From f1a3705699e8833e87655a92d7563c271c687755 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Wed, 13 Mar 2024 14:32:37 +0100 Subject: [PATCH] config: allow destroying keymaps --- jay-config/src/_private/client.rs | 4 ++++ jay-config/src/_private/ipc.rs | 3 +++ jay-config/src/keyboard/mod.rs | 9 +++++++++ src/config/handler.rs | 5 +++++ 4 files changed, 21 insertions(+) diff --git a/jay-config/src/_private/client.rs b/jay-config/src/_private/client.rs index b32085c4..8daf7d0d 100644 --- a/jay-config/src/_private/client.rs +++ b/jay-config/src/_private/client.rs @@ -782,6 +782,10 @@ impl Client { has } + pub fn destroy_keymap(&self, keymap: Keymap) { + self.send(&ClientMessage::DestroyKeymap { keymap }) + } + pub fn seat_set_keymap(&self, seat: Seat, keymap: Keymap) { self.send(&ClientMessage::SeatSetKeymap { seat, keymap }) } diff --git a/jay-config/src/_private/ipc.rs b/jay-config/src/_private/ipc.rs index cf63c823..b6d485c3 100644 --- a/jay-config/src/_private/ipc.rs +++ b/jay-config/src/_private/ipc.rs @@ -382,6 +382,9 @@ pub enum ClientMessage<'a> { fds: Vec<(i32, i32)>, }, DisableDefaultSeat, + DestroyKeymap { + keymap: Keymap, + }, } #[derive(Serialize, Deserialize, Debug)] diff --git a/jay-config/src/keyboard/mod.rs b/jay-config/src/keyboard/mod.rs index a061840e..8630926c 100644 --- a/jay-config/src/keyboard/mod.rs +++ b/jay-config/src/keyboard/mod.rs @@ -59,6 +59,15 @@ impl Keymap { pub fn is_invalid(self) -> bool { self == Self::INVALID } + + /// Destroys this reference to the keymap. + /// + /// Seats that are currently using this keymap are unaffected. + pub fn destroy(self) { + if self.is_valid() { + get!().destroy_keymap(self); + } + } } /// Parses a keymap. diff --git a/src/config/handler.rs b/src/config/handler.rs index 5866186b..e1eccb22 100644 --- a/src/config/handler.rs +++ b/src/config/handler.rs @@ -1250,6 +1250,10 @@ impl ConfigProxyHandler { Ok(()) } + fn handle_destroy_keymap(&self, keymap: Keymap) { + self.keymaps.remove(&keymap); + } + pub fn handle_request(self: &Rc, msg: &[u8]) { if let Err(e) = self.handle_request_(msg) { log::error!("Could not handle client request: {}", ErrorFmt(e)); @@ -1515,6 +1519,7 @@ impl ConfigProxyHandler { fds, } => self.handle_run(prog, args, env, fds).wrn("run")?, ClientMessage::DisableDefaultSeat => self.state.create_default_seat.set(false), + ClientMessage::DestroyKeymap { keymap } => self.handle_destroy_keymap(keymap), } Ok(()) }