Skip to content

Commit 68ee755

Browse files
committed
key grabs
1 parent 4040198 commit 68ee755

File tree

2 files changed

+47
-14
lines changed

2 files changed

+47
-14
lines changed

src/dbus/a11y_keyboard_monitor.rs

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ const ATSPI_DEVICE_A11Y_MANAGER_VIRTUAL_MOD_START: u32 = 15;
1919
#[derive(PartialEq, Eq, Debug)]
2020
struct KeyGrab {
2121
pub mods: u32,
22-
pub virtual_modifiers: HashSet<Keysym>,
22+
pub virtual_mods: HashSet<Keysym>,
2323
pub key: Keysym,
2424
}
2525

2626
impl KeyGrab {
27-
fn new(virtual_modifiers: &[Keysym], key: Keysym, raw_mods: u32) -> Self {
27+
fn new(virtual_mods: &[Keysym], key: Keysym, raw_mods: u32) -> Self {
2828
let mods = raw_mods & ((1 << ATSPI_DEVICE_A11Y_MANAGER_VIRTUAL_MOD_START) - 1);
29-
let virtual_modifiers = virtual_modifiers
29+
let virtual_mods = virtual_mods
3030
.iter()
3131
.copied()
3232
.enumerate()
@@ -37,7 +37,7 @@ impl KeyGrab {
3737
.collect();
3838
Self {
3939
mods,
40-
virtual_modifiers,
40+
virtual_mods,
4141
key,
4242
}
4343
}
@@ -47,7 +47,7 @@ impl KeyGrab {
4747
struct Client {
4848
grabbed: bool,
4949
watched: bool,
50-
virtual_modifiers: HashSet<Keysym>,
50+
virtual_mods: HashSet<Keysym>,
5151
key_grabs: Vec<KeyGrab>,
5252
}
5353

@@ -68,7 +68,7 @@ impl Clients {
6868
pub struct A11yKeyboardMonitorState {
6969
executor: ThreadPool,
7070
clients: Arc<Mutex<Clients>>,
71-
active_virtual_modifiers: HashSet<Keysym>,
71+
active_virtual_mods: HashSet<Keysym>,
7272
conn: Arc<OnceLock<zbus::Connection>>,
7373
}
7474

@@ -92,7 +92,7 @@ impl A11yKeyboardMonitorState {
9292
Self {
9393
clients,
9494
executor,
95-
active_virtual_modifiers: HashSet::new(),
95+
active_virtual_mods: HashSet::new(),
9696
conn: conn_cell,
9797
}
9898
}
@@ -103,7 +103,35 @@ impl A11yKeyboardMonitorState {
103103
.unwrap()
104104
.0
105105
.values()
106-
.any(|client| client.virtual_modifiers.contains(&keysym))
106+
.any(|client| client.virtual_mods.contains(&keysym))
107+
}
108+
109+
pub fn remove_active_virtual_modifier(&mut self, keysym: Keysym) -> bool {
110+
self.active_virtual_mods.remove(&keysym)
111+
}
112+
113+
pub fn has_keyboard_grab(&self) -> bool {
114+
self.clients
115+
.lock()
116+
.unwrap()
117+
.0
118+
.values()
119+
.any(|client| client.grabbed)
120+
}
121+
122+
/// Key grab exists for mods, key, with active virtual mods
123+
pub fn has_key_grab(&self, mods: u32, key: Keysym) -> bool {
124+
self.clients
125+
.lock()
126+
.unwrap()
127+
.0
128+
.values()
129+
.flat_map(|client| &client.key_grabs)
130+
.any(|grab| {
131+
grab.mods == mods
132+
&& grab.virtual_mods == self.active_virtual_mods
133+
&& grab.key == key
134+
})
107135
}
108136

109137
pub fn key_event(
@@ -139,7 +167,7 @@ impl A11yKeyboardMonitorState {
139167
let future = KeyboardMonitor::key_event(
140168
signal_context,
141169
released,
142-
modifiers.serialized.depressed,
170+
modifiers.serialized.layout_effective,
143171
keysym.modified_sym().raw(),
144172
unichar,
145173
keysym.raw_code().raw() as u16,
@@ -191,16 +219,16 @@ impl KeyboardMonitor {
191219
fn set_key_grabs(
192220
&self,
193221
#[zbus(header)] header: Header<'_>,
194-
virtual_modifiers: Vec<u32>,
222+
virtual_mods: Vec<u32>,
195223
keystrokes: Vec<(u32, u32)>,
196224
) {
197-
let virtual_modifiers = virtual_modifiers
225+
let virtual_mods = virtual_mods
198226
.into_iter()
199227
.map(Keysym::from)
200228
.collect::<Vec<_>>();
201229
let key_grabs = keystrokes
202230
.into_iter()
203-
.map(|(k, mods)| KeyGrab::new(&virtual_modifiers, Keysym::from(k), mods))
231+
.map(|(k, mods)| KeyGrab::new(&virtual_mods, Keysym::from(k), mods))
204232
.collect::<Vec<_>>();
205233

206234
if let Some(sender) = header.sender() {
@@ -209,9 +237,9 @@ impl KeyboardMonitor {
209237
eprintln!(
210238
"key grabs set by {}: {:?}",
211239
sender,
212-
(&virtual_modifiers, &key_grabs)
240+
(&virtual_mods, &key_grabs)
213241
);
214-
client.virtual_modifiers = virtual_modifiers.into_iter().collect::<HashSet<_>>();
242+
client.virtual_mods = virtual_mods.into_iter().collect::<HashSet<_>>();
215243
client.key_grabs = key_grabs;
216244
}
217245
}

src/input/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1804,10 +1804,15 @@ impl State {
18041804
}
18051805

18061806
if self.common.atspi_ei.has_keyboard_grab()
1807+
|| self.common.a11y_keyboard_monitor_state.has_keyboard_grab()
18071808
|| self
18081809
.common
18091810
.atspi_ei
18101811
.has_key_grab(modifiers.serialized.layout_effective, event.key_code())
1812+
|| self
1813+
.common
1814+
.a11y_keyboard_monitor_state
1815+
.has_key_grab(modifiers.serialized.layout_effective, handle.modified_sym())
18111816
{
18121817
return FilterResult::Intercept(None);
18131818
}

0 commit comments

Comments
 (0)