Skip to content

Commit fec4617

Browse files
committed
Distinguish emulated input and user input (Bug #110)
1 parent 8e774f6 commit fec4617

5 files changed

Lines changed: 101 additions & 89 deletions

File tree

demo/demo_hook.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ static void logger(unsigned int level, const char *format, ...) {
5959
void dispatch_proc(uiohook_event * const event, void *user_data) {
6060
char buffer[256] = { 0 };
6161
size_t length = snprintf(buffer, sizeof(buffer),
62-
"id=%i,when=%" PRIu64 ",mask=0x%X",
62+
"id=%i,when=%" PRIu64 ",mask=0x%X",
6363
event->type, event->time, event->mask);
6464

6565
switch (event->type) {

include/uiohook.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,7 @@ typedef struct _mouse_wheel_event_data {
117117
typedef struct _uiohook_event {
118118
event_type type;
119119
uint64_t time;
120-
uint16_t mask;
121-
uint16_t reserved;
120+
uint32_t mask;
122121
union {
123122
keyboard_event_data keyboard;
124123
mouse_event_data mouse;
@@ -453,6 +452,9 @@ typedef void (*dispatcher_t)(uiohook_event * const, void *);
453452
#define MASK_NUM_LOCK 1 << 13
454453
#define MASK_CAPS_LOCK 1 << 14
455454
#define MASK_SCROLL_LOCK 1 << 15
455+
456+
#define MASK_EMULATED 1 << 30
457+
#define MASK_CONSUME 1 << 31
456458
/* End Virtual Modifier Masks */
457459

458460

src/darwin/dispatch_event.c

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,12 @@ bool dispatch_hook_enabled(uint64_t timestamp) {
7777

7878
// Populate the hook start event.
7979
uio_event.time = timestamp;
80-
uio_event.reserved = 0x00;
81-
8280
uio_event.type = EVENT_HOOK_ENABLED;
8381
uio_event.mask = 0x00;
8482

8583
// Fire the hook start event.
8684
dispatch_event(&uio_event);
87-
consumed = uio_event.reserved & 0x01;
85+
consumed = uio_event.mask & MASK_CONSUME;
8886

8987
return consumed;
9088
}
@@ -94,8 +92,6 @@ bool dispatch_hook_disabled(uint64_t timestamp) {
9492

9593
// Populate the hook stop event.
9694
uio_event.time = timestamp;
97-
uio_event.reserved = 0x00;
98-
9995
uio_event.type = EVENT_HOOK_DISABLED;
10096
uio_event.mask = 0x00;
10197

@@ -104,7 +100,7 @@ bool dispatch_hook_disabled(uint64_t timestamp) {
104100

105101
// Deinitialize native input helper functions.
106102
unload_input_helper();
107-
consumed = uio_event.reserved & 0x01;
103+
consumed = uio_event.mask & MASK_CONSUME;
108104

109105
return consumed;
110106
}
@@ -116,10 +112,11 @@ bool dispatch_key_press(uint64_t timestamp, CGEventRef event_ref) {
116112

117113
// Populate key pressed event.
118114
uio_event.time = timestamp;
119-
uio_event.reserved = 0x00;
120-
121115
uio_event.type = EVENT_KEY_PRESSED;
122116
uio_event.mask = get_modifiers();
117+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
118+
uio_event.mask |= MASK_EMULATED;
119+
}
123120

124121
uio_event.data.keyboard.keycode = keycode_to_scancode(keycode);
125122
uio_event.data.keyboard.rawcode = keycode;
@@ -131,7 +128,7 @@ bool dispatch_key_press(uint64_t timestamp, CGEventRef event_ref) {
131128

132129
// Fire key pressed event.
133130
dispatch_event(&uio_event);
134-
consumed = uio_event.reserved & 0x01;
131+
consumed = uio_event.mask & MASK_CONSUME;
135132

136133
// If the pressed event was not consumed...
137134
if (!consumed) {
@@ -141,10 +138,11 @@ bool dispatch_key_press(uint64_t timestamp, CGEventRef event_ref) {
141138
for (unsigned int i = 0; i < length; i++) {
142139
// Populate key typed event.
143140
uio_event.time = timestamp;
144-
uio_event.reserved = 0x00;
145-
146141
uio_event.type = EVENT_KEY_TYPED;
147142
uio_event.mask = get_modifiers();
143+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
144+
uio_event.mask |= MASK_EMULATED;
145+
}
148146

149147
uio_event.data.keyboard.keycode = VC_UNDEFINED;
150148
uio_event.data.keyboard.rawcode = keycode;
@@ -157,7 +155,7 @@ bool dispatch_key_press(uint64_t timestamp, CGEventRef event_ref) {
157155

158156
// Populate key typed event.
159157
dispatch_event(&uio_event);
160-
consumed = uio_event.reserved & 0x01;
158+
consumed = uio_event.mask & MASK_CONSUME;
161159
}
162160
}
163161

@@ -171,10 +169,11 @@ bool dispatch_key_release(uint64_t timestamp, CGEventRef event_ref) {
171169

172170
// Populate key released event.
173171
uio_event.time = timestamp;
174-
uio_event.reserved = 0x00;
175-
176172
uio_event.type = EVENT_KEY_RELEASED;
177173
uio_event.mask = get_modifiers();
174+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
175+
uio_event.mask |= MASK_EMULATED;
176+
}
178177

179178
uio_event.data.keyboard.keycode = keycode_to_scancode(keycode);
180179
uio_event.data.keyboard.rawcode = keycode;
@@ -186,7 +185,7 @@ bool dispatch_key_release(uint64_t timestamp, CGEventRef event_ref) {
186185

187186
// Fire key released event.
188187
dispatch_event(&uio_event);
189-
consumed = uio_event.reserved & 0x01;
188+
consumed = uio_event.mask & MASK_CONSUME;
190189

191190
return consumed;
192191
}
@@ -469,10 +468,11 @@ bool dispatch_button_press(uint64_t timestamp, CGEventRef event_ref, uint16_t bu
469468

470469
// Populate mouse pressed event.
471470
uio_event.time = timestamp;
472-
uio_event.reserved = 0x00;
473-
474471
uio_event.type = EVENT_MOUSE_PRESSED;
475472
uio_event.mask = get_modifiers();
473+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
474+
uio_event.mask |= MASK_EMULATED;
475+
}
476476

477477
uio_event.data.mouse.button = button;
478478
uio_event.data.mouse.clicks = click_count;
@@ -486,7 +486,7 @@ bool dispatch_button_press(uint64_t timestamp, CGEventRef event_ref, uint16_t bu
486486

487487
// Fire mouse pressed event.
488488
dispatch_event(&uio_event);
489-
consumed = uio_event.reserved & 0x01;
489+
consumed = uio_event.mask & MASK_CONSUME;
490490

491491
return consumed;
492492
}
@@ -498,10 +498,11 @@ bool dispatch_button_release(uint64_t timestamp, CGEventRef event_ref, uint16_t
498498

499499
// Populate mouse released event.
500500
uio_event.time = timestamp;
501-
uio_event.reserved = 0x00;
502-
503501
uio_event.type = EVENT_MOUSE_RELEASED;
504502
uio_event.mask = get_modifiers();
503+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
504+
uio_event.mask |= MASK_EMULATED;
505+
}
505506

506507
uio_event.data.mouse.button = button;
507508
uio_event.data.mouse.clicks = click_count;
@@ -515,16 +516,17 @@ bool dispatch_button_release(uint64_t timestamp, CGEventRef event_ref, uint16_t
515516

516517
// Fire mouse released event.
517518
dispatch_event(&uio_event);
518-
consumed = uio_event.reserved & 0x01;
519+
consumed = uio_event.mask & MASK_CONSUME;
519520

520521
// If the pressed event was not consumed...
521-
if (uio_event.reserved ^ 0x01 && !is_mouse_dragged()) {
522+
if (!consumed && !is_mouse_dragged()) {
522523
// Populate mouse clicked event.
523524
uio_event.time = timestamp;
524-
uio_event.reserved = 0x00;
525-
526525
uio_event.type = EVENT_MOUSE_CLICKED;
527526
uio_event.mask = get_modifiers();
527+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
528+
uio_event.mask |= MASK_EMULATED;
529+
}
528530

529531
uio_event.data.mouse.button = button;
530532
uio_event.data.mouse.clicks = click_count;
@@ -538,7 +540,7 @@ bool dispatch_button_release(uint64_t timestamp, CGEventRef event_ref, uint16_t
538540

539541
// Fire mouse clicked event.
540542
dispatch_event(&uio_event);
541-
consumed = uio_event.reserved & 0x01; // TODO Should we track this flag for consumed events?
543+
consumed = uio_event.mask & MASK_CONSUME; // TODO Should we track this flag for consumed events?
542544
}
543545

544546
// Reset the number of clicks.
@@ -562,15 +564,16 @@ bool dispatch_mouse_move(uint64_t timestamp, CGEventRef event_ref) {
562564

563565
// Populate mouse motion event.
564566
uio_event.time = timestamp;
565-
uio_event.reserved = 0x00;
566-
567567
if (is_mouse_dragged()) {
568568
uio_event.type = EVENT_MOUSE_DRAGGED;
569569
}
570570
else {
571571
uio_event.type = EVENT_MOUSE_MOVED;
572572
}
573573
uio_event.mask = get_modifiers();
574+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
575+
uio_event.mask |= MASK_EMULATED;
576+
}
574577

575578
uio_event.data.mouse.button = MOUSE_NOBUTTON;
576579
uio_event.data.mouse.clicks = click_count;
@@ -583,14 +586,14 @@ bool dispatch_mouse_move(uint64_t timestamp, CGEventRef event_ref) {
583586

584587
// Fire mouse motion event.
585588
dispatch_event(&uio_event);
586-
consumed = uio_event.reserved & 0x01;
589+
consumed = uio_event.mask & MASK_CONSUME;
587590

588591
return consumed;
589592
}
590593

591594
bool dispatch_mouse_wheel(uint64_t timestamp, CGEventRef event_ref) {
592595
bool consumed = false;
593-
596+
594597
// Reset the click count and previous button.
595598
click_count = 0;
596599
click_button = MOUSE_NOBUTTON;
@@ -603,10 +606,11 @@ bool dispatch_mouse_wheel(uint64_t timestamp, CGEventRef event_ref) {
603606

604607
// Populate mouse wheel event.
605608
uio_event.time = timestamp;
606-
uio_event.reserved = 0x00;
607-
608609
uio_event.type = EVENT_MOUSE_WHEEL;
609610
uio_event.mask = get_modifiers();
611+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
612+
uio_event.mask |= MASK_EMULATED;
613+
}
610614

611615
uio_event.data.wheel.x = event_point.x;
612616
uio_event.data.wheel.y = event_point.y;
@@ -665,7 +669,7 @@ bool dispatch_mouse_wheel(uint64_t timestamp, CGEventRef event_ref) {
665669

666670
// Fire mouse wheel event.
667671
dispatch_event(&uio_event);
668-
consumed = uio_event.reserved & 0x01;
672+
consumed = uio_event.mask & MASK_CONSUME;
669673
}
670674

671675
return consumed;

0 commit comments

Comments
 (0)