/* * Given a keyboard ADB event, decode the keycodes and pass them to wskbd. */ void akbd_processevent(struct akbd_softc *sc, adb_event_t *event) { switch (event->byte_count) { case 1: akbd_capslockwrapper(sc, event->bytes[0]); break; case 2: /* * The reset (or power) key sends 0x7f7f on press and * 0xffff on release, and we ignore it. */ if (event->bytes[0] == event->bytes[1] && ADBK_KEYVAL(event->bytes[0]) == ADBK_RESET) { if (event->bytes[0] == ADBK_KEYDOWN(ADBK_RESET)) SET(sc->sc_caps, CL_DOWN_RESET); else { if (ISSET(sc->sc_caps, CL_DOWN_RESET)) CLR(sc->sc_caps, CL_DOWN_RESET); else if (ISSET(sc->sc_caps, CL_DOWN_ADB)) { akbd_input(sc, ISSET(sc->sc_caps, CL_DOWN_LOGICAL) ? ADBK_KEYDOWN(ADBK_CAPSLOCK) : ADBK_KEYUP(ADBK_CAPSLOCK)); sc->sc_caps ^= CL_DOWN_LOGICAL; } } } else { akbd_capslockwrapper(sc, event->bytes[0]); akbd_capslockwrapper(sc, event->bytes[1]); } break; default: #ifdef DIAGNOSTIC printf("%s: unexpected message length %d\n", sc->sc_dev.dv_xname, event->byte_count); #endif break; } }
/* * Handles mouse button emulation via the keyboard. If the emulation * modifier key is down, left and right arrows will generate 2nd and * 3rd mouse button events while the 1, 2, and 3 keys will generate * the corresponding mouse button event. */ static void aed_emulate_mouse(adb_event_t *event) { static int emulmodkey_down; adb_event_t new_event; if (event->u.k.key == ADBK_KEYDOWN(ADBK_OPTION)) { emulmodkey_down = 1; } else if (event->u.k.key == ADBK_KEYUP(ADBK_OPTION)) { /* key up */ emulmodkey_down = 0; if (aed_sc->sc_buttons & 0xfe) { aed_sc->sc_buttons &= 1; new_event.def_addr = ADBADDR_MS; new_event.u.m.buttons = aed_sc->sc_buttons; new_event.u.m.dx = new_event.u.m.dy = 0; microtime(&new_event.timestamp); aed_handoff(&new_event); } } else if (emulmodkey_down) { switch(event->u.k.key) { #ifdef ALTXBUTTONS case ADBK_KEYDOWN(ADBK_1): aed_sc->sc_buttons |= 1; /* left down */ new_event.def_addr = ADBADDR_MS; new_event.u.m.buttons = aed_sc->sc_buttons; new_event.u.m.dx = new_event.u.m.dy = 0; microtime(&new_event.timestamp); aed_handoff(&new_event); break; case ADBK_KEYUP(ADBK_1): aed_sc->sc_buttons &= ~1; /* left up */ new_event.def_addr = ADBADDR_MS; new_event.u.m.buttons = aed_sc->sc_buttons; new_event.u.m.dx = new_event.u.m.dy = 0; microtime(&new_event.timestamp); aed_handoff(&new_event); break; #endif case ADBK_KEYDOWN(ADBK_LEFT): #ifdef ALTXBUTTONS case ADBK_KEYDOWN(ADBK_2): #endif aed_sc->sc_buttons |= 2; /* middle down */ new_event.def_addr = ADBADDR_MS; new_event.u.m.buttons = aed_sc->sc_buttons; new_event.u.m.dx = new_event.u.m.dy = 0; microtime(&new_event.timestamp); aed_handoff(&new_event); break; case ADBK_KEYUP(ADBK_LEFT): #ifdef ALTXBUTTONS case ADBK_KEYUP(ADBK_2): #endif aed_sc->sc_buttons &= ~2; /* middle up */ new_event.def_addr = ADBADDR_MS; new_event.u.m.buttons = aed_sc->sc_buttons; new_event.u.m.dx = new_event.u.m.dy = 0; microtime(&new_event.timestamp); aed_handoff(&new_event); break; case ADBK_KEYDOWN(ADBK_RIGHT): #ifdef ALTXBUTTONS case ADBK_KEYDOWN(ADBK_3): #endif aed_sc->sc_buttons |= 4; /* right down */ new_event.def_addr = ADBADDR_MS; new_event.u.m.buttons = aed_sc->sc_buttons; new_event.u.m.dx = new_event.u.m.dy = 0; microtime(&new_event.timestamp); aed_handoff(&new_event); break; case ADBK_KEYUP(ADBK_RIGHT): #ifdef ALTXBUTTONS case ADBK_KEYUP(ADBK_3): #endif aed_sc->sc_buttons &= ~4; /* right up */ new_event.def_addr = ADBADDR_MS; new_event.u.m.buttons = aed_sc->sc_buttons; new_event.u.m.dx = new_event.u.m.dy = 0; microtime(&new_event.timestamp); aed_handoff(&new_event); break; case ADBK_KEYUP(ADBK_SHIFT): case ADBK_KEYDOWN(ADBK_SHIFT): case ADBK_KEYUP(ADBK_CONTROL): case ADBK_KEYDOWN(ADBK_CONTROL): case ADBK_KEYUP(ADBK_FLOWER): case ADBK_KEYDOWN(ADBK_FLOWER): /* ctrl, shift, cmd */ aed_dokeyupdown(event); break; default: if (event->u.k.key & 0x80) /* ignore keyup */ break; /* key down */ new_event = *event; /* send option-down */ new_event.u.k.key = ADBK_KEYDOWN(ADBK_OPTION); new_event.bytes[0] = new_event.u.k.key; microtime(&new_event.timestamp); aed_dokeyupdown(&new_event); /* send key-down */ new_event.u.k.key = event->bytes[0]; new_event.bytes[0] = new_event.u.k.key; microtime(&new_event.timestamp); aed_dokeyupdown(&new_event); /* send key-up */ new_event.u.k.key = ADBK_KEYUP(ADBK_KEYVAL(event->bytes[0])); microtime(&new_event.timestamp); new_event.bytes[0] = new_event.u.k.key; aed_dokeyupdown(&new_event); /* send option-up */ new_event.u.k.key = ADBK_KEYUP(ADBK_OPTION); new_event.bytes[0] = new_event.u.k.key; microtime(&new_event.timestamp); aed_dokeyupdown(&new_event); break; } } else { aed_dokeyupdown(event); } }