From 32db27a7f867b503c2840ca7b815e96d10be9210 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Thu, 17 Apr 2008 12:42:01 -0700 Subject: [PATCH] Input: Remove modifierMap from core We already have modmap (in the exact same format!) in XKB, so just use that all the time, instead of duplicating the information. Signed-off-by: Daniel Stone Signed-off-by: Peter Hutterer --- Xi/exevents.c | 4 +- dix/getevents.c | 2 +- dix/inpututils.c | 10 +++-- hw/dmx/input/dmxinputinit.c | 2 - hw/dmx/input/lnx-keyboard.c | 2 +- hw/dmx/input/usb-keyboard.c | 2 +- hw/kdrive/ephyr/ephyr.c | 6 +-- hw/kdrive/src/kdrive.h | 1 - hw/kdrive/src/kinput.c | 82 ------------------------------------- hw/xnest/Keyboard.c | 22 ++-------- hw/xquartz/quartzKeyboard.c | 10 +++++ hw/xwin/winkeybd.c | 6 +-- include/inputstr.h | 3 +- xkb/xkb.c | 3 -- xkb/xkbInit.c | 3 -- xkb/xkbUtils.c | 8 +--- 16 files changed, 30 insertions(+), 136 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 824972ca5..f06aed07d 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -199,8 +199,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master) dk = device->key; mk = master->key; - memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH); - mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode; mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode; SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms); @@ -997,7 +995,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count) if (xE->u.u.type == DeviceKeyPress) { if (ret == IS_REPEAT) { /* allow ddx to generate multiple downs */ - modifiers = k->modifierMap[key]; + modifiers = k->xkbInfo->desc->map->modmap[key]; if (!modifiers) { xE->u.u.type = DeviceKeyRelease; ProcessOtherEvent(xE, device, count); diff --git a/dix/getevents.c b/dix/getevents.c index 81e660860..ee08bed49 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -819,7 +819,7 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type, * or we have a modifier, don't generate a repeat event. */ if (!pDev->kbdfeed->ctrl.autoRepeat || !key_autorepeats(pDev, key_code) || - pDev->key->modifierMap[key_code]) + pDev->key->xkbInfo->desc->map->modmap[key_code]) return 0; } diff --git a/dix/inpututils.c b/dix/inpututils.c index 1adaa7888..1b6458f45 100644 --- a/dix/inpututils.c +++ b/dix/inpututils.c @@ -32,6 +32,8 @@ #include "input.h" #include "inputstr.h" #include "xace.h" +#include "xkbsrv.h" +#include "xkbstr.h" /* Check if a modifier map change is okay with the device. * Returns -1 for BadValue, as it collides with MappingBusy; this particular @@ -79,7 +81,7 @@ check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap) /* None of the old modifiers may be down while we change the map, * either. */ for (i = syms->minKeyCode; i < syms->maxKeyCode; i++) { - if (!dev->key->modifierMap[i]) + if (!dev->key->xkbInfo->desc->map->modmap[i]) continue; if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) { client->errorValue = i; @@ -130,7 +132,7 @@ check_modmap_change_slave(ClientPtr client, DeviceIntPtr master, static void do_modmap_change(ClientPtr client, DeviceIntPtr dev, CARD8 *modmap) { - memcpy(dev->key->modifierMap, modmap, MAP_LENGTH); + memcpy(dev->key->xkbInfo->desc->map->modmap, modmap, MAP_LENGTH); SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev); } @@ -209,7 +211,7 @@ int generate_modkeymap(ClientPtr client, DeviceIntPtr dev, keys_per_mod[i] = 0; for (i = 8; i < MAP_LENGTH; i++) { for (j = 0; j < 8; j++) { - if (dev->key->modifierMap[i] & (1 << j)) { + if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) { if (++keys_per_mod[j] > max_keys_per_mod) max_keys_per_mod = keys_per_mod[j]; } @@ -225,7 +227,7 @@ int generate_modkeymap(ClientPtr client, DeviceIntPtr dev, for (i = 8; i < MAP_LENGTH; i++) { for (j = 0; j < 8; j++) { - if (dev->key->modifierMap[i] & (1 << j)) { + if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) { modkeymap[(j * max_keys_per_mod) + keys_per_mod[j]] = i; keys_per_mod[j]++; } diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c index bce886fd3..9a14044db 100644 --- a/hw/dmx/input/dmxinputinit.c +++ b/hw/dmx/input/dmxinputinit.c @@ -427,7 +427,6 @@ static int dmxKeyboardOn(DeviceIntPtr pDevice, DMXLocalInitInfo *info) XkbInitKeyboardDeviceStruct(pDevice, &info->names, &info->keySyms, - info->modMap, dmxKeyboardBellProc, dmxKeyboardKbdCtrlProc); @@ -461,7 +460,6 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what) DevicePtr pDev = (DevicePtr) pDevice; InitKeyboardDeviceStruct(pDev, &info.keySyms, - info.modMap, dmxBell, dmxKbdCtrl); } if (info.buttonClass) { diff --git a/hw/dmx/input/lnx-keyboard.c b/hw/dmx/input/lnx-keyboard.c index 55ff9f859..744b6ace5 100644 --- a/hw/dmx/input/lnx-keyboard.c +++ b/hw/dmx/input/lnx-keyboard.c @@ -697,7 +697,7 @@ static void kbdLinuxConvert(DevicePtr pDev, /* No auto-repeat? */ if ((feed && !feed->ctrl.autoRepeat) - || priv->pKeyboard->key->modifierMap[keyCode] + || priv->pKeyboard->key->xkbInfo->desc->map->modmap[keyCode] || (feed && !(feed->ctrl.autoRepeats[keyCode >> 3] & (1 << (keyCode & 7))))) return; /* Ignore */ diff --git a/hw/dmx/input/usb-keyboard.c b/hw/dmx/input/usb-keyboard.c index 455513d06..12ca8ab96 100644 --- a/hw/dmx/input/usb-keyboard.c +++ b/hw/dmx/input/usb-keyboard.c @@ -331,7 +331,7 @@ static void kbdUSBConvert(DevicePtr pDev, /* No auto-repeat? */ if ((feed && !feed->ctrl.autoRepeat) - || priv->pDevice->key->modifierMap[keyCode] + || priv->pDevice->key->xkbInfo->desc->map->modmap[keyCode] || (feed && !(feed->ctrl.autoRepeats[keyCode >> 3] & (1 << (keyCode & 7))))) return; /* Ignore */ diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index 740f66148..fc3d940be 100644 --- a/hw/kdrive/ephyr/ephyr.c +++ b/hw/kdrive/ephyr/ephyr.c @@ -782,7 +782,7 @@ ephyrUpdateModifierState(unsigned int state) int count = keyc->modifierKeyCount[i]; for (key = 0; key < MAP_LENGTH; key++) - if (keyc->modifierMap[key] & mask) + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { int bit; BYTE *kptr; @@ -802,9 +802,9 @@ ephyrUpdateModifierState(unsigned int state) /* Modifier shoud be down, but isn't */ if (!(keyc->state & mask) && (state & mask)) for (key = 0; key < MAP_LENGTH; key++) - if (keyc->modifierMap[key] & mask) + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { - if (keyc->modifierMap[key] & mask && ephyrKbd && + if (keyc->xkbInfo->desc->map->modmap[key] & mask && ephyrKbd && ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled) KdEnqueueKeyboardEvent(ephyrKbd, key, FALSE); /* press */ break; diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h index 774648490..6a9f493ef 100644 --- a/hw/kdrive/src/kdrive.h +++ b/hw/kdrive/src/kdrive.h @@ -309,7 +309,6 @@ struct _KdKeyboardInfo { CARD8 keyState[KD_KEY_COUNT/8]; int minScanCode; int maxScanCode; - CARD8 modmap[MAP_LENGTH]; KeySymsRec keySyms; int leds; diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c index 2e38cf8f5..9b34a7a00 100644 --- a/hw/kdrive/src/kinput.c +++ b/hw/kdrive/src/kinput.c @@ -660,85 +660,6 @@ KdKbdCtrl (DeviceIntPtr pDevice, KeybdCtrl *ctrl) extern KeybdCtrl defaultKeyboardControl; -static void -KdInitAutoRepeats (KdKeyboardInfo *ki) -{ - int key_code; - unsigned char mask; - int i; - unsigned char *repeats; - - repeats = defaultKeyboardControl.autoRepeats; - memset (repeats, '\0', 32); - for (key_code = KD_MIN_KEYCODE; key_code <= KD_MAX_KEYCODE; key_code++) - { - if (!ki->modmap[key_code]) - { - i = key_code >> 3; - mask = 1 << (key_code & 7); - repeats[i] |= mask; - } - } -} - -const KdKeySymModsRec kdKeySymMods[] = { - { XK_Control_L, ControlMask }, - { XK_Control_R, ControlMask }, - { XK_Shift_L, ShiftMask }, - { XK_Shift_R, ShiftMask }, - { XK_Caps_Lock, LockMask }, - { XK_Shift_Lock, LockMask }, - { XK_Alt_L, Mod1Mask }, - { XK_Alt_R, Mod1Mask }, - { XK_Meta_L, Mod1Mask }, - { XK_Meta_R, Mod1Mask }, - { XK_Num_Lock, Mod2Mask }, - { XK_Super_L, Mod3Mask }, - { XK_Super_R, Mod3Mask }, - { XK_Hyper_L, Mod3Mask }, - { XK_Hyper_R, Mod3Mask }, - { XK_Mode_switch, Mod4Mask }, - /* PDA specific hacks */ -#ifdef XF86XK_Start - { XF86XK_Start, ControlMask }, -#endif - { XK_Menu, ShiftMask }, - { XK_telephone, Mod1Mask }, -#ifdef XF86XK_AudioRecord - { XF86XK_AudioRecord, Mod2Mask }, -#endif -#ifdef XF86XK_Calendar - { XF86XK_Calendar, Mod3Mask } -#endif -}; - -#define NUM_SYM_MODS (sizeof(kdKeySymMods) / sizeof(kdKeySymMods[0])) - -static void -KdInitModMap (KdKeyboardInfo *ki) -{ - int key_code; - int row; - int width; - KeySym *syms; - int i; - - width = ki->keySyms.mapWidth; - for (key_code = ki->keySyms.minKeyCode; key_code <= ki->keySyms.maxKeyCode; key_code++) - { - ki->modmap[key_code] = 0; - syms = ki->keySyms.map + (key_code - ki->keySyms.minKeyCode) * width; - for (row = 0; row < width; row++, syms++) - { - for (i = 0; i < NUM_SYM_MODS; i++) - { - if (*syms == kdKeySymMods[i].modsym) - ki->modmap[key_code] |= kdKeySymMods[i].modbit; - } - } - } -} - static int KdKeyboardProc(DeviceIntPtr pDevice, int onoff) { @@ -792,9 +713,6 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff) return !Success; } - KdInitModMap(ki); - KdInitAutoRepeats(ki); - memset(&rmlvo, 0, sizeof(rmlvo)); rmlvo.rules = ki->xkbRules; rmlvo.model = ki->xkbModel; diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c index 35be5212e..022816dec 100644 --- a/hw/xnest/Keyboard.c +++ b/hw/xnest/Keyboard.c @@ -119,7 +119,6 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff) int mapWidth; int min_keycode, max_keycode; KeySymsRec keySyms; - CARD8 modmap[MAP_LENGTH]; int i, j; XKeyboardState values; XkbComponentNamesRec names; @@ -130,7 +129,6 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff) switch (onoff) { case DEVICE_INIT: - modifier_keymap = XGetModifierMapping(xnestDisplay); XDisplayKeycodes(xnestDisplay, &min_keycode, &max_keycode); #ifdef _XSERVER64 { @@ -153,18 +151,6 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff) &mapWidth); #endif - for (i = 0; i < MAP_LENGTH; i++) - modmap[i] = 0; - for (j = 0; j < 8; j++) - for(i = 0; i < modifier_keymap->max_keypermod; i++) { - CARD8 keycode; - if ((keycode = - modifier_keymap-> - modifiermap[j * modifier_keymap->max_keypermod + i])) - modmap[keycode] |= 1<ctrls, xkb->ctrls); XkbFreeKeyboard(xkb, 0, False); xfree(keymap); @@ -250,7 +236,7 @@ xnestUpdateModifierState(unsigned int state) int count = keyc->modifierKeyCount[i]; for (key = 0; key < MAP_LENGTH; key++) - if (keyc->modifierMap[key] & mask) { + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { int bit; BYTE *kptr; @@ -269,7 +255,7 @@ xnestUpdateModifierState(unsigned int state) */ if (!(keyc->state & mask) && (state & mask)) for (key = 0; key < MAP_LENGTH; key++) - if (keyc->modifierMap[key] & mask) { + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { xnestQueueKeyEvent(KeyPress, key); break; } diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c index 21736d190..9e8da8be9 100644 --- a/hw/xquartz/quartzKeyboard.c +++ b/hw/xquartz/quartzKeyboard.c @@ -342,6 +342,16 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) { pthread_mutex_lock(&keyInfo_mutex); assert(XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, keyInfo.modMap, QuartzBell, DarwinChangeKeyboardControl)); + assert(pDev->key->xkbInfo->desc->map->modmap!=NULL); + memcpy(pDev->key->xkbInfo->desc->map->modmap, keyInfo.modMap, sizeof(keyInfo.modMap)); + pthread_mutex_unlock(&keyInfo_mutex); + + QuartzXkbUpdate(pDev); +#else + pthread_mutex_lock(&keyInfo_mutex); + assert( InitKeyboardDeviceStruct( (DevicePtr)pDev, &keySyms, + QuartzBell, + DarwinChangeKeyboardControl )); pthread_mutex_unlock(&keyInfo_mutex); /* Get our key repeat settings from GlobalPreferences */ diff --git a/hw/xwin/winkeybd.c b/hw/xwin/winkeybd.c index f270431e6..41168f3bd 100644 --- a/hw/xwin/winkeybd.c +++ b/hw/xwin/winkeybd.c @@ -217,7 +217,6 @@ int winKeybdProc (DeviceIntPtr pDeviceInt, int iState) { KeySymsRec keySyms; - CARD8 modMap[MAP_LENGTH]; DevicePtr pDevice = (DevicePtr) pDeviceInt; XkbComponentNamesRec names; XkbSrvInfoPtr xkbi; @@ -228,8 +227,6 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState) case DEVICE_INIT: winConfigKeyboard (pDeviceInt); - winGetKeyMappings (&keySyms, modMap); - /* FIXME: Maybe we should use winGetKbdLeds () here? */ defaultKeyboardControl.leds = g_winInfo.keyboard.leds; @@ -237,7 +234,6 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState) { InitKeyboardDeviceStruct (pDevice, &keySyms, - modMap, winKeybdBell, winKeybdCtrl); } @@ -263,7 +259,7 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState) g_winInfo.xkb.layout, g_winInfo.xkb.variant, g_winInfo.xkb.options); XkbInitKeyboardDeviceStruct (pDeviceInt, &names, &keySyms, - modMap, winKeybdBell, winKeybdCtrl); + winKeybdBell, winKeybdCtrl); } if (!g_winInfo.xkb.disable) diff --git a/include/inputstr.h b/include/inputstr.h index cdd68d593..76523aa83 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -138,8 +138,7 @@ typedef struct _KeyClassRec { CARD8 down[DOWN_LENGTH]; CARD8 postdown[DOWN_LENGTH]; KeySymsRec curKeySyms; - int modifierKeyCount[8]; - CARD8 modifierMap[MAP_LENGTH]; + int modifierKeyCount[8]; struct _XkbSrvInfo *xkbInfo; } KeyClassRec, *KeyClassPtr; diff --git a/xkb/xkb.c b/xkb/xkb.c index 21750c9cf..f818a72fa 100644 --- a/xkb/xkb.c +++ b/xkb/xkb.c @@ -5836,9 +5836,6 @@ ProcXkbGetKbdByName(ClientPtr client) if (tmpd == dev || (dev->id == inputInfo.keyboard->id && tmpd->key && tmpd->coreEvents)) { - - memcpy(tmpd->key->modifierMap, xkb->map->modmap, - xkb->max_key_code + 1); if (tmpd != dev) XkbCopyKeymap(dev->key->xkbInfo->desc, tmpd->key->xkbInfo->desc, True); diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c index d85fbd4e4..bcee26c37 100644 --- a/xkb/xkbInit.c +++ b/xkb/xkbInit.c @@ -506,9 +506,6 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, XkbInitControls(dev, xkbi); - /* XXX: Doesn't XUCD make this redundant? */ - memcpy(dev->key->modifierMap, xkb->map->modmap, xkb->max_key_code + 1); - XkbInitIndicatorMap(xkbi); XkbDDXInitDevice(dev); diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c index 8960bca12..f84e89206 100644 --- a/xkb/xkbUtils.c +++ b/xkb/xkbUtils.c @@ -363,17 +363,14 @@ int maxSymsPerKey,maxKeysPerMod, maxGroup1Width; int first,last,firstCommon,lastCommon; XkbDescPtr xkb; KeyClassPtr keyc; -CARD8 keysPerMod[XkbNumModifiers]; int maxNumberOfGroups; if (!keybd || !keybd->key || !keybd->key->xkbInfo) return; xkb= keybd->key->xkbInfo->desc; keyc= keybd->key; - maxSymsPerKey= maxKeysPerMod= maxGroup1Width= 0; + maxSymsPerKey= maxGroup1Width= 0; maxNumberOfGroups = 0; - bzero(keysPerMod,sizeof(keysPerMod)); - memcpy(keyc->modifierMap,xkb->map->modmap,xkb->max_key_code+1); if ((xkb->min_key_code==keyc->curKeySyms.minKeyCode)&& (xkb->max_key_code==keyc->curKeySyms.maxKeyCode)) { first= firstCommon= xkb->min_key_code; @@ -590,10 +587,7 @@ unsigned check; XkbDescPtr xkb= kbd->key->xkbInfo->desc; XkbSetCauseCoreReq(&cause,X_SetModifierMapping,client); - num = xkb->max_key_code-xkb->min_key_code+1; - memcpy(xkb->map->modmap,kbd->key->modifierMap,xkb->max_key_code+1); - changes.map.changed|= XkbModifierMapMask; changes.map.first_modmap_key= xkb->min_key_code; changes.map.num_modmap_keys= num;