stack: Remember previous position during focus navigation

This commit is contained in:
Victoria Brekenfeld 2025-02-24 21:43:16 +01:00 committed by Victoria Brekenfeld
parent e6f563d04e
commit e116f20396
6 changed files with 137 additions and 73 deletions

View file

@ -18,7 +18,7 @@ use smithay::{
},
output::Output,
reexports::{input::Device as InputDevice, wayland_server::DisplayHandle},
utils::{Buffer, IsAlive, Monotonic, Point, Rectangle, Time, Transform},
utils::{Buffer, IsAlive, Monotonic, Point, Rectangle, Serial, Time, Transform},
wayland::compositor::with_states,
};
use tracing::warn;
@ -172,6 +172,9 @@ struct ActiveOutput(pub Mutex<Output>);
/// The output which currently has keyboard focus
struct FocusedOutput(pub Mutex<Option<Output>>);
#[derive(Default)]
pub struct LastModifierChange(pub Mutex<Option<Serial>>);
pub fn create_seat(
dh: &DisplayHandle,
seat_state: &mut SeatState<State>,
@ -186,6 +189,7 @@ pub fn create_seat(
userdata.insert_if_missing(SupressedKeys::default);
userdata.insert_if_missing(SupressedButtons::default);
userdata.insert_if_missing(ModifiersShortcutQueue::default);
userdata.insert_if_missing(LastModifierChange::default);
userdata.insert_if_missing_threadsafe(SeatMoveGrabState::default);
userdata.insert_if_missing_threadsafe(SeatMenuGrabState::default);
userdata.insert_if_missing_threadsafe(CursorState::default);
@ -241,6 +245,7 @@ pub trait SeatExt {
fn supressed_keys(&self) -> &SupressedKeys;
fn supressed_buttons(&self) -> &SupressedButtons;
fn modifiers_shortcut_queue(&self) -> &ModifiersShortcutQueue;
fn last_modifier_change(&self) -> Option<Serial>;
fn cursor_geometry(
&self,
@ -315,6 +320,16 @@ impl SeatExt for Seat<State> {
self.user_data().get::<ModifiersShortcutQueue>().unwrap()
}
fn last_modifier_change(&self) -> Option<Serial> {
*self
.user_data()
.get::<LastModifierChange>()
.unwrap()
.0
.lock()
.unwrap()
}
fn cursor_geometry(
&self,
loc: impl Into<Point<f64, Buffer>>,