// Retrigger the last-pressed key void _keyretrigger(usbdevice* kb){ int scancode = kb->lastkeypress; postevent_kp(kb->event, kb->modifiers, scancode, 1, 0, 1); // Set next key repeat time long repeat = repeattime(kb->event, 0); if(repeat > 0) timespec_add(&kb->keyrepeat, repeat); else kb->lastkeypress = KEY_NONE; }
void os_keypress(usbdevice* kb, int scancode, int down){ // Check for modifier keys and update flags int flags = 0; // Keep a separate list of left/right side modifiers - combine them below IOOptionBits* side = (scancode == KEY_RIGHTSHIFT || scancode == KEY_RIGHTCTRL || scancode == KEY_RIGHTMETA || scancode == KEY_RIGHTALT) ? &kb->rflags : &kb->lflags; CGEventFlags mod = 0; if(scancode == KEY_CAPSLOCK){ if(down) kb->lflags ^= NX_ALPHASHIFTMASK; flags = 1; } else if(scancode == KEY_LEFTSHIFT || scancode == KEY_RIGHTSHIFT){ mod = NX_SHIFTMASK; mod |= (scancode == KEY_LEFTSHIFT) ? NX_DEVICELSHIFTKEYMASK : NX_DEVICERSHIFTKEYMASK; flags = 1; } else if(scancode == KEY_LEFTCTRL || scancode == KEY_RIGHTCTRL){ mod = NX_CONTROLMASK; mod |= (scancode == KEY_LEFTCTRL) ? NX_DEVICELCTLKEYMASK : NX_DEVICERCTLKEYMASK; flags = 1; } else if(scancode == KEY_LEFTMETA || scancode == KEY_RIGHTMETA){ mod = NX_COMMANDMASK; mod |= (scancode == KEY_LEFTMETA) ? NX_DEVICELCMDKEYMASK : NX_DEVICERCMDKEYMASK; flags = 1; } else if(scancode == KEY_LEFTALT || scancode == KEY_RIGHTALT){ mod = NX_ALTERNATEMASK; mod |= (scancode == KEY_LEFTALT) ? NX_DEVICELALTKEYMASK : NX_DEVICERALTKEYMASK; flags = 1; } if(flags){ // Update flags when a modifier key is pressed if(down) *side |= mod; else *side &= ~mod; kb->eventflags = kb->lflags | kb->rflags; kb->lastkeypress = KEY_NONE; } else { // For any other key, trigger key repeat if(down){ long repeat = repeattime(kb->event, 1); if(repeat > 0){ kb->lastkeypress = scancode; clock_gettime(CLOCK_MONOTONIC, &kb->keyrepeat); timespec_add(&kb->keyrepeat, repeat); } else kb->lastkeypress = KEY_NONE; } else kb->lastkeypress = KEY_NONE; } postevent(kb->event, kb->eventflags, scancode, down, flags, 0); }
void keyretrigger(usbdevice* kb){ int scancode = kb->lastkeypress; if(scancode < 0) return; // Retrigger the last-pressed key postevent(kb->event, kb->eventflags, scancode, 1, 0, 1); // Set next key repeat time long repeat = repeattime(kb->event, 0); if(repeat > 0) timespec_add(&kb->keyrepeat, repeat); else kb->lastkeypress = KEY_NONE; }
void os_keypress(usbdevice* kb, int scancode, int down){ if(scancode & SCAN_MOUSE){ if(scancode == BTN_WHEELUP){ if(down) postevent_wheel(kb->event, !!(kb->features & FEAT_MOUSEACCEL), 1); return; } else if(scancode == BTN_WHEELDOWN){ if(down) postevent_wheel(kb->event, !!(kb->features & FEAT_MOUSEACCEL), -1); return; } int button = scancode & ~SCAN_MOUSE; // Reverse or collapse left/right buttons if the system preferences say so int mode; if(IOHIDGetMouseButtonMode(kb->event, &mode) == kIOReturnSuccess){ if(mode == kIOHIDButtonMode_ReverseLeftRightClicks && button == 0) button = 1; else if(mode != kIOHIDButtonMode_EnableRightClick && button == 1) button = 0; } postevent_mb(kb->event, button, down); if(down) kb->mousestate |= (1 << button); else kb->mousestate &= ~(1 << button); return; } // Some boneheaded Apple engineers decided to reverse kVK_ANSI_Grave and kVK_ISO_Section on the 105-key layouts... if(!HAS_ANY_FEATURE(kb, FEAT_LMASK)){ // If the layout hasn't been set yet, it can be auto-detected from certain keys if(scancode == KEY_BACKSLASH_ISO || scancode == KEY_102ND) kb->features |= FEAT_ISO; else if(scancode == KEY_BACKSLASH) kb->features |= FEAT_ANSI; } if(scancode == KEY_BACKSLASH_ISO) scancode = KEY_BACKSLASH; if(HAS_FEATURES(kb, FEAT_ISO)){ // Compensate for key reversal if(scancode == KEY_GRAVE) scancode = KEY_102ND; else if(scancode == KEY_102ND) scancode = KEY_GRAVE; } // Check for modifier keys and update flags int isMod = 0; IOOptionBits mod = 0; if(scancode == KEY_CAPSLOCK){ if(down) kb->modifiers ^= NX_ALPHASHIFTMASK; isMod = 1; } else if(scancode == KEY_LEFTSHIFT) mod = NX_DEVICELSHIFTKEYMASK; else if(scancode == KEY_RIGHTSHIFT) mod = NX_DEVICERSHIFTKEYMASK; else if(scancode == KEY_LEFTCTRL) mod = NX_DEVICELCTLKEYMASK; else if(scancode == KEY_RIGHTCTRL) mod = NX_DEVICERCTLKEYMASK; else if(scancode == KEY_LEFTMETA) mod = NX_DEVICELCMDKEYMASK; else if(scancode == KEY_RIGHTMETA) mod = NX_DEVICERCMDKEYMASK; else if(scancode == KEY_LEFTALT) mod = NX_DEVICELALTKEYMASK; else if(scancode == KEY_RIGHTALT) mod = NX_DEVICERALTKEYMASK; if(mod){ // Update global modifiers if(down) mod |= kb->modifiers; else mod = kb->modifiers & ~mod; if((mod & NX_DEVICELSHIFTKEYMASK) || (mod & NX_DEVICERSHIFTKEYMASK)) mod |= NX_SHIFTMASK; else mod &= ~NX_SHIFTMASK; if((mod & NX_DEVICELCTLKEYMASK) || (mod & NX_DEVICERCTLKEYMASK)) mod |= NX_CONTROLMASK; else mod &= ~NX_CONTROLMASK; if((mod & NX_DEVICELCMDKEYMASK) || (mod & NX_DEVICERCMDKEYMASK)) mod |= NX_COMMANDMASK; else mod &= ~NX_COMMANDMASK; if((mod & NX_DEVICELALTKEYMASK) || (mod & NX_DEVICERALTKEYMASK)) mod |= NX_ALTERNATEMASK; else mod &= ~NX_ALTERNATEMASK; kb->modifiers = mod; kb->lastkeypress = KEY_NONE; isMod = 1; } else if(!isMod){ // For any other key, trigger key repeat if(down){ long repeat = repeattime(kb->event, 1); if(repeat > 0){ kb->lastkeypress = scancode; clock_gettime(CLOCK_MONOTONIC, &kb->keyrepeat); timespec_add(&kb->keyrepeat, repeat); } else kb->lastkeypress = KEY_NONE; } else kb->lastkeypress = KEY_NONE; } postevent_kp(kb->event, kb->modifiers, scancode, down, isMod, 0); }