From 103fa371562e86af63204df8cf7bf35559ada0d4 Mon Sep 17 00:00:00 2001 From: Matthew Chisolm <39521893+mchisolm0@users.noreply.github.com> Date: Wed, 25 Mar 2026 01:38:14 -0500 Subject: [PATCH] Use the most recent serial of kinds KeyPress or MousePress when copying (#52053) Release Notes: - Fix copy for some Wayland users --- crates/gpui_linux/src/linux/wayland/client.rs | 8 ++++++-- crates/gpui_linux/src/linux/wayland/serial.rs | 12 ++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/crates/gpui_linux/src/linux/wayland/client.rs b/crates/gpui_linux/src/linux/wayland/client.rs index 0d07c60650722e6bedc78d3f33d0ac458dca5e02..b65a203dd3448ba191b7e2f5ae0f5b6c396545a8 100644 --- a/crates/gpui_linux/src/linux/wayland/client.rs +++ b/crates/gpui_linux/src/linux/wayland/client.rs @@ -875,7 +875,9 @@ impl LinuxClient for WaylandClient { }; if state.mouse_focused_window.is_some() || state.keyboard_focused_window.is_some() { state.clipboard.set_primary(item); - let serial = state.serial_tracker.get(SerialKind::KeyPress); + let serial = state + .serial_tracker + .latest_of(&[SerialKind::KeyPress, SerialKind::MousePress]); let data_source = primary_selection_manager.create_source(&state.globals.qh, ()); for mime_type in TEXT_MIME_TYPES { data_source.offer(mime_type.to_string()); @@ -895,7 +897,9 @@ impl LinuxClient for WaylandClient { }; if state.mouse_focused_window.is_some() || state.keyboard_focused_window.is_some() { state.clipboard.set(item); - let serial = state.serial_tracker.get(SerialKind::KeyPress); + let serial = state + .serial_tracker + .latest_of(&[SerialKind::KeyPress, SerialKind::MousePress]); let data_source = data_device_manager.create_data_source(&state.globals.qh, ()); for mime_type in TEXT_MIME_TYPES { data_source.offer(mime_type.to_string()); diff --git a/crates/gpui_linux/src/linux/wayland/serial.rs b/crates/gpui_linux/src/linux/wayland/serial.rs index eadc7a9ca97c6f3c78f8a5609deb27e891e52949..ed38f14bd130c4fb6db178fe218bae1327355476 100644 --- a/crates/gpui_linux/src/linux/wayland/serial.rs +++ b/crates/gpui_linux/src/linux/wayland/serial.rs @@ -46,4 +46,16 @@ impl SerialTracker { .map(|serial_data| serial_data.serial) .unwrap_or(0) } + + /// Returns the latest tracked serial of the provided [`SerialKind`]s + /// + /// Will return 0 if not tracked. + pub fn latest_of(&self, kinds: &[SerialKind]) -> u32 { + kinds + .iter() + .filter_map(|kind| self.serials.get(kind)) + .max_by_key(|serial_data| serial_data.serial) + .map(|serial_data| serial_data.serial) + .unwrap_or(0) + } }