From 0eb14d281601f2cb47bd7fc7ca08f141028620ec Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Tue, 17 Sep 2024 20:24:19 +0200 Subject: [PATCH 1/4] wayland: include object id in request errors --- build/wire.rs | 1 + src/client/error.rs | 3 ++- src/wl_usr.rs | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/build/wire.rs b/build/wire.rs index 31137918..a21f8895 100644 --- a/build/wire.rs +++ b/build/wire.rs @@ -830,6 +830,7 @@ fn write_request_handler( writeln!(f, " }};")?; writeln!(f, " Err({error}::MethodError {{")?; writeln!(f, " interface: {camel_obj_name},")?; + writeln!(f, " id: self.id(),")?; writeln!(f, " method,")?; writeln!(f, " error,")?; writeln!(f, " }})")?; diff --git a/src/client/error.rs b/src/client/error.rs index 08e592ed..5f7402c8 100644 --- a/src/client/error.rs +++ b/src/client/error.rs @@ -37,9 +37,10 @@ pub enum ClientError { ClientIdOutOfBounds, #[error("Object {0} is not a display")] NotADisplay(WlDisplayId), - #[error("Could not process a `{}.{}` request", .interface.name(), .method)] + #[error("Could not process a `{}#{}.{}` request", .interface.name(), .id, .method)] MethodError { interface: Interface, + id: ObjectId, method: &'static str, #[source] error: Box, diff --git a/src/wl_usr.rs b/src/wl_usr.rs index e7f5321d..0dfc3cfd 100644 --- a/src/wl_usr.rs +++ b/src/wl_usr.rs @@ -63,9 +63,10 @@ pub enum UsrConError { Write(#[source] BufFdError), #[error("Server sent an event for object {0} that does not exist")] MissingObject(ObjectId), - #[error("Could not process a `{}.{}` event", .interface.name(), .method)] + #[error("Could not process a `{}#{}.{}` event", .interface.name(), .id, .method)] MethodError { interface: Interface, + id: ObjectId, method: &'static str, #[source] error: Box, From 2a1d6a8ba86203516c56cc99d52a09e1142821f5 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Tue, 17 Sep 2024 22:12:50 +0200 Subject: [PATCH 2/4] toplevel-drag: reattach only after drop has finished --- src/ifs/ipc/wl_data_source.rs | 11 +++++++---- src/ifs/wl_seat/pointer_owner.rs | 5 ++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ifs/ipc/wl_data_source.rs b/src/ifs/ipc/wl_data_source.rs index ad365eea..a21feed0 100644 --- a/src/ifs/ipc/wl_data_source.rs +++ b/src/ifs/ipc/wl_data_source.rs @@ -154,16 +154,19 @@ impl WlDataSource { shared.selected_action.get() != 0 && shared.state.get().contains(OFFER_STATE_ACCEPTED) } - pub fn on_drop(&self, seat: &Rc) { + pub fn on_drop(&self) { self.data.state.or_assign(SOURCE_STATE_DROPPED); - if let Some(drag) = self.toplevel_drag.take() { - drag.finish_drag(seat); - } self.send_dnd_drop_performed(); let shared = self.data.shared.get(); shared.state.or_assign(OFFER_STATE_DROPPED); } + pub fn finish_toplevel_drag(&self, seat: &Rc) { + if let Some(drag) = self.toplevel_drag.take() { + drag.finish_drag(seat); + } + } + pub fn send_cancelled(&self, seat: &Rc) { self.data.state.or_assign(SOURCE_STATE_CANCELLED); if let Some(drag) = self.toplevel_drag.take() { diff --git a/src/ifs/wl_seat/pointer_owner.rs b/src/ifs/wl_seat/pointer_owner.rs index 5f3623c7..8f9740ff 100644 --- a/src/ifs/wl_seat/pointer_owner.rs +++ b/src/ifs/wl_seat/pointer_owner.rs @@ -468,7 +468,7 @@ impl PointerOwner for DndPointerOwner { let target = self.target.get(); target.node_on_dnd_drop(&self.dnd); if let Some(src) = &self.dnd.src { - src.on_drop(seat); + src.on_drop(); } let should_drop = match &self.dnd.src { None => true, @@ -491,6 +491,9 @@ impl PointerOwner for DndPointerOwner { } seat.pointer_owner.set_default_pointer_owner(seat); seat.tree_changed.trigger(); + if let Some(src) = &self.dnd.src { + src.finish_toplevel_drag(seat); + } } fn axis_node(&self, _seat: &Rc) -> Option> { From 7729704e421254ffbd9607282afa19cb68c908a8 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Tue, 17 Sep 2024 23:04:34 +0200 Subject: [PATCH 3/4] seat: drop xkb_state before reverting pointer to default --- src/ifs/wl_seat/event_handling.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ifs/wl_seat/event_handling.rs b/src/ifs/wl_seat/event_handling.rs index e47cb4f1..753df5fc 100644 --- a/src/ifs/wl_seat/event_handling.rs +++ b/src/ifs/wl_seat/event_handling.rs @@ -811,9 +811,10 @@ impl WlSeatGlobal { } let scs = &*self.shortcuts.borrow(); let keysyms = xkb_state.unmodified_keysyms(key); + let mut revert_pointer_to_default = false; for &sym in keysyms { if sym == SYM_Escape.0 && mods == 0 { - self.pointer_owner.revert_to_default(self); + revert_pointer_to_default = true; } if !self.state.lock.locked.get() { if let Some(key_mods) = scs.get(&sym) { @@ -829,6 +830,11 @@ impl WlSeatGlobal { } } } + if revert_pointer_to_default { + drop(xkb_state); + self.pointer_owner.revert_to_default(self); + xkb_state = xkb_state_rc.borrow_mut(); + } new_mods = xkb_state.update(key, xkb_dir); } self.state.for_each_seat_tester(|t| { From d31ad1f64105df76d5c88d57c5ce3d80c9aac8ce Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Tue, 17 Sep 2024 23:10:35 +0200 Subject: [PATCH 4/4] toplevel-drag: damage toplevel on drop --- src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs index 426f8b6d..7e472442 100644 --- a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs +++ b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs @@ -388,6 +388,9 @@ impl XdgToplevel { pub fn after_toplevel_drag(self: &Rc, output: &Rc, x: i32, y: i32) { assert!(self.toplevel_data.parent.is_none()); + if self.node_visible() { + self.xdg.damage(); + } let extents = match self.xdg.geometry.get() { None => self.xdg.extents.get(), Some(g) => g,