From bd94a0e921d7fb837fbcb3c1535eaabd53f92e51 Mon Sep 17 00:00:00 2001 From: Rom Grk Date: Thu, 22 Feb 2024 12:51:09 -0500 Subject: [PATCH] Wayland: implement focus events (#8170) Implements keyboard focus in/out events. This also enables vim mode to work on wayland, which is only activated when an editor gains focus. --- .../gpui/src/platform/linux/wayland/client.rs | 26 +++++++++++++++---- .../gpui/src/platform/linux/wayland/window.rs | 8 +++++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/crates/gpui/src/platform/linux/wayland/client.rs b/crates/gpui/src/platform/linux/wayland/client.rs index 1579a5098b87756f230232b9c9c0de22928de04f..2e341dabac6160a7cffbf14755a3271246e90a8b 100644 --- a/crates/gpui/src/platform/linux/wayland/client.rs +++ b/crates/gpui/src/platform/linux/wayland/client.rs @@ -421,12 +421,29 @@ impl Dispatch for WaylandClientState { state.keymap_state = Some(xkb::State::new(&keymap)); } wl_keyboard::Event::Enter { surface, .. } => { - for window in &state.windows { - if window.1.surface.id() == surface.id() { - state.keyboard_focused_window = Some(Rc::clone(&window.1)); - } + state.keyboard_focused_window = state + .windows + .iter() + .find(|&w| w.1.surface.id() == surface.id()) + .map(|w| w.1.clone()); + + if let Some(window) = &state.keyboard_focused_window { + window.set_focused(true); } } + wl_keyboard::Event::Leave { surface, .. } => { + let keyboard_focused_window = state + .windows + .iter() + .find(|&w| w.1.surface.id() == surface.id()) + .map(|w| w.1.clone()); + + if let Some(window) = keyboard_focused_window { + window.set_focused(false); + } + + state.keyboard_focused_window = None; + } wl_keyboard::Event::Modifiers { mods_depressed, mods_latched, @@ -479,7 +496,6 @@ impl Dispatch for WaylandClientState { } } } - wl_keyboard::Event::Leave { .. } => {} _ => {} } } diff --git a/crates/gpui/src/platform/linux/wayland/window.rs b/crates/gpui/src/platform/linux/wayland/window.rs index 5f0b64cff71efff55214de69ad39b92d1032a4d9..3a0c82cd16f20356a6110601144ae319d59832e2 100644 --- a/crates/gpui/src/platform/linux/wayland/window.rs +++ b/crates/gpui/src/platform/linux/wayland/window.rs @@ -228,6 +228,12 @@ impl WaylandWindowState { } } } + + pub fn set_focused(&self, focus: bool) { + if let Some(ref mut fun) = self.callbacks.lock().active_status_change { + fun(focus); + } + } } #[derive(Clone)] @@ -349,7 +355,7 @@ impl PlatformWindow for WaylandWindow { } fn on_active_status_change(&self, callback: Box) { - //todo!(linux) + self.0.callbacks.lock().active_status_change = Some(callback); } fn on_resize(&self, callback: Box, f32)>) {