summaryrefslogtreecommitdiff
path: root/sys/arch/atari/dev
diff options
context:
space:
mode:
authorleo <leo@NetBSD.org>1997-01-10 21:24:25 +0000
committerleo <leo@NetBSD.org>1997-01-10 21:24:25 +0000
commit7a0c8fa119caf36bb32221bccfe8f6d844eaffa2 (patch)
tree515d522f0488ee4e7fc1b3af7e287cf2cc1e7fdd /sys/arch/atari/dev
parent2fa61d9691461fdea4ccf286fe500768360d6a88 (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.c106
-rw-r--r--sys/arch/atari/dev/kbd.c68
-rw-r--r--sys/arch/atari/dev/kbdmap.h3
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],