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/kbd.c | |
| 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/kbd.c')
| -rw-r--r-- | sys/arch/atari/dev/kbd.c | 68 |
1 files changed, 56 insertions, 12 deletions
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; +} |
