1
0
Fork 0
forked from wry/wry

autocommit 2022-04-16 13:42:13 CEST

This commit is contained in:
Julian Orth 2022-04-16 13:42:13 +02:00
parent 4826305236
commit 50b792db78
27 changed files with 217 additions and 60 deletions

View file

@ -457,12 +457,17 @@ impl WlSeatGlobal {
// Button callbacks
impl WlSeatGlobal {
pub fn button_surface(self: &Rc<Self>, surface: &Rc<WlSurface>, button: u32, state: KeyState) {
pub fn button_surface(
self: &Rc<Self>,
surface: &Rc<WlSurface>,
button: u32,
state: KeyState,
serial: u32,
) {
let (state, pressed) = match state {
KeyState::Released => (wl_pointer::RELEASED, false),
KeyState::Pressed => (wl_pointer::PRESSED, true),
};
let serial = self.serial.fetch_add(1);
self.surface_pointer_event(0, surface, |p| p.send_button(serial, 0, button, state));
self.surface_pointer_frame(surface);
if pressed && surface.accepts_kb_focus() {
@ -522,7 +527,8 @@ impl WlSeatGlobal {
}
pub fn enter_surface(&self, n: &WlSurface, x: Fixed, y: Fixed) {
let serial = self.serial.fetch_add(1);
let serial = n.client.next_serial();
n.client.last_enter_serial.set(serial);
self.surface_pointer_event(0, n, |p| p.send_enter(serial, n.id, x, y));
self.surface_pointer_frame(n);
}
@ -531,7 +537,7 @@ impl WlSeatGlobal {
// Leave callbacks
impl WlSeatGlobal {
pub fn leave_surface(&self, n: &WlSurface) {
let serial = self.serial.fetch_add(1);
let serial = n.client.next_serial();
self.surface_pointer_event(0, n, |p| p.send_leave(serial, n.id));
self.surface_pointer_frame(n);
}
@ -540,7 +546,8 @@ impl WlSeatGlobal {
// Unfocus callbacks
impl WlSeatGlobal {
pub fn unfocus_surface(&self, surface: &WlSurface) {
self.surface_kb_event(0, surface, |k| k.send_leave(0, surface.id))
let serial = surface.client.next_serial();
self.surface_kb_event(0, surface, |k| k.send_leave(serial, surface.id))
}
}
@ -548,7 +555,7 @@ impl WlSeatGlobal {
impl WlSeatGlobal {
pub fn focus_surface(&self, surface: &WlSurface) {
let pressed_keys: Vec<_> = self.pressed_keys.borrow().iter().copied().collect();
let serial = self.serial.fetch_add(1);
let serial = surface.client.next_serial();
self.surface_kb_event(0, surface, |k| {
k.send_enter(serial, surface.id, &pressed_keys)
});
@ -559,7 +566,7 @@ impl WlSeatGlobal {
group,
..
} = self.kb_state.borrow().mods();
let serial = self.serial.fetch_add(1);
let serial = surface.client.next_serial();
self.surface_kb_event(0, surface, |k| {
k.send_modifiers(serial, mods_depressed, mods_latched, mods_locked, group)
});
@ -577,7 +584,7 @@ impl WlSeatGlobal {
// Key callbacks
impl WlSeatGlobal {
pub fn key_surface(&self, surface: &WlSurface, key: u32, state: u32) {
let serial = self.serial.fetch_add(1);
let serial = surface.client.next_serial();
self.surface_kb_event(0, surface, |k| k.send_key(serial, 0, key, state));
}
}
@ -585,7 +592,7 @@ impl WlSeatGlobal {
// Modifiers callbacks
impl WlSeatGlobal {
pub fn mods_surface(&self, surface: &WlSurface, mods: ModifierState) {
let serial = self.serial.fetch_add(1);
let serial = surface.client.next_serial();
self.surface_kb_event(0, surface, |k| {
k.send_modifiers(
serial,
@ -624,16 +631,16 @@ impl WlSeatGlobal {
surface.client.flush();
}
pub fn dnd_surface_enter(&self, surface: &WlSurface, dnd: &Dnd, x: Fixed, y: Fixed) {
pub fn dnd_surface_enter(&self, surface: &WlSurface, dnd: &Dnd, x: Fixed, y: Fixed, serial: u32) {
if let Some(src) = &dnd.src {
ipc::offer_source_to::<WlDataDevice>(src, &surface.client);
src.for_each_data_offer(|offer| {
offer.device.send_enter(surface.id, x, y, offer.id);
offer.device.send_enter(surface.id, x, y, offer.id, serial);
offer.send_source_actions();
})
} else if surface.client.id == dnd.client.id {
self.for_each_data_device(0, dnd.client.id, |dd| {
dd.send_enter(surface.id, x, y, WlDataOfferId::NONE);
dd.send_enter(surface.id, x, y, WlDataOfferId::NONE, serial);
})
}
surface.client.flush();

View file

@ -68,8 +68,11 @@ impl PointerOwnerHolder {
origin: &Rc<WlSurface>,
source: Option<Rc<WlDataSource>>,
icon: Option<Rc<WlSurface>>,
serial: u32,
) -> Result<(), WlSeatError> {
self.owner.get().start_drag(seat, origin, source, icon)
self.owner
.get()
.start_drag(seat, origin, source, icon, serial)
}
pub fn cancel_dnd(&self, seat: &Rc<WlSeatGlobal>) {
@ -103,6 +106,7 @@ trait PointerOwner {
origin: &Rc<WlSurface>,
source: Option<Rc<WlDataSource>>,
icon: Option<Rc<WlSurface>>,
serial: u32,
) -> Result<(), WlSeatError>;
fn cancel_dnd(&self, seat: &Rc<WlSeatGlobal>);
fn revert_to_default(&self, seat: &Rc<WlSeatGlobal>);
@ -116,6 +120,7 @@ struct DefaultPointerOwner;
struct GrabPointerOwner {
buttons: SmallMap<u32, (), 1>,
node: Rc<dyn Node>,
serial: u32,
}
struct DndPointerOwner {
@ -136,12 +141,14 @@ impl PointerOwner for DefaultPointerOwner {
Some(n) => n,
_ => return,
};
let serial = seat.state.next_serial(pn.node_client().as_deref());
seat.pointer_owner.owner.set(Rc::new(GrabPointerOwner {
buttons: SmallMap::new_with(button, ()),
node: pn.clone(),
serial,
}));
pn.node_seat_state().add_pointer_grab(seat);
pn.node_button(seat, button, state);
pn.node_button(seat, button, state, serial);
}
fn axis_node(&self, seat: &Rc<WlSeatGlobal>) -> Option<Rc<dyn Node>> {
@ -217,6 +224,7 @@ impl PointerOwner for DefaultPointerOwner {
_origin: &Rc<WlSurface>,
source: Option<Rc<WlDataSource>>,
_icon: Option<Rc<WlSurface>>,
_serial: u32,
) -> Result<(), WlSeatError> {
if let Some(src) = source {
src.send_cancelled();
@ -262,7 +270,8 @@ impl PointerOwner for GrabPointerOwner {
self.buttons.insert(button, ());
}
}
self.node.clone().node_button(seat, button, state);
let serial = seat.state.next_serial(self.node.node_client().as_deref());
self.node.clone().node_button(seat, button, state, serial);
}
fn axis_node(&self, _seat: &Rc<WlSeatGlobal>) -> Option<Rc<dyn Node>> {
@ -284,6 +293,7 @@ impl PointerOwner for GrabPointerOwner {
origin: &Rc<WlSurface>,
src: Option<Rc<WlDataSource>>,
icon: Option<Rc<WlSurface>>,
serial: u32,
) -> Result<(), WlSeatError> {
let button = match self.buttons.iter().next() {
Some((b, _)) => b,
@ -292,6 +302,9 @@ impl PointerOwner for GrabPointerOwner {
if self.buttons.len() != 1 {
return Ok(());
}
if serial != self.serial {
return Ok(());
}
if self.node.node_id() != origin.node_id {
return Ok(());
}
@ -413,7 +426,7 @@ impl PointerOwner for DndPointerOwner {
target.node_dnd_leave(&self.dnd);
target.node_seat_state().remove_dnd_target(seat);
target = node;
target.node_dnd_enter(&self.dnd, x, y);
target.node_dnd_enter(&self.dnd, x, y, seat.state.next_serial(target.node_client().as_deref()));
target.node_seat_state().add_dnd_target(seat);
self.target.set(target);
} else if (self.pos_x.get(), self.pos_y.get()) != (x, y) {
@ -429,6 +442,7 @@ impl PointerOwner for DndPointerOwner {
_origin: &Rc<WlSurface>,
source: Option<Rc<WlDataSource>>,
_icon: Option<Rc<WlSurface>>,
_serial: u32,
) -> Result<(), WlSeatError> {
if let Some(src) = source {
src.send_cancelled();

View file

@ -156,6 +156,7 @@ impl WlPointer {
fn set_cursor(&self, parser: MsgParser<'_, '_>) -> Result<(), SetCursorError> {
let req: SetCursor = self.seat.client.parse(self, parser)?;
self.seat.client.validate_serial(req.serial)?;
let mut cursor_opt = None;
if req.surface.is_some() {
let surface = self.seat.client.lookup(req.surface)?;
@ -163,7 +164,7 @@ impl WlPointer {
cursor.set_hotspot(req.hotspot_x, req.hotspot_y);
cursor_opt = Some(cursor as Rc<dyn Cursor>);
}
let pointer_node = match self.seat.global.pointer_stack.borrow().last().cloned() {
let pointer_node = match self.seat.global.pointer_node() {
Some(n) => n,
_ => {
// cannot happen
@ -173,6 +174,9 @@ impl WlPointer {
if pointer_node.node_client_id() != Some(self.seat.client.id) {
return Ok(());
}
if req.serial != self.seat.client.last_enter_serial.get() {
return Ok(());
}
self.seat.global.set_app_cursor(cursor_opt);
Ok(())
}