commit fa95cd708067e9841f92ea4dd8bd9e03ffc34654 Author: Pierre Willenbrock Date: Thu Jan 29 00:51:16 2009 +0100 Collected fixes for xserver changes diff --git a/src/atKeynames.h b/src/atKeynames.h index 85f13ac..6e6ba85 100644 --- a/src/atKeynames.h +++ b/src/atKeynames.h @@ -67,7 +67,7 @@ #define ScrollLockMask Mod5Mask #define KeyPressed(k) (keyc->postdown[k >> 3] & (1 << (k & 7))) -#define ModifierDown(k) ((keyc->state & (k)) == (k)) +#define ModifierDown(k) ((XkbStateFieldFromRec(&keyc->xkbInfo->state) & (k)) == (k)) /* * NOTE: The AT/MF keyboards can generate (via the 8042) two (MF: three) diff --git a/src/kbd.c b/src/kbd.c index 38d6513..f27ca97 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -41,14 +41,12 @@ #include "xf86OSKbd.h" #include "compiler.h" -#ifdef XKB #include #include #include -#endif -extern int XkbDfltRepeatDelay; -extern int XkbDfltRepeatInterval; +static int XkbDfltRepeatDelay = 660; +static int XkbDfltRepeatInterval = 40; #define CAPSFLAG 1 #define NUMFLAG 2 @@ -140,10 +138,6 @@ static const OptionInfoRec KeyboardOptions[] = { /* Xorg 1.6 and earlier put the default XKB rules file in __XKBDEFRULES__ in xorg-server.h, later versions switched to XKB_DFLT_RULES */ -#if !defined(XKB_DFLT_RULES) && defined(__XKBDEFRULES__) -# define XKB_DFLT_RULES __XKBDEFRULES__ -#endif - static const char *kbdDefaults[] = { #ifdef XQUEUE "Protocol", "Xqueue", @@ -151,7 +145,7 @@ static const char *kbdDefaults[] = { "Protocol", "standard", #endif "AutoRepeat", "500 30", - "XkbRules", XKB_DFLT_RULES, + "XkbRules", "base", "XkbModel", "pc105", "XkbLayout", "us", "Panix106", "off", @@ -180,7 +174,6 @@ const char *xkbSymbols[] = { NULL, }; -#ifdef XKB static char *xkb_rules; static char *xkb_model; static char *xkb_layout; @@ -188,7 +181,6 @@ static char *xkb_variant; static char *xkb_options; static XkbComponentNamesRec xkbnames; -#endif /* XKB */ /*ARGSUSED*/ static const OptionInfoRec * @@ -328,8 +320,6 @@ KbdPreInit(InputDriverPtr drv, IDevPtr dev, int flags) xfree(s); } -#ifdef XKB - /* XkbDisable must be a server flag but for compatibility we check it here */ if (xf86FindOption(pInfo->options, "XkbDisable")) @@ -337,10 +327,6 @@ KbdPreInit(InputDriverPtr drv, IDevPtr dev, int flags) "%s: XKB can't be disabled here. Use \"ServerFlags\" section.\n", pInfo->name); - pKbd->noXkb = noXkbExtension; - if (pKbd->noXkb) { - xf86Msg(X_CONFIG, "XKB: disabled\n"); - } else { SetXkbOption(pInfo, "XkbKeymap", &xkbnames.keymap); if (xkbnames.keymap) { xf86Msg(X_CONFIG, "%s: XkbKeymap overrides all other XKB settings\n", @@ -358,12 +344,10 @@ KbdPreInit(InputDriverPtr drv, IDevPtr dev, int flags) SetXkbOption(pInfo, "XkbSymbols", &xkbnames.symbols); SetXkbOption(pInfo, "XkbGeometry", &xkbnames.geometry); } - } if ((xkb_model && !strcmp(xkb_model, "sun")) || (xkb_rules && !strcmp(xkb_rules, "sun"))) pKbd->sunKbd = TRUE; -#endif #if defined(SVR4) && defined(i386) if ((pKbd->Panix106 = @@ -441,15 +425,7 @@ KbdCtrl( DeviceIntPtr device, KeybdCtrl *ctrl) pKbd->keyLeds &= ~COMPOSEFLAG; } leds = ctrl->leds & ~(XCAPS | XNUM | XSCR); /* ??? */ -#ifdef XKB - if (pKbd->noXkb) { -#endif - pKbd->leds = (leds & pKbd->xledsMask) | (pKbd->leds & ~pKbd->xledsMask); -#ifdef XKB - } else { pKbd->leds = leds; - } -#endif pKbd->SetLeds(pInfo, pKbd->leds); pKbd->autoRepeat = ctrl->autoRepeat; @@ -547,6 +523,12 @@ KbdProc(DeviceIntPtr device, int what) KeySymsRec keySyms; CARD8 modMap[MAP_LENGTH]; int ret; + XkbRMLVOSet rmlvo; + rmlvo.rules = xkb_rules; + rmlvo.model = xkb_model; + rmlvo.layout = xkb_layout; + rmlvo.variant = xkb_variant; + rmlvo.options = xkb_options; switch (what) { case DEVICE_INIT: @@ -557,28 +539,13 @@ KbdProc(DeviceIntPtr device, int what) pKbd->KbdGetMapping(pInfo, &keySyms, modMap); device->public.on = FALSE; -#ifdef XKB - if (pKbd->noXkb) { -#endif - InitKeyboardDeviceStruct((DevicePtr) device, - &keySyms, - modMap, - KbdBell, - (KbdCtrlProcPtr)KbdCtrl); -#ifdef XKB - } else { if (xkbnames.keymap) xkb_rules = NULL; - XkbSetRulesDflts(xkb_rules, xkb_model, xkb_layout, - xkb_variant, xkb_options); - XkbInitKeyboardDeviceStruct(device, - &xkbnames, - &keySyms, - modMap, - KbdBell, - (KbdCtrlProcPtr)KbdCtrl); - } -#endif + rmlvo.rules = xkb_rules; + InitKeyboardDeviceStruct(device, + &rmlvo, + KbdBell, + (KbdCtrlProcPtr)KbdCtrl); InitKBD(pInfo, TRUE); break; case DEVICE_ON: @@ -628,11 +595,10 @@ PostKbdEvent(InputInfoPtr pInfo, unsigned int scanCode, Bool down) KbdFeedbackClassRec *kbdfeed = device->kbdfeed; int specialkey = 0; - Bool UsePrefix = FALSE; KeySym *keysym; + KeySymsRec keySyms; + CARD8 modMap[MAP_LENGTH]; int keycode; - unsigned long changeLock = 0; - static int lockkeys = 0; #ifdef DEBUG ErrorF("kbd driver rec scancode: 0x02%x %s\n", scanCode, down?"down":"up"); @@ -685,24 +651,6 @@ PostKbdEvent(InputInfoPtr pInfo, unsigned int scanCode, Bool down) } } -#ifndef TERMINATE_FALLBACK -#define TERMINATE_FALLBACK 0 -#endif -#ifdef XKB - if (noXkbExtension -#if TERMINATE_FALLBACK - || specialkey == KEY_BackSpace -#endif - ) -#endif - { - if (CommonSpecialKey(specialkey, down, keyc->state)) - return; - if (pKbd->SpecialKey != NULL) - if (pKbd->SpecialKey(pInfo, specialkey, down, keyc->state)) - return; - } - #ifndef __sparc64__ /* * PC keyboards generate separate key codes for @@ -722,119 +670,12 @@ sunKeyboards: /* * Now map the scancodes to real X-keycodes ... */ + pKbd->KbdGetMapping(pInfo, &keySyms, modMap); + keycode = scanCode + MIN_KEYCODE; - keysym = (keyc->curKeySyms.map + - keyc->curKeySyms.mapWidth * - (keycode - keyc->curKeySyms.minKeyCode)); - -#ifdef XKB - if (pKbd->noXkb) { -#endif - /* - * Filter autorepeated caps/num/scroll lock keycodes. - */ - if( down ) { - switch( keysym[0] ) { - case XK_Caps_Lock : - if (lockkeys & CAPSFLAG) - return; - else - lockkeys |= CAPSFLAG; - break; - - case XK_Num_Lock : - if (lockkeys & NUMFLAG) - return; - else - lockkeys |= NUMFLAG; - break; - - case XK_Scroll_Lock : - if (lockkeys & SCROLLFLAG) - return; - else - lockkeys |= SCROLLFLAG; - break; - } - if (keysym[1] == XF86XK_ModeLock) - { - if (lockkeys & MODEFLAG) - return; - else - lockkeys |= MODEFLAG; - } - } - else { - switch( keysym[0] ) { - case XK_Caps_Lock : - lockkeys &= ~CAPSFLAG; - break; - - case XK_Num_Lock : - lockkeys &= ~NUMFLAG; - break; - - case XK_Scroll_Lock : - lockkeys &= ~SCROLLFLAG; - break; - } - if (keysym[1] == XF86XK_ModeLock) - lockkeys &= ~MODEFLAG; - } - - /* - * LockKey special handling: - * ignore releases, toggle on & off on presses. - * Don't deal with the Caps_Lock keysym directly, but check the lock modifier - */ - - if (keyc->modifierMap[keycode] & LockMask) - changeLock = CAPSFLAG; - if (keysym[0] == XK_Num_Lock) - changeLock = NUMFLAG; - if (keysym[0] == XK_Scroll_Lock) - changeLock = SCROLLFLAG; - if (keysym[1] == XF86XK_ModeLock) - changeLock = MODEFLAG; - - if (changeLock) { - if (!down) - return; - - pKbd->keyLeds &= ~changeLock; - - if (KeyPressed(keycode)) { - down = !down; - } else { - pKbd->keyLeds |= changeLock; - } - UpdateLeds(pInfo); - } - -#if !defined(CSRG_BASED) && \ - !defined(__GNU__) && \ - defined(KB_84) - if (!pKbd->CustomKeycodes) { - /* - * normal, non-keypad keys - */ - if (scanCode < KEY_KP_7 || scanCode > KEY_KP_Decimal) { - /* - * magic ALT_L key on AT84 keyboards for multilingual support - */ - if (pKbd->kbdType == KB_84 && - ModifierDown(AltMask) && - keysym[2] != NoSymbol) - { - UsePrefix = TRUE; - } - } - } -#endif /* !CSRG_BASED && !GNU && KB_84 */ - -#ifdef XKB - } -#endif + keysym = (keySyms.map + + keySyms.mapWidth * + (keycode - keyc->xkbInfo->desc->min_key_code)); /* * check for an autorepeat-event @@ -844,20 +685,12 @@ sunKeyboards: int bit = 1 << (keycode & 7); if ((pKbd->autoRepeat != AutoRepeatModeOn) || - keyc->modifierMap[keycode] || + modMap[keycode] || !(kbdfeed->ctrl.autoRepeats[num] & bit)) return; } - if (UsePrefix) { - xf86PostKeyboardEvent(device, - keyc->modifierKeyMap[keyc->maxKeysPerModifier*7], TRUE); - xf86PostKeyboardEvent(device, keycode, down); - xf86PostKeyboardEvent(device, - keyc->modifierKeyMap[keyc->maxKeysPerModifier*7], FALSE); - } else { - xf86PostKeyboardEvent(device, keycode, down); - } + xf86PostKeyboardEvent(device, keycode, down); } ModuleInfoRec KbdInfo = {