Skip to content

Commit

Permalink
livesplit-hotkey: Support consuming on macOS
Browse files Browse the repository at this point in the history
  • Loading branch information
tmandry committed Jan 19, 2024
1 parent 655b2ec commit 30d8d45
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
1 change: 1 addition & 0 deletions crates/livesplit-hotkey/src/macos/cg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ bitflags::bitflags! {
#[link(name = "CoreGraphics", kind = "framework")]
extern "C" {
pub fn CGEventGetFlags(event: EventRef) -> EventFlags;
pub fn CGEventSetType(event: EventRef, event_type: EventType);

pub fn CGEventTapCreate(
tap: EventTapLocation,
Expand Down
23 changes: 17 additions & 6 deletions crates/livesplit-hotkey/src/macos/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ use self::{
},
};
use crate::{ConsumePreference, Hotkey, KeyCode, Modifiers, Result};
use core::ptr::null_mut;
use std::{
collections::{hash_map::Entry, HashMap},
ffi::c_void,
Expand Down Expand Up @@ -97,9 +98,10 @@ impl Drop for Hook {

impl Hook {
pub fn new(consume: ConsumePreference) -> Result<Self> {
if matches!(consume, ConsumePreference::MustConsume) {
return Err(crate::Error::UnmatchedPreference);
}
let is_consuming = matches!(
consume,
ConsumePreference::PreferConsume | ConsumePreference::MustConsume,
);

let state = Arc::new(State {
hotkeys: Mutex::new(HashMap::new()),
Expand All @@ -124,7 +126,11 @@ impl Hook {
let port = CGEventTapCreate(
EventTapLocation::SESSION,
EventTapPlacement::HEAD_INSERT_EVENT_TAP,
EventTapOptions::DEFAULT_TAP,
if is_consuming {
EventTapOptions::DEFAULT_TAP
} else {
EventTapOptions::LISTEN_ONLY
},
EventMask::KEY_DOWN,
Some(callback),
state_ptr as *mut c_void,
Expand Down Expand Up @@ -479,7 +485,12 @@ unsafe extern "C" fn callback(
.get_mut(&key_code.with_modifiers(modifiers))
{
callback();
}

event
// If we handled the event and the hook is consuming, we should return
// null so the system deletes the event. If the hook is not consuming
// the return value will be ignored, so return null anyway.
null_mut()
} else {
event
}
}

0 comments on commit 30d8d45

Please sign in to comment.