From a995cd062d6283935c9ebc9991e10ebde7c7cb59 Mon Sep 17 00:00:00 2001 From: ed Date: Mon, 24 Aug 2009 09:17:01 +0000 Subject: Unhardcode 0x100 inside kbdcontrol. In preparation for Unicode support for the keyboard layer, we'd better get rid of all the hardcoded 0x100/0xff constants in kbdcontrol. Instead, add a flag called SPECIAL stored in the top bit of the integer. Adding Unicode support is very simple now; just change u_char map[] to u_int map[] in keyent_t, change the bounds checking in kbdcontrol to 0x1FFFFF and modify the ioctls to allow loading these new keymaps. --- usr.sbin/kbdcontrol/kbdcontrol.c | 144 ++++++++++++++++++++------------------- 1 file changed, 73 insertions(+), 71 deletions(-) (limited to 'usr.sbin') diff --git a/usr.sbin/kbdcontrol/kbdcontrol.c b/usr.sbin/kbdcontrol/kbdcontrol.c index c800233..bbeb758 100644 --- a/usr.sbin/kbdcontrol/kbdcontrol.c +++ b/usr.sbin/kbdcontrol/kbdcontrol.c @@ -55,6 +55,8 @@ __FBSDID("$FreeBSD$"); #define PASTE 0xa3 /* paste from cut-paste buffer */ #endif +#define SPECIAL 0x80000000 + char ctrl_names[32][4] = { "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel", "bs ", "ht ", "nl ", "vt ", "ff ", "cr ", "so ", "si ", @@ -180,77 +182,77 @@ get_entry(void) { switch ((token = yylex())) { case TNOP: - return NOP | 0x100; + return NOP | SPECIAL; case TLSH: - return LSH | 0x100; + return LSH | SPECIAL; case TRSH: - return RSH | 0x100; + return RSH | SPECIAL; case TCLK: - return CLK | 0x100; + return CLK | SPECIAL; case TNLK: - return NLK | 0x100; + return NLK | SPECIAL; case TSLK: - return SLK | 0x100; + return SLK | SPECIAL; case TBTAB: - return BTAB | 0x100; + return BTAB | SPECIAL; case TLALT: - return LALT | 0x100; + return LALT | SPECIAL; case TLCTR: - return LCTR | 0x100; + return LCTR | SPECIAL; case TNEXT: - return NEXT | 0x100; + return NEXT | SPECIAL; case TPREV: - return PREV | 0x100; + return PREV | SPECIAL; case TRCTR: - return RCTR | 0x100; + return RCTR | SPECIAL; case TRALT: - return RALT | 0x100; + return RALT | SPECIAL; case TALK: - return ALK | 0x100; + return ALK | SPECIAL; case TASH: - return ASH | 0x100; + return ASH | SPECIAL; case TMETA: - return META | 0x100; + return META | SPECIAL; case TRBT: - return RBT | 0x100; + return RBT | SPECIAL; case TDBG: - return DBG | 0x100; + return DBG | SPECIAL; case TSUSP: - return SUSP | 0x100; + return SUSP | SPECIAL; case TSPSC: - return SPSC | 0x100; + return SPSC | SPECIAL; case TPANIC: - return PNC | 0x100; + return PNC | SPECIAL; case TLSHA: - return LSHA | 0x100; + return LSHA | SPECIAL; case TRSHA: - return RSHA | 0x100; + return RSHA | SPECIAL; case TLCTRA: - return LCTRA | 0x100; + return LCTRA | SPECIAL; case TRCTRA: - return RCTRA | 0x100; + return RCTRA | SPECIAL; case TLALTA: - return LALTA | 0x100; + return LALTA | SPECIAL; case TRALTA: - return RALTA | 0x100; + return RALTA | SPECIAL; case THALT: - return HALT | 0x100; + return HALT | SPECIAL; case TPDWN: - return PDWN | 0x100; + return PDWN | SPECIAL; case TPASTE: - return PASTE | 0x100; + return PASTE | SPECIAL; case TACC: if (ACC(number) > L_ACC) return -1; - return ACC(number) | 0x100; + return ACC(number) | SPECIAL; case TFUNC: if (F(number) > L_FN) return -1; - return F(number) | 0x100; + return F(number) | SPECIAL; case TSCRN: if (S(number) > L_SCR) return -1; - return S(number) | 0x100; + return S(number) | SPECIAL; case TLET: return (unsigned char)letter; case TNUM: @@ -310,9 +312,9 @@ get_key_definition_line(keymap_t *map) for (i=0; ikey[scancode].spcl |= (0x80 >> i); - map->key[scancode].map[i] = def & 0xFF; + map->key[scancode].map[i] = def & ~SPECIAL; } /* get lock state key def */ if ((token = yylex()) != TFLAG) @@ -386,101 +388,101 @@ get_accent_definition_line(accentmap_t *map) void print_entry(FILE *fp, int value) { - int val = value & 0xFF; + int val = value & ~SPECIAL; switch (value) { - case NOP | 0x100: + case NOP | SPECIAL: fprintf(fp, " nop "); break; - case LSH | 0x100: + case LSH | SPECIAL: fprintf(fp, " lshift"); break; - case RSH | 0x100: + case RSH | SPECIAL: fprintf(fp, " rshift"); break; - case CLK | 0x100: + case CLK | SPECIAL: fprintf(fp, " clock "); break; - case NLK | 0x100: + case NLK | SPECIAL: fprintf(fp, " nlock "); break; - case SLK | 0x100: + case SLK | SPECIAL: fprintf(fp, " slock "); break; - case BTAB | 0x100: + case BTAB | SPECIAL: fprintf(fp, " btab "); break; - case LALT | 0x100: + case LALT | SPECIAL: fprintf(fp, " lalt "); break; - case LCTR | 0x100: + case LCTR | SPECIAL: fprintf(fp, " lctrl "); break; - case NEXT | 0x100: + case NEXT | SPECIAL: fprintf(fp, " nscr "); break; - case PREV | 0x100: + case PREV | SPECIAL: fprintf(fp, " pscr "); break; - case RCTR | 0x100: + case RCTR | SPECIAL: fprintf(fp, " rctrl "); break; - case RALT | 0x100: + case RALT | SPECIAL: fprintf(fp, " ralt "); break; - case ALK | 0x100: + case ALK | SPECIAL: fprintf(fp, " alock "); break; - case ASH | 0x100: + case ASH | SPECIAL: fprintf(fp, " ashift"); break; - case META | 0x100: + case META | SPECIAL: fprintf(fp, " meta "); break; - case RBT | 0x100: + case RBT | SPECIAL: fprintf(fp, " boot "); break; - case DBG | 0x100: + case DBG | SPECIAL: fprintf(fp, " debug "); break; - case SUSP | 0x100: + case SUSP | SPECIAL: fprintf(fp, " susp "); break; - case SPSC | 0x100: + case SPSC | SPECIAL: fprintf(fp, " saver "); break; - case PNC | 0x100: + case PNC | SPECIAL: fprintf(fp, " panic "); break; - case LSHA | 0x100: + case LSHA | SPECIAL: fprintf(fp, " lshifta"); break; - case RSHA | 0x100: + case RSHA | SPECIAL: fprintf(fp, " rshifta"); break; - case LCTRA | 0x100: + case LCTRA | SPECIAL: fprintf(fp, " lctrla"); break; - case RCTRA | 0x100: + case RCTRA | SPECIAL: fprintf(fp, " rctrla"); break; - case LALTA | 0x100: + case LALTA | SPECIAL: fprintf(fp, " lalta "); break; - case RALTA | 0x100: + case RALTA | SPECIAL: fprintf(fp, " ralta "); break; - case HALT | 0x100: + case HALT | SPECIAL: fprintf(fp, " halt "); break; - case PDWN | 0x100: + case PDWN | SPECIAL: fprintf(fp, " pdwn "); break; - case PASTE | 0x100: + case PASTE | SPECIAL: fprintf(fp, " paste "); break; default: - if (value & 0x100) { + if (value & SPECIAL) { if (val >= F_FN && val <= L_FN) fprintf(fp, " fkey%02d", val - F_FN + 1); else if (val >= F_SCR && val <= L_SCR) @@ -521,7 +523,7 @@ print_key_definition_line(FILE *fp, int scancode, struct keyent_t *key) /* print key definitions */ for (i=0; ispcl & (0x80 >> i)) - print_entry(fp, key->map[i] | 0x100); + print_entry(fp, key->map[i] | SPECIAL); else print_entry(fp, key->map[i]); } @@ -587,8 +589,8 @@ print_accent_definition_line(FILE *fp, int accent, struct acc_t *key) void dump_entry(int value) { - if (value & 0x100) { - value &= 0x00ff; + if (value & SPECIAL) { + value &= ~SPECIAL; switch (value) { case NOP: printf(" NOP, "); @@ -719,7 +721,7 @@ dump_key_definition(char *name, keymap_t *keymap) printf("/*%02x*/{{", i); for (j = 0; j < NUM_STATES; j++) { if (keymap->key[i].spcl & (0x80 >> j)) - dump_entry(keymap->key[i].map[j] | 0x100); + dump_entry(keymap->key[i].map[j] | SPECIAL); else dump_entry(keymap->key[i].map[j]); } -- cgit v1.1