summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2009-08-24 09:17:01 +0000
committered <ed@FreeBSD.org>2009-08-24 09:17:01 +0000
commita995cd062d6283935c9ebc9991e10ebde7c7cb59 (patch)
treefdbd7be578f5c48eadb6a49bcef203a3a93743ff /usr.sbin
parente23bffc564ab5535d22eea5710c2e1dc24512239 (diff)
downloadFreeBSD-src-a995cd062d6283935c9ebc9991e10ebde7c7cb59.zip
FreeBSD-src-a995cd062d6283935c9ebc9991e10ebde7c7cb59.tar.gz
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.
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/kbdcontrol/kbdcontrol.c144
1 files changed, 73 insertions, 71 deletions
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; i<NUM_STATES; i++) {
if ((def = get_entry()) == -1)
return -1;
- if (def & 0x100)
+ if (def & SPECIAL)
map->key[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; i<NUM_STATES; i++) {
if (key->spcl & (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]);
}
OpenPOWER on IntegriCloud