Skip to content

Commit 138c43f

Browse files
committed
macos: fix modifier capture
1 parent f91b6bd commit 138c43f

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

input-capture/src/macos.rs

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct InputCaptureState {
4040
active_clients: Lazy<HashSet<Position>>,
4141
current_pos: Option<Position>,
4242
bounds: Bounds,
43+
modifier_state: XMods,
4344
}
4445

4546
#[derive(Debug)]
@@ -57,6 +58,7 @@ impl InputCaptureState {
5758
active_clients: Lazy::new(HashSet::new),
5859
current_pos: None,
5960
bounds: Bounds::default(),
61+
modifier_state: Default::default(),
6062
};
6163
res.update_bounds()?;
6264
Ok(res)
@@ -180,6 +182,7 @@ fn get_events(
180182
ev_type: &CGEventType,
181183
ev: &CGEvent,
182184
result: &mut Vec<CaptureEvent>,
185+
modifier_state: &mut XMods,
183186
) -> Result<(), CaptureError> {
184187
fn map_pointer_event(ev: &CGEvent) -> PointerEvent {
185188
PointerEvent::Motion {
@@ -215,29 +218,42 @@ fn get_events(
215218
})));
216219
}
217220
CGEventType::FlagsChanged => {
218-
let mut mods = XMods::empty();
221+
let mut depressed = XMods::empty();
219222
let mut mods_locked = XMods::empty();
220223
let cg_flags = ev.get_flags();
221224

222225
if cg_flags.contains(CGEventFlags::CGEventFlagShift) {
223-
mods |= XMods::ShiftMask;
226+
depressed |= XMods::ShiftMask;
224227
}
225228
if cg_flags.contains(CGEventFlags::CGEventFlagControl) {
226-
mods |= XMods::ControlMask;
229+
depressed |= XMods::ControlMask;
227230
}
228231
if cg_flags.contains(CGEventFlags::CGEventFlagAlternate) {
229-
mods |= XMods::Mod1Mask;
232+
depressed |= XMods::Mod1Mask;
230233
}
231234
if cg_flags.contains(CGEventFlags::CGEventFlagCommand) {
232-
mods |= XMods::Mod4Mask;
235+
depressed |= XMods::Mod4Mask;
233236
}
234237
if cg_flags.contains(CGEventFlags::CGEventFlagAlphaShift) {
235-
mods |= XMods::LockMask;
238+
depressed |= XMods::LockMask;
236239
mods_locked |= XMods::LockMask;
237240
}
238241

242+
// check if pressed or released
243+
let state = if depressed > *modifier_state { 1 } else { 0 };
244+
*modifier_state = depressed;
245+
246+
if let Ok(key) = map_key(ev) {
247+
let key_event = CaptureEvent::Input(Event::Keyboard(KeyboardEvent::Key {
248+
time: 0,
249+
key,
250+
state,
251+
}));
252+
result.push(key_event);
253+
}
254+
239255
let modifier_event = KeyboardEvent::Modifiers {
240-
depressed: mods.bits(),
256+
depressed: depressed.bits(),
241257
latched: 0,
242258
locked: mods_locked.bits(),
243259
group: 0,
@@ -366,7 +382,13 @@ fn create_event_tap<'a>(
366382
// Are we in a client?
367383
if let Some(current_pos) = state.current_pos {
368384
pos = Some(current_pos);
369-
get_events(&event_type, cg_ev, &mut res_events).unwrap_or_else(|e| {
385+
get_events(
386+
&event_type,
387+
cg_ev,
388+
&mut res_events,
389+
&mut state.modifier_state,
390+
)
391+
.unwrap_or_else(|e| {
370392
log::error!("Failed to get events: {e}");
371393
});
372394

0 commit comments

Comments
 (0)