diff --git a/src/input/mod.rs b/src/input/mod.rs index 4c5cd27e..d0b11e0b 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -20,10 +20,26 @@ use smithay::{ use std::{cell::RefCell, collections::HashMap}; use xkbcommon::xkb::KEY_XF86Switch_VT_12; +crate::utils::id_gen!(next_seat_id, SEAT_ID, SEAT_IDS); + +#[repr(transparent)] +pub struct SeatId(pub usize); pub struct ActiveOutput(pub RefCell); pub struct SupressedKeys(RefCell>); pub struct Devices(RefCell>>); +impl Default for SeatId { + fn default() -> SeatId { + SeatId(next_seat_id()) + } +} + +impl Drop for SeatId { + fn drop(&mut self) { + SEAT_IDS.lock().unwrap().remove(&self.0); + } +} + impl SupressedKeys { fn new() -> SupressedKeys { SupressedKeys(RefCell::new(Vec::new())) @@ -84,6 +100,7 @@ impl Devices { pub fn add_seat(dh: &DisplayHandle, name: String) -> Seat { let seat = Seat::::new(dh, name, None); let userdata = seat.user_data(); + userdata.insert_if_missing(SeatId::default); userdata.insert_if_missing(|| Devices::new()); userdata.insert_if_missing(|| SupressedKeys::new()); userdata.insert_if_missing(|| RefCell::new(CursorImageStatus::Default)); diff --git a/src/utils/prelude.rs b/src/utils/prelude.rs index 4a05213c..0887b927 100644 --- a/src/utils/prelude.rs +++ b/src/utils/prelude.rs @@ -1,4 +1,4 @@ -use crate::{input::ActiveOutput, state::Common}; +use crate::{input::{ActiveOutput, SeatId}, state::Common}; use smithay::{ utils::{Logical, Rectangle, Transform}, wayland::{output::Output, seat::Seat}, @@ -28,6 +28,16 @@ impl OutputExt for Output { } } +pub trait SeatExt { + fn id(&self) -> usize; +} + +impl SeatExt for Seat { + fn id(&self) -> usize { + self.user_data().get::().unwrap().0 + } +} + pub fn active_output(seat: &Seat, state: &Common) -> Output { seat.user_data() .get::()