diff options
author | Daniel Stone <daniel@fooishbar.org> | 2008-03-18 10:05:57 +0200 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2009-01-22 15:06:25 +1100 |
commit | 40877c6680863bd6a8475f2bb0c54df55bcf0b0e (patch) | |
tree | 9f958934add153efc9f6e85900fd5ff9ab2320da /hw/kdrive | |
parent | f9da417163b6b2d6234d2542c1f375e33db7159a (diff) |
XKB: Make XKB mandatory
No more #ifdef XKB, because you can't disable the build, and no more
noXkbExtension either.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'hw/kdrive')
-rw-r--r-- | hw/kdrive/linux/keyboard.c | 280 | ||||
-rw-r--r-- | hw/kdrive/src/kdrive.h | 6 | ||||
-rw-r--r-- | hw/kdrive/src/kinput.c | 101 |
3 files changed, 122 insertions, 265 deletions
diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c index ae981b776..d36c31d77 100644 --- a/hw/kdrive/linux/keyboard.c +++ b/hw/kdrive/linux/keyboard.c @@ -112,7 +112,6 @@ static const KeySym linux_to_x[256] = { XK_udiaeresis, XK_yacute, XK_thorn, XK_ydiaeresis }; -#ifdef XKB /* * Getting a keycode from scancode * @@ -209,10 +208,6 @@ static unsigned char at2lnx[] = #define NUM_AT_KEYS (sizeof(at2lnx)/sizeof(at2lnx[0])) #define LNX_KEY_INDEX(n) n < NUM_AT_KEYS ? at2lnx[n] : 0 -#else /* not XKB */ -#define LNX_KEY_INDEX(n) n -#endif - static unsigned char tbl[KD_MAX_WIDTH] = { 0, @@ -491,8 +486,6 @@ readKernelMapping(KdKeyboardInfo *ki) ki->maxScanCode = maxKeyCode; } -#ifdef XKB - /* * We need these to handle extended scancodes correctly (I could just use the * numbers below, but this makes the code more readable @@ -555,9 +548,6 @@ readKernelMapping(KdKeyboardInfo *ki) #define KEY_F17 /* F17 0x72 */ 114 #define KEY_KP_DEC /* KP_DEC 0x73 */ 115 -#endif /* XKB */ - - static void LinuxKeyboardRead (int fd, void *closure) { @@ -568,164 +558,118 @@ LinuxKeyboardRead (int fd, void *closure) while ((n = read (fd, buf, sizeof (buf))) > 0) { b = buf; while (n--) { -#ifdef XKB - if (!noXkbExtension) { - /* - * With xkb we use RAW mode for reading the console, which allows us - * process extended scancodes. - * - * See if this is a prefix extending the following keycode - */ - if (!prefix && ((b[0] & 0x7f) == KEY_Prefix0)) - { - prefix = KEY_Prefix0; -#ifdef DEBUG - ErrorF("Prefix0"); -#endif - /* swallow this up */ - b++; - continue; - } - else if (!prefix && ((b[0] & 0x7f) == KEY_Prefix1)) - { - prefix = KEY_Prefix1; - ErrorF("Prefix1"); - /* swallow this up */ - b++; - continue; - } - scancode = b[0] & 0x7f; - - switch (prefix) { - /* from xf86Events.c */ - case KEY_Prefix0: - { -#ifdef DEBUG - ErrorF("Prefix0 scancode: 0x%02x\n", scancode); -#endif - switch (scancode) { - case KEY_KP_7: - scancode = KEY_Home; break; /* curs home */ - case KEY_KP_8: - scancode = KEY_Up; break; /* curs up */ - case KEY_KP_9: - scancode = KEY_PgUp; break; /* curs pgup */ - case KEY_KP_4: - scancode = KEY_Left; break; /* curs left */ - case KEY_KP_5: - scancode = KEY_Begin; break; /* curs begin */ - case KEY_KP_6: - scancode = KEY_Right; break; /* curs right */ - case KEY_KP_1: - scancode = KEY_End; break; /* curs end */ - case KEY_KP_2: - scancode = KEY_Down; break; /* curs down */ - case KEY_KP_3: - scancode = KEY_PgDown; break; /* curs pgdown */ - case KEY_KP_0: - scancode = KEY_Insert; break; /* curs insert */ - case KEY_KP_Decimal: - scancode = KEY_Delete; break; /* curs delete */ - case KEY_Enter: - scancode = KEY_KP_Enter; break; /* keypad enter */ - case KEY_LCtrl: - scancode = KEY_RCtrl; break; /* right ctrl */ - case KEY_KP_Multiply: - scancode = KEY_Print; break; /* print */ - case KEY_Slash: - scancode = KEY_KP_Divide; break; /* keyp divide */ - case KEY_Alt: - scancode = KEY_AltLang; break; /* right alt */ - case KEY_ScrollLock: - scancode = KEY_Break; break; /* curs break */ - case 0x5b: - scancode = KEY_LMeta; break; - case 0x5c: - scancode = KEY_RMeta; break; - case 0x5d: - scancode = KEY_Menu; break; - case KEY_F3: - scancode = KEY_F13; break; - case KEY_F4: - scancode = KEY_F14; break; - case KEY_F5: - scancode = KEY_F15; break; - case KEY_F6: - scancode = KEY_F16; break; - case KEY_F7: - scancode = KEY_F17; break; - case KEY_KP_Plus: - scancode = KEY_KP_DEC; break; - /* Ignore virtual shifts (E0 2A, E0 AA, E0 36, E0 B6) */ - case 0x2A: - case 0x36: - b++; - prefix = 0; - continue; - default: -#ifdef DEBUG - ErrorF("Unreported Prefix0 scancode: 0x%02x\n", - scancode); -#endif - /* - * "Internet" keyboards are generating lots of new - * codes. Let them pass. There is little consistency - * between them, so don't bother with symbolic names at - * this level. - */ - scancode += 0x78; - } - break; - } - - case KEY_Prefix1: - { - /* we do no handle these */ -#ifdef DEBUG - ErrorF("Prefix1 scancode: 0x%02x\n", scancode); -#endif - b++; - prefix = 0; - continue; + /* + * With xkb we use RAW mode for reading the console, which allows us + * process extended scancodes. + * + * See if this is a prefix extending the following keycode + */ + if (!prefix && ((b[0] & 0x7f) == KEY_Prefix0)) + { + prefix = KEY_Prefix0; + /* swallow this up */ + b++; + continue; + } + else if (!prefix && ((b[0] & 0x7f) == KEY_Prefix1)) + { + prefix = KEY_Prefix1; + /* swallow this up */ + b++; + continue; + } + scancode = b[0] & 0x7f; + + switch (prefix) { + /* from xf86Events.c */ + case KEY_Prefix0: + { + switch (scancode) { + case KEY_KP_7: + scancode = KEY_Home; break; /* curs home */ + case KEY_KP_8: + scancode = KEY_Up; break; /* curs up */ + case KEY_KP_9: + scancode = KEY_PgUp; break; /* curs pgup */ + case KEY_KP_4: + scancode = KEY_Left; break; /* curs left */ + case KEY_KP_5: + scancode = KEY_Begin; break; /* curs begin */ + case KEY_KP_6: + scancode = KEY_Right; break; /* curs right */ + case KEY_KP_1: + scancode = KEY_End; break; /* curs end */ + case KEY_KP_2: + scancode = KEY_Down; break; /* curs down */ + case KEY_KP_3: + scancode = KEY_PgDown; break; /* curs pgdown */ + case KEY_KP_0: + scancode = KEY_Insert; break; /* curs insert */ + case KEY_KP_Decimal: + scancode = KEY_Delete; break; /* curs delete */ + case KEY_Enter: + scancode = KEY_KP_Enter; break; /* keypad enter */ + case KEY_LCtrl: + scancode = KEY_RCtrl; break; /* right ctrl */ + case KEY_KP_Multiply: + scancode = KEY_Print; break; /* print */ + case KEY_Slash: + scancode = KEY_KP_Divide; break; /* keyp divide */ + case KEY_Alt: + scancode = KEY_AltLang; break; /* right alt */ + case KEY_ScrollLock: + scancode = KEY_Break; break; /* curs break */ + case 0x5b: + scancode = KEY_LMeta; break; + case 0x5c: + scancode = KEY_RMeta; break; + case 0x5d: + scancode = KEY_Menu; break; + case KEY_F3: + scancode = KEY_F13; break; + case KEY_F4: + scancode = KEY_F14; break; + case KEY_F5: + scancode = KEY_F15; break; + case KEY_F6: + scancode = KEY_F16; break; + case KEY_F7: + scancode = KEY_F17; break; + case KEY_KP_Plus: + scancode = KEY_KP_DEC; break; + /* Ignore virtual shifts (E0 2A, E0 AA, E0 36, E0 B6) */ + case 0x2A: + case 0x36: + b++; + prefix = 0; + continue; + default: + /* + * "Internet" keyboards are generating lots of new + * codes. Let them pass. There is little consistency + * between them, so don't bother with symbolic names at + * this level. + */ + scancode += 0x78; } + break; + } - default: /* should not happen*/ - case 0: /* do nothing */ -#ifdef DEBUG - ErrorF("Plain scancode: 0x%02x\n", scancode); -#endif - ; - } + case KEY_Prefix1: + { + /* we do no handle these */ + b++; + prefix = 0; + continue; + } - prefix = 0; + default: /* should not happen*/ + case 0: /* do nothing */ + ; } - /* without xkb we use mediumraw mode -- enqueue the scancode as is */ - else -#endif - scancode = b[0] & 0x7f; - /* This is extended medium raw mode interpreter - see linux/drivers/keyboard.c (kbd->kbdmode == VC_MEDIUMRAW) */ - switch (mediumraw_state) - { - case DEFAULT: - if (scancode == 0) - { - mediumraw_state = EXTBYTE1; - mediumraw_up = b[0] & 0x80; - } - else - KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80); - break; - case EXTBYTE1: - mediumraw_data = scancode; - mediumraw_state = EXTBYTE2; - break; - case EXTBYTE2: - /* Note: Only codes < 256 will pass correctly through KdEnqueueKeyboardEvent() */ - KdEnqueueKeyboardEvent (closure, (int)mediumraw_data << 7 | scancode, mediumraw_up); - mediumraw_state = DEFAULT; - break; - } + + prefix = 0; + KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80); b++; } } @@ -750,13 +694,7 @@ LinuxKeyboardEnable (KdKeyboardInfo *ki) ioctl (fd, KDGKBMODE, &LinuxKbdTrans); tcgetattr (fd, &LinuxTermios); -#ifdef XKB - if (!noXkbExtension) - ioctl(fd, KDSKBMODE, K_RAW); - else -#else - ioctl(fd, KDSKBMODE, K_MEDIUMRAW); -#endif + ioctl(fd, KDSKBMODE, K_RAW); nTty = LinuxTermios; nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP); nTty.c_oflag = 0; diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h index 4b9566970..774648490 100644 --- a/hw/kdrive/src/kdrive.h +++ b/hw/kdrive/src/kdrive.h @@ -44,9 +44,7 @@ #include "randrstr.h" #include "globals.h" -#ifdef XKB -#include <X11/extensions/XKBstr.h> -#endif +#include "xkbstr.h" #define KD_DPMS_NORMAL 0 #define KD_DPMS_STANDBY 1 @@ -300,14 +298,12 @@ struct _KdKeyboardInfo { char *name; char *path; int inputClass; -#ifdef XKB XkbDescPtr xkb; char *xkbRules; char *xkbModel; char *xkbLayout; char *xkbVariant; char *xkbOptions; -#endif int LockLed; CARD8 keyState[KD_KEY_COUNT/8]; diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c index 816e933e6..670cc372f 100644 --- a/hw/kdrive/src/kinput.c +++ b/hw/kdrive/src/kinput.c @@ -38,9 +38,7 @@ #include <sys/file.h> /* needed for FNONBLOCK & FASYNC */ #endif -#ifdef XKB -#include <xkbsrv.h> -#endif +#include "xkbsrv.h" #include <X11/extensions/XI.h> #include <X11/extensions/XIproto.h> @@ -748,9 +746,7 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff) DevicePtr pDev = (DevicePtr)pDevice; KdKeyboardInfo *ki; Atom xiclass; -#ifdef XKB XkbComponentNamesRec names; -#endif if (!pDev) return BadImplementation; @@ -799,25 +795,16 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff) KdInitModMap(ki); KdInitAutoRepeats(ki); -#ifdef XKB - if (!noXkbExtension) { - memset(&names, 0, sizeof(XkbComponentNamesRec)); + memset(&names, 0, sizeof(XkbComponentNamesRec)); - XkbSetRulesDflts (ki->xkbRules, ki->xkbModel, ki->xkbLayout, - ki->xkbVariant, ki->xkbOptions); + XkbSetRulesDflts (ki->xkbRules, ki->xkbModel, ki->xkbLayout, + ki->xkbVariant, ki->xkbOptions); - ret = XkbInitKeyboardDeviceStruct (pDevice, - &names, - &ki->keySyms, - ki->modmap, - KdBell, KdKbdCtrl); - } - else -#endif - ret = InitKeyboardDeviceStruct(pDev, - &ki->keySyms, - ki->modmap, - KdBell, KdKbdCtrl); + ret = XkbInitKeyboardDeviceStruct (pDevice, + &names, + &ki->keySyms, + ki->modmap, + KdBell, KdKbdCtrl); if (!ret) { ErrorF("Couldn't initialise keyboard %s\n", ki->name); return BadImplementation; @@ -974,13 +961,11 @@ KdNewKeyboard (void) ki->bellDuration = 200; ki->next = NULL; ki->options = NULL; -#ifdef XKB ki->xkbRules = KdSaveString("base"); ki->xkbModel = KdSaveString("pc105"); ki->xkbLayout = KdSaveString("us"); ki->xkbVariant = NULL; ki->xkbOptions = NULL; -#endif return ki; } @@ -1160,7 +1145,6 @@ KdParseKbdOptions (KdKeyboardInfo *ki) for (option = ki->options; option; option = option->next) { -#ifdef XKB if (strcasecmp(option->key, "XkbRules") == 0) ki->xkbRules = option->value; else if (strcasecmp(option->key, "XkbModel") == 0) @@ -1174,7 +1158,6 @@ KdParseKbdOptions (KdKeyboardInfo *ki) else if (!strcasecmp (option->key, "device")) ki->path = KdSaveString(option->value); else -#endif ErrorF("Kbd option key (%s) of value (%s) not assigned!\n", option->key, option->value); } @@ -1196,9 +1179,7 @@ KdParseKeyboard (char *arg) ki->path = NULL; ki->driver = NULL; ki->driverPrivate = NULL; -#ifdef XKB ki->xkb = NULL; -#endif ki->next = NULL; if (!arg) @@ -1880,57 +1861,6 @@ CARD32 KdSpecialKeys = 0; extern int nClients; -static void -KdCheckSpecialKeys(KdKeyboardInfo *ki, int type, int sym) -{ - if (!ki) - return; - - /* - * Ignore key releases - */ - - if (type == KeyRelease) - return; - - /* Some iPaq keyboard -> mouse button mapping used to be here, but I - * refuse to perpetuate this madness. -daniels */ - - /* - * Check for control/alt pressed - */ - if ((ki->dixdev->key->state & (ControlMask|Mod1Mask)) != - (ControlMask|Mod1Mask)) - return; - - /* - * Let OS function see keysym first - */ - - if (kdOsFuncs->SpecialKey) - if ((*kdOsFuncs->SpecialKey) (sym)) - return; - - /* - * Now check for backspace or delete; these signal the - * X server to terminate - * - * I can't believe it's not XKB. -daniels - */ - switch (sym) { - case XK_BackSpace: - case XK_Delete: - case XK_KP_Delete: - /* - * Set the dispatch exception flag so the server will terminate the - * next time through the dispatch loop. - */ - if (kdAllowZap || party_like_its_1989) - dispatchException |= DE_TERMINATE; - break; - } -} - /* * kdEnqueueKeyboardEvent * @@ -2024,7 +1954,7 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo *ki, if (scan_code >= ki->minScanCode && scan_code <= ki->maxScanCode) { key_code = scan_code + KD_MIN_KEYCODE - ki->minScanCode; - + /* * Set up this event -- the type may be modified below */ @@ -2032,16 +1962,9 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo *ki, type = KeyRelease; else type = KeyPress; - -#ifdef XKB - if (noXkbExtension) -#endif - { - KdCheckSpecialKeys(ki, type, key_code); - KdHandleKeyboardEvent(ki, type, key_code); - } - + GetEventList(&kdEvents); + nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, type, key_code); for (i = 0; i < nEvents; i++) KdQueueEvent(ki->dixdev, (kdEvents + i)->event); |