/* * Supply keysym as console input. Convert keysym to character(s) and * pass them up to cons_channel's upstream hook. * * Return zero on success, else the keysym that we could not handle * (so that the caller may complain). */ static int kbd_input_keysym(struct kbd_softc *k, int keysym) { struct kbd_state *ks = &k->k_state; int data; /* Check if a recipient has been configured */ if (k->k_cc == NULL || k->k_cc->cc_upstream == NULL) return 0; switch (KEYSYM_CLASS(keysym)) { case KEYSYM_ASCII: data = KEYSYM_DATA(keysym); if (ks->kbd_modbits & KBMOD_META_MASK) data |= 0x80; (*k->k_cc->cc_upstream)(data); break; case KEYSYM_STRING: data = keysym & 0xF; kbd_input_string(k, kbd_stringtab[data]); break; case KEYSYM_FUNC: kbd_input_funckey(k, keysym); break; case KEYSYM_CLRMOD: data = 1 << (keysym & 0x1F); ks->kbd_modbits &= ~data; break; case KEYSYM_SETMOD: data = 1 << (keysym & 0x1F); ks->kbd_modbits |= data; break; case KEYSYM_INVMOD: data = 1 << (keysym & 0x1F); ks->kbd_modbits ^= data; kbd_update_leds(k); break; case KEYSYM_ALL_UP: ks->kbd_modbits &= ~0xFFFF; break; case KEYSYM_SPECIAL: if (keysym == KEYSYM_NOP) break; /* FALLTHROUGH */ default: /* We could not handle it. */ return keysym; } return 0; }
void handle_kbdleds() { if(numlock && !capslock) { kbd_update_leds(NUM_LED); } else if(numlock && capslock) { kbd_update_leds(NUM_LED|CAPS_LED); } else if(!numlock && capslock) { kbd_update_leds(CAPS_LED); } else { kbd_update_leds(0); } }