/** Simulate keystroke using sequences of key presses and releases. */ void stroke_sim(kbd_dev_t *kdev, unsigned mod, unsigned key) { int i; /* Simulate modifier presses. */ i = 0; while (mods_keys[i][0] != 0) { if (mod & mods_keys[i][0]) { kbd_push_event(kdev, KEY_PRESS, mods_keys[i][1]); } ++i; } /* Simulate key press and release. */ if (key != 0) { kbd_push_event(kdev, KEY_PRESS, key); kbd_push_event(kdev, KEY_RELEASE, key); } /* Simulate modifier releases. */ i = 0; while (mods_keys[i][0] != 0) { if (mod & mods_keys[i][0]) { kbd_push_event(kdev, KEY_RELEASE, mods_keys[i][1]); } ++i; } }
static void kbdev_callback_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) { kbdev_t *kbdev; int retval; int type, key; /* Kbdev device structure */ kbdev = arg; while (true) { ipc_call_t call; ipc_callid_t callid; callid = async_get_call(&call); if (!IPC_GET_IMETHOD(call)) { kbdev_destroy(kbdev); return; } switch (IPC_GET_IMETHOD(call)) { case KBDEV_EVENT: /* Got event from keyboard device */ retval = 0; type = IPC_GET_ARG1(call); key = IPC_GET_ARG2(call); kbd_push_event(kbdev->kbd_dev, type, key); break; default: retval = ENOTSUP; break; } async_answer_0(callid, retval); } }
static void apple_ctl_parse(sysarg_t scancode) { kbd_event_type_t type; unsigned int key; if (scancode >= 0x100) return; if (scancode & KBD_KEY_RELEASE) { scancode &= ~KBD_KEY_RELEASE; type = KEY_RELEASE; } else { type = KEY_PRESS; } key = scanmap[scancode]; if (key != 0) kbd_push_event(kbd_dev, type, key); }