diff options
| author | Peter Collingbourne <peter@pcc.me.uk> | 2024-06-09 21:09:28 -0700 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-06-10 18:06:34 +0300 |
| commit | bc3d6cac805bde6a26232dfa75c37b18ca9ec743 (patch) | |
| tree | 7c104f1d7da2c5727d4a6ffc812ffa81011e1864 /src | |
| parent | a55e385b12f27e3e700ae759d620b401f910288f (diff) | |
| download | niri-bc3d6cac805bde6a26232dfa75c37b18ca9ec743.tar.gz niri-bc3d6cac805bde6a26232dfa75c37b18ca9ec743.tar.bz2 niri-bc3d6cac805bde6a26232dfa75c37b18ca9ec743.zip | |
Implement xdg_activation_v1
Fixes #30.
Diffstat (limited to 'src')
| -rw-r--r-- | src/handlers/mod.rs | 41 | ||||
| -rw-r--r-- | src/niri.rs | 4 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index e40306d0..8ee34c70 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -48,6 +48,9 @@ use smithay::wayland::session_lock::{ LockSurface, SessionLockHandler, SessionLockManagerState, SessionLocker, }; use smithay::wayland::tablet_manager::TabletSeatHandler; +use smithay::wayland::xdg_activation::{ + XdgActivationHandler, XdgActivationState, XdgActivationToken, XdgActivationTokenData, +}; use smithay::{ delegate_cursor_shape, delegate_data_control, delegate_data_device, delegate_dmabuf, delegate_drm_lease, delegate_idle_inhibit, delegate_idle_notify, delegate_input_method_manager, @@ -55,6 +58,7 @@ use smithay::{ delegate_presentation, delegate_primary_selection, delegate_relative_pointer, delegate_seat, delegate_security_context, delegate_session_lock, delegate_tablet_manager, delegate_text_input_manager, delegate_viewporter, delegate_virtual_keyboard_manager, + delegate_xdg_activation, }; use crate::niri::{ClientState, State}; @@ -498,3 +502,40 @@ impl GammaControlHandler for State { } } delegate_gamma_control!(State); + +impl XdgActivationHandler for State { + fn activation_state(&mut self) -> &mut XdgActivationState { + &mut self.niri.activation_state + } + + fn token_created(&mut self, _token: XdgActivationToken, data: XdgActivationTokenData) -> bool { + // Only tokens that were created while the application has keyboard focus are valid. + let Some((serial, seat)) = data.serial else { + return false; + }; + let Some(seat) = Seat::<State>::from_resource(&seat) else { + return false; + }; + + let keyboard = seat.get_keyboard().unwrap(); + return keyboard + .last_enter() + .map(|last_enter| serial.is_no_older_than(&last_enter)) + .unwrap_or(false); + } + + fn request_activation( + &mut self, + _token: XdgActivationToken, + token_data: XdgActivationTokenData, + surface: WlSurface, + ) { + if token_data.timestamp.elapsed().as_secs() < 10 { + if let Some((mapped, _)) = self.niri.layout.find_window_and_output(&surface) { + let window = mapped.window.clone(); + self.niri.layout.activate_window(&window); + } + } + } +} +delegate_xdg_activation!(State); diff --git a/src/niri.rs b/src/niri.rs index 7da671c2..c03edd19 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -90,6 +90,7 @@ use smithay::wayland::tablet_manager::TabletManagerState; use smithay::wayland::text_input::TextInputManagerState; use smithay::wayland::viewporter::ViewporterState; use smithay::wayland::virtual_keyboard::VirtualKeyboardManagerState; +use smithay::wayland::xdg_activation::XdgActivationState; use smithay::wayland::xdg_foreign::XdgForeignState; use crate::backend::tty::SurfaceDmabufFeedback; @@ -217,6 +218,7 @@ pub struct Niri { pub presentation_state: PresentationState, pub security_context_state: SecurityContextState, pub gamma_control_manager_state: GammaControlManagerState, + pub activation_state: XdgActivationState, pub seat: Seat<State>, /// Scancodes of the keys to suppress. @@ -1369,6 +1371,7 @@ impl Niri { GammaControlManagerState::new::<State, _>(&display_handle, move |client| { is_tty && !client.get_data::<ClientState>().unwrap().restricted }); + let activation_state = XdgActivationState::new::<State>(&display_handle); let mut seat: Seat<State> = seat_state.new_wl_seat(&display_handle, backend.seat_name()); seat.add_keyboard( @@ -1527,6 +1530,7 @@ impl Niri { presentation_state, security_context_state, gamma_control_manager_state, + activation_state, seat, keyboard_focus: KeyboardFocus::Layout { surface: None }, |
