Skip to content

Commit 99a6851

Browse files
committed
Distinguish emulated input and user input. Fixes #110
1 parent 0d3ba3b commit 99a6851

File tree

5 files changed

+85
-75
lines changed

5 files changed

+85
-75
lines changed

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_CONSUMED 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
@@ -74,14 +74,12 @@ bool dispatch_hook_enabled(uint64_t timestamp) {
7474

7575
// Populate the hook start event.
7676
uio_event.time = timestamp;
77-
uio_event.reserved = 0x00;
78-
7977
uio_event.type = EVENT_HOOK_ENABLED;
8078
uio_event.mask = 0x00;
8179

8280
// Fire the hook start event.
8381
dispatch_event(&uio_event);
84-
consumed = uio_event.reserved & 0x01;
82+
consumed = uio_event.mask & MASK_CONSUMED;
8583

8684
return consumed;
8785
}
@@ -91,8 +89,6 @@ bool dispatch_hook_disabled(uint64_t timestamp) {
9189

9290
// Populate the hook stop event.
9391
uio_event.time = timestamp;
94-
uio_event.reserved = 0x00;
95-
9692
uio_event.type = EVENT_HOOK_DISABLED;
9793
uio_event.mask = 0x00;
9894

@@ -101,7 +97,7 @@ bool dispatch_hook_disabled(uint64_t timestamp) {
10197

10298
// Deinitialize native input helper functions.
10399
unload_input_helper();
104-
consumed = uio_event.reserved & 0x01;
100+
consumed = uio_event.mask & MASK_CONSUMED;
105101

106102
return consumed;
107103
}
@@ -113,10 +109,11 @@ bool dispatch_key_press(uint64_t timestamp, CGEventRef event_ref) {
113109

114110
// Populate key pressed event.
115111
uio_event.time = timestamp;
116-
uio_event.reserved = 0x00;
117-
118112
uio_event.type = EVENT_KEY_PRESSED;
119113
uio_event.mask = get_modifiers();
114+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
115+
uio_event.mask |= MASK_EMULATED;
116+
}
120117

121118
uio_event.data.keyboard.keycode = keycode_to_scancode(keycode);
122119
uio_event.data.keyboard.rawcode = keycode;
@@ -128,7 +125,7 @@ bool dispatch_key_press(uint64_t timestamp, CGEventRef event_ref) {
128125

129126
// Fire key pressed event.
130127
dispatch_event(&uio_event);
131-
consumed = uio_event.reserved & 0x01;
128+
consumed = uio_event.mask & MASK_CONSUMED;
132129

133130
// If the pressed event was not consumed...
134131
if (!consumed) {
@@ -138,10 +135,11 @@ bool dispatch_key_press(uint64_t timestamp, CGEventRef event_ref) {
138135
for (unsigned int i = 0; i < length; i++) {
139136
// Populate key typed event.
140137
uio_event.time = timestamp;
141-
uio_event.reserved = 0x00;
142-
143138
uio_event.type = EVENT_KEY_TYPED;
144139
uio_event.mask = get_modifiers();
140+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
141+
uio_event.mask |= MASK_EMULATED;
142+
}
145143

146144
uio_event.data.keyboard.keycode = VC_UNDEFINED;
147145
uio_event.data.keyboard.rawcode = keycode;
@@ -154,7 +152,7 @@ bool dispatch_key_press(uint64_t timestamp, CGEventRef event_ref) {
154152

155153
// Populate key typed event.
156154
dispatch_event(&uio_event);
157-
consumed = uio_event.reserved & 0x01;
155+
consumed = uio_event.mask & MASK_CONSUMED;
158156
}
159157
}
160158

@@ -168,10 +166,11 @@ bool dispatch_key_release(uint64_t timestamp, CGEventRef event_ref) {
168166

169167
// Populate key released event.
170168
uio_event.time = timestamp;
171-
uio_event.reserved = 0x00;
172-
173169
uio_event.type = EVENT_KEY_RELEASED;
174170
uio_event.mask = get_modifiers();
171+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
172+
uio_event.mask |= MASK_EMULATED;
173+
}
175174

176175
uio_event.data.keyboard.keycode = keycode_to_scancode(keycode);
177176
uio_event.data.keyboard.rawcode = keycode;
@@ -183,7 +182,7 @@ bool dispatch_key_release(uint64_t timestamp, CGEventRef event_ref) {
183182

184183
// Fire key released event.
185184
dispatch_event(&uio_event);
186-
consumed = uio_event.reserved & 0x01;
185+
consumed = uio_event.mask & MASK_CONSUMED;
187186

188187
return consumed;
189188
}
@@ -466,10 +465,11 @@ bool dispatch_button_press(uint64_t timestamp, CGEventRef event_ref, uint16_t bu
466465

467466
// Populate mouse pressed event.
468467
uio_event.time = timestamp;
469-
uio_event.reserved = 0x00;
470-
471468
uio_event.type = EVENT_MOUSE_PRESSED;
472469
uio_event.mask = get_modifiers();
470+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
471+
uio_event.mask |= MASK_EMULATED;
472+
}
473473

474474
uio_event.data.mouse.button = button;
475475
uio_event.data.mouse.clicks = click_count;
@@ -483,7 +483,7 @@ bool dispatch_button_press(uint64_t timestamp, CGEventRef event_ref, uint16_t bu
483483

484484
// Fire mouse pressed event.
485485
dispatch_event(&uio_event);
486-
consumed = uio_event.reserved & 0x01;
486+
consumed = uio_event.mask & MASK_CONSUMED;
487487

488488
return consumed;
489489
}
@@ -495,10 +495,11 @@ bool dispatch_button_release(uint64_t timestamp, CGEventRef event_ref, uint16_t
495495

496496
// Populate mouse released event.
497497
uio_event.time = timestamp;
498-
uio_event.reserved = 0x00;
499-
500498
uio_event.type = EVENT_MOUSE_RELEASED;
501499
uio_event.mask = get_modifiers();
500+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
501+
uio_event.mask |= MASK_EMULATED;
502+
}
502503

503504
uio_event.data.mouse.button = button;
504505
uio_event.data.mouse.clicks = click_count;
@@ -512,16 +513,17 @@ bool dispatch_button_release(uint64_t timestamp, CGEventRef event_ref, uint16_t
512513

513514
// Fire mouse released event.
514515
dispatch_event(&uio_event);
515-
consumed = uio_event.reserved & 0x01;
516+
consumed = uio_event.mask & MASK_CONSUMED;
516517

517518
// If the pressed event was not consumed...
518-
if (uio_event.reserved ^ 0x01 && !is_mouse_dragged()) {
519+
if (!consumed && !is_mouse_dragged()) {
519520
// Populate mouse clicked event.
520521
uio_event.time = timestamp;
521-
uio_event.reserved = 0x00;
522-
523522
uio_event.type = EVENT_MOUSE_CLICKED;
524523
uio_event.mask = get_modifiers();
524+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
525+
uio_event.mask |= MASK_EMULATED;
526+
}
525527

526528
uio_event.data.mouse.button = button;
527529
uio_event.data.mouse.clicks = click_count;
@@ -535,7 +537,7 @@ bool dispatch_button_release(uint64_t timestamp, CGEventRef event_ref, uint16_t
535537

536538
// Fire mouse clicked event.
537539
dispatch_event(&uio_event);
538-
consumed = uio_event.reserved & 0x01; // TODO Should we track this flag for consumed events?
540+
consumed = uio_event.mask & MASK_CONSUMED;
539541
}
540542

541543
// Reset the number of clicks.
@@ -559,15 +561,16 @@ bool dispatch_mouse_move(uint64_t timestamp, CGEventRef event_ref) {
559561

560562
// Populate mouse motion event.
561563
uio_event.time = timestamp;
562-
uio_event.reserved = 0x00;
563-
564564
if (is_mouse_dragged()) {
565565
uio_event.type = EVENT_MOUSE_DRAGGED;
566566
}
567567
else {
568568
uio_event.type = EVENT_MOUSE_MOVED;
569569
}
570570
uio_event.mask = get_modifiers();
571+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
572+
uio_event.mask |= MASK_EMULATED;
573+
}
571574

572575
uio_event.data.mouse.button = MOUSE_NOBUTTON;
573576
uio_event.data.mouse.clicks = click_count;
@@ -580,14 +583,14 @@ bool dispatch_mouse_move(uint64_t timestamp, CGEventRef event_ref) {
580583

581584
// Fire mouse motion event.
582585
dispatch_event(&uio_event);
583-
consumed = uio_event.reserved & 0x01;
586+
consumed = uio_event.mask & MASK_CONSUMED;
584587

585588
return consumed;
586589
}
587590

588591
bool dispatch_mouse_wheel(uint64_t timestamp, CGEventRef event_ref) {
589592
bool consumed = false;
590-
593+
591594
// Reset the click count and previous button.
592595
click_count = 0;
593596
click_button = MOUSE_NOBUTTON;
@@ -600,10 +603,11 @@ bool dispatch_mouse_wheel(uint64_t timestamp, CGEventRef event_ref) {
600603

601604
// Populate mouse wheel event.
602605
uio_event.time = timestamp;
603-
uio_event.reserved = 0x00;
604-
605606
uio_event.type = EVENT_MOUSE_WHEEL;
606607
uio_event.mask = get_modifiers();
608+
if (CGEventGetIntegerValueField(event_ref, kCGEventSourceUnixProcessID)) {
609+
uio_event.mask |= MASK_EMULATED;
610+
}
607611

608612
uio_event.data.wheel.x = event_point.x;
609613
uio_event.data.wheel.y = event_point.y;
@@ -662,7 +666,7 @@ bool dispatch_mouse_wheel(uint64_t timestamp, CGEventRef event_ref) {
662666

663667
// Fire mouse wheel event.
664668
dispatch_event(&uio_event);
665-
consumed = uio_event.reserved & 0x01;
669+
consumed = uio_event.mask & MASK_CONSUMED;
666670
}
667671

668672
return consumed;

src/windows/dispatch_event.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ bool dispatch_hook_enable(uint64_t timestamp) {
8585

8686
// Fire the hook start event.
8787
dispatch_event(&uio_event);
88-
consumed = uio_event.mask & MASK_CONSUME;
88+
consumed = uio_event.mask & MASK_CONSUMED;
8989

9090
return consumed;
9191
}
@@ -100,7 +100,7 @@ bool dispatch_hook_disable(uint64_t timestamp) {
100100

101101
// Fire the hook stop event.
102102
dispatch_event(&uio_event);
103-
consumed = uio_event.mask & MASK_CONSUME;
103+
consumed = uio_event.mask & MASK_CONSUMED;
104104

105105
return consumed;
106106
}
@@ -139,7 +139,7 @@ bool dispatch_key_press(uint64_t timestamp, KBDLLHOOKSTRUCT *kbhook) {
139139

140140
// Populate key pressed event.
141141
dispatch_event(&uio_event);
142-
consumed = uio_event.mask & MASK_CONSUME;
142+
consumed = uio_event.mask & MASK_CONSUMED;
143143

144144
// If the pressed event was not consumed...
145145
if (!consumed) {
@@ -167,7 +167,7 @@ bool dispatch_key_press(uint64_t timestamp, KBDLLHOOKSTRUCT *kbhook) {
167167

168168
// Fire key typed event.
169169
dispatch_event(&uio_event);
170-
consumed = uio_event.mask & MASK_CONSUME;
170+
consumed = uio_event.mask & MASK_CONSUMED;
171171
}
172172
}
173173

@@ -208,7 +208,7 @@ bool dispatch_key_release(uint64_t timestamp, KBDLLHOOKSTRUCT *kbhook) {
208208

209209
// Fire key released event.
210210
dispatch_event(&uio_event);
211-
consumed = uio_event.mask & MASK_CONSUME;
211+
consumed = uio_event.mask & MASK_CONSUMED;
212212

213213
return consumed;
214214
}
@@ -260,7 +260,7 @@ bool dispatch_button_press(uint64_t timestamp, MSLLHOOKSTRUCT *mshook, uint16_t
260260

261261
// Fire mouse pressed event.
262262
dispatch_event(&uio_event);
263-
consumed = uio_event.mask & MASK_CONSUME;
263+
consumed = uio_event.mask & MASK_CONSUMED;
264264

265265
return consumed;
266266
}
@@ -289,7 +289,7 @@ bool dispatch_button_release(uint64_t timestamp, MSLLHOOKSTRUCT *mshook, uint16_
289289

290290
// Fire mouse released event.
291291
dispatch_event(&uio_event);
292-
consumed = uio_event.mask & MASK_CONSUME;
292+
consumed = uio_event.mask & MASK_CONSUMED;
293293

294294
// If the pressed event was not consumed...
295295
if (!consumed && last_click.x == mshook->pt.x && last_click.y == mshook->pt.y) {
@@ -313,7 +313,7 @@ bool dispatch_button_release(uint64_t timestamp, MSLLHOOKSTRUCT *mshook, uint16_
313313

314314
// Fire mouse clicked event.
315315
dispatch_event(&uio_event);
316-
consumed = uio_event.mask & MASK_CONSUME;
316+
consumed = uio_event.mask & MASK_CONSUMED;
317317
}
318318

319319
// Reset the number of clicks.
@@ -366,7 +366,7 @@ bool dispatch_mouse_move(uint64_t timestamp, MSLLHOOKSTRUCT *mshook) {
366366

367367
// Fire mouse move event.
368368
dispatch_event(&uio_event);
369-
consumed = uio_event.mask & MASK_CONSUME;
369+
consumed = uio_event.mask & MASK_CONSUMED;
370370
}
371371

372372
return consumed;
@@ -432,7 +432,7 @@ bool dispatch_mouse_wheel(uint64_t timestamp, MSLLHOOKSTRUCT *mshook, uint8_t di
432432

433433
// Fire mouse wheel event.
434434
dispatch_event(&uio_event);
435-
consumed = uio_event.mask & MASK_CONSUME;
435+
consumed = uio_event.mask & MASK_CONSUMED;
436436
} else {
437437
logger(LOG_LEVEL_WARN, "%s [%u]: SystemParametersInfo() failed, event will be consumed.\n",
438438
__FUNCTION__, __LINE__);

0 commit comments

Comments
 (0)