Implement pointer constraints; update to send frame manually

This commit is contained in:
Ian Douglas Scott 2023-09-13 20:52:10 -07:00 committed by Victoria Brekenfeld
parent 0b057f153e
commit 373af07319
16 changed files with 272 additions and 49 deletions

View file

@ -906,6 +906,13 @@ impl PointerTarget<State> for CosmicMapped {
_ => {}
}
}
fn frame(&self, seat: &Seat<State>, data: &mut State) {
match &self.element {
CosmicMappedInternal::Stack(s) => PointerTarget::frame(s, seat, data),
CosmicMappedInternal::Window(w) => PointerTarget::frame(w, seat, data),
_ => {}
}
}
fn leave(&self, seat: &Seat<State>, data: &mut State, serial: Serial, time: u32) {
self.last_cursor_position.lock().unwrap().remove(&seat.id());
match &self.element {

View file

@ -1169,6 +1169,27 @@ impl PointerTarget<State> for CosmicStack {
}
}
fn frame(&self, seat: &Seat<State>, data: &mut State) {
if let Some((location, serial, time)) = self
.0
.with_program(|p| p.last_location.lock().unwrap().clone())
{
self.pointer_leave_if_previous(seat, data, serial, time, location);
}
match self.0.with_program(|p| p.current_focus()) {
Focus::Header => PointerTarget::frame(&self.0, seat, data),
Focus::Window => self.0.with_program(|p| {
PointerTarget::frame(
&p.windows.lock().unwrap()[p.active.load(Ordering::SeqCst)],
seat,
data,
)
}),
_ => {}
}
}
fn leave(&self, seat: &Seat<State>, data: &mut State, serial: Serial, time: u32) {
if let Some((location, serial, time)) = self
.0

View file

@ -757,6 +757,14 @@ impl PointerTarget<State> for CosmicSurface {
}
}
fn frame(&self, seat: &Seat<State>, data: &mut State) {
match self {
CosmicSurface::Wayland(window) => PointerTarget::frame(window, seat, data),
CosmicSurface::X11(surface) => PointerTarget::frame(surface, seat, data),
_ => unreachable!(),
}
}
fn leave(
&self,
seat: &Seat<State>,

View file

@ -585,6 +585,16 @@ impl PointerTarget<State> for CosmicWindow {
}
}
fn frame(&self, seat: &Seat<State>, data: &mut State) {
match self.0.with_program(|p| p.current_focus()) {
Focus::Header => PointerTarget::frame(&self.0, seat, data),
Focus::Window => self
.0
.with_program(|p| PointerTarget::frame(&p.window, seat, data)),
_ => {}
}
}
fn leave(&self, seat: &Seat<State>, data: &mut State, serial: Serial, time: u32) {
let previous = self.0.with_program(|p| {
if let Some(sessions) = p.window.user_data().get::<ScreencopySessions>() {