Compare commits

..

1 Commits

Author SHA1 Message Date
Ferdinand Schober
295be87a29 macos: fix duplicated key release event 2025-10-29 17:46:57 +01:00
2 changed files with 157 additions and 186 deletions

View File

@@ -40,7 +40,6 @@ struct InputCaptureState {
active_clients: Lazy<HashSet<Position>>,
current_pos: Option<Position>,
bounds: Bounds,
modifier_state: XMods,
}
#[derive(Debug)]
@@ -58,7 +57,6 @@ impl InputCaptureState {
active_clients: Lazy::new(HashSet::new),
current_pos: None,
bounds: Bounds::default(),
modifier_state: Default::default(),
};
res.update_bounds()?;
Ok(res)
@@ -182,7 +180,6 @@ fn get_events(
ev_type: &CGEventType,
ev: &CGEvent,
result: &mut Vec<CaptureEvent>,
modifier_state: &mut XMods,
) -> Result<(), CaptureError> {
fn map_pointer_event(ev: &CGEvent) -> PointerEvent {
PointerEvent::Motion {
@@ -218,42 +215,29 @@ fn get_events(
})));
}
CGEventType::FlagsChanged => {
let mut depressed = XMods::empty();
let mut mods = XMods::empty();
let mut mods_locked = XMods::empty();
let cg_flags = ev.get_flags();
if cg_flags.contains(CGEventFlags::CGEventFlagShift) {
depressed |= XMods::ShiftMask;
mods |= XMods::ShiftMask;
}
if cg_flags.contains(CGEventFlags::CGEventFlagControl) {
depressed |= XMods::ControlMask;
mods |= XMods::ControlMask;
}
if cg_flags.contains(CGEventFlags::CGEventFlagAlternate) {
depressed |= XMods::Mod1Mask;
mods |= XMods::Mod1Mask;
}
if cg_flags.contains(CGEventFlags::CGEventFlagCommand) {
depressed |= XMods::Mod4Mask;
mods |= XMods::Mod4Mask;
}
if cg_flags.contains(CGEventFlags::CGEventFlagAlphaShift) {
depressed |= XMods::LockMask;
mods |= XMods::LockMask;
mods_locked |= XMods::LockMask;
}
// check if pressed or released
let state = if depressed > *modifier_state { 1 } else { 0 };
*modifier_state = depressed;
if let Ok(key) = map_key(ev) {
let key_event = CaptureEvent::Input(Event::Keyboard(KeyboardEvent::Key {
time: 0,
key,
state,
}));
result.push(key_event);
}
let modifier_event = KeyboardEvent::Modifiers {
depressed: depressed.bits(),
depressed: mods.bits(),
latched: 0,
locked: mods_locked.bits(),
group: 0,
@@ -382,13 +366,7 @@ fn create_event_tap<'a>(
// Are we in a client?
if let Some(current_pos) = state.current_pos {
pos = Some(current_pos);
get_events(
&event_type,
cg_ev,
&mut res_events,
&mut state.modifier_state,
)
.unwrap_or_else(|e| {
get_events(&event_type, cg_ev, &mut res_events).unwrap_or_else(|e| {
log::error!("Failed to get events: {e}");
});

View File

@@ -88,7 +88,7 @@ impl MacOSEmulation {
button_state,
previous_button: None,
previous_button_click: None,
button_click_state: 0,
button_click_state: 1,
repeat_task: None,
notify_repeat_task: Arc::new(Notify::new()),
modifier_state: Rc::new(Cell::new(XMods::empty())),
@@ -244,8 +244,7 @@ impl Emulation for MacOSEmulation {
) -> Result<(), EmulationError> {
log::trace!("{event:?}");
match event {
Event::Pointer(pointer_event) => {
match pointer_event {
Event::Pointer(pointer_event) => match pointer_event {
PointerEvent::Motion { time: _, dx, dy } => {
let mut mouse_location = match self.get_mouse_location() {
Some(l) => l,
@@ -396,13 +395,7 @@ impl Emulation for MacOSEmulation {
};
event.post(CGEventTapLocation::HID);
}
}
// reset button click state in case it's not a button event
if !matches!(pointer_event, PointerEvent::Button { .. }) {
self.button_click_state = 0;
}
}
},
Event::Keyboard(keyboard_event) => match keyboard_event {
KeyboardEvent::Key {
time: _,