/* * Console interface. */ int wskbd_cngetc(dev_t dev) { static int num = 0; static int pos; u_int type; int data; keysym_t ks; if (!wskbd_console_initted) return 0; if (wskbd_console_device != NULL && !wskbd_console_device->sc_translating) return 0; for(;;) { if (num-- > 0) { ks = wskbd_console_data.t_symbols[pos++]; if (KS_GROUP(ks) == KS_GROUP_Ascii) return (KS_VALUE(ks)); } else { (*wskbd_console_data.t_consops->getc) (wskbd_console_data.t_consaccesscookie, &type, &data); num = wskbd_translate(&wskbd_console_data, type, data); pos = 0; } } }
void wskbd_get_mapentry(const struct wskbd_mapdata *mapdata, int kc, struct wscons_keymap *mapentry) { kbd_t cur; const keysym_t *kp; const struct wscons_keydesc *mp; int l; keysym_t ksg; mapentry->command = KS_voidSymbol; mapentry->group1[0] = KS_voidSymbol; mapentry->group1[1] = KS_voidSymbol; mapentry->group2[0] = KS_voidSymbol; mapentry->group2[1] = KS_voidSymbol; for (cur = mapdata->layout & ~KB_HANDLEDBYWSKBD; cur != 0; ) { mp = mapdata->keydesc; while (mp->map_size > 0) { if (mp->name == cur) break; mp++; } /* If map not found, return */ if (mp->map_size <= 0) return; for (kp = mp->map; kp < mp->map + mp->map_size; kp++) { ksg = KS_GROUP(*kp); if (ksg == KS_GROUP_Keycode && KS_VALUE(*kp) == kc) { /* First skip keycode and possible command */ kp++; if (KS_GROUP(*kp) == KS_GROUP_Command || *kp == KS_Cmd || *kp == KS_Cmd1 || *kp == KS_Cmd2) mapentry->command = *kp++; for (l = 0; kp + l < mp->map + mp->map_size; l++) { ksg = KS_GROUP(kp[l]); if (ksg == KS_GROUP_Keycode) break; } if (l > 4) panic("wskbd_get_mapentry: %d(%d): bad entry", mp->name, *kp); fillmapentry(kp, l, mapentry); return; } } cur = mp->base; } }
/* * Console interface. */ int wskbd_cngetc(dev_t dev) { static int num = 0; static int pos; u_int type; int data; keysym_t ks; if (!wskbd_console_initted) return 0; if (wskbd_console_device != NULL && !wskbd_console_device->sc_translating) return 0; for(;;) { if (num-- > 0) { ks = wskbd_console_data.t_symbols[pos++]; if (KS_GROUP(ks) == KS_GROUP_Plain) return (KS_VALUE(ks)); } else { (*wskbd_console_data.t_consops->getc) (wskbd_console_data.t_consaccesscookie, &type, &data); if (type == WSCONS_EVENT_ASCII) { /* * We assume that when the driver falls back * to deliver pure ASCII it is in a state that * it can not track press/release events * reliable - so we clear all previously * accumulated modifier state. */ wskbd_console_data.t_modifiers = 0; return(data); } num = wskbd_translate(&wskbd_console_data, type, data); pos = 0; } } }
int wsemul_sun_translate(void *cookie, kbd_t layout, keysym_t in, const u_char **out) { struct wsemul_sun_emuldata *edp = cookie; if (KS_GROUP(in) == KS_GROUP_Ascii) { *out = edp->translatebuf; return (wsemul_utf8_translate(KS_VALUE(in), layout, edp->translatebuf, edp->flags & SUN_EMUL_FLAGS_UTF8)); } if (KS_GROUP(in) == KS_GROUP_Keypad && (in & 0x80) == 0) { edp->translatebuf[0] = in & 0xff; /* turn into ASCII */ *out = edp->translatebuf; return (1); } if (in >= KS_f1 && in <= KS_f12) { *out = sun_fkeys[in - KS_f1]; return (6); } if (in >= KS_F1 && in <= KS_F12) { *out = sun_fkeys[in - KS_F1]; return (6); } if (in >= KS_KP_F1 && in <= KS_KP_F4) { *out = sun_fkeys[in - KS_KP_F1]; return (6); } if (in >= KS_Help && in <= KS_Cut && sun_lkeys[in - KS_Help] != NULL) { *out = sun_lkeys[in - KS_Help]; return (6); } switch (in) { case KS_Home: case KS_KP_Home: case KS_KP_Begin: *out = "\033[214z"; return (6); case KS_End: case KS_KP_End: *out = "\033[220z"; return (6); case KS_Insert: case KS_KP_Insert: *out = "\033[247z"; return (6); case KS_Prior: case KS_KP_Prior: *out = "\033[216z"; return (6); case KS_Next: case KS_KP_Next: *out = "\033[222z"; return (6); case KS_Up: case KS_KP_Up: *out = "\033[A"; return (3); case KS_Down: case KS_KP_Down: *out = "\033[B"; return (3); case KS_Left: case KS_KP_Left: *out = "\033[D"; return (3); case KS_Right: case KS_KP_Right: *out = "\033[C"; return (3); case KS_KP_Delete: *out = "\177"; return (1); } return (0); }
int wskbd_load_keymap(const struct wskbd_mapdata *mapdata, struct wscons_keymap **map, int *maplen) { int i, s, kc, stack_ptr; const keysym_t *kp; const struct wscons_keydesc *mp, *stack[10]; kbd_t cur; keysym_t ksg; for (cur = mapdata->layout & ~KB_HANDLEDBYWSKBD, stack_ptr = 0; cur != 0; stack_ptr++) { mp = mapdata->keydesc; while (mp->map_size > 0) { if (cur == 0 || mp->name == cur) { break; } mp++; } if (stack_ptr == nitems(stack)) panic("wskbd_load_keymap: %d: recursion too deep", mapdata->layout); if (mp->map_size <= 0) return(EINVAL); stack[stack_ptr] = mp; cur = mp->base; } for (i = 0, s = stack_ptr - 1; s >= 0; s--) { mp = stack[s]; for (kp = mp->map; kp < mp->map + mp->map_size; kp++) { ksg = KS_GROUP(*kp); if (ksg == KS_GROUP_Keycode && KS_VALUE(*kp) > i) i = KS_VALUE(*kp); } } wskbd_init_keymap(i + 1, map, maplen); for (s = stack_ptr - 1; s >= 0; s--) { mp = stack[s]; for (kp = mp->map; kp < mp->map + mp->map_size; ) { ksg = KS_GROUP(*kp); if (ksg != KS_GROUP_Keycode) panic("wskbd_load_keymap: %d(%d): bad entry", mp->name, *kp); kc = KS_VALUE(*kp); kp++; if (KS_GROUP(*kp) == KS_GROUP_Command || *kp == KS_Cmd || *kp == KS_Cmd1 || *kp == KS_Cmd2) { (*map)[kc].command = *kp; kp++; } for (i = 0; kp + i < mp->map + mp->map_size; i++) { ksg = KS_GROUP(kp[i]); if (ksg == KS_GROUP_Keycode) break; } if (i > 4) panic("wskbd_load_keymap: %d(%d): bad entry", mp->name, *kp); fillmapentry(kp, i, &(*map)[kc]); kp += i; } } return(0); }