diff options
| author | leo <leo@NetBSD.org> | 1997-01-10 21:24:25 +0000 |
|---|---|---|
| committer | leo <leo@NetBSD.org> | 1997-01-10 21:24:25 +0000 |
| commit | 7a0c8fa119caf36bb32221bccfe8f6d844eaffa2 (patch) | |
| tree | 515d522f0488ee4e7fc1b3af7e287cf2cc1e7fdd /sys/arch/atari/dev | |
| parent | 2fa61d9691461fdea4ccf286fe500768360d6a88 (diff) | |
Handle keyboard modifiers *before* handing the keycodes to either the
console driver or the DDB keyboard functions. This prevents annoyances
with out of sync modifier stati.
Diffstat (limited to 'sys/arch/atari/dev')
| -rw-r--r-- | sys/arch/atari/dev/ite.c | 106 | ||||
| -rw-r--r-- | sys/arch/atari/dev/kbd.c | 68 | ||||
| -rw-r--r-- | sys/arch/atari/dev/kbdmap.h | 3 |
3 files changed, 79 insertions, 98 deletions
diff --git a/sys/arch/atari/dev/ite.c b/sys/arch/atari/dev/ite.c index 120bf5afb0e..a1f4b3551ab 100644 --- a/sys/arch/atari/dev/ite.c +++ b/sys/arch/atari/dev/ite.c @@ -1,4 +1,4 @@ -/* $NetBSD: ite.c,v 1.21 1997/01/08 11:28:03 leo Exp $ */ +/* $NetBSD: ite.c,v 1.22 1997/01/10 21:24:25 leo Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -754,12 +754,13 @@ ite_reset(ip) } /* - * has to be global becuase of the shared filters. + * has to be global because of the shared filters. */ -static u_char key_mod; static u_char last_dead; -/* Used in console at startup only */ +/* + * Used in console at startup only and for DDB. + */ int ite_cnfilter(c, caller) u_int c; @@ -779,39 +780,6 @@ enum caller caller; s = spltty(); /* - * Handle special keys - */ - switch(c) { - case KBD_LEFT_SHIFT: - mask = KBD_MOD_LSHIFT; - break; - case KBD_RIGHT_SHIFT: - mask = KBD_MOD_RSHIFT; - break; - case KBD_CTRL: - mask = KBD_MOD_CTRL; - break; - case KBD_ALT: - mask = KBD_MOD_ALT; - break; - case KBD_CAPS_LOCK: - /* CAPSLOCK is a toggle */ - if(!up) - key_mod ^= KBD_MOD_CAPS; - splx(s); - return -1; - break; - } - if(mask) { - if(up) - key_mod &= ~mask; - else - key_mod |= mask; - splx(s); - return -1; - } - - /* * No special action if key released */ if(up) { @@ -820,19 +788,19 @@ enum caller caller; } /* translate modifiers */ - if(key_mod & KBD_MOD_SHIFT) { - if(key_mod & KBD_MOD_ALT) + if(kbd_modifier & KBD_MOD_SHIFT) { + if(kbd_modifier & KBD_MOD_ALT) key = kbdmap->alt_shift_keys[c]; else key = kbdmap->shift_keys[c]; } - else if(key_mod & KBD_MOD_ALT) + else if(kbd_modifier & KBD_MOD_ALT) key = kbdmap->alt_keys[c]; else { key = kbdmap->keys[c]; /* * If CAPS and key is CAPable (no pun intended) */ - if((key_mod & KBD_MOD_CAPS) && (key.mode & KBD_MODE_CAPS)) + if((kbd_modifier & KBD_MOD_CAPS) && (key.mode & KBD_MODE_CAPS)) key = kbdmap->shift_keys[c]; } code = key.code; @@ -864,7 +832,7 @@ enum caller caller; last_dead = 0; } #endif - if(key_mod & KBD_MOD_CTRL) + if(kbd_modifier & KBD_MOD_CTRL) code &= 0x1f; /* @@ -926,40 +894,6 @@ enum caller caller; */ rem_sicallback((si_farg)ite_filter); - - /* - * Handle special keys - */ - switch(c) { - case KBD_LEFT_SHIFT: - mask = KBD_MOD_LSHIFT; - break; - case KBD_RIGHT_SHIFT: - mask = KBD_MOD_RSHIFT; - break; - case KBD_CTRL: - mask = KBD_MOD_CTRL; - break; - case KBD_ALT: - mask = KBD_MOD_ALT; - break; - case KBD_CAPS_LOCK: - /* CAPSLOCK is a toggle */ - if(!up) - key_mod ^= KBD_MOD_CAPS; - splx(s); - return; - break; - } - if(mask) { - if(up) - key_mod &= ~mask; - else - key_mod |= mask; - splx(s); - return; - } - /* * Stop repeating on up event */ @@ -984,7 +918,7 @@ enum caller caller; /* * Handle ite-switching ALT + Fx */ - if((key_mod == KBD_MOD_ALT) && (c >= 0x3b) && (c <= 0x44)) { + if((kbd_modifier == KBD_MOD_ALT) && (c >= 0x3b) && (c <= 0x44)) { ite_switch(c - 0x3b); splx(s); return; @@ -992,15 +926,17 @@ enum caller caller; /* * Safety button, switch back to ascii keymap. */ - if(key_mod == (KBD_MOD_ALT | KBD_MOD_LSHIFT) && c == 0x3b) { + if(kbd_modifier == (KBD_MOD_ALT | KBD_MOD_LSHIFT) && c == 0x3b) { /* ALT + LSHIFT + F1 */ bcopy(&ascii_kbdmap, kbdmap, sizeof(struct kbdmap)); splx(s); return; #ifdef DDB } - else if(key_mod == (KBD_MOD_ALT | KBD_MOD_LSHIFT) && c == 0x43) { - /* ALT + LSHIFT + F9 */ + else if(kbd_modifier == (KBD_MOD_ALT | KBD_MOD_LSHIFT) && c == 0x43) { + /* + * ALT + LSHIFT + F9 -> Debugger! + */ Debugger(); splx(s); return; @@ -1018,19 +954,19 @@ enum caller caller; /* * Translate modifiers */ - if(key_mod & KBD_MOD_SHIFT) { - if(key_mod & KBD_MOD_ALT) + if(kbd_modifier & KBD_MOD_SHIFT) { + if(kbd_modifier & KBD_MOD_ALT) key = kbdmap->alt_shift_keys[c]; else key = kbdmap->shift_keys[c]; } - else if(key_mod & KBD_MOD_ALT) + else if(kbd_modifier & KBD_MOD_ALT) key = kbdmap->alt_keys[c]; else { key = kbdmap->keys[c]; /* * If CAPS and key is CAPable (no pun intended) */ - if((key_mod & KBD_MOD_CAPS) && (key.mode & KBD_MODE_CAPS)) + if((kbd_modifier & KBD_MOD_CAPS) && (key.mode & KBD_MODE_CAPS)) key = kbdmap->shift_keys[c]; } code = key.code; @@ -1078,7 +1014,7 @@ enum caller caller; if(!(key.mode & KBD_MODE_STRING) && (!(key.mode & KBD_MODE_KPAD) || (kbd_ite && !kbd_ite->keypad_appmode))) { - if(key_mod & KBD_MOD_CTRL) + if(kbd_modifier & KBD_MOD_CTRL) code &= 0x1f; } else if((key.mode & KBD_MODE_KPAD) diff --git a/sys/arch/atari/dev/kbd.c b/sys/arch/atari/dev/kbd.c index d434a73151f..d37964b977d 100644 --- a/sys/arch/atari/dev/kbd.c +++ b/sys/arch/atari/dev/kbd.c @@ -1,4 +1,4 @@ -/* $NetBSD: kbd.c,v 1.14 1996/12/20 12:49:41 leo Exp $ */ +/* $NetBSD: kbd.c,v 1.15 1997/01/10 21:24:26 leo Exp $ */ /* * Copyright (c) 1995 Leo Weppelman @@ -56,10 +56,13 @@ #include <atari/dev/ym2149reg.h> #include <atari/dev/kbdreg.h> #include <atari/dev/kbdvar.h> +#include <atari/dev/kbdmap.h> #include <atari/dev/msvar.h> #include "mouse.h" +u_char kbd_modifier; /* Modifier mask */ + static u_char kbd_ring[KBD_RING_SIZE]; static volatile u_int kbd_rbput = 0; /* 'put' index */ static u_int kbd_rbget = 0; /* 'get' index */ @@ -80,6 +83,7 @@ void kbdintr __P((int)); static void kbdsoft __P((void *, void *)); static void kbdattach __P((struct device *, struct device *, void *)); static int kbdmatch __P((struct device *, struct cfdata *, void *)); +static int kbd_do_modifier __P((u_char)); static int kbd_write_poll __P((u_char *, int)); static void kbd_pkg_start __P((struct kbd_softc *, u_char)); @@ -153,11 +157,6 @@ void *auxp; printf("\n"); } -/* definitions for atari keyboard encoding. */ -#define KEY_CODE(c) ((u_char)(c) & 0x7f) -#define KEY_UP(c) ((u_char)(c) & 0x80) -#define IS_KEY(c) ((u_char)(c) < 0xf6) - void kbdenable() { @@ -368,10 +367,13 @@ void *junk1, *junk2; /* * If this is a package header, init pkg. handling. */ - if (!IS_KEY(code)) { + if (!KBD_IS_KEY(code)) { kbd_pkg_start(k, code); continue; } + if (kbd_do_modifier(code) && !k->k_event_mode) + continue; + /* * if not in event mode, deliver straight to ite to * process key stroke @@ -397,9 +399,9 @@ void *junk1, *junk2; splx(s); continue; } - fe->id = KEY_CODE(code); - fe->value = KEY_UP(code) ? VKEY_UP : VKEY_DOWN; - fe->time = time; + fe->id = KBD_SCANCODE(code); + fe->value = KBD_RELEASED(code) ? VKEY_UP : VKEY_DOWN; + fe->time = time; k->k_events.ev_put = put; EV_WAKEUP(&k->k_events); splx(s); @@ -445,10 +447,11 @@ kbdgetcn() code = KBD->ac_da; /* Silently ignore errors */ continue; } - break; + code = KBD->ac_da; + if (!kbd_do_modifier(code)) + break; } - code = KBD->ac_da; if (ints_active) { MFP->mf_iprb &= ~IB_AINT; MFP->mf_imrb |= IB_AINT; @@ -569,3 +572,44 @@ u_char msg_start; break; } } + +/* + * Modifier processing + */ +static int +kbd_do_modifier(code) +u_char code; +{ + u_char up, mask; + + up = KBD_RELEASED(code); + mask = 0; + + switch(KBD_SCANCODE(code)) { + case KBD_LEFT_SHIFT: + mask = KBD_MOD_LSHIFT; + break; + case KBD_RIGHT_SHIFT: + mask = KBD_MOD_RSHIFT; + break; + case KBD_CTRL: + mask = KBD_MOD_CTRL; + break; + case KBD_ALT: + mask = KBD_MOD_ALT; + break; + case KBD_CAPS_LOCK: + /* CAPSLOCK is a toggle */ + if(!up) + kbd_modifier ^= KBD_MOD_CAPS; + return 1; + } + if(mask) { + if(up) + kbd_modifier &= ~mask; + else + kbd_modifier |= mask; + return 1; + } + return 0; +} diff --git a/sys/arch/atari/dev/kbdmap.h b/sys/arch/atari/dev/kbdmap.h index b75795cbfb1..f6f3682dc3d 100644 --- a/sys/arch/atari/dev/kbdmap.h +++ b/sys/arch/atari/dev/kbdmap.h @@ -1,4 +1,4 @@ -/* $NetBSD: kbdmap.h,v 1.3 1995/07/24 05:56:17 leo Exp $ */ +/* $NetBSD: kbdmap.h,v 1.4 1997/01/10 21:24:27 leo Exp $ */ /* * Copyright (c) 1993 Markus Wild @@ -127,6 +127,7 @@ struct key { #define KBD_SCANCODE(code) (code & 0x7f) #define KBD_RELEASED(code) (code & 0x80 ? 1 : 0) +#define KBD_IS_KEY(code) ((u_char)(code) < 0xf6) struct kbdmap { struct key keys[KBD_NUM_KEYS], |
