xserver: Branch 'master' - 32 commits
Daniel Stone
daniels at kemper.freedesktop.org
Wed Jan 21 21:44:32 PST 2009
Xext/xtest.c | 6
Xi/exevents.c | 314 ++------------------
Xi/getkmap.c | 29 +
Xi/getmmap.c | 28 -
Xi/listdev.c | 6
Xi/querydp.c | 5
Xi/queryst.c | 5
Xi/setbmap.c | 21 -
Xi/setmmap.c | 30 +
Xi/ungrdevk.c | 6
configure.ac | 2
dix/Makefile.am | 1
dix/devices.c | 626 ++++++++---------------------------------
dix/dispatch.c | 21 -
dix/events.c | 282 +-----------------
dix/getevents.c | 94 ++----
dix/inpututils.c | 356 +++++++++++++++++++++++
hw/dmx/dmxclient.h | 11
hw/dmx/input/atKeynames.h | 1
hw/dmx/input/dmxcommon.c | 6
hw/dmx/input/dmxcommon.h | 4
hw/dmx/input/dmxdummy.c | 2
hw/dmx/input/dmxinputinit.c | 114 +++----
hw/dmx/input/dmxinputinit.h | 2
hw/dmx/input/lnx-keyboard.c | 2
hw/dmx/input/usb-keyboard.c | 4
hw/kdrive/ephyr/ephyr.c | 19 +
hw/kdrive/linux/keyboard.c | 280 +++++++-----------
hw/kdrive/src/kdrive.h | 7
hw/kdrive/src/kinput.c | 204 -------------
hw/vfb/InitInput.c | 16 -
hw/xfree86/common/xf86Config.c | 19 -
hw/xfree86/common/xf86DGA.c | 10
hw/xfree86/common/xf86Events.c | 72 +---
hw/xfree86/common/xf86Module.h | 2
hw/xfree86/common/xf86Xinput.c | 5
hw/xnest/Keyboard.c | 98 ++----
hw/xquartz/quartzKeyboard.c | 38 +-
hw/xwin/InitOutput.c | 8
hw/xwin/winconfig.c | 259 +++++-----------
hw/xwin/winconfig.h | 13
hw/xwin/winkeybd.c | 25 -
hw/xwin/winprocarg.c | 11
hw/xwin/winwndproc.c | 4
include/dix-config.h.in | 9
include/dix.h | 2
include/dixstruct.h | 2
include/exevents.h | 22 -
include/globals.h | 5
include/input.h | 57 +--
include/inputstr.h | 29 -
include/site.h | 4
include/xkbfile.h | 4
include/xkbrules.h | 84 -----
include/xkbsrv.h | 86 +----
include/xkbstr.h | 175 +++++------
include/xorg-server.h.in | 6
mi/miinitext.c | 20 -
os/utils.c | 9
xkb/Makefile.am | 8
xkb/XKBMisc.c | 8
xkb/ddxInit.c | 45 --
xkb/ddxKeyClick.c | 45 --
xkb/ddxList.c | 6
xkb/ddxLoad.c | 38 ++
xkb/maprules.c | 299 -------------------
xkb/xkb.c | 45 --
xkb/xkbAccessX.c | 7
xkb/xkbActions.c | 91 -----
xkb/xkbEvents.c | 299 ++++++++++++-------
xkb/xkbInit.c | 481 ++++++++-----------------------
xkb/xkbLEDs.c | 6
xkb/xkbPrOtherEv.c | 81 -----
xkb/xkbUtils.c | 435 ++++++++++------------------
xkb/xkbfmisc.c | 57 ---
xkb/xkbtext.c | 14
xkb/xkmread.c | 94 +++++-
77 files changed, 1879 insertions(+), 3762 deletions(-)
New commits:
commit b5ece46b76c9182a077141505cc0e788c0fca3ea
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Jan 17 20:07:40 2009 +0200
Input: Clarify valuator FatalError messages
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 8117ec4..bf9d167 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -753,10 +753,11 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
int first = xV->first_valuator;
BOOL change = FALSE;
- if (xV->num_valuators &&
- (!v || (xV->num_valuators &&
- (first + xV->num_valuators > v->numAxes))))
- FatalError("Bad valuators reported for device %s\n",
+ if (xV->num_valuators && !v)
+ FatalError("Valuators reported for non-valuator device '%s'\n",
+ device->name);
+ if (first + xV->num_valuators > v->numAxes)
+ FatalError("Too many valuators reported for device '%s'\n",
device->name);
if (v && v->axisVal) {
/* v->axisVal is always in absolute coordinates. Only the
commit ddb46c1421a98190313b79621c0f5ae43b97d3f6
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Jan 17 20:03:10 2009 +0200
Input: Use previous state in valuator events
Make valuator event state match other events by using the device state
from before processing the event, not after. Also, we already check the
number of valuators in UpdateDeviceState, so no need to do it again.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 00ced5d..8117ec4 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -952,20 +952,8 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
/* Valuator event handling */
for (i = 1; i < count; i++) {
- if ((++xV)->type == DeviceValuator) {
- int first = xV->first_valuator;
- if (xV->num_valuators
- && (!v
- || (xV->num_valuators
- && (first + xV->num_valuators > v->numAxes))))
- FatalError("Bad valuators reported for device %s\n",
- device->name);
- xV->device_state = 0;
- if (k)
- xV->device_state |= XkbStateFieldFromRec(&k->xkbInfo->state);
- if (b)
- xV->device_state |= b->state;
- }
+ if ((++xV)->type == DeviceValuator)
+ xV->device_state = state;
}
if (xE->u.u.type == DeviceKeyPress) {
commit 18e51911f5748f9a27a18cd6bb421c899f5b048f
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Jan 17 13:44:47 2009 +0200
Input: Add postdown to ButtonClassRec
This mirrors that in KeyClassRec: the state of the buttons as posted to
GetPointerEvents, rather than the state of the buttons as processed by
ProcessOtherEvent and friends.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/dix/getevents.c b/dix/getevents.c
index ee08bed..ce086d5 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1006,10 +1006,14 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
kbp->type = DeviceMotionNotify;
}
else {
- if (type == ButtonPress)
+ if (type == ButtonPress) {
kbp->type = DeviceButtonPress;
- else if (type == ButtonRelease)
+ pDev->button->postdown[buttons >> 3] |= (1 << (buttons & 7));
+ }
+ else if (type == ButtonRelease) {
kbp->type = DeviceButtonRelease;
+ pDev->button->postdown[buttons >> 3] &= ~(1 << (buttons & 7));
+ }
kbp->detail = buttons;
}
diff --git a/include/inputstr.h b/include/inputstr.h
index daee7ed..2ee4f9b 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -181,6 +181,7 @@ typedef struct _ButtonClassRec {
unsigned short state;
Mask motionMask;
CARD8 down[DOWN_LENGTH];
+ CARD8 postdown[DOWN_LENGTH];
CARD8 map[MAP_LENGTH];
union _XkbAction *xkb_acts;
} ButtonClassRec, *ButtonClassPtr;
commit c05f3bc935bef4d98216d38c0e98bd57ced382df
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Jan 17 19:35:15 2009 +0200
Input: Don't allow DDX to generate repeat events
We always use soft-repeat at the moment; XKB posts a release/press sequence,
which admittedly needs cleaning up, but that's for another day.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 011fc7e..00ced5d 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -705,11 +705,9 @@ ChangeMasterDeviceClasses(DeviceIntPtr device,
* return values are
* DEFAULT ... process as normal
* DONT_PROCESS ... return immediately from caller
- * IS_REPEAT .. event is a repeat event.
*/
#define DEFAULT 0
#define DONT_PROCESS 1
-#define IS_REPEAT 2
int
UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
{
@@ -813,9 +811,8 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
return DONT_PROCESS;
kptr = &k->down[key >> 3];
- if (*kptr & bit) { /* allow ddx to generate multiple downs */
- return IS_REPEAT;
- }
+ if (*kptr & bit) /* don't allow ddx to generate multiple downs */
+ return DONT_PROCESS;
if (device->valuator)
device->valuator->motionHintWindow = NullWindow;
*kptr |= bit;
@@ -895,7 +892,6 @@ void
ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
{
int i;
- CARD16 modifiers;
GrabPtr grab = device->deviceGrab.grab;
Bool deactivateDeviceGrab = FALSE;
int key = 0, rootX, rootY;
@@ -973,17 +969,6 @@ 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->xkbInfo->desc->map->modmap[key];
- if (!modifiers) {
- xE->u.u.type = DeviceKeyRelease;
- ProcessOtherEvent(xE, device, count);
- xE->u.u.type = DeviceKeyPress;
- /* release can have side effects, don't fall through */
- ProcessOtherEvent(xE, device, count);
- }
- return;
- }
if (!grab && CheckDeviceGrabs(device, xE, 0, count)) {
device->deviceGrab.activatingKey = key;
return;
commit 6aef4e96affcc26b9415c6bc9c9bebb5af05a1a7
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Jan 17 13:42:46 2009 +0200
XKB: Fix logic error
Use logical or instead of bitwise or.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index 4a0f561..c7f7439 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -604,7 +604,7 @@ Bool ignoreKeyEvent = FALSE;
ev.keycode= key;
ev.slowKeysDelay= ctrls->slow_keys_delay;
ev.debounceDelay= ctrls->debounce_delay;
- if (BitIsOn(keybd->key->down,key) | (xkbi->mouseKey == key)) {
+ if (BitIsOn(keybd->key->down,key) || (xkbi->mouseKey == key)) {
ev.detail= XkbAXN_SKRelease;
beep_type= _BEEP_SLOW_RELEASE;
}
commit 0ec9b1069aeeaf66fd104c09f08202f7ebccd170
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Jan 10 14:44:28 2009 +0200
XKB: Remove unused XkbProcessOtherEvent
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/xkb/Makefile.am b/xkb/Makefile.am
index 19d3541..b85ee8a 100644
--- a/xkb/Makefile.am
+++ b/xkb/Makefile.am
@@ -37,11 +37,7 @@ X11_SRCS = \
XKBGAlloc.c \
XKBMAlloc.c
-# ends up unused...
-# XI_SRCS = xkbPrOtherEv.c
-
-libxkb_la_SOURCES = $(DDX_SRCS) $(DIX_SRCS) $(XI_SRCS) $(XKBFILE_SRCS) \
- $(X11_SRCS)
+libxkb_la_SOURCES = $(DDX_SRCS) $(DIX_SRCS) $(XKBFILE_SRCS) $(X11_SRCS)
libxkbstubs_la_SOURCES = ddxVT.c ddxPrivate.c ddxKillSrv.c
EXTRA_DIST = xkbDflts.h xkbgeom.h xkb.h
diff --git a/xkb/xkbPrOtherEv.c b/xkb/xkbPrOtherEv.c
deleted file mode 100644
index ef8b014..0000000
--- a/xkb/xkbPrOtherEv.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/************************************************************
-Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <math.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "xkbsrv.h"
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-
-extern void ProcessOtherEvent(
- xEvent * /* xE */,
- DeviceIntPtr /* dev */,
- int /* count */
-);
-
-/***====================================================================***/
-
-void
-XkbProcessOtherEvent(xEvent *xE,DeviceIntPtr dev,int count)
-{
-Bool xkbCares,isBtn;
-
- xkbCares= True;
- isBtn= False;
- switch ( xE->u.u.type ) {
- case KeyPress: xE->u.u.type= DeviceKeyPress; break;
- case KeyRelease: xE->u.u.type= DeviceKeyRelease; break;
- case ButtonPress: xE->u.u.type= DeviceButtonPress;
- isBtn= True;
- break;
- case ButtonRelease: xE->u.u.type= DeviceButtonRelease;
- isBtn= True;
- break;
- default: xkbCares= False; break;
- }
- if (xkbCares) {
- if ((!isBtn)||((dev->button)&&(dev->button->xkb_acts))) {
- DeviceIntPtr kbd;
- if (dev->key) kbd= dev;
- else kbd= inputInfo.keyboard;
- XkbHandleActions(dev,kbd,xE,count);
- return;
- }
- }
- ProcessOtherEvent(xE,dev,count);
- return;
-}
-
commit 7af53799ccefe27b996bdc6073075b7f12353d3a
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sun Jan 4 16:39:18 2009 +1100
Input: Remove unused CoreProcess{Keyboard,Pointer}Event
Everything goes through XKB's Process{Keyboard,Pointer}Event on its way
through to ProcessOtherEvent now, so get rid of the old, useless functions.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/dix/events.c b/dix/events.c
index 0a70296..839c456 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3647,90 +3647,6 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
}
}
-/**
- * Main keyboard event processing function for core keyboard events.
- * Updates the events fields from the current pointer state and delivers the
- * event.
- *
- * For key events, xE will always be a single event.
- *
- * @param xE Event list
- * @param keybd The device that caused an event.
- * @param count Number of elements in xE.
- */
-void
-CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
-{
- int key, bit;
- BYTE *kptr;
- GrabPtr grab;
- GrabInfoPtr grabinfo;
- Bool deactivateGrab = FALSE;
- KeyClassPtr keyc = keybd->key;
-
- grabinfo = &keybd->deviceGrab;
- grab = grabinfo->grab;
-
- if (!syncEvents.playingEvents)
- {
- NoticeTime(xE);
- if (DeviceEventCallback)
- {
- DeviceEventInfoRec eventinfo;
- eventinfo.events = xE;
- eventinfo.count = count;
- CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
- }
- }
-
- /* ProcessOtherEvent already updated the keyboard's state, so we need to
- * access prev_state here! */
- XE_KBPTR.state = XkbStateFieldFromRec(&keybd->key->xkbInfo->prev_state);
- XE_KBPTR.state |= GetPairedDevice(keybd)->button->state;
- XE_KBPTR.rootX = keybd->spriteInfo->sprite->hot.x;
- XE_KBPTR.rootY = keybd->spriteInfo->sprite->hot.y;
-
- key = xE->u.u.detail;
- kptr = &keyc->down[key >> 3];
- bit = 1 << (key & 7);
-
- switch (xE->u.u.type)
- {
- case KeyPress:
- /* We MUST NOT change the device itself here. All device state
- * changes must be performed in ProcessOtherEvents. We're dealing
- * with the same device struct, so if we change it in POE and
- * here, we've just screwed up the state by setting it twice.
- *
- * Devices may not send core events but always send XI events, so
- * the state must be changed in POE, not here.
- */
- if (!grab && CheckDeviceGrabs(keybd, xE, 0, count))
- {
- grabinfo->activatingKey = key;
- return;
- }
- break;
- case KeyRelease:
- if (!(*kptr & bit)) /* guard against duplicates */
- return;
- /* No device state changes, see comment for KeyPress */
- if (grabinfo->fromPassiveGrab && (key == grabinfo->activatingKey))
- deactivateGrab = TRUE;
- break;
- default:
- FatalError("Impossible keyboard event");
- }
- if (grab)
- DeliverGrabbedEvent(xE, keybd, deactivateGrab, count);
- else
- DeliverFocusedEvent(keybd, xE, keybd->spriteInfo->sprite->win, count);
- if (deactivateGrab)
- (*grabinfo->DeactivateGrab)(keybd);
-
- XaceHook(XACE_KEY_AVAIL, xE, keybd, count);
-}
-
/* This function is used to set the key pressed or key released state -
this is only used when the pressing of keys does not cause
the device's processInputProc to be called, as in for example Mouse Keys.
@@ -3761,94 +3677,6 @@ FixKeyState (xEvent *xE, DeviceIntPtr keybd)
FatalError("Impossible keyboard event");
}
-/**
- * Main pointer event processing function for core pointer events.
- * For motion events: update the sprite.
- * For all other events: Update the event fields based on the current sprite
- * state.
- *
- * For core pointer events, xE will always be a single event.
- *
- * @param xE Event list
- * @param mouse The device that caused an event.
- * @param count Number of elements in xE.
- */
-void
-CoreProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count)
-{
- GrabPtr grab = mouse->deviceGrab.grab;
- Bool deactivateGrab = FALSE;
- ButtonClassPtr butc = mouse->button;
- SpritePtr pSprite = mouse->spriteInfo->sprite;
-
- XkbSrvInfoPtr xkbi= GetPairedDevice(mouse)->key->xkbInfo;
-
- if (!syncEvents.playingEvents)
- NoticeTime(xE)
- XE_KBPTR.state = (butc->state | xkbi->state.grab_mods);
- {
- NoticeTime(xE);
- if (DeviceEventCallback)
- {
- DeviceEventInfoRec eventinfo;
- /* see comment in EnqueueEvents regarding the next three lines */
- if (xE->u.u.type == MotionNotify)
- XE_KBPTR.root =
- WindowTable[pSprite->hotPhys.pScreen->myNum]->drawable.id;
- eventinfo.events = xE;
- eventinfo.count = count;
- CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
- }
- }
- /* We need to call CheckMotion for each event. It doesn't really give us
- any benefit for relative devices, but absolute devices may not send
- button events to the right position otherwise. */
- if (!CheckMotion(xE, mouse) && xE->u.u.type == MotionNotify)
- return;
- if (xE->u.u.type != MotionNotify)
- {
- int key;
-
- XE_KBPTR.rootX = pSprite->hot.x;
- XE_KBPTR.rootY = pSprite->hot.y;
-
- key = xE->u.u.detail;
- switch (xE->u.u.type)
- {
- case ButtonPress:
- /*
- * We rely on the fact that ButtonMotionMask is the same as
- * DeviceButtonMotionMask, so setting the motionMask
- * to this value ensures correctness for both XI and core events.
- */
- if (xE->u.u.detail == 0)
- return;
- filters[mouse->id][Motion_Filter(butc)] = MotionNotify;
- if (!grab)
- if (CheckDeviceGrabs(mouse, xE, 0, count))
- return;
- break;
- case ButtonRelease:
- if (xE->u.u.detail == 0)
- return;
- filters[mouse->id][Motion_Filter(butc)] = MotionNotify;
- if (!butc->buttonsDown && mouse->deviceGrab.fromPassiveGrab)
- deactivateGrab = TRUE;
- break;
- default:
- FatalError("bogus pointer event from ddx. Type %d\n", xE->u.u.type);
- }
- }
-
- if (grab)
- DeliverGrabbedEvent(xE, mouse, deactivateGrab, count);
- else
- DeliverDeviceEvents(pSprite->win, xE, NullGrab, NullWindow,
- mouse, count);
- if (deactivateGrab)
- (*mouse->deviceGrab.DeactivateGrab)(mouse);
-}
-
#define AtMostOneClient \
(SubstructureRedirectMask | ResizeRedirectMask | ButtonPressMask)
#define ManagerMask \
diff --git a/include/input.h b/include/input.h
index 19d1ae7..bf826b0 100644
--- a/include/input.h
+++ b/include/input.h
@@ -400,16 +400,6 @@ extern _X_EXPORT void ProcessKeyboardEvent(
DeviceIntPtr /*keybd*/,
int /*count*/);
-extern _X_EXPORT void CoreProcessPointerEvent(
- xEventPtr /*xE*/,
- DeviceIntPtr /*mouse*/,
- int /*count*/) _X_DEPRECATED;
-
-extern _X_EXPORT _X_DEPRECATED void CoreProcessKeyboardEvent(
- xEventPtr /*xE*/,
- DeviceIntPtr /*keybd*/,
- int /*count*/) _X_DEPRECATED;
-
extern _X_EXPORT Bool LegalModifier(
unsigned int /*key*/,
DeviceIntPtr /*pDev*/);
commit 7c4c00649cae855e141ec9a3667bfe399e3156d0
Author: Daniel Stone <daniel at fooishbar.org>
Date: Thu Jan 1 05:25:52 2009 +1100
XKB: Remove unused DDX functions
They were complete no-ops anyway.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 7684675..8f6a767 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -771,22 +771,12 @@ extern _X_EXPORT int XkbRemoveResourceClient(
XID /* id */
);
-extern _X_EXPORT int XkbDDXInitDevice(
- DeviceIntPtr /* dev */
-);
-
extern _X_EXPORT int XkbDDXAccessXBeep(
DeviceIntPtr /* dev */,
unsigned int /* what */,
unsigned int /* which */
);
-extern _X_EXPORT void XkbDDXKeyClick(
- DeviceIntPtr /* dev */,
- int /* keycode */,
- int /* synthetic */
-);
-
extern _X_EXPORT int XkbDDXUsesSoftRepeat(
DeviceIntPtr /* dev */
);
diff --git a/xkb/Makefile.am b/xkb/Makefile.am
index 5967f42..19d3541 100644
--- a/xkb/Makefile.am
+++ b/xkb/Makefile.am
@@ -7,8 +7,6 @@ DDX_SRCS = \
ddxBeep.c \
ddxCtrls.c \
ddxFakeMtn.c \
- ddxInit.c \
- ddxKeyClick.c \
ddxLEDs.c \
ddxLoad.c \
ddxList.c \
diff --git a/xkb/ddxInit.c b/xkb/ddxInit.c
deleted file mode 100644
index 89ffb78..0000000
--- a/xkb/ddxInit.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include <xkbsrv.h>
-#include <X11/extensions/XI.h>
-
-int
-XkbDDXInitDevice(DeviceIntPtr dev)
-{
- return 1;
-}
diff --git a/xkb/ddxKeyClick.c b/xkb/ddxKeyClick.c
deleted file mode 100644
index aabedab..0000000
--- a/xkb/ddxKeyClick.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include <xkbsrv.h>
-#include <X11/extensions/XI.h>
-
-void
-XkbDDXKeyClick(DeviceIntPtr pXDev,int keycode,int synthetic)
-{
- return;
-}
diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index b98b0d8..4a0f561 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -132,9 +132,7 @@ xEvent xE;
DebugF("[xkb] AXKE: Key %d %s\n",keyCode,(xE.u.u.type==KeyPress?"down":"up"));
}
- if (_XkbIsPressEvent(type))
- XkbDDXKeyClick(keybd,keyCode,TRUE);
- else if (isRepeat)
+ if (!_XkbIsPressEvent(type) && isRepeat)
XkbLastRepeatEvent= (pointer)&xE;
XkbProcessKeyboardEvent(&xE,keybd,1L);
XkbLastRepeatEvent= NULL;
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index 151d9a5..bc2b41e 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -508,8 +508,6 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
XkbInitIndicatorMap(xkbi);
- XkbDDXInitDevice(dev);
-
XkbUpdateActions(dev, xkb->min_key_code, XkbNumKeys(xkb), &changes,
&check, &cause);
commit 4fa3872dc2bcfd6d1fc88d0a94c7071683eea899
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Oct 18 20:26:00 2008 +0100
Input: Remove core keysyms from KeyClassRec
Instead of always keeping two copies of the keymap, only generate the
core keymap from the XKB keymap when we really need to, and use the XKB
keymap as the canonical keymap.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xext/xtest.c b/Xext/xtest.c
index 2383a87..7e95c86 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -42,6 +42,8 @@
#include "dixevents.h"
#include "sleepuntil.h"
#include "mi.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
#define _XTEST_SERVER_
#include <X11/extensions/XTest.h>
#include <X11/extensions/xteststr.h>
@@ -321,8 +323,8 @@ ProcXTestFakeInput(ClientPtr client)
{
case KeyPress:
case KeyRelease:
- if (ev->u.u.detail < dev->key->curKeySyms.minKeyCode ||
- ev->u.u.detail > dev->key->curKeySyms.maxKeyCode)
+ if (ev->u.u.detail < dev->key->xkbInfo->desc->min_key_code ||
+ ev->u.u.detail > dev->key->xkbInfo->desc->max_key_code)
{
client->errorValue = ev->u.u.detail;
return BadValue;
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 76214b9..011fc7e 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -212,8 +212,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
if (device == master)
return;
- SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
-
for (i = 0; i < 8; i++)
mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
@@ -476,7 +474,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
if (from->key)
{
- KeySym *oldMap;
struct _XkbSrvInfo *oldXkbInfo;
if (!to->key)
{
@@ -492,21 +489,8 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
classes->key = NULL;
}
- oldMap = to->key->curKeySyms.map;
oldXkbInfo = to->key->xkbInfo;
-
- if (!oldMap) /* newly created key struct */
- {
- int bytes = (to->key->curKeySyms.maxKeyCode -
- to->key->curKeySyms.minKeyCode + 1) *
- to->key->curKeySyms.mapWidth;
- oldMap = (KeySym *)xcalloc(sizeof(KeySym), bytes);
- memcpy(oldMap, from->key->curKeySyms.map, bytes);
- }
-
- to->key->curKeySyms.map = oldMap;
to->key->xkbInfo = oldXkbInfo;
-
CopyKeyClass(from, to);
} else if (to->key && !from->key)
{
@@ -1101,7 +1085,8 @@ FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k,
memcpy((char*)ev->buttons, (char*)b->down, 4);
} else if (k) {
ev->classes_reported |= (1 << KeyClass);
- ev->num_keys = k->curKeySyms.maxKeyCode - k->curKeySyms.minKeyCode;
+ ev->num_keys = k->xkbInfo->desc->max_key_code -
+ k->xkbInfo->desc->min_key_code;
memmove((char *)&ev->keys[0], (char *)k->down, 4);
}
if (v) {
@@ -1185,7 +1170,8 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
evcount++;
}
if ((k = dev->key) != NULL) {
- nkeys = k->curKeySyms.maxKeyCode - k->curKeySyms.minKeyCode;
+ nkeys = k->xkbInfo->desc->max_key_code -
+ k->xkbInfo->desc->min_key_code;
if (nkeys > 32)
evcount++;
if (nbuttons > 0) {
@@ -1355,10 +1341,11 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
client->errorValue = this_device_mode;
return BadValue;
}
- if (((key > k->curKeySyms.maxKeyCode) || (key < k->curKeySyms.minKeyCode))
+ if ((key > k->xkbInfo->desc->max_key_code ||
+ key < k->xkbInfo->desc->min_key_code)
&& (key != AnyKey)) {
client->errorValue = key;
- return BadValue;
+ return BadValue;
}
if ((modifiers != AnyModifier) && (modifiers & ~AllModifiersMask)) {
client->errorValue = modifiers;
@@ -1656,8 +1643,8 @@ ChangeKeyMapping(ClientPtr client,
if (len != (keyCodes * keySymsPerKeyCode))
return BadLength;
- if ((firstKeyCode < k->curKeySyms.minKeyCode) ||
- (firstKeyCode + keyCodes - 1 > k->curKeySyms.maxKeyCode)) {
+ if ((firstKeyCode < k->xkbInfo->desc->min_key_code) ||
+ (firstKeyCode + keyCodes - 1 > k->xkbInfo->desc->max_key_code)) {
client->errorValue = firstKeyCode;
return BadValue;
}
diff --git a/Xi/getkmap.c b/Xi/getkmap.c
index 5401846..78449e2 100644
--- a/Xi/getkmap.c
+++ b/Xi/getkmap.c
@@ -59,6 +59,8 @@ SOFTWARE.
#include <X11/extensions/XIproto.h>
#include "exglobals.h"
#include "swaprep.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
#include "getkmap.h"
@@ -90,7 +92,8 @@ ProcXGetDeviceKeyMapping(ClientPtr client)
{
xGetDeviceKeyMappingReply rep;
DeviceIntPtr dev;
- KeySymsPtr k;
+ XkbDescPtr xkb;
+ KeySymsPtr syms;
int rc;
REQUEST(xGetDeviceKeyMappingReq);
@@ -101,31 +104,37 @@ ProcXGetDeviceKeyMapping(ClientPtr client)
return rc;
if (dev->key == NULL)
return BadMatch;
- k = &dev->key->curKeySyms;
+ xkb = dev->key->xkbInfo->desc;
- if ((stuff->firstKeyCode < k->minKeyCode) ||
- (stuff->firstKeyCode > k->maxKeyCode)) {
+ if (stuff->firstKeyCode < xkb->min_key_code ||
+ stuff->firstKeyCode > xkb->max_key_code) {
client->errorValue = stuff->firstKeyCode;
return BadValue;
}
- if (stuff->firstKeyCode + stuff->count > k->maxKeyCode + 1) {
+ if (stuff->firstKeyCode + stuff->count > xkb->max_key_code + 1) {
client->errorValue = stuff->count;
return BadValue;
}
+ syms = XkbGetCoreMap(dev);
+ if (!syms)
+ return BadAlloc;
+
rep.repType = X_Reply;
rep.RepType = X_GetDeviceKeyMapping;
rep.sequenceNumber = client->sequence;
- rep.keySymsPerKeyCode = k->mapWidth;
- rep.length = (k->mapWidth * stuff->count); /* KeySyms are 4 bytes */
+ rep.keySymsPerKeyCode = syms->mapWidth;
+ rep.length = (syms->mapWidth * stuff->count); /* KeySyms are 4 bytes */
WriteReplyToClient(client, sizeof(xGetDeviceKeyMappingReply), &rep);
client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
WriteSwappedDataToClient(client,
- k->mapWidth * stuff->count * sizeof(KeySym),
- &k->map[(stuff->firstKeyCode - k->minKeyCode) *
- k->mapWidth]);
+ syms->mapWidth * stuff->count * sizeof(KeySym),
+ &syms->map[syms->mapWidth * (stuff->firstKeyCode -
+ syms->minKeyCode)]);
+ xfree(syms->map);
+ xfree(syms);
return Success;
}
diff --git a/Xi/listdev.c b/Xi/listdev.c
index 04550e4..9a5a189 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -64,6 +64,8 @@ SOFTWARE.
#include "exglobals.h" /* FIXME */
#include "exevents.h"
#include "xace.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
#include "listdev.h"
@@ -211,8 +213,8 @@ CopySwapKeyClass(ClientPtr client, KeyClassPtr k, char **buf)
k2 = (xKeyInfoPtr) * buf;
k2->class = KeyClass;
k2->length = sizeof(xKeyInfo);
- k2->min_keycode = k->curKeySyms.minKeyCode;
- k2->max_keycode = k->curKeySyms.maxKeyCode;
+ k2->min_keycode = k->xkbInfo->desc->min_key_code;
+ k2->max_keycode = k->xkbInfo->desc->max_key_code;
k2->num_keys = k2->max_keycode - k2->min_keycode + 1;
if (client && client->swapped) {
swaps(&k2->num_keys, n);
diff --git a/Xi/queryst.c b/Xi/queryst.c
index 6553aa8..2b20837 100644
--- a/Xi/queryst.c
+++ b/Xi/queryst.c
@@ -42,6 +42,8 @@ from The Open Group.
#include <X11/extensions/XIproto.h>
#include "exevents.h"
#include "exglobals.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
#include "queryst.h"
@@ -126,7 +128,8 @@ ProcXQueryDeviceState(ClientPtr client)
tk = (xKeyState *) buf;
tk->class = KeyClass;
tk->length = sizeof(xKeyState);
- tk->num_keys = k->curKeySyms.maxKeyCode - k->curKeySyms.minKeyCode + 1;
+ tk->num_keys = k->xkbInfo->desc->max_key_code -
+ k->xkbInfo->desc->min_key_code + 1;
for (i = 0; i < 32; i++)
tk->keys[i] = k->down[i];
buf += sizeof(xKeyState);
diff --git a/Xi/ungrdevk.c b/Xi/ungrdevk.c
index 8d9cdb1..7f5e4aa 100644
--- a/Xi/ungrdevk.c
+++ b/Xi/ungrdevk.c
@@ -60,6 +60,8 @@ SOFTWARE.
#include <X11/extensions/XIproto.h>
#include "exglobals.h"
#include "dixgrabs.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
#include "ungrdevk.h"
@@ -124,8 +126,8 @@ ProcXUngrabDeviceKey(ClientPtr client)
if (rc != Success)
return rc;
- if (((stuff->key > dev->key->curKeySyms.maxKeyCode) ||
- (stuff->key < dev->key->curKeySyms.minKeyCode))
+ if (((stuff->key > dev->key->xkbInfo->desc->max_key_code) ||
+ (stuff->key < dev->key->xkbInfo->desc->min_key_code))
&& (stuff->key != AnyKey))
return BadValue;
diff --git a/dix/devices.c b/dix/devices.c
index 884256c..f3c2717 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -514,13 +514,9 @@ CorePointerProc(DeviceIntPtr pDev, int what)
{
BYTE map[33];
int i = 0;
- ClassesPtr classes;
switch (what) {
case DEVICE_INIT:
- if (!(classes = xcalloc(1, sizeof(ClassesRec))))
- return BadAlloc;
-
for (i = 1; i <= 32; i++)
map[i] = i;
InitPointerDeviceStruct((DevicePtr)pDev, map, 32,
@@ -619,7 +615,6 @@ FreeDeviceClass(int type, pointer *class)
XkbFreeInfo((*k)->xkbInfo);
(*k)->xkbInfo = NULL;
}
- xfree((*k)->curKeySyms.map);
xfree((*k));
break;
}
@@ -1008,8 +1003,8 @@ void
QueryMinMaxKeyCodes(KeyCode *minCode, KeyCode *maxCode)
{
if (inputInfo.keyboard) {
- *minCode = inputInfo.keyboard->key->curKeySyms.minKeyCode;
- *maxCode = inputInfo.keyboard->key->curKeySyms.maxKeyCode;
+ *minCode = inputInfo.keyboard->key->xkbInfo->desc->min_key_code;
+ *maxCode = inputInfo.keyboard->key->xkbInfo->desc->max_key_code;
}
}
@@ -1482,7 +1477,6 @@ ProcChangeKeyboardMapping(ClientPtr client)
REQUEST(xChangeKeyboardMappingReq);
unsigned len;
KeySymsRec keysyms;
- KeySymsPtr curKeySyms = &PickKeyboard(client)->key->curKeySyms;
DeviceIntPtr pDev, tmp;
int rc;
REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
@@ -1491,14 +1485,17 @@ ProcChangeKeyboardMapping(ClientPtr client)
if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode))
return BadLength;
- if ((stuff->firstKeyCode < curKeySyms->minKeyCode) ||
- (stuff->firstKeyCode > curKeySyms->maxKeyCode)) {
+ pDev = PickKeyboard(client);
+
+ if ((stuff->firstKeyCode < pDev->key->xkbInfo->desc->min_key_code) ||
+ (stuff->firstKeyCode > pDev->key->xkbInfo->desc->max_key_code)) {
client->errorValue = stuff->firstKeyCode;
return BadValue;
}
if (((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) >
- curKeySyms->maxKeyCode) || (stuff->keySymsPerKeyCode == 0)) {
+ pDev->key->xkbInfo->desc->max_key_code) ||
+ (stuff->keySymsPerKeyCode == 0)) {
client->errorValue = stuff->keySymsPerKeyCode;
return BadValue;
}
@@ -1589,7 +1586,8 @@ ProcGetKeyboardMapping(ClientPtr client)
{
xGetKeyboardMappingReply rep;
DeviceIntPtr kbd = PickKeyboard(client);
- KeySymsPtr curKeySyms = &kbd->key->curKeySyms;
+ XkbDescPtr xkb;
+ KeySymsPtr syms;
int rc;
REQUEST(xGetKeyboardMappingReq);
REQUEST_SIZE_MATCH(xGetKeyboardMappingReq);
@@ -1598,29 +1596,35 @@ ProcGetKeyboardMapping(ClientPtr client)
if (rc != Success)
return rc;
- if ((stuff->firstKeyCode < curKeySyms->minKeyCode) ||
- (stuff->firstKeyCode > curKeySyms->maxKeyCode)) {
+ xkb = kbd->key->xkbInfo->desc;
+
+ if ((stuff->firstKeyCode < xkb->min_key_code) ||
+ (stuff->firstKeyCode > xkb->max_key_code)) {
client->errorValue = stuff->firstKeyCode;
return BadValue;
}
- if (stuff->firstKeyCode + stuff->count >
- (unsigned)(curKeySyms->maxKeyCode + 1)) {
+ if (stuff->firstKeyCode + stuff->count > xkb->max_key_code + 1) {
client->errorValue = stuff->count;
return BadValue;
}
+ syms = XkbGetCoreMap(kbd);
+ if (!syms)
+ return BadAlloc;
+
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
- rep.keySymsPerKeyCode = curKeySyms->mapWidth;
+ rep.keySymsPerKeyCode = syms->mapWidth;
/* length is a count of 4 byte quantities and KeySyms are 4 bytes */
- rep.length = (curKeySyms->mapWidth * stuff->count);
+ rep.length = syms->mapWidth * stuff->count;
WriteReplyToClient(client, sizeof(xGetKeyboardMappingReply), &rep);
client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
- WriteSwappedDataToClient(
- client,
- curKeySyms->mapWidth * stuff->count * sizeof(KeySym),
- &curKeySyms->map[(stuff->firstKeyCode - curKeySyms->minKeyCode) *
- curKeySyms->mapWidth]);
+ WriteSwappedDataToClient(client,
+ syms->mapWidth * stuff->count * sizeof(KeySym),
+ &syms->map[syms->mapWidth * (stuff->firstKeyCode -
+ syms->minKeyCode)]);
+ xfree(syms->map);
+ xfree(syms);
return client->noClientException;
}
@@ -1773,8 +1777,8 @@ DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
case KBKey:
key = (KeyCode)*vlist;
vlist++;
- if ((KeyCode)key < keybd->key->curKeySyms.minKeyCode ||
- (KeyCode)key > keybd->key->curKeySyms.maxKeyCode) {
+ if ((KeyCode)key < keybd->key->xkbInfo->desc->min_key_code ||
+ (KeyCode)key > keybd->key->xkbInfo->desc->max_key_code) {
client->errorValue = key;
return BadValue;
}
diff --git a/dix/events.c b/dix/events.c
index 5e8fc9b..0a70296 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5018,8 +5018,8 @@ ProcUngrabKey(ClientPtr client)
if (rc != Success)
return rc;
- if (((stuff->key > keybd->key->curKeySyms.maxKeyCode) ||
- (stuff->key < keybd->key->curKeySyms.minKeyCode))
+ if (((stuff->key > keybd->key->xkbInfo->desc->max_key_code) ||
+ (stuff->key < keybd->key->xkbInfo->desc->min_key_code))
&& (stuff->key != AnyKey))
{
client->errorValue = stuff->key;
@@ -5080,8 +5080,8 @@ ProcGrabKey(ClientPtr client)
client->errorValue = stuff->keyboardMode;
return BadValue;
}
- if (((stuff->key > keybd->key->curKeySyms.maxKeyCode) ||
- (stuff->key < keybd->key->curKeySyms.minKeyCode))
+ if (((stuff->key > keybd->key->xkbInfo->desc->max_key_code) ||
+ (stuff->key < keybd->key->xkbInfo->desc->min_key_code))
&& (stuff->key != AnyKey))
{
client->errorValue = stuff->key;
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 4763382..366a897 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -148,7 +148,7 @@ static int
check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
{
int ret, i;
- KeySymsPtr syms;
+ XkbDescPtr xkb;
ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
if (ret != Success)
@@ -156,7 +156,7 @@ check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
if (!dev->key)
return BadMatch;
- syms = &dev->key->curKeySyms;
+ xkb = dev->key->xkbInfo->desc;
for (i = 0; i < MAP_LENGTH; i++) {
if (!modmap[i])
@@ -164,7 +164,7 @@ check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
/* Check that all the new modifiers fall within the advertised
* keycode range. */
- if (i < syms->minKeyCode || i > syms->maxKeyCode) {
+ if (i < xkb->min_key_code || i > xkb->max_key_code) {
client->errorValue = i;
return -1;
}
@@ -185,8 +185,8 @@ 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->xkbInfo->desc->map->modmap[i])
+ for (i = xkb->min_key_code; i < xkb->max_key_code; i++) {
+ if (!xkb->map->modmap[i])
continue;
if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
client->errorValue = i;
@@ -201,18 +201,18 @@ static int
check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
DeviceIntPtr slave, CARD8 *modmap)
{
- KeySymsPtr master_syms, slave_syms;
+ XkbDescPtr master_xkb, slave_xkb;
int i, j;
if (!slave->key || !master->key)
return 0;
- master_syms = &master->key->curKeySyms;
- slave_syms = &slave->key->curKeySyms;
+ master_xkb = master->key->xkbInfo->desc;
+ slave_xkb = slave->key->xkbInfo->desc;
/* Ignore devices with a clearly different keymap. */
- if (slave_syms->minKeyCode != master_syms->minKeyCode ||
- slave_syms->maxKeyCode != master_syms->maxKeyCode)
+ if (slave_xkb->min_key_code != master_xkb->min_key_code ||
+ slave_xkb->max_key_code != master_xkb->max_key_code)
return 0;
for (i = 0; i < MAP_LENGTH; i++) {
@@ -221,9 +221,11 @@ check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
/* If we have different symbols for any modifier on an
* extended keyboard, ignore the whole remap request. */
- for (j = 0; j < slave_syms->mapWidth && j < master_syms->mapWidth; j++)
- if (slave_syms->map[modmap[i] * slave_syms->mapWidth + j] !=
- master_syms->map[modmap[i] * master_syms->mapWidth + j])
+ for (j = 0;
+ j < XkbKeyNumSyms(slave_xkb, i) &&
+ j < XkbKeyNumSyms(master_xkb, i);
+ j++)
+ if (XkbKeySymsPtr(slave_xkb, i)[j] != XkbKeySymsPtr(master_xkb, i)[j])
return 0;
}
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 9b34a7a..2875920 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -75,12 +75,6 @@ static KdPointerMatrix kdPointerMatrix = {
void KdResetInputMachine (void);
-#define IsKeyDown(ki, key) ((ki->keyState[(key) >> 3] >> ((key) & 7)) & 1)
-#define KEYMAP(ki) (ki->dixdev->key->curKeySyms)
-#define KEYMAPDDX(ki) (ki->keySyms)
-#define KEYCOL1(ki, k) (KEYMAP(ki).map[((k)-(KEYMAP(ki).minKeyCode))*KEYMAP(ki).mapWidth])
-#define KEYCOL1DDX(ki, k) (KEYMAPDDX(ki).map[((k)-(KEYMAPDDX(ki).minKeyCode))*KEYMAPDDX(ki).mapWidth])
-
#define KD_MAX_INPUT_FDS 8
typedef struct _kdInputFd {
@@ -1756,13 +1750,6 @@ KdReceiveTimeout (KdPointerInfo *pi)
KdRunMouseMachine (pi, timeout, 0, 0, 0, 0, 0, 0);
}
-#define KILL_SEQUENCE ((1L << KK_CONTROL)|(1L << KK_ALT)|(1L << KK_F8)|(1L << KK_F10))
-#define SPECIAL_SEQUENCE ((1L << KK_CONTROL) | (1L << KK_ALT))
-#define SETKILLKEY(b) (KdSpecialKeys |= (1L << (b)))
-#define CLEARKILLKEY(b) (KdSpecialKeys &= ~(1L << (b)))
-
-CARD32 KdSpecialKeys = 0;
-
/*
* kdCheckTermination
*
@@ -1819,7 +1806,7 @@ KdReleaseAllKeys (void)
for (ki = kdKeyboards; ki; ki = ki->next) {
for (key = ki->keySyms.minKeyCode; key < ki->keySyms.maxKeyCode;
key++) {
- if (IsKeyDown(ki, key)) {
+ if (key_is_down(ki->dixdev, key, KEY_POSTED | KEY_PROCESSED)) {
KdHandleKeyboardEvent(ki, KeyRelease, key);
GetEventList(&kdEvents);
nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, KeyRelease, key);
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index a1beea0..50a5bf6 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -76,6 +76,9 @@
#include "mi.h"
#include "mipointer.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
+
#ifdef XF86BIGFONT
#define _XF86BIGFONT_SERVER_
#include <X11/extensions/xf86bigfont.h>
@@ -402,16 +405,14 @@ xf86PrintBacktrace(void)
static void
xf86ReleaseKeys(DeviceIntPtr pDev)
{
- KeyClassPtr keyc = NULL;
- KeySym *map = NULL;
+ KeyClassPtr keyc;
xEvent ke;
- int i = 0, j = 0, nevents = 0;
+ int i, j, nevents, sigstate;
if (!pDev || !pDev->key)
return;
keyc = pDev->key;
- map = keyc->curKeySyms.map;
/*
* Hmm... here is the biggest hack of every time !
@@ -424,36 +425,15 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
* are reenabled.
*/
- for (i = keyc->curKeySyms.minKeyCode, map = keyc->curKeySyms.map;
- i < keyc->curKeySyms.maxKeyCode;
- i++, map += keyc->curKeySyms.mapWidth) {
+ for (i = keyc->xkbInfo->desc->min_key_code;
+ i < keyc->xkbInfo->desc->max_key_code;
+ i++) {
if (KeyPressed(i)) {
- switch (*map) {
- /* Don't release the lock keys */
- case XK_Caps_Lock:
- case XK_Shift_Lock:
- case XK_Num_Lock:
- case XK_Scroll_Lock:
- case XK_Kana_Lock:
- break;
- default:
- if (pDev == inputInfo.keyboard) {
- ke.u.keyButtonPointer.time = GetTimeInMillis();
- ke.u.keyButtonPointer.rootX = 0;
- ke.u.keyButtonPointer.rootY = 0;
- ke.u.u.type = KeyRelease;
- ke.u.u.detail = i;
- (*pDev->public.processInputProc) (&ke, pDev, 1);
- }
- else {
- int sigstate = xf86BlockSIGIO ();
- nevents = GetKeyboardEvents(xf86Events, pDev, KeyRelease, i);
- for (j = 0; j < nevents; j++)
- mieqEnqueue(pDev, (xf86Events + j)->event);
- xf86UnblockSIGIO(sigstate);
- }
- break;
- }
+ sigstate = xf86BlockSIGIO ();
+ nevents = GetKeyboardEvents(xf86Events, pDev, KeyRelease, i);
+ for (j = 0; j < nevents; j++)
+ mieqEnqueue(pDev, (xf86Events + j)->event);
+ xf86UnblockSIGIO(sigstate);
}
}
}
@@ -502,18 +482,19 @@ xf86VTSwitch(void)
* Keep the order: Disable Device > LeaveVT
* EnterVT > EnableDevice
*/
- pInfo = xf86InputDevs;
- while (pInfo) {
- if (pInfo->dev)
+ for (ih = InputHandlers; ih; ih = ih->next)
+ xf86DisableInputHandler(ih);
+ for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next) {
+ if (pInfo->dev) {
+ xf86ReleaseKeys(pInfo->dev);
+ ProcessInputEvents();
DisableDevice(pInfo->dev);
- pInfo = pInfo->next;
+ }
}
xf86EnterServerState(SETUP);
for (i = 0; i < xf86NumScreens; i++)
xf86Screens[i]->LeaveVT(i, 0);
- for (ih = InputHandlers; ih; ih = ih->next)
- xf86DisableInputHandler(ih);
xf86AccessLeave(); /* We need this here, otherwise */
xf86AccessLeaveState(); /* console won't be restored */
@@ -543,14 +524,10 @@ xf86VTSwitch(void)
pInfo = xf86InputDevs;
while (pInfo) {
- if (pInfo->dev) {
- xf86ReleaseKeys(pInfo->dev);
+ if (pInfo->dev)
EnableDevice(pInfo->dev);
- }
pInfo = pInfo->next;
}
- /* XXX HACK */
- xf86ReleaseKeys(inputInfo.keyboard);
for (ih = InputHandlers; ih; ih = ih->next)
xf86EnableInputHandler(ih);
@@ -607,14 +584,10 @@ xf86VTSwitch(void)
pInfo = xf86InputDevs;
while (pInfo) {
- if (pInfo->dev) {
- xf86ReleaseKeys(pInfo->dev);
+ if (pInfo->dev)
EnableDevice(pInfo->dev);
- }
pInfo = pInfo->next;
}
- /* XXX HACK */
- xf86ReleaseKeys(inputInfo.keyboard);
for (ih = InputHandlers; ih; ih = ih->next)
xf86EnableInputHandler(ih);
diff --git a/include/inputstr.h b/include/inputstr.h
index 76523aa..daee7ed 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -137,7 +137,6 @@ typedef struct _GrabRec {
typedef struct _KeyClassRec {
CARD8 down[DOWN_LENGTH];
CARD8 postdown[DOWN_LENGTH];
- KeySymsRec curKeySyms;
int modifierKeyCount[8];
struct _XkbSrvInfo *xkbInfo;
} KeyClassRec, *KeyClassPtr;
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 54010eb..7684675 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -322,11 +322,6 @@ extern _X_EXPORT int DeviceEnterNotify,DeviceLeaveNotify;
#define _XkbIsPressEvent(t) (((t)==KeyPress)||((t)==DeviceKeyPress))
#define _XkbIsReleaseEvent(t) (((t)==KeyRelease)||((t)==DeviceKeyRelease))
-#define _XkbCoreKeycodeInRange(c,k) (((k)>=(c)->curKeySyms.minKeyCode)&&\
- ((k)<=(c)->curKeySyms.maxKeyCode))
-#define _XkbCoreNumKeys(c) ((c)->curKeySyms.maxKeyCode-\
- (c)->curKeySyms.minKeyCode+1)
-
#define XConvertCase(s,l,u) XkbConvertCase(s,l,u)
#undef IsKeypadKey
#define IsKeypadKey(s) XkbKSIsKeypad(s)
@@ -510,6 +505,7 @@ extern _X_EXPORT XkbAction *XkbResizeKeyActions(
extern _X_EXPORT void XkbUpdateKeyTypesFromCore(
DeviceIntPtr /* pXDev */,
+ KeySymsPtr /* syms */,
KeyCode /* first */,
CARD8 /* num */,
XkbChangesPtr /* pChanges */
@@ -531,9 +527,8 @@ extern _X_EXPORT void XkbUpdateActions(
XkbEventCausePtr /* cause */
);
-extern _X_EXPORT void XkbUpdateCoreDescription(
- DeviceIntPtr /* keybd */,
- Bool /* resize */
+extern _X_EXPORT KeySymsPtr XkbGetCoreMap(
+ DeviceIntPtr /* keybd */
);
extern _X_EXPORT void XkbApplyMappingChange(
diff --git a/xkb/xkb.c b/xkb/xkb.c
index 722141c..d889680 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -2519,7 +2519,6 @@ _XkbSetMap(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq *req, char *values)
if (!sentNKN)
XkbSendNotification(dev,&change,&cause);
- XkbUpdateCoreDescription(dev,False);
return Success;
allocFailure:
return BadAlloc;
@@ -2856,7 +2855,6 @@ _XkbSetCompatMap(ClientPtr client, DeviceIntPtr dev,
&cause);
if (check)
XkbCheckSecondaryEffects(xkbi,check,&change,&cause);
- XkbUpdateCoreDescription(dev,False);
XkbSendNotification(dev,&change,&cause);
}
return Success;
@@ -5838,7 +5836,6 @@ ProcXkbGetKbdByName(ClientPtr client)
tmpd->coreEvents)) {
if (tmpd != dev)
XkbCopyDeviceKeymap(tmpd, dev);
- XkbUpdateCoreDescription(tmpd, True);
if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) {
old_sli = tmpd->kbdfeed->xkb_sli;
@@ -5854,8 +5851,6 @@ ProcXkbGetKbdByName(ClientPtr client)
}
}
- /* this should be either a MN or an NKN, depending on whether or not
- * the keycode range changed? */
nkn.deviceID= nkn.oldDeviceID= dev->id;
nkn.minKeyCode= new->min_key_code;
nkn.maxKeyCode= new->max_key_code;
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index bcee26c..151d9a5 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -510,12 +510,8 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
XkbDDXInitDevice(dev);
- XkbUpdateCoreDescription(dev, True);
-
XkbUpdateActions(dev, xkb->min_key_code, XkbNumKeys(xkb), &changes,
&check, &cause);
- dev->key->curKeySyms.minKeyCode = xkb->min_key_code;
- dev->key->curKeySyms.maxKeyCode = xkb->max_key_code;
InitFocusClassDeviceStruct(dev);
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 89d3825..3cd3557 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -213,13 +213,13 @@ register unsigned mask;
void
XkbUpdateKeyTypesFromCore( DeviceIntPtr pXDev,
+ KeySymsPtr pCore,
KeyCode first,
CARD8 num,
XkbChangesPtr changes)
{
XkbDescPtr xkb;
unsigned key,nG,explicit;
-KeySymsPtr pCore;
int types[XkbNumKbdGroups];
KeySym tsyms[XkbMaxSymsPerKey],*syms;
XkbMapChangesPtr mc;
@@ -232,7 +232,6 @@ XkbMapChangesPtr mc;
mc= (changes?(&changes->map):NULL);
- pCore= &pXDev->key->curKeySyms;
syms= &pCore->map[(first-xkb->min_key_code)*pCore->mapWidth];
for (key=first; key<(first+num); key++,syms+= pCore->mapWidth) {
explicit= xkb->server->explicit[key]&XkbExplicitKeyTypesMask;
@@ -355,54 +354,24 @@ CARD8 * repeat;
return;
}
-void
-XkbUpdateCoreDescription(DeviceIntPtr keybd,Bool resize)
+KeySymsPtr
+XkbGetCoreMap(DeviceIntPtr keybd)
{
register int key,tmp;
int maxSymsPerKey,maxKeysPerMod, maxGroup1Width;
-int first,last,firstCommon,lastCommon;
XkbDescPtr xkb;
-KeyClassPtr keyc;
+KeySymsPtr syms;
int maxNumberOfGroups;
if (!keybd || !keybd->key || !keybd->key->xkbInfo)
- return;
+ return NULL;
+
xkb= keybd->key->xkbInfo->desc;
- keyc= keybd->key;
maxSymsPerKey= maxGroup1Width= 0;
maxNumberOfGroups = 0;
- if ((xkb->min_key_code==keyc->curKeySyms.minKeyCode)&&
- (xkb->max_key_code==keyc->curKeySyms.maxKeyCode)) {
- first= firstCommon= xkb->min_key_code;
- last= lastCommon= xkb->max_key_code;
- }
- else if (resize) {
- keyc->curKeySyms.minKeyCode= xkb->min_key_code;
- keyc->curKeySyms.maxKeyCode= xkb->max_key_code;
- first= firstCommon= xkb->min_key_code;
- last= lastCommon= xkb->max_key_code;
- }
- else {
- if (xkb->min_key_code<keyc->curKeySyms.minKeyCode) {
- first= xkb->min_key_code;
- firstCommon= keyc->curKeySyms.minKeyCode;
- }
- else {
- firstCommon= xkb->min_key_code;
- first= keyc->curKeySyms.minKeyCode;
- }
- if (xkb->max_key_code>keyc->curKeySyms.maxKeyCode) {
- lastCommon= keyc->curKeySyms.maxKeyCode;
- last= xkb->max_key_code;
- }
- else {
- lastCommon= xkb->max_key_code;
- last= keyc->curKeySyms.maxKeyCode;
- }
- }
/* determine sizes */
- for (key=first;key<=last;key++) {
+ for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
if (XkbKeycodeInRange(xkb,key)) {
int nGroups;
int w;
@@ -437,53 +406,69 @@ int maxNumberOfGroups;
}
}
- if (maxSymsPerKey>0) {
- /* See Section 12.4 of the XKB Protocol spec. Because of the
- * single-group distribution for multi-group keyboards, we have to
- * have enough symbols for the largest group 1 to replicate across the
- * number of groups on the keyboard. e.g. a single-group key with 4
- * symbols on a keyboard that has 3 groups -> 12 syms per key */
- if (maxSymsPerKey < maxNumberOfGroups * maxGroup1Width)
- maxSymsPerKey = maxNumberOfGroups * maxGroup1Width;
-
- tmp= maxSymsPerKey*_XkbCoreNumKeys(keyc);
- keyc->curKeySyms.map= _XkbTypedRealloc(keyc->curKeySyms.map,tmp,KeySym);
- if (keyc->curKeySyms.map==NULL)
- FatalError("Couldn't allocate symbols map in UpdateCore\n");
- }
- else if ((keyc->curKeySyms.mapWidth>0)&&(keyc->curKeySyms.map!=NULL)) {
- _XkbFree(keyc->curKeySyms.map);
- keyc->curKeySyms.map= NULL;
- }
- keyc->curKeySyms.mapWidth= maxSymsPerKey;
+ if (maxSymsPerKey <= 0)
+ return NULL;
- for (key=firstCommon;key<=lastCommon;key++) {
- if (keyc->curKeySyms.map!=NULL) {
- KeySym *pCore,*pXKB;
- unsigned nGroups,groupWidth,n,nOut;
+ syms = xcalloc(1, sizeof(*syms));
+ if (!syms)
+ return NULL;
- nGroups= XkbKeyNumGroups(xkb,key);
- n= (key-keyc->curKeySyms.minKeyCode)*maxSymsPerKey;
- pCore= &keyc->curKeySyms.map[n];
- bzero(pCore,maxSymsPerKey*sizeof(KeySym));
- pXKB= XkbKeySymsPtr(xkb,key);
- nOut= 2;
- if (nGroups>0) {
- groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup1Index);
- if (groupWidth>0) pCore[0]= pXKB[0];
- if (groupWidth>1) pCore[1]= pXKB[1];
- for (n=2;n<groupWidth;n++) {
- pCore[2+n]= pXKB[n];
- }
- if (groupWidth>2)
- nOut= groupWidth;
- }
+ /* See Section 12.4 of the XKB Protocol spec. Because of the
+ * single-group distribution for multi-group keyboards, we have to
+ * have enough symbols for the largest group 1 to replicate across the
+ * number of groups on the keyboard. e.g. a single-group key with 4
+ * symbols on a keyboard that has 3 groups -> 12 syms per key */
+ if (maxSymsPerKey < maxNumberOfGroups * maxGroup1Width)
+ maxSymsPerKey = maxNumberOfGroups * maxGroup1Width;
+
+ syms->mapWidth = maxSymsPerKey;
+
+ tmp = syms->mapWidth * (xkb->max_key_code - xkb->min_key_code);
+ syms->map = xcalloc(tmp, sizeof(*syms->map));
+ if (!syms->map) {
+ xfree(syms);
+ return NULL;
+ }
- /* See XKB Protocol Sec, Section 12.4.
- A 1-group key with ABCDE on a 2 group keyboard must be
- duplicated across all groups as ABABCDECDE.
- */
- if (nGroups == 1)
+ for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
+ KeySym *pCore,*pXKB;
+ unsigned nGroups,groupWidth,n,nOut;
+
+ nGroups= XkbKeyNumGroups(xkb,key);
+ n= (key-xkb->min_key_code)*syms->mapWidth;
+ pCore= &syms->map[n];
+ pXKB= XkbKeySymsPtr(xkb,key);
+ nOut= 2;
+ if (nGroups>0) {
+ groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup1Index);
+ if (groupWidth>0) pCore[0]= pXKB[0];
+ if (groupWidth>1) pCore[1]= pXKB[1];
+ for (n=2;n<groupWidth;n++)
+ pCore[2+n]= pXKB[n];
+ if (groupWidth>2)
+ nOut= groupWidth;
+ }
+
+ /* See XKB Protocol Sec, Section 12.4.
+ A 1-group key with ABCDE on a 2 group keyboard must be
+ duplicated across all groups as ABABCDECDE.
+ */
+ if (nGroups == 1)
+ {
+ int idx;
+
+ groupWidth = XkbKeyGroupWidth(xkb, key, XkbGroup1Index);
+
+ /* AB..CDE... -> ABABCDE... */
+ if (groupWidth > 0 && syms->mapWidth >= 3)
+ pCore[2] = pCore[0];
+ if (groupWidth > 1 && syms->mapWidth >= 4)
+ pCore[3] = pCore[1];
+
+ /* ABABCDE... -> ABABCDECDE */
+ idx = 2 + groupWidth;
+ while (groupWidth > 2 && idx < syms->mapWidth &&
+ idx < groupWidth * 2)
{
int idx, j;
@@ -512,31 +497,38 @@ int maxNumberOfGroups;
for (n = 0; n < groupWidth && idx < maxSymsPerKey; n++)
pCore[idx++] = pXKB[n];
}
+ idx = 2 * groupWidth;
+ if (idx < 4)
+ idx = 4;
+ /* 3 or more groups: ABABCDECDEABCDEABCDE */
+ for (n = 0; n < groupWidth && idx < syms->mapWidth; n++)
+ pCore[idx++] = pXKB[n];
+ }
- pXKB+= XkbKeyGroupsWidth(xkb,key);
- nOut+= 2;
- if (nGroups>1) {
- groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup2Index);
- if (groupWidth>0) pCore[2]= pXKB[0];
- if (groupWidth>1) pCore[3]= pXKB[1];
- for (n=2;n<groupWidth;n++) {
- pCore[nOut+(n-2)]= pXKB[n];
- }
- if (groupWidth>2)
- nOut+= (groupWidth-2);
+ pXKB+= XkbKeyGroupsWidth(xkb,key);
+ nOut+= 2;
+ if (nGroups>1) {
+ groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup2Index);
+ if (groupWidth>0) pCore[2]= pXKB[0];
+ if (groupWidth>1) pCore[3]= pXKB[1];
+ for (n=2;n<groupWidth;n++) {
+ pCore[nOut+(n-2)]= pXKB[n];
}
- pXKB+= XkbKeyGroupsWidth(xkb,key);
- for (n=XkbGroup3Index;n<nGroups;n++) {
- register int s;
- groupWidth= XkbKeyGroupWidth(xkb,key,n);
- for (s=0;s<groupWidth;s++) {
- pCore[nOut++]= pXKB[s];
- }
- pXKB+= XkbKeyGroupsWidth(xkb,key);
+ if (groupWidth>2)
+ nOut+= (groupWidth-2);
+ }
+ pXKB+= XkbKeyGroupsWidth(xkb,key);
+ for (n=XkbGroup3Index;n<nGroups;n++) {
+ register int s;
+ groupWidth= XkbKeyGroupWidth(xkb,key,n);
+ for (s=0;s<groupWidth;s++) {
+ pCore[nOut++]= pXKB[s];
}
+ pXKB+= XkbKeyGroupsWidth(xkb,key);
}
}
- return;
+
+ return syms;
}
void
@@ -580,9 +572,7 @@ XkbApplyMappingChange(DeviceIntPtr kbd, KeySymsPtr map, KeyCode first_key,
check = 0;
XkbSetCauseCoreReq(&cause, X_ChangeKeyboardMapping, client);
- if (!SetKeySymsMap(&kbd->key->curKeySyms, map))
- FatalError("XkbApplyMappingChange: failed to copy core keymap!\n");
- XkbUpdateKeyTypesFromCore(kbd, first_key, num_keys, &changes);
+ XkbUpdateKeyTypesFromCore(kbd, map, first_key, num_keys, &changes);
XkbUpdateActions(kbd, first_key, num_keys, &changes, &check, &cause);
if (check)
commit bc909f71367a02297e725bb5769c2bcadab22395
Author: Daniel Stone <daniel at fooishbar.org>
Date: Tue Aug 12 00:35:56 2008 +0300
Input: Centralise pointer map changing
Replace both core and Xi functions with one function that validates the
proposed map, and sends out both kinds of notification.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 623f710..76214b9 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1639,20 +1639,6 @@ SetButtonMapping(ClientPtr client, DeviceIntPtr dev, int nElts, BYTE * map)
return Success;
}
-void
-SendDevicePointerMappingNotify(ClientPtr client, DeviceIntPtr dev)
-{
- xEvent event;
- deviceMappingNotify *ev = (deviceMappingNotify *) & event;
-
- ev->type = DeviceMappingNotify;
- ev->request = MappingPointer;
- ev->deviceid = dev->id;
- ev->time = currentTime.milliseconds;
-
- SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) ev, 1);
-}
-
int
ChangeKeyMapping(ClientPtr client,
DeviceIntPtr dev,
diff --git a/Xi/setbmap.c b/Xi/setbmap.c
index 0bcfbb8..b6f62dd 100644
--- a/Xi/setbmap.c
+++ b/Xi/setbmap.c
@@ -107,21 +107,15 @@ ProcXSetDeviceButtonMapping(ClientPtr client)
rep.sequenceNumber = client->sequence;
rep.status = MappingSuccess;
- ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
- if (ret != Success)
- return ret;
-
- ret = SetButtonMapping(client, dev, stuff->map_length, (BYTE *) & stuff[1]);
-
- if (ret == BadValue || ret == BadMatch)
- return ret;
- else {
- rep.status = ret;
- WriteReplyToClient(client, sizeof(xSetDeviceButtonMappingReply), &rep);
- }
-
- if (ret != MappingBusy)
- SendDevicePointerMappingNotify(client, dev);
+ ret = ApplyPointerMapping(dev, (CARD8 *) &stuff[1], stuff->map_length, client);
+ if (ret == -1)
+ return BadValue;
+ else if (ret == MappingBusy)
+ rep.status = ret;
+ else if (ret != Success)
+ return ret;
+
+ WriteReplyToClient(client, sizeof(xSetDeviceButtonMappingReply), &rep);
return Success;
}
diff --git a/dix/devices.c b/dix/devices.c
index 33f149c..884256c 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1396,28 +1396,6 @@ InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons,
InitPtrFeedbackClassDeviceStruct(dev, controlProc));
}
-_X_EXPORT void
-SendPointerMappingNotify(DeviceIntPtr pDev, ClientPtr client)
-{
- int i;
- xEvent event;
-
- /* 0 is the server client. */
- for (i = 1; i < currentMaxClients; i++) {
- /* Don't send irrelevant events to naïve clients. */
- if (PickPointer(clients[i]) != pDev)
- continue;
-
- if (clients[i] && clients[i]->clientState == ClientStateRunning) {
- event.u.u.type = MappingNotify;
- event.u.u.sequenceNumber = clients[i]->sequence;
- event.u.mappingNotify.request = MappingPointer;
-
- WriteEventsToClient(clients[i], 1, &event);
- }
- }
-}
-
/*
* Check if the given buffer contains elements between low (inclusive) and
* high (inclusive) only.
@@ -1553,31 +1531,6 @@ ProcChangeKeyboardMapping(ClientPtr client)
return client->noClientException;
}
-static int
-DoSetPointerMapping(ClientPtr client, DeviceIntPtr device, BYTE *map, int n)
-{
- int rc, i = 0;
-
- if (!device || !device->button)
- return BadDevice;
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, device, DixManageAccess);
- if (rc != Success)
- return rc;
-
- for (i = 0; i < n; i++) {
- if ((device->button->map[i + 1] != map[i]) &&
- BitIsOn(device->button->down, i + 1)) {
- return MappingBusy;
- }
- }
-
- for (i = 0; i < n; i++)
- device->button->map[i + 1] = map[i];
-
- return Success;
-}
-
int
ProcSetPointerMapping(ClientPtr client)
{
@@ -1607,31 +1560,26 @@ ProcSetPointerMapping(ClientPtr client)
client->errorValue = stuff->nElts;
return BadValue;
}
- if (BadDeviceMap(&map[0], (int)stuff->nElts, 1, 255, &client->errorValue))
- return BadValue;
- /* core protocol specs don't allow for duplicate mappings. */
- for (i = 0; i < stuff->nElts; i++)
- {
- for (j = i + 1; j < stuff->nElts; j++)
- {
- if (map[i] && map[i] == map[j])
- {
+ /* Core protocol specs don't allow for duplicate mappings; this check
+ * almost certainly wants disabling through XFixes too. */
+ for (i = 0; i < stuff->nElts; i++) {
+ for (j = i + 1; j < stuff->nElts; j++) {
+ if (map[i] && map[i] == map[j]) {
client->errorValue = map[i];
return BadValue;
}
}
}
- ret = DoSetPointerMapping(client, ptr, map, stuff->nElts);
- if (ret != Success) {
+ ret = ApplyPointerMapping(ptr, map, stuff->nElts, client);
+ if (ret == MappingBusy)
rep.success = ret;
- WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
- return Success;
- }
+ else if (ret == -1)
+ return BadValue;
+ else if (ret != Success)
+ return ret;
- /* FIXME: Send mapping notifies for masters/slaves as well. */
- SendPointerMappingNotify(ptr, client);
WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
return Success;
}
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 309ef51..4763382 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -28,6 +28,7 @@
#endif
#include "exevents.h"
+#include "exglobals.h"
#include "misc.h"
#include "input.h"
#include "inputstr.h"
@@ -35,6 +36,110 @@
#include "xkbsrv.h"
#include "xkbstr.h"
+/* Check if a button map change is okay with the device.
+ * Returns -1 for BadValue, as it collides with MappingBusy. */
+static int
+check_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, CARD32 *errval_out,
+ ClientPtr client)
+{
+ int i, ret;
+
+ if (!dev || !dev->button)
+ return BadDevice;
+
+ ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
+ if (ret != Success)
+ return ret;
+
+ for (i = 0; i < len; i++) {
+ if (dev->button->map[i + 1] != map[i] && dev->button->down[i + 1])
+ return MappingBusy;
+
+ if (map[i] < 1 || map[i] > 255) {
+ if (errval_out)
+ *errval_out = map[i];
+ return -1;
+ }
+ }
+
+ return Success;
+}
+
+static void
+do_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
+{
+ int i;
+ xEvent core_mn;
+ deviceMappingNotify xi_mn;
+
+ /* The map in ButtonClassRec refers to button numbers, whereas the
+ * protocol is zero-indexed. Sigh. */
+ memcpy(&(dev->button->map[1]), map, len);
+
+ core_mn.u.u.type = MappingNotify;
+ core_mn.u.mappingNotify.request = MappingPointer;
+
+ /* 0 is the server client. */
+ for (i = 1; i < currentMaxClients; i++) {
+ /* Don't send irrelevant events to naïve clients. */
+ if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+ continue;
+
+ if (!XIShouldNotify(clients[i], dev))
+ continue;
+
+ core_mn.u.u.sequenceNumber = clients[i]->sequence;
+ WriteEventsToClient(clients[i], 1, &core_mn);
+ }
+
+ xi_mn.type = DeviceMappingNotify;
+ xi_mn.request = MappingPointer;
+ xi_mn.deviceid = dev->id;
+ xi_mn.time = GetTimeInMillis();
+
+ SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) &xi_mn, 1);
+}
+
+/*
+ * Does what it says on the box, both for core and Xi.
+ *
+ * Faithfully reports any errors encountered while trying to apply the map
+ * to the requested device, faithfully ignores any errors encountered while
+ * trying to apply the map to its master/slaves.
+ */
+_X_EXPORT int
+ApplyPointerMapping(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
+{
+ int ret;
+ DeviceIntPtr tmp;
+
+ /* If we can't perform the change on the requested device, bail out. */
+ ret = check_butmap_change(dev, map, len, &client->errorValue, client);
+ if (ret != Success)
+ return ret;
+ do_butmap_change(dev, map, len, client);
+
+ /* Change any attached masters/slaves. */
+ if (dev->isMaster) {
+ for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+ if (!tmp->isMaster && tmp->u.master == dev)
+ if (check_butmap_change(tmp, map, len, NULL, client) == Success)
+ do_butmap_change(tmp, map, len, client);
+ }
+ }
+ else {
+ for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+ if (tmp->isMaster && tmp->u.lastSlave == dev) {
+ /* If this fails, expect the results to be weird. */
+ if (check_butmap_change(tmp, map, len, NULL, client) == Success)
+ do_butmap_change(tmp, map, len, client);
+ }
+ }
+ }
+
+ return Success;
+}
+
/* Check if a modifier map change is okay with the device.
* Returns -1 for BadValue, as it collides with MappingBusy; this particular
* caveat can be removed with LegalModifier, as we have no other reason to
diff --git a/include/exevents.h b/include/exevents.h
index 46df009..ff29227 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -137,10 +137,6 @@ extern _X_EXPORT int SetButtonMapping (
int /* nElts */,
BYTE * /* map */);
-extern _X_EXPORT void SendDevicePointerMappingNotify(
- ClientPtr /* client, */,
- DeviceIntPtr /* dev */);
-
extern _X_EXPORT int ChangeKeyMapping(
ClientPtr /* client */,
DeviceIntPtr /* dev */,
diff --git a/include/input.h b/include/input.h
index 8a774c9..19d1ae7 100644
--- a/include/input.h
+++ b/include/input.h
@@ -368,8 +368,10 @@ extern _X_EXPORT Bool InitKeyboardDeviceStruct(
BellProcPtr /*bellProc*/,
KbdCtrlProcPtr /*controlProc*/);
-extern _X_EXPORT void SendPointerMappingNotify(
+extern _X_EXPORT int ApplyPointerMapping(
DeviceIntPtr /* pDev */,
+ CARD8 * /* map */,
+ int /* len */,
ClientPtr /* client */);
extern _X_EXPORT Bool BadDeviceMap(
commit f06a9d2e05e13466c115fc706966a90b1fb0518e
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Oct 18 20:59:30 2008 +0100
Input: Clean up keymap change notifications
Keyboard map notifications are always generated from within XKB code,
which also takes care of copying the keysyms, etc. If you need to
mangle the keymap yourself, generate a new core keymap/modmap, and pass
it to XkbApplyMappingChange.
SendMappingNotify is renamed to SendPointerMappingNotify (and ditto its
Device variants), which still only _sends_ the notifications, as opposed
to also doing the copying a la XkbApplyMappingChange.
Also have the modmap change code traverse the device hierachy, rather
than just going off the core keyboard.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index da10040..623f710 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -205,41 +205,20 @@ XIGetDevice(xEvent* xE)
static void
CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
{
- static DeviceIntPtr lastMapNotifyDevice = NULL;
- KeyClassPtr mk, dk; /* master, device */
+ KeyClassPtr mk = master->key;
+ KeyClassPtr dk = device->key;
int i;
if (device == master)
return;
- dk = device->key;
- mk = master->key;
-
- mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode;
- mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
for (i = 0; i < 8; i++)
mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
- if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
+ if (!XkbCopyDeviceKeymap(master, device))
FatalError("Couldn't pivot keymap from device to core!\n");
-
- /* Copy the state here. This means we'll only have consistency
- * between state and active keymap, rather than between state and
- * keycodes pressed, but there's pretty much no way to win here,
- * so might as well go for the one that would seem to give the
- * least nonsensical result. */
- mk->xkbInfo->state = dk->xkbInfo->state;
-
- if (lastMapNotifyDevice != master) {
- SendMappingNotify(master, MappingKeyboard,
- mk->curKeySyms.minKeyCode,
- (mk->curKeySyms.maxKeyCode -
- mk->curKeySyms.minKeyCode),
- serverClient);
- lastMapNotifyDevice = master;
- }
}
/**
@@ -1661,23 +1640,15 @@ SetButtonMapping(ClientPtr client, DeviceIntPtr dev, int nElts, BYTE * map)
}
void
-SendDeviceMappingNotify(ClientPtr client, CARD8 request,
- KeyCode firstKeyCode, CARD8 count, DeviceIntPtr dev)
+SendDevicePointerMappingNotify(ClientPtr client, DeviceIntPtr dev)
{
xEvent event;
deviceMappingNotify *ev = (deviceMappingNotify *) & event;
ev->type = DeviceMappingNotify;
- ev->request = request;
+ ev->request = MappingPointer;
ev->deviceid = dev->id;
ev->time = currentTime.milliseconds;
- if (request == MappingKeyboard) {
- ev->firstKeyCode = firstKeyCode;
- ev->count = count;
- }
-
- if (request == MappingKeyboard || request == MappingModifier)
- XkbApplyMappingChange(dev, request, firstKeyCode, count, client);
SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) ev, 1);
}
@@ -1712,9 +1683,10 @@ ChangeKeyMapping(ClientPtr client,
keysyms.maxKeyCode = firstKeyCode + keyCodes - 1;
keysyms.mapWidth = keySymsPerKeyCode;
keysyms.map = map;
- if (!SetKeySymsMap(&k->curKeySyms, &keysyms))
- return BadAlloc;
- SendDeviceMappingNotify(client, MappingKeyboard, firstKeyCode, keyCodes, dev);
+
+ XkbApplyMappingChange(dev, &keysyms, firstKeyCode, keyCodes, NULL,
+ serverClient);
+
return client->noClientException;
}
diff --git a/Xi/setbmap.c b/Xi/setbmap.c
index 3c293c0..0bcfbb8 100644
--- a/Xi/setbmap.c
+++ b/Xi/setbmap.c
@@ -121,7 +121,8 @@ ProcXSetDeviceButtonMapping(ClientPtr client)
}
if (ret != MappingBusy)
- SendDeviceMappingNotify(client, MappingPointer, 0, 0, dev);
+ SendDevicePointerMappingNotify(client, dev);
+
return Success;
}
diff --git a/dix/devices.c b/dix/devices.c
index a4ff641..33f149c 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1013,19 +1013,20 @@ QueryMinMaxKeyCodes(KeyCode *minCode, KeyCode *maxCode)
}
}
+/* Notably, this function does not expand the destination's keycode range, or
+ * notify clients. */
Bool
SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
{
int i, j;
+ KeySym *tmp;
int rowDif = src->minKeyCode - dst->minKeyCode;
/* if keysym map size changes, grow map first */
- if (src->mapWidth < dst->mapWidth)
- {
- for (i = src->minKeyCode; i <= src->maxKeyCode; i++)
- {
-#define SI(r, c) (((r-src->minKeyCode)*src->mapWidth) + (c))
-#define DI(r, c) (((r - dst->minKeyCode)*dst->mapWidth) + (c))
+ if (src->mapWidth < dst->mapWidth) {
+ for (i = src->minKeyCode; i <= src->maxKeyCode; i++) {
+#define SI(r, c) (((r - src->minKeyCode) * src->mapWidth) + (c))
+#define DI(r, c) (((r - dst->minKeyCode) * dst->mapWidth) + (c))
for (j = 0; j < src->mapWidth; j++)
dst->map[DI(i, j)] = src->map[SI(i, j)];
for (j = src->mapWidth; j < dst->mapWidth; j++)
@@ -1035,39 +1036,37 @@ SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
}
return TRUE;
}
- else if (src->mapWidth > dst->mapWidth)
- {
- KeySym *map;
- int bytes = sizeof(KeySym) * src->mapWidth *
- (dst->maxKeyCode - dst->minKeyCode + 1);
- map = (KeySym *)xcalloc(1, bytes);
- if (!map)
- return FALSE;
- if (dst->map)
- {
+ else if (src->mapWidth > dst->mapWidth) {
+ i = sizeof(KeySym) * src->mapWidth *
+ (dst->maxKeyCode - dst->minKeyCode + 1);
+ tmp = xcalloc(sizeof(KeySym), i);
+ if (!tmp)
+ return FALSE;
+
+ if (dst->map) {
for (i = 0; i <= dst->maxKeyCode-dst->minKeyCode; i++)
- memmove((char *)&map[i*src->mapWidth],
- (char *)&dst->map[i*dst->mapWidth],
- dst->mapWidth * sizeof(KeySym));
- xfree(dst->map);
- }
- dst->mapWidth = src->mapWidth;
- dst->map = map;
- } else if (!dst->map)
- {
- KeySym *map;
- int bytes = sizeof(KeySym) * src->mapWidth *
- (dst->maxKeyCode - dst->minKeyCode + 1);
- map = (KeySym *)xcalloc(1, bytes);
- if (!map)
+ memmove(&tmp[i * src->mapWidth], &dst->map[i * dst->mapWidth],
+ dst->mapWidth * sizeof(KeySym));
+ xfree(dst->map);
+ }
+ dst->mapWidth = src->mapWidth;
+ dst->map = tmp;
+ }
+ else if (!dst->map) {
+ i = sizeof(KeySym) * src->mapWidth *
+ (dst->maxKeyCode - dst->minKeyCode + 1);
+ tmp = xcalloc(sizeof(KeySym), i);
+ if (!tmp)
return FALSE;
- dst->map = map;
+
+ dst->map = tmp;
dst->mapWidth = src->mapWidth;
}
- memmove((char *)&dst->map[rowDif * dst->mapWidth],
- (char *)src->map,
- (int)(src->maxKeyCode - src->minKeyCode + 1) *
- dst->mapWidth * sizeof(KeySym));
+
+ memmove(&dst->map[rowDif * dst->mapWidth], src->map,
+ (src->maxKeyCode - src->minKeyCode + 1) *
+ dst->mapWidth * sizeof(KeySym));
+
return TRUE;
}
@@ -1398,34 +1397,24 @@ InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons,
}
_X_EXPORT void
-SendMappingNotify(DeviceIntPtr pDev, unsigned request, unsigned firstKeyCode,
- unsigned count, ClientPtr client)
+SendPointerMappingNotify(DeviceIntPtr pDev, ClientPtr client)
{
int i;
xEvent event;
- event.u.u.type = MappingNotify;
- event.u.mappingNotify.request = request;
- if (request == MappingKeyboard)
- {
- event.u.mappingNotify.firstKeyCode = firstKeyCode;
- event.u.mappingNotify.count = count;
- }
- if (request == MappingKeyboard || request == MappingModifier)
- XkbApplyMappingChange(pDev,request,firstKeyCode,count, client);
+ /* 0 is the server client. */
+ for (i = 1; i < currentMaxClients; i++) {
+ /* Don't send irrelevant events to naïve clients. */
+ if (PickPointer(clients[i]) != pDev)
+ continue;
- /* 0 is the server client */
- for (i=1; i<currentMaxClients; i++)
- {
- if (clients[i] && clients[i]->clientState == ClientStateRunning)
- {
- if (request == MappingKeyboard &&
- clients[i]->xkbClientFlags != 0 &&
- (clients[i]->mapNotifyMask & XkbKeySymsMask))
- continue;
- event.u.u.sequenceNumber = clients[i]->sequence;
- WriteEventsToClient(clients[i], 1, &event);
- }
+ if (clients[i] && clients[i]->clientState == ClientStateRunning) {
+ event.u.u.type = MappingNotify;
+ event.u.u.sequenceNumber = clients[i]->sequence;
+ event.u.mappingNotify.request = MappingPointer;
+
+ WriteEventsToClient(clients[i], 1, &event);
+ }
}
}
@@ -1516,7 +1505,7 @@ ProcChangeKeyboardMapping(ClientPtr client)
unsigned len;
KeySymsRec keysyms;
KeySymsPtr curKeySyms = &PickKeyboard(client)->key->curKeySyms;
- DeviceIntPtr pDev = NULL;
+ DeviceIntPtr pDev, tmp;
int rc;
REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
@@ -1536,28 +1525,30 @@ ProcChangeKeyboardMapping(ClientPtr client)
return BadValue;
}
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
- if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
- if (rc != Success)
- return rc;
- }
- }
-
keysyms.minKeyCode = stuff->firstKeyCode;
keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1;
keysyms.mapWidth = stuff->keySymsPerKeyCode;
- keysyms.map = (KeySym *)&stuff[1];
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
- if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key)
- if (!SetKeySymsMap(&pDev->key->curKeySyms, &keysyms))
- return BadAlloc;
-
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
- if (pDev->key && pDev->coreEvents)
- SendDeviceMappingNotify(client, MappingKeyboard,
- stuff->firstKeyCode, stuff->keyCodes,
- pDev);
+ keysyms.map = (KeySym *) &stuff[1];
+
+ pDev = PickKeyboard(client);
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
+ if (rc != Success)
+ return rc;
+
+ XkbApplyMappingChange(pDev, &keysyms, stuff->firstKeyCode,
+ stuff->keyCodes, NULL, client);
+
+ for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+ if (tmp->isMaster || tmp->u.master != pDev)
+ continue;
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
+ if (rc != Success)
+ continue;
+
+ XkbApplyMappingChange(tmp, &keysyms, stuff->firstKeyCode,
+ stuff->keyCodes, NULL, client);
+ }
return client->noClientException;
}
@@ -1639,7 +1630,8 @@ ProcSetPointerMapping(ClientPtr client)
return Success;
}
- SendMappingNotify(ptr, MappingPointer, 0, 0, client);
+ /* FIXME: Send mapping notifies for masters/slaves as well. */
+ SendPointerMappingNotify(ptr, client);
WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
return Success;
}
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 1b6458f..309ef51 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -132,8 +132,7 @@ check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
static void
do_modmap_change(ClientPtr client, DeviceIntPtr dev, CARD8 *modmap)
{
- memcpy(dev->key->xkbInfo->desc->map->modmap, modmap, MAP_LENGTH);
- SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev);
+ XkbApplyMappingChange(dev, NULL, 0, 0, modmap, serverClient);
}
/* Rebuild modmap (key -> mod) from map (mod -> key). */
@@ -165,7 +164,7 @@ change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
{
int ret;
CARD8 modmap[MAP_LENGTH];
- DeviceIntPtr slave;
+ DeviceIntPtr tmp;
ret = build_modmap_from_modkeymap(modmap, modkeymap, max_keys_per_mod);
if (ret != Success)
@@ -177,12 +176,21 @@ change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
return ret;
do_modmap_change(client, dev, modmap);
- /* If we're acting on a master, change the slaves as well. */
+ /* Change any attached masters/slaves. */
if (dev->isMaster) {
- for (slave = inputInfo.devices; slave; slave = slave->next) {
- if (slave != dev && !slave->isMaster && slave->u.master == dev)
- if (check_modmap_change_slave(client, dev, slave, modmap))
- do_modmap_change(client, slave, modmap);
+ for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+ if (!tmp->isMaster && tmp->u.master == dev)
+ if (check_modmap_change_slave(client, dev, tmp, modmap))
+ do_modmap_change(client, tmp, modmap);
+ }
+ }
+ else {
+ for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+ if (tmp->isMaster && tmp->u.lastSlave == dev) {
+ /* If this fails, expect the results to be weird. */
+ if (check_modmap_change(client, tmp, modmap))
+ do_modmap_change(client, tmp, modmap);
+ }
}
}
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 9e8da8b..020b6a6 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -293,26 +293,15 @@ static void DarwinLoadKeyboardMapping(KeySymsRec *keySyms) {
* DarwinKeyboardSetDeviceKeyMap
* Load a keymap into the keyboard device
*/
-static void DarwinKeyboardSetDeviceKeyMap(KeySymsRec *keySyms) {
+static void DarwinKeyboardSetDeviceKeyMap(KeySymsRec *keySyms, CARD8 *modmap) {
DeviceIntPtr pDev;
- /* From ProcSetModifierMapping */
- SendMappingNotify(darwinKeyboard, MappingModifier, 0, 0, serverClient);
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
- if (pDev->key && pDev->coreEvents)
- SendDeviceMappingNotify(serverClient, MappingModifier, 0, 0, pDev);
-
- /* From ProcChangeKeyboardMapping */
for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key)
- assert(SetKeySymsMap(&pDev->key->curKeySyms, keySyms));
-
- SendMappingNotify(darwinKeyboard, MappingKeyboard, keySyms->minKeyCode,
- keySyms->maxKeyCode - keySyms->minKeyCode + 1, serverClient);
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
- if (pDev->key && pDev->coreEvents)
- SendDeviceMappingNotify(serverClient, MappingKeyboard, keySyms->minKeyCode,
- keySyms->maxKeyCode - keySyms->minKeyCode + 1, pDev);
+ XkbApplyMappingChange(pDev, XkbKeySymsMask | XkbModifierMapMask,
+ keysyms, keysyms.minKeyCode,
+ keysyms.maxKeyCode - keysyms.minKeyCode + 1,
+ modmap, serverClient);
}
/*
@@ -340,14 +329,11 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) {
//XkbSetRulesDflts("base", "pc105", "us", NULL, NULL);
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));
+ assert(XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, QuartzBell,
+ DarwinChangeKeyboardControl));
+ assert(keyInfo.modMap!=NULL);
pthread_mutex_unlock(&keyInfo_mutex);
- QuartzXkbUpdate(pDev);
-#else
pthread_mutex_lock(&keyInfo_mutex);
assert( InitKeyboardDeviceStruct( (DevicePtr)pDev, &keySyms,
QuartzBell,
@@ -373,7 +359,7 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) {
XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOn);
}
- DarwinKeyboardSetDeviceKeyMap(&keySyms);
+ DarwinKeyboardSetDeviceKeyMap(&keySyms, keyInfo.modMap);
}
void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr pDev, int nevents) {
diff --git a/include/exevents.h b/include/exevents.h
index abe1a5f..46df009 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -137,11 +137,8 @@ extern _X_EXPORT int SetButtonMapping (
int /* nElts */,
BYTE * /* map */);
-extern _X_EXPORT void SendDeviceMappingNotify(
+extern _X_EXPORT void SendDevicePointerMappingNotify(
ClientPtr /* client, */,
- CARD8 /* request, */,
- KeyCode /* firstKeyCode */,
- CARD8 /* count */,
DeviceIntPtr /* dev */);
extern _X_EXPORT int ChangeKeyMapping(
diff --git a/include/input.h b/include/input.h
index a38dbfa..8a774c9 100644
--- a/include/input.h
+++ b/include/input.h
@@ -368,11 +368,8 @@ extern _X_EXPORT Bool InitKeyboardDeviceStruct(
BellProcPtr /*bellProc*/,
KbdCtrlProcPtr /*controlProc*/);
-extern _X_EXPORT void SendMappingNotify(
+extern _X_EXPORT void SendPointerMappingNotify(
DeviceIntPtr /* pDev */,
- unsigned int /*request*/,
- unsigned int /*firstKeyCode*/,
- unsigned int /*count*/,
ClientPtr /* client */);
extern _X_EXPORT Bool BadDeviceMap(
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index b2b1736..54010eb 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -538,9 +538,10 @@ extern _X_EXPORT void XkbUpdateCoreDescription(
extern _X_EXPORT void XkbApplyMappingChange(
DeviceIntPtr /* pXDev */,
- CARD8 /* request */,
- KeyCode /* firstKey */,
- CARD8 /* num */,
+ KeySymsPtr /* map */,
+ KeyCode /* firstKey */,
+ CARD8 /* num */,
+ CARD8 * /* modmap */,
ClientPtr /* client */
);
@@ -955,8 +956,11 @@ extern _X_EXPORT void XkbSendNewKeyboardNotify(
extern Bool XkbCopyKeymap(
XkbDescPtr /* dst */,
- XkbDescPtr /* src */,
- Bool /* sendNotifies */);
+ XkbDescPtr /* src */);
+
+extern Bool XkbCopyDeviceKeymap(
+ DeviceIntPtr /* dst */,
+ DeviceIntPtr /* src */);
#include "xkbfile.h"
#include <X11/extensions/XKMformat.h>
diff --git a/xkb/xkb.c b/xkb/xkb.c
index b99b261..722141c 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5837,8 +5837,7 @@ ProcXkbGetKbdByName(ClientPtr client)
(dev->id == inputInfo.keyboard->id && tmpd->key &&
tmpd->coreEvents)) {
if (tmpd != dev)
- XkbCopyKeymap(dev->key->xkbInfo->desc,
- tmpd->key->xkbInfo->desc, True);
+ XkbCopyDeviceKeymap(tmpd, dev);
XkbUpdateCoreDescription(tmpd, True);
if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) {
diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index ed80b04..6c2d32d 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -35,6 +35,8 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <X11/extensions/XI.h>
#include <X11/extensions/XIproto.h>
#include "inputstr.h"
+#include "exevents.h"
+#include "exglobals.h"
#include "windowstr.h"
#include "exevents.h"
#include <xkbsrv.h>
@@ -42,58 +44,151 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
/***====================================================================***/
+/*
+ * This function sends out two kinds of notification:
+ * - Core mapping notify events sent to clients for whom kbd is the
+ * current core ('picked') keyboard _and_ have not explicitly
+ * selected for XKB mapping notify events;
+ * - Xi mapping events, sent unconditionally to all clients who have
+ * explicitly selected for them (including those who have explicitly
+ * selected for XKB mapping notify events!).
+ */
+static void
+XkbSendLegacyMapNotify(DeviceIntPtr kbd, CARD16 xkb_event, CARD16 changed,
+ int first_key, int num_keys)
+{
+ int i;
+ int keymap_changed = 0;
+ int modmap_changed = 0;
+ xEvent core_mn;
+ deviceMappingNotify xi_mn;
+ CARD32 time = GetTimeInMillis();
+
+ if (xkb_event == XkbNewKeyboardNotify) {
+ if (changed & XkbNKN_KeycodesMask) {
+ keymap_changed = 1;
+ modmap_changed = 1;
+ }
+ }
+ else if (xkb_event == XkbMapNotify) {
+ if (changed & XkbKeySymsMask)
+ keymap_changed = 1;
+ if (changed & XkbModifierMapMask)
+ modmap_changed = 1;
+ }
+ if (!keymap_changed && !modmap_changed)
+ return;
+
+ core_mn.u.u.type = MappingNotify;
+ xi_mn.type = DeviceMappingNotify;
+ xi_mn.deviceid = kbd->id;
+ xi_mn.time = time;
+
+ /* 0 is serverClient. */
+ for (i = 1; i < currentMaxClients; i++) {
+ if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+ continue;
+
+ /* Ignore clients which will have already received this.
+ * Inconsistent with themselves, but consistent with previous
+ * behaviour.*/
+ if (xkb_event == XkbMapNotify && (clients[i]->mapNotifyMask & changed))
+ continue;
+ if (xkb_event == XkbNewKeyboardNotify &&
+ (clients[i]->xkbClientFlags & _XkbClientInitialized))
+ continue;
+
+ /* Don't send core events to clients who don't know about us. */
+ if (!XIShouldNotify(clients[i], kbd))
+ continue;
+
+ core_mn.u.u.sequenceNumber = clients[i]->sequence;
+ if (keymap_changed) {
+ core_mn.u.mappingNotify.request = MappingKeyboard;
+
+ /* Clip the keycode range to what the client knows about, so it
+ * doesn't freak out. */
+ if (first_key >= clients[i]->minKC)
+ core_mn.u.mappingNotify.firstKeyCode = first_key;
+ else
+ core_mn.u.mappingNotify.firstKeyCode = clients[i]->minKC;
+ if (first_key + num_keys - 1 <= clients[i]->maxKC)
+ core_mn.u.mappingNotify.count = num_keys;
+ else
+ core_mn.u.mappingNotify.count = clients[i]->maxKC -
+ clients[i]->minKC + 1;
+
+ WriteEventsToClient(clients[i], 1, &core_mn);
+ }
+ if (modmap_changed) {
+ core_mn.u.mappingNotify.request = MappingModifier;
+ core_mn.u.mappingNotify.firstKeyCode = 0;
+ core_mn.u.mappingNotify.count = 0;
+ WriteEventsToClient(clients[i], 1, &core_mn);
+ }
+ }
+
+ /* Hmm, maybe we can accidentally generate Xi events for core devices
+ * here? Clients might be upset, but that seems better than the
+ * alternative of stale keymaps. -ds */
+ if (keymap_changed) {
+ xi_mn.request = MappingKeyboard;
+ xi_mn.firstKeyCode = first_key;
+ xi_mn.count = num_keys;
+ SendEventToAllWindows(kbd, DeviceMappingNotifyMask, (xEvent *) &xi_mn,
+ 1);
+ }
+ if (modmap_changed) {
+ xi_mn.request = MappingModifier;
+ xi_mn.firstKeyCode = 0;
+ xi_mn.count = 0;
+ SendEventToAllWindows(kbd, DeviceMappingNotifyMask, (xEvent *) &xi_mn,
+ 1);
+ }
+}
+
+/***====================================================================***/
+
void
XkbSendNewKeyboardNotify(DeviceIntPtr kbd,xkbNewKeyboardNotify *pNKN)
-{
-register int i;
-Time time;
-CARD16 changed;
+{
+ int i;
+ Time time = GetTimeInMillis();
+ CARD16 changed = pNKN->changed;
pNKN->type = XkbEventCode + XkbEventBase;
pNKN->xkbType = XkbNewKeyboardNotify;
- pNKN->time = time = GetTimeInMillis();
- changed = pNKN->changed;
for (i=1; i<currentMaxClients; i++) {
- if ((!clients[i]) || clients[i]->clientGone ||
- (clients[i]->requestVector==InitialVector)) {
- continue;
- }
+ if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+ continue;
+
+ if (!(clients[i]->newKeyboardNotifyMask & changed))
+ continue;
+
+ if (!XIShouldNotify(clients[i], kbd))
+ continue;
+
+ pNKN->sequenceNumber = clients[i]->sequence;
+ pNKN->time = time;
+ pNKN->changed = changed;
+ if (clients[i]->swapped) {
+ int n;
+ swaps(&pNKN->sequenceNumber,n);
+ swapl(&pNKN->time,n);
+ swaps(&pNKN->changed,n);
+ }
+ WriteToClient(clients[i], sizeof(xEvent), pNKN);
- if (clients[i]->xkbClientFlags&_XkbClientInitialized) {
- if (clients[i]->newKeyboardNotifyMask&changed) {
- pNKN->sequenceNumber = clients[i]->sequence;
- pNKN->time = time;
- pNKN->changed = changed;
- if ( clients[i]->swapped ) {
- register int n;
- swaps(&pNKN->sequenceNumber,n);
- swapl(&pNKN->time,n);
- swaps(&pNKN->changed,n);
- }
- WriteToClient(clients[i],sizeof(xEvent),(char *)pNKN);
- if (changed&XkbNKN_KeycodesMask) {
- clients[i]->minKC= pNKN->minKeyCode;
- clients[i]->maxKC= pNKN->maxKeyCode;
- }
- }
- }
- else if (changed&XkbNKN_KeycodesMask) {
- xEvent event;
- event.u.u.type= MappingNotify;
- event.u.mappingNotify.request= MappingKeyboard;
- event.u.mappingNotify.firstKeyCode= clients[i]->minKC;
- event.u.mappingNotify.count= clients[i]->maxKC-clients[i]->minKC+1;
- event.u.u.sequenceNumber= clients[i]->sequence;
- if (clients[i]->swapped) {
- int n;
- swaps(&event.u.u.sequenceNumber,n);
- }
- WriteToClient(clients[i],SIZEOF(xEvent), (char *)&event);
- event.u.mappingNotify.request= MappingModifier;
- WriteToClient(clients[i],SIZEOF(xEvent), (char *)&event);
- }
+ if (changed & XkbNKN_KeycodesMask) {
+ clients[i]->minKC = pNKN->minKeyCode;
+ clients[i]->maxKC = pNKN->maxKeyCode;
+ }
}
+
+ XkbSendLegacyMapNotify(kbd, XkbNewKeyboardNotify, changed, pNKN->minKeyCode,
+ pNKN->maxKeyCode - pNKN->minKeyCode + 1);
+
return;
}
@@ -139,7 +234,8 @@ register CARD16 changed,bState;
if ((!interest->client->clientGone) &&
(interest->client->requestVector != InitialVector) &&
(interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->stateNotifyMask&changed)) {
+ (interest->stateNotifyMask&changed) &&
+ XIShouldNotify(interest->client,kbd)) {
pSN->sequenceNumber = interest->client->sequence;
pSN->time = time;
pSN->changed = changed;
@@ -160,49 +256,50 @@ register CARD16 changed,bState;
/***====================================================================***/
+/*
+ * This function sends out XKB mapping notify events to clients which
+ * have explicitly selected for them. Core and Xi events are handled by
+ * XkbSendLegacyMapNotify. */
void
-XkbSendMapNotify(DeviceIntPtr kbd,xkbMapNotify *pMN)
+XkbSendMapNotify(DeviceIntPtr kbd, xkbMapNotify *pMN)
{
-int i;
-XkbSrvInfoPtr xkbi;
-unsigned time = 0,initialized;
-CARD16 changed;
-
- if (!kbd->key || !kbd->key->xkbInfo)
- return;
-
- xkbi = kbd->key->xkbInfo;
- initialized= 0;
-
- changed = pMN->changed;
- pMN->minKeyCode= xkbi->desc->min_key_code;
- pMN->maxKeyCode= xkbi->desc->max_key_code;
- for (i=1; i<currentMaxClients; i++) {
- if (clients[i] && ! clients[i]->clientGone &&
- (clients[i]->requestVector != InitialVector) &&
- (clients[i]->xkbClientFlags&_XkbClientInitialized) &&
- (clients[i]->mapNotifyMask&changed))
- {
- if (!initialized) {
- pMN->type = XkbEventCode + XkbEventBase;
- pMN->xkbType = XkbMapNotify;
- pMN->deviceID = kbd->id;
- time = GetTimeInMillis();
- initialized= 1;
- }
- pMN->time= time;
- pMN->sequenceNumber = clients[i]->sequence;
- pMN->changed = changed;
- if ( clients[i]->swapped ) {
- register int n;
- swaps(&pMN->sequenceNumber,n);
- swapl(&pMN->time,n);
- swaps(&pMN->changed,n);
- }
- WriteToClient(clients[i],sizeof(xEvent),(char *)pMN);
- }
+ int i;
+ CARD32 time = GetTimeInMillis();
+ CARD16 changed = pMN->changed;
+ XkbSrvInfoPtr xkbi = kbd->key->xkbInfo;
+
+ pMN->minKeyCode = xkbi->desc->min_key_code;
+ pMN->maxKeyCode = xkbi->desc->max_key_code;
+ pMN->type = XkbEventCode + XkbEventBase;
+ pMN->xkbType = XkbMapNotify;
+ pMN->deviceID = kbd->id;
+
+ /* 0 is serverClient. */
+ for (i = 1; i < currentMaxClients; i++) {
+ if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+ continue;
+
+ if (!(clients[i]->mapNotifyMask & changed))
+ continue;
+
+ if (!XIShouldNotify(clients[i], kbd))
+ continue;
+
+ pMN->time = time;
+ pMN->sequenceNumber = clients[i]->sequence;
+ pMN->changed = changed;
+
+ if (clients[i]->swapped) {
+ int n;
+ swaps(&pMN->sequenceNumber, n);
+ swapl(&pMN->time, n);
+ swaps(&pMN->changed, n);
+ }
+ WriteToClient(clients[i], sizeof(xEvent), pMN);
}
- return;
+
+ XkbSendLegacyMapNotify(kbd, XkbMapNotify, changed, pMN->firstKeySym,
+ pMN->nKeySyms);
}
int
@@ -306,7 +403,8 @@ Time time = 0;
if ((!interest->client->clientGone) &&
(interest->client->requestVector != InitialVector) &&
(interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->ctrlsNotifyMask&changedControls)) {
+ (interest->ctrlsNotifyMask&changedControls) &&
+ XIShouldNotify(interest->client, kbd)) {
if (!initialized) {
pCN->type = XkbEventCode + XkbEventBase;
pCN->xkbType = XkbControlsNotify;
@@ -354,6 +452,7 @@ CARD32 state,changed;
if ((!interest->client->clientGone) &&
(interest->client->requestVector != InitialVector) &&
(interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ XIShouldNotify(interest->client, kbd) &&
(((xkbType==XkbIndicatorStateNotify)&&
(interest->iStateNotifyMask&changed))||
((xkbType==XkbIndicatorMapNotify)&&
@@ -437,7 +536,8 @@ XID winID = 0;
if ((!interest->client->clientGone) &&
(interest->client->requestVector != InitialVector) &&
(interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->bellNotifyMask)) {
+ (interest->bellNotifyMask) &&
+ XIShouldNotify(interest->client,kbd)) {
if (!initialized) {
time = GetTimeInMillis();
bn.type = XkbEventCode + XkbEventBase;
@@ -491,7 +591,8 @@ CARD16 sk_delay,db_delay;
if ((!interest->client->clientGone) &&
(interest->client->requestVector != InitialVector) &&
(interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->accessXNotifyMask&(1<<pEv->detail))) {
+ (interest->accessXNotifyMask&(1<<pEv->detail)) &&
+ XIShouldNotify(interest->client, kbd)) {
if (!initialized) {
pEv->type = XkbEventCode + XkbEventBase;
pEv->xkbType = XkbAccessXNotify;
@@ -538,7 +639,8 @@ CARD32 changedIndicators;
if ((!interest->client->clientGone) &&
(interest->client->requestVector != InitialVector) &&
(interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->namesNotifyMask&pEv->changed)) {
+ (interest->namesNotifyMask&pEv->changed) &&
+ XIShouldNotify(interest->client, kbd)) {
if (!initialized) {
pEv->type = XkbEventCode + XkbEventBase;
pEv->xkbType = XkbNamesNotify;
@@ -583,7 +685,8 @@ CARD16 firstSI = 0, nSI = 0, nTotalSI = 0;
if ((!interest->client->clientGone) &&
(interest->client->requestVector != InitialVector) &&
(interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->compatNotifyMask)) {
+ (interest->compatNotifyMask) &&
+ XIShouldNotify(interest->client, kbd)) {
if (!initialized) {
pEv->type = XkbEventCode + XkbEventBase;
pEv->xkbType = XkbCompatMapNotify;
@@ -635,7 +738,8 @@ Time time = 0;
if ((!interest->client->clientGone) &&
(interest->client->requestVector != InitialVector) &&
(interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->actionMessageMask)) {
+ (interest->actionMessageMask) &&
+ XIShouldNotify(interest->client, kbd)) {
if (!initialized) {
pEv->type = XkbEventCode + XkbEventBase;
pEv->xkbType = XkbActionMessage;
@@ -681,7 +785,8 @@ CARD16 reason;
if ((!interest->client->clientGone) &&
(interest->client->requestVector != InitialVector) &&
(interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->extDevNotifyMask&reason)) {
+ (interest->extDevNotifyMask&reason) &&
+ XIShouldNotify(interest->client, dev)) {
if (!initialized) {
pEv->type = XkbEventCode + XkbEventBase;
pEv->xkbType = XkbExtensionDeviceNotify;
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index b07dceb..89d3825 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -563,41 +563,52 @@ XkbSetRepeatKeys(DeviceIntPtr pXDev,int key,int onoff)
return;
}
+/* Applies a change to a single device, does not traverse the device tree. */
void
-XkbApplyMappingChange( DeviceIntPtr kbd,
- CARD8 request,
- KeyCode firstKey,
- CARD8 num,
- ClientPtr client)
+XkbApplyMappingChange(DeviceIntPtr kbd, KeySymsPtr map, KeyCode first_key,
+ CARD8 num_keys, CARD8 *modmap, ClientPtr client)
{
-XkbEventCauseRec cause;
-XkbChangesRec changes;
-unsigned check;
-
- bzero(&changes,sizeof(XkbChangesRec));
- check= 0;
- if (request==MappingKeyboard) {
- XkbSetCauseCoreReq(&cause,X_ChangeKeyboardMapping,client);
- XkbUpdateKeyTypesFromCore(kbd,firstKey,num,&changes);
- XkbUpdateActions(kbd,firstKey,num,&changes,&check,&cause);
- if (check)
- XkbCheckSecondaryEffects(kbd->key->xkbInfo,check,&changes,&cause);
+ XkbDescPtr xkb = kbd->key->xkbInfo->desc;
+ XkbEventCauseRec cause;
+ XkbChangesRec changes;
+ unsigned int check;
+
+ memset(&changes, 0, sizeof(changes));
+ memset(&cause, 0, sizeof(cause));
+
+ if (map && first_key && num_keys) {
+ check = 0;
+ XkbSetCauseCoreReq(&cause, X_ChangeKeyboardMapping, client);
+
+ if (!SetKeySymsMap(&kbd->key->curKeySyms, map))
+ FatalError("XkbApplyMappingChange: failed to copy core keymap!\n");
+ XkbUpdateKeyTypesFromCore(kbd, first_key, num_keys, &changes);
+ XkbUpdateActions(kbd, first_key, num_keys, &changes, &check, &cause);
+
+ if (check)
+ XkbCheckSecondaryEffects(kbd->key->xkbInfo, 1, &changes, &cause);
}
- else if (request==MappingModifier) {
- XkbDescPtr xkb= kbd->key->xkbInfo->desc;
-
- XkbSetCauseCoreReq(&cause,X_SetModifierMapping,client);
- num = xkb->max_key_code-xkb->min_key_code+1;
- changes.map.changed|= XkbModifierMapMask;
- changes.map.first_modmap_key= xkb->min_key_code;
- changes.map.num_modmap_keys= num;
- XkbUpdateActions(kbd,xkb->min_key_code,num,&changes,&check,&cause);
- if (check)
- XkbCheckSecondaryEffects(kbd->key->xkbInfo,check,&changes,&cause);
+
+ if (modmap) {
+ /* A keymap change can imply a modmap change, se we prefer the
+ * former. */
+ if (!cause.mjr)
+ XkbSetCauseCoreReq(&cause,X_SetModifierMapping,client);
+
+ check = 0;
+ num_keys = xkb->max_key_code - xkb->min_key_code + 1;
+ changes.map.changed |= XkbModifierMapMask;
+ changes.map.first_modmap_key = xkb->min_key_code;
+ changes.map.num_modmap_keys = num_keys;
+ memcpy(kbd->key->xkbInfo->desc->map->modmap, modmap, MAP_LENGTH);
+ XkbUpdateActions(kbd, xkb->min_key_code, num_keys, &changes, &check,
+ &cause);
+
+ if (check)
+ XkbCheckSecondaryEffects(kbd->key->xkbInfo, 1, &changes, &cause);
}
- /* 3/26/94 (ef) -- XXX! Doesn't deal with input extension requests */
- XkbSendNotification(kbd,&changes,&cause);
- return;
+
+ XkbSendNotification(kbd, &changes, &cause);
}
void
@@ -2062,17 +2073,8 @@ _XkbCopyControls(XkbDescPtr src, XkbDescPtr dst)
*/
Bool
-XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
+XkbCopyKeymap(XkbDescPtr dst, XkbDescPtr src)
{
- DeviceIntPtr pDev = NULL, tmpDev = NULL;
- xkbMapNotify mn;
- xkbNewKeyboardNotify nkn;
- XkbEventCauseRec cause;
- XkbChangesRec changes;
- unsigned int check = 0;
-
- memset(&changes, 0, sizeof(changes));
- memset(&cause, 0, sizeof(cause));
if (!src || !dst) {
DebugF("XkbCopyKeymap: src (%p) or dst (%p) is NULL\n", src, dst);
@@ -2111,79 +2113,36 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
return FALSE;
}
- for (tmpDev = inputInfo.devices; tmpDev && !pDev; tmpDev = tmpDev->next) {
- if (tmpDev->key && tmpDev->key->xkbInfo &&
- tmpDev->key->xkbInfo->desc == dst) {
- pDev = tmpDev;
- break;
- }
- }
- for (tmpDev = inputInfo.off_devices; tmpDev && !pDev;
- tmpDev = tmpDev->next) {
- if (tmpDev->key && tmpDev->key->xkbInfo &&
- tmpDev->key->xkbInfo->desc == dst) {
- pDev = tmpDev;
- break;
- }
- }
-
- if (sendNotifies) {
- if (!pDev) {
- ErrorF("[xkb] XkbCopyKeymap: asked for notifies, but can't find device!\n");
- }
- else {
- /* send NewKeyboardNotify if the keycode range changed, else
- * just MapNotify. we also need to send NKN if the geometry
- * changed (obviously ...). */
- if ((src->min_key_code != dst->min_key_code ||
- src->max_key_code != dst->max_key_code)) {
- nkn.oldMinKeyCode = dst->min_key_code;
- nkn.oldMaxKeyCode = dst->max_key_code;
- nkn.deviceID = nkn.oldDeviceID = pDev->id;
- nkn.minKeyCode = src->min_key_code;
- nkn.maxKeyCode = src->max_key_code;
- nkn.requestMajor = XkbReqCode;
- nkn.requestMinor = X_kbSetMap; /* XXX bare-faced lie */
- nkn.changed = XkbAllNewKeyboardEventsMask;
- XkbSendNewKeyboardNotify(pDev, &nkn);
- } else
- {
- mn.deviceID = pDev->id;
- mn.minKeyCode = src->min_key_code;
- mn.maxKeyCode = src->max_key_code;
- mn.firstType = 0;
- mn.nTypes = src->map->num_types;
- mn.firstKeySym = src->min_key_code;
- mn.nKeySyms = XkbNumKeys(src);
- mn.firstKeyAct = src->min_key_code;
- mn.nKeyActs = XkbNumKeys(src);
- /* Cargo-culted from ProcXkbGetMap. */
- mn.firstKeyBehavior = src->min_key_code;
- mn.nKeyBehaviors = XkbNumKeys(src);
- mn.firstKeyExplicit = src->min_key_code;
- mn.nKeyExplicit = XkbNumKeys(src);
- mn.firstModMapKey = src->min_key_code;
- mn.nModMapKeys = XkbNumKeys(src);
- mn.firstVModMapKey = src->min_key_code;
- mn.nVModMapKeys = XkbNumKeys(src);
- mn.virtualMods = ~0; /* ??? */
- mn.changed = XkbAllMapComponentsMask;
- XkbSendMapNotify(pDev, &mn);
- }
-
- XkbUpdateActions(pDev, dst->min_key_code,
- XkbNumKeys(pDev->key->xkbInfo->desc), &changes,
- &check, &cause);
- if (check)
- XkbCheckSecondaryEffects(pDev->key->xkbInfo, check, &changes,
- &cause);
- memcpy(pDev->kbdfeed->ctrl.autoRepeats, dst->ctrls->per_key_repeat,
- XkbPerKeyBitArraySize);
- }
- }
-
dst->min_key_code = src->min_key_code;
dst->max_key_code = src->max_key_code;
return TRUE;
}
+
+Bool
+XkbCopyDeviceKeymap(DeviceIntPtr dst, DeviceIntPtr src)
+{
+ xkbNewKeyboardNotify nkn;
+ Bool ret;
+
+ if (!dst->key || !src->key)
+ return FALSE;
+
+ nkn.oldMinKeyCode = dst->key->xkbInfo->desc->min_key_code;
+ nkn.oldMaxKeyCode = dst->key->xkbInfo->desc->max_key_code;
+ nkn.deviceID = dst->id;
+ nkn.oldDeviceID = dst->id; /* maybe src->id? */
+ nkn.minKeyCode = src->key->xkbInfo->desc->min_key_code;
+ nkn.maxKeyCode = src->key->xkbInfo->desc->max_key_code;
+ nkn.requestMajor = XkbReqCode;
+ nkn.requestMinor = X_kbSetMap; /* Near enough's good enough. */
+ nkn.changed = XkbNKN_KeycodesMask;
+ if (src->key->xkbInfo->desc->geom)
+ nkn.changed |= XkbNKN_GeometryMask;
+
+ ret = XkbCopyKeymap(dst->key->xkbInfo->desc, src->key->xkbInfo->desc);
+ if (ret)
+ XkbSendNewKeyboardNotify(dst, &nkn);
+
+ return ret;
+}
commit 1d1a0f67eee330a286fbdef17e967ce8ea201548
Author: Daniel Stone <daniel at fooishbar.org>
Date: Tue Oct 28 16:27:37 2008 +1100
Xi: Introduce XIShouldNotify
XIShouldNotify just lets you know if you should send an event for a
keymap change (or similar) concerning a given device to a given client;
at the moment, this is only for devices which are sending events to that
client.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index f06aed0..da10040 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -95,6 +95,22 @@ static Bool MakeInputMasks(WindowPtr /* pWin */
/* Used to sture classes currently not in use by an MD */
extern DevPrivateKey UnusedClassesPrivateKey;
+/*
+ * Only let the given client know of core events which will affect its
+ * interpretation of input events, if the client's ClientPointer (or the
+ * paired keyboard) is the current device.
+ */
+int
+XIShouldNotify(ClientPtr client, DeviceIntPtr dev)
+{
+ DeviceIntPtr current_ptr = PickPointer(client);
+ DeviceIntPtr current_kbd = GetPairedDevice(current_ptr);
+
+ if (dev == current_kbd || dev == current_ptr)
+ return 1;
+
+ return 0;
+}
void
RegisterOtherDevice(DeviceIntPtr device)
diff --git a/include/exevents.h b/include/exevents.h
index 8ddfbf9..abe1a5f 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -255,4 +255,9 @@ extern _X_EXPORT int XIPropToFloat(
float **buf_return
);
+/* For an event such as MappingNotify which affects client interpretation
+ * of input events sent by device dev, should we notify the client, or
+ * would it merely be irrelevant and confusing? */
+extern _X_EXPORT int XIShouldNotify(ClientPtr client, DeviceIntPtr dev);
+
#endif /* EXEVENTS_H */
commit b5242789edb726bb539e4d42fa35bfdaca0025c9
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Aug 9 17:02:02 2008 +0300
XKB: Simplify keymap writing a bit
We don't need no temporary variable.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
diff --git a/xkb/xkbfmisc.c b/xkb/xkbfmisc.c
index 349c79a..be8accb 100644
--- a/xkb/xkbfmisc.c
+++ b/xkb/xkbfmisc.c
@@ -163,14 +163,13 @@ XkbWriteXKBKeymapForNames( FILE * file,
unsigned want,
unsigned need)
{
-char * name,*tmp;
+char * tmp;
unsigned complete;
XkbNamesPtr old_names;
int multi_section;
unsigned wantNames,wantConfig,wantDflts;
complete= 0;
- name= "default";
if (COMPLETE(names->keycodes)) complete|= XkmKeyNamesMask;
if (COMPLETE(names->types)) complete|= XkmTypesMask;
if (COMPLETE(names->compat)) complete|= XkmCompatMapMask;
@@ -292,15 +291,15 @@ unsigned wantNames,wantConfig,wantDflts;
multi_section= 1;
if (((complete&XkmKeymapRequired)==XkmKeymapRequired)&&
((complete&(~XkmKeymapLegal))==0)) {
- fprintf(file,"xkb_keymap \"%s\" {\n",name);
+ fprintf(file,"xkb_keymap \"default\" {\n");
}
else if (((complete&XkmSemanticsRequired)==XkmSemanticsRequired)&&
((complete&(~XkmSemanticsLegal))==0)) {
- fprintf(file,"xkb_semantics \"%s\" {\n",name);
+ fprintf(file,"xkb_semantics \"default\" {\n");
}
else if (((complete&XkmLayoutRequired)==XkmLayoutRequired)&&
((complete&(~XkmLayoutLegal))==0)) {
- fprintf(file,"xkb_layout \"%s\" {\n",name);
+ fprintf(file,"xkb_layout \"default\" {\n");
}
else if (XkmSingleSection(complete&(~XkmVirtualModsMask))) {
multi_section= 0;
@@ -310,41 +309,36 @@ unsigned wantNames,wantConfig,wantDflts;
}
wantNames= complete&(~(wantConfig|wantDflts));
- name= names->keycodes;
if (wantConfig&XkmKeyNamesMask)
- XkbWriteXKBKeycodes(file,xkb,False,False,_AddIncl,name);
+ XkbWriteXKBKeycodes(file,xkb,False,False,_AddIncl,names->keycodes);
else if (wantDflts&XkmKeyNamesMask)
fprintf(stderr,"Default symbols not implemented yet!\n");
else if (wantNames&XkmKeyNamesMask)
- XkbWriteSectionFromName(file,"keycodes",name);
+ XkbWriteSectionFromName(file,"keycodes",names->keycodes);
- name= names->types;
if (wantConfig&XkmTypesMask)
- XkbWriteXKBKeyTypes(file,xkb,False,False,_AddIncl,name);
+ XkbWriteXKBKeyTypes(file,xkb,False,False,_AddIncl,names->types);
else if (wantDflts&XkmTypesMask)
fprintf(stderr,"Default types not implemented yet!\n");
else if (wantNames&XkmTypesMask)
- XkbWriteSectionFromName(file,"types",name);
+ XkbWriteSectionFromName(file,"types",names->types);
- name= names->compat;
if (wantConfig&XkmCompatMapMask)
- XkbWriteXKBCompatMap(file,xkb,False,False,_AddIncl,name);
+ XkbWriteXKBCompatMap(file,xkb,False,False,_AddIncl,names->compat);
else if (wantDflts&XkmCompatMapMask)
fprintf(stderr,"Default interps not implemented yet!\n");
else if (wantNames&XkmCompatMapMask)
- XkbWriteSectionFromName(file,"compatibility",name);
+ XkbWriteSectionFromName(file,"compatibility",names->compat);
- name= names->symbols;
if (wantConfig&XkmSymbolsMask)
- XkbWriteXKBSymbols(file,xkb,False,False,_AddIncl,name);
+ XkbWriteXKBSymbols(file,xkb,False,False,_AddIncl,names->symbols);
else if (wantNames&XkmSymbolsMask)
- XkbWriteSectionFromName(file,"symbols",name);
+ XkbWriteSectionFromName(file,"symbols",names->symbols);
- name= names->geometry;
if (wantConfig&XkmGeometryMask)
- XkbWriteXKBGeometry(file,xkb,False,False,_AddIncl,name);
+ XkbWriteXKBGeometry(file,xkb,False,False,_AddIncl,names->geometry);
else if (wantNames&XkmGeometryMask)
- XkbWriteSectionFromName(file,"geometry",name);
+ XkbWriteSectionFromName(file,"geometry",names->geometry);
if (multi_section)
fprintf(file,"};\n");
commit feb757f384382c7782ceac55f99d54c7caadbd9d
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Apr 25 19:54:29 2008 +0300
XKB: Sanitise vmods for redirected keys
Turn two unsigned chars into one unsigned int for both vmods and the
vmod mask. As a bonus, remove broken unused accessor macro for setting
the vmods.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/include/xkbstr.h b/include/xkbstr.h
index 0a49ee1..ec19b30 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -194,23 +194,10 @@ typedef struct _XkbRedirectKeyAction {
unsigned char new_key;
unsigned char mods_mask;
unsigned char mods;
- /* FIXME: Make this an int. */
- unsigned char vmods_mask0;
- unsigned char vmods_mask1;
- unsigned char vmods0;
- unsigned char vmods1;
+ unsigned int vmods_mask;
+ unsigned int vmods;
} XkbRedirectKeyAction;
-#define XkbSARedirectVMods(a) ((((unsigned int)(a)->vmods1)<<8)|\
- ((unsigned int)(a)->vmods0))
-/* FIXME: This is blatantly not setting vmods. Yeesh. */
-#define XkbSARedirectSetVMods(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\
- ((a)->vmods_mask0=((m)&0xff)))
-#define XkbSARedirectVModsMask(a) ((((unsigned int)(a)->vmods_mask1)<<8)|\
- ((unsigned int)(a)->vmods_mask0))
-#define XkbSARedirectSetVModsMask(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\
- ((a)->vmods_mask0=((m)&0xff)))
-
typedef struct _XkbDeviceBtnAction {
unsigned char type;
unsigned char flags;
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 4eb6b0b..9a138b0 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -833,8 +833,8 @@ ProcessInputProc backupproc;
ev.u.u.type = KeyPress;
ev.u.u.detail = pAction->redirect.new_key;
- mask= XkbSARedirectVModsMask(&pAction->redirect);
- mods= XkbSARedirectVMods(&pAction->redirect);
+ mask= pAction->redirect.vmods_mask;
+ mods= pAction->redirect.vmods;
if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
mask|= pAction->redirect.mods_mask;
@@ -865,8 +865,8 @@ ProcessInputProc backupproc;
ev.u.u.type = KeyRelease;
ev.u.u.detail = filter->upAction.redirect.new_key;
- mask= XkbSARedirectVModsMask(&filter->upAction.redirect);
- mods= XkbSARedirectVMods(&filter->upAction.redirect);
+ mask= filter->upAction.redirect.vmods_mask;
+ mods= filter->upAction.redirect.vmods;
if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
mask|= filter->upAction.redirect.mods_mask;
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index e91ab2e..b9f16a8 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -1006,8 +1006,8 @@ unsigned vmods,vmods_mask;
act= &action->redirect;
kc= act->new_key;
- vmods= XkbSARedirectVMods(act);
- vmods_mask= XkbSARedirectVModsMask(act);
+ vmods= act->vmods;
+ vmods_mask= act->vmods_mask;
if (xkb && xkb->names && xkb->names->keys && (kc<=xkb->max_key_code) &&
(xkb->names->keys[kc].name[0]!='\0')) {
char *kn;
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index e4d3d4d..a6fdc6f 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -512,10 +512,10 @@ XkbAction *act;
act->redirect.new_key = wire.actionData[0];
act->redirect.mods_mask = wire.actionData[1];
act->redirect.mods = wire.actionData[2];
- act->redirect.vmods_mask0 = wire.actionData[3];
- act->redirect.vmods_mask1 = wire.actionData[4];
- act->redirect.vmods0 = wire.actionData[4];
- act->redirect.vmods1 = wire.actionData[5];
+ act->redirect.vmods_mask = (wire.actionData[3] << 8) | \
+ wire.actionData[4];
+ act->redirect.vmods = (wire.actionData[5] << 8) | \
+ wire.actionData[6];
break;
case XkbSA_DeviceValuator:
act->devval.device = wire.actionData[0];
commit b5f49382fe48f0a762d9a15fb10a7d7e1183fc8d
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Apr 25 19:52:11 2008 +0300
XKB: Sanitise ctrls action
Turn four unsigned chars into one unsigned long.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/include/xkbstr.h b/include/xkbstr.h
index 193f276..0a49ee1 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -180,20 +180,8 @@ typedef struct _XkbSwitchScreenAction {
typedef struct _XkbCtrlsAction {
unsigned char type;
unsigned char flags;
- /* FIXME: Make this an int. */
- unsigned char ctrls3;
- unsigned char ctrls2;
- unsigned char ctrls1;
- unsigned char ctrls0;
+ unsigned long ctrls;
} XkbCtrlsAction;
-#define XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \
- (a)->ctrls2 = ((c) >> 16) & 0xff, \
- (a)->ctrls1 = ((c) >> 8) & 0xff, \
- (a)->ctrls0 = (c) & 0xff)
-#define XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
- (((unsigned int)(a)->ctrls2)<<16)|\
- (((unsigned int)(a)->ctrls1)<<8)|\
- ((unsigned int) (a)->ctrls0))
typedef struct _XkbMessageAction {
unsigned char type;
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index cd26887..4eb6b0b 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -671,7 +671,7 @@ XkbEventCauseRec cause;
filter->keycode = keycode;
filter->active = 1;
filter->filterOthers = 0;
- change= XkbActionCtrls(&pAction->ctrls);
+ change= pAction->ctrls.ctrls;
filter->priv = change;
filter->filter = _XkbFilterControls;
filter->upAction = *pAction;
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index debc2f9..e91ab2e 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -890,7 +890,7 @@ unsigned tmp;
char tbuf[32];
act= &action->ctrls;
- tmp= XkbActionCtrls(act);
+ tmp= act->ctrls;
TryCopyStr(buf,"controls=",sz);
if (tmp==0)
TryCopyStr(buf,"none",sz);
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index 9ba14c4..e4d3d4d 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -503,10 +503,10 @@ XkbAction *act;
case XkbSA_SetControls:
case XkbSA_LockControls:
act->ctrls.flags = wire.actionData[0];
- act->ctrls.ctrls3 = wire.actionData[1];
- act->ctrls.ctrls2 = wire.actionData[2];
- act->ctrls.ctrls1 = wire.actionData[3];
- act->ctrls.ctrls0 = wire.actionData[4];
+ act->ctrls.ctrls = (wire.actionData[1] << 24) | \
+ (wire.actionData[2] << 16) | \
+ (wire.actionData[3] << 8) | \
+ wire.actionData[4];
break;
case XkbSA_RedirectKey:
act->redirect.new_key = wire.actionData[0];
commit 1bd7fd195d85681e722161f8c636a28f11b40abb
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Apr 25 19:50:12 2008 +0300
XKB: Sanitise pointer actions
Turn two unsigned chars into one int.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/include/xkbstr.h b/include/xkbstr.h
index c1752a3..193f276 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -149,16 +149,9 @@ typedef struct _XkbISOAction {
typedef struct _XkbPtrAction {
unsigned char type;
unsigned char flags;
- /* FIXME: Make this an int. */
- unsigned char high_XXX;
- unsigned char low_XXX;
- unsigned char high_YYY;
- unsigned char low_YYY;
+ int x;
+ int y;
} XkbPtrAction;
-#define XkbPtrActionX(a) (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
-#define XkbPtrActionY(a) (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
-#define XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
-#define XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
typedef struct _XkbPtrBtnAction {
unsigned char type;
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index c46bd84..cd26887 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -523,15 +523,15 @@ Bool accel;
xkbi->mouseKeysCounter= 0;
xkbi->mouseKey= keycode;
accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
- x= XkbPtrActionX(&pAction->ptr);
- y= XkbPtrActionY(&pAction->ptr);
+ x= pAction->ptr.x;
+ y= pAction->ptr.y;
XkbDDXFakePointerMotion(pAction->ptr.flags,x,y);
AccessXCancelRepeatKey(xkbi,keycode);
xkbi->mouseKeysAccel= accel&&
(xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
xkbi->mouseKeysFlags= pAction->ptr.flags;
- xkbi->mouseKeysDX= XkbPtrActionX(&pAction->ptr);
- xkbi->mouseKeysDY= XkbPtrActionY(&pAction->ptr);
+ xkbi->mouseKeysDX= x;
+ xkbi->mouseKeysDY= y;
xkbi->mouseKeyTimer= TimerSet(xkbi->mouseKeyTimer, 0,
xkbi->desc->ctrls->mk_delay,
_XkbPtrAccelExpire,(pointer)xkbi);
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index 213dbb7..debc2f9 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -731,8 +731,8 @@ int x,y;
char tbuf[32];
act= &action->ptr;
- x= XkbPtrActionX(act);
- y= XkbPtrActionY(act);
+ x= act->x;
+ y= act->y;
if ((act->flags&XkbSA_MoveAbsoluteX)||(x<0))
sprintf(tbuf,"x=%d",x);
else sprintf(tbuf,"x=+%d",x);
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index ff0537e..9ba14c4 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -467,10 +467,8 @@ XkbAction *act;
break;
case XkbSA_MovePtr:
act->ptr.flags = wire.actionData[0];
- act->ptr.high_XXX = wire.actionData[1];
- act->ptr.low_XXX = wire.actionData[2];
- act->ptr.high_YYY = wire.actionData[3];
- act->ptr.low_YYY = wire.actionData[4];
+ act->ptr.x = (wire.actionData[1] << 8) | wire.actionData[2];
+ act->ptr.y = (wire.actionData[3] << 8) | wire.actionData[4];
break;
case XkbSA_PtrBtn:
case XkbSA_LockPtrBtn:
commit 61c508fa78aa08ea2666fde950fbafad95d65056
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Apr 25 19:47:16 2008 +0300
XKB: Sanitise vmods in actions
Turn vmods from two unsigned chars into one int.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/include/xkbstr.h b/include/xkbstr.h
index 4afe010..c1752a3 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -123,14 +123,8 @@ typedef struct _XkbModAction {
unsigned char flags;
unsigned char mask;
unsigned char real_mods;
- /* FIXME: Make this an int. */
- unsigned char vmods1;
- unsigned char vmods2;
+ unsigned int vmods;
} XkbModAction;
-#define XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2))
-#define XkbSetModActionVMods(a,v) \
- ((a)->vmods1 = (((v) >> 8) & 0xff), \
- (a)->vmods2 = (v) & 0xff)
typedef struct _XkbGroupAction {
unsigned char type;
@@ -149,8 +143,7 @@ typedef struct _XkbISOAction {
/* FIXME: Make this an int. */
char group_XXX;
unsigned char affect;
- unsigned char vmods1;
- unsigned char vmods2;
+ unsigned int vmods;
} XkbISOAction;
typedef struct _XkbPtrAction {
diff --git a/xkb/XKBMisc.c b/xkb/XKBMisc.c
index 078f241..82d37d1 100644
--- a/xkb/XKBMisc.c
+++ b/xkb/XKBMisc.c
@@ -343,7 +343,7 @@ unsigned tmp;
case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
if (act->mods.flags&XkbSA_UseModMapMods)
act->mods.real_mods= act->mods.mask= mods;
- if ((tmp= XkbModActionVMods(&act->mods))!=0) {
+ if ((tmp= act->mods.vmods)!=0) {
XkbVirtualModsToReal(xkb,tmp,&tmp);
act->mods.mask|= tmp;
}
@@ -351,7 +351,7 @@ unsigned tmp;
case XkbSA_ISOLock:
if (act->iso.flags&XkbSA_UseModMapMods)
act->iso.real_mods= act->iso.mask= mods;
- if ((tmp= XkbModActionVMods(&act->iso))!=0) {
+ if ((tmp= act->iso.vmods)!=0) {
XkbVirtualModsToReal(xkb,tmp,&tmp);
act->iso.mask|= tmp;
}
@@ -666,7 +666,7 @@ unsigned int tmp;
switch (act->type) {
case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
- if (((tmp= XkbModActionVMods(&act->mods))&changed)!=0) {
+ if (((tmp= act->mods.vmods)&changed)!=0) {
XkbVirtualModsToReal(xkb,tmp,&tmp);
act->mods.mask= act->mods.real_mods;
act->mods.mask|= tmp;
@@ -674,7 +674,7 @@ unsigned int tmp;
}
break;
case XkbSA_ISOLock:
- if ((((tmp= XkbModActionVMods(&act->iso))!=0)&changed)!=0) {
+ if ((((tmp= act->iso.vmods)!=0)&changed)!=0) {
XkbVirtualModsToReal(xkb,tmp,&tmp);
act->iso.mask= act->iso.real_mods;
act->iso.mask|= tmp;
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index d03195f..b07dceb 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -183,13 +183,13 @@ register unsigned tmp;
case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
if (act->mods.flags&XkbSA_UseModMapMods)
act->mods.real_mods= act->mods.mask= mods;
- if ((tmp= XkbModActionVMods(&act->mods))!=0)
+ if ((tmp= act->mods.vmods)!=0)
act->mods.mask|= XkbMaskForVMask(xkb,tmp);
break;
case XkbSA_ISOLock:
if (act->iso.flags&XkbSA_UseModMapMods)
act->iso.real_mods= act->iso.mask= mods;
- if ((tmp= XkbModActionVMods(&act->iso))!=0)
+ if ((tmp= act->iso.vmods)!=0)
act->iso.mask|= XkbMaskForVMask(xkb,tmp);
break;
}
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index f9bfae5..213dbb7 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -678,7 +678,7 @@ XkbModAction * act;
unsigned tmp;
act= &action->mods;
- tmp= XkbModActionVMods(act);
+ tmp= act->vmods;
TryCopyStr(buf,"modifiers=",sz);
if (act->flags&XkbSA_UseModMapMods)
TryCopyStr(buf,"modMapMods",sz);
@@ -818,7 +818,7 @@ char tbuf[64];
}
else {
unsigned tmp;
- tmp= XkbModActionVMods(act);
+ tmp= act->vmods;
TryCopyStr(buf,"modifiers=",sz);
if (act->flags&XkbSA_UseModMapMods)
TryCopyStr(buf,"modMapMods",sz);
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index dc6e0d2..ff0537e 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -457,8 +457,7 @@ XkbAction *act;
act->mods.flags = wire.actionData[0];
act->mods.mask = wire.actionData[1];
act->mods.real_mods = wire.actionData[2];
- act->mods.vmods1 = wire.actionData[3];
- act->mods.vmods2 = wire.actionData[4];
+ act->mods.vmods = (wire.actionData[3] << 8) | wire.actionData[4];
break;
case XkbSA_SetGroup:
case XkbSA_LatchGroup:
@@ -497,8 +496,7 @@ XkbAction *act;
act->iso.real_mods = wire.actionData[2];
act->iso.group_XXX = wire.actionData[3];
act->iso.affect = wire.actionData[4];
- act->iso.vmods1 = wire.actionData[5];
- act->iso.vmods2 = wire.actionData[6];
+ act->iso.vmods = (wire.actionData[5] << 8) | wire.actionData[6];
break;
case XkbSA_SwitchScreen:
act->screen.flags = wire.actionData[0];
commit 4f3078df2acf07364a17f738bc5c32f9a5962723
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Aug 9 16:50:22 2008 +0300
XKB: Add a hell of a lot more FIXMEs
For some reason, we insist on having daft internal representations that
make no sense, that always have to be converted to be used. We should
really sort this one out.
Also, comment the hojillion members of XkbStateRec.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
diff --git a/include/xkbstr.h b/include/xkbstr.h
index ba7debb..4afe010 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -29,12 +29,13 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <X11/extensions/XKB.h>
-#define XkbCharToInt(v) ((v)&0x80?(int)((v)|(~0xff)):(int)((v)&0x7f))
-#define XkbIntTo2Chars(i,h,l) (((h)=((i>>8)&0xff)),((l)=((i)&0xff)))
+#define XkbCharToInt(v) ((int) ((v) & 0x80 ? ((v) | (~0xff)) : ((v) & 0x7f)))
+#define XkbIntTo2Chars(i, h, l) ((h) = (i >> 8) & 0xff, (l) = (i) & 0xff)
#if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
-#define Xkb2CharsToInt(h,l) ((h)&0x80?(int)(((h)<<8)|(l)|(~0xffff)):\
- (int)(((h)<<8)|(l)&0x7fff))
+#define Xkb2CharsToInt(h, l) ((int) ((h) & 0x80 ? \
+ (((h) << 8) | (l) | (~0xffff)) : \
+ (((h) << 8) | (l) & 0x7fff))
#else
#define Xkb2CharsToInt(h,l) ((short)(((h)<<8)|(l)))
#endif
@@ -44,20 +45,30 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
typedef struct _XkbStateRec {
- unsigned char group;
+ unsigned char group; /* base + latched + locked */
+ /* FIXME: Why are base + latched short and not char?? */
+ unsigned short base_group; /* physically ... down? */
+ unsigned short latched_group;
unsigned char locked_group;
- unsigned short base_group;
- unsigned short latched_group;
- unsigned char mods;
- unsigned char base_mods;
- unsigned char latched_mods;
- unsigned char locked_mods;
- unsigned char compat_state;
- unsigned char grab_mods;
- unsigned char compat_grab_mods;
- unsigned char lookup_mods;
- unsigned char compat_lookup_mods;
- unsigned short ptr_buttons;
+
+ unsigned char mods; /* base + latched + locked */
+ unsigned char base_mods; /* physically down */
+ unsigned char latched_mods;
+ unsigned char locked_mods;
+
+ unsigned char compat_state; /* mods + group for core state */
+
+ /* grab mods = all depressed and latched mods, _not_ locked mods */
+ unsigned char grab_mods; /* grab mods minus internal mods */
+ unsigned char compat_grab_mods; /* grab mods + group for core state,
+ but not locked groups if
+ IgnoreGroupLocks set */
+
+ /* effective mods = all mods (depressed, latched, locked) */
+ unsigned char lookup_mods; /* effective mods minus internal mods */
+ unsigned char compat_lookup_mods; /* effective mods + group */
+
+ unsigned short ptr_buttons; /* core pointer buttons */
} XkbStateRec,*XkbStatePtr;
#define XkbStateFieldFromRec(s) XkbBuildCoreState((s)->lookup_mods,(s)->group)
#define XkbGrabStateFromRec(s) XkbBuildCoreState((s)->grab_mods,(s)->group)
@@ -88,7 +99,8 @@ typedef struct _XkbKeyType {
#define XkbOutOfRangeGroupInfo(g) ((g)&0xf0)
#define XkbOutOfRangeGroupAction(g) ((g)&0xc0)
#define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4)
-#define XkbSetGroupInfo(g,w,n) (((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))
+#define XkbSetGroupInfo(g, w, n) (((w) & 0xc0) | (((n) & 3) << 4) | \
+ ((g) & 0x0f))
#define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f))
/*
@@ -111,17 +123,19 @@ typedef struct _XkbModAction {
unsigned char flags;
unsigned char mask;
unsigned char real_mods;
+ /* FIXME: Make this an int. */
unsigned char vmods1;
unsigned char vmods2;
} XkbModAction;
-#define XkbModActionVMods(a) \
- ((short)(((a)->vmods1<<8)|((a)->vmods2)))
+#define XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2))
#define XkbSetModActionVMods(a,v) \
- (((a)->vmods1=(((v)>>8)&0xff)),(a)->vmods2=((v)&0xff))
+ ((a)->vmods1 = (((v) >> 8) & 0xff), \
+ (a)->vmods2 = (v) & 0xff)
typedef struct _XkbGroupAction {
unsigned char type;
unsigned char flags;
+ /* FIXME: Make this an int. */
char group_XXX;
} XkbGroupAction;
#define XkbSAGroup(a) (XkbCharToInt((a)->group_XXX))
@@ -132,6 +146,7 @@ typedef struct _XkbISOAction {
unsigned char flags;
unsigned char mask;
unsigned char real_mods;
+ /* FIXME: Make this an int. */
char group_XXX;
unsigned char affect;
unsigned char vmods1;
@@ -141,6 +156,7 @@ typedef struct _XkbISOAction {
typedef struct _XkbPtrAction {
unsigned char type;
unsigned char flags;
+ /* FIXME: Make this an int. */
unsigned char high_XXX;
unsigned char low_XXX;
unsigned char high_YYY;
@@ -165,7 +181,7 @@ typedef struct _XkbPtrDfltAction {
char valueXXX;
} XkbPtrDfltAction;
#define XkbSAPtrDfltValue(a) (XkbCharToInt((a)->valueXXX))
-#define XkbSASetPtrDfltValue(a,c) ((a)->valueXXX= ((c)&0xff))
+#define XkbSASetPtrDfltValue(a, c) ((a)->valueXXX = (c) & 0xff)
typedef struct _XkbSwitchScreenAction {
unsigned char type;
@@ -173,24 +189,25 @@ typedef struct _XkbSwitchScreenAction {
char screenXXX;
} XkbSwitchScreenAction;
#define XkbSAScreen(a) (XkbCharToInt((a)->screenXXX))
-#define XkbSASetScreen(a,s) ((a)->screenXXX= ((s)&0xff))
+#define XkbSASetScreen(a, s) ((a)->screenXXX = (s) & 0xff)
typedef struct _XkbCtrlsAction {
unsigned char type;
unsigned char flags;
+ /* FIXME: Make this an int. */
unsigned char ctrls3;
unsigned char ctrls2;
unsigned char ctrls1;
unsigned char ctrls0;
} XkbCtrlsAction;
-#define XkbActionSetCtrls(a,c) (((a)->ctrls3=(((c)>>24)&0xff)),\
- ((a)->ctrls2=(((c)>>16)&0xff)),\
- ((a)->ctrls1=(((c)>>8)&0xff)),\
- ((a)->ctrls0=((c)&0xff)))
+#define XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \
+ (a)->ctrls2 = ((c) >> 16) & 0xff, \
+ (a)->ctrls1 = ((c) >> 8) & 0xff, \
+ (a)->ctrls0 = (c) & 0xff)
#define XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
(((unsigned int)(a)->ctrls2)<<16)|\
(((unsigned int)(a)->ctrls1)<<8)|\
- ((unsigned int)((a)->ctrls0)))
+ ((unsigned int) (a)->ctrls0))
typedef struct _XkbMessageAction {
unsigned char type;
@@ -203,6 +220,7 @@ typedef struct _XkbRedirectKeyAction {
unsigned char new_key;
unsigned char mods_mask;
unsigned char mods;
+ /* FIXME: Make this an int. */
unsigned char vmods_mask0;
unsigned char vmods_mask1;
unsigned char vmods0;
@@ -211,6 +229,7 @@ typedef struct _XkbRedirectKeyAction {
#define XkbSARedirectVMods(a) ((((unsigned int)(a)->vmods1)<<8)|\
((unsigned int)(a)->vmods0))
+/* FIXME: This is blatantly not setting vmods. Yeesh. */
#define XkbSARedirectSetVMods(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\
((a)->vmods_mask0=((m)&0xff)))
#define XkbSARedirectVModsMask(a) ((((unsigned int)(a)->vmods_mask1)<<8)|\
@@ -281,7 +300,8 @@ typedef struct _XkbControls {
#define XkbAX_AnyFeedback(c) ((c)->enabled_ctrls&XkbAccessXFeedbackMask)
#define XkbAX_NeedOption(c,w) ((c)->ax_options&(w))
-#define XkbAX_NeedFeedback(c,w) (XkbAX_AnyFeedback(c)&&XkbAX_NeedOption(c,w))
+#define XkbAX_NeedFeedback(c, w) (XkbAX_AnyFeedback((c)) && \
+ XkbAX_NeedOption((c), (w)))
typedef struct _XkbServerMapRec {
unsigned short num_acts;
@@ -300,7 +320,7 @@ typedef struct _XkbServerMapRec {
unsigned short *vmodmap;
} XkbServerMapRec, *XkbServerMapPtr;
-#define XkbSMKeyActionsPtr(m,k) (&(m)->acts[(m)->key_acts[k]])
+#define XkbSMKeyActionsPtr(m, k) (&(m)->acts[(m)->key_acts[(k)]])
/*
* Structures and access macros used primarily by clients
@@ -326,15 +346,16 @@ typedef struct _XkbClientMapRec {
unsigned char *modmap;
} XkbClientMapRec, *XkbClientMapPtr;
-#define XkbCMKeyGroupInfo(m,k) ((m)->key_sym_map[k].group_info)
-#define XkbCMKeyNumGroups(m,k) (XkbNumGroups((m)->key_sym_map[k].group_info))
-#define XkbCMKeyGroupWidth(m,k,g) (XkbCMKeyType(m,k,g)->num_levels)
-#define XkbCMKeyGroupsWidth(m,k) ((m)->key_sym_map[k].width)
-#define XkbCMKeyTypeIndex(m,k,g) ((m)->key_sym_map[k].kt_index[g&0x3])
-#define XkbCMKeyType(m,k,g) (&(m)->types[XkbCMKeyTypeIndex(m,k,g)])
-#define XkbCMKeyNumSyms(m,k) (XkbCMKeyGroupsWidth(m,k)*XkbCMKeyNumGroups(m,k))
-#define XkbCMKeySymsOffset(m,k) ((m)->key_sym_map[k].offset)
-#define XkbCMKeySymsPtr(m,k) (&(m)->syms[XkbCMKeySymsOffset(m,k)])
+#define XkbCMKeyGroupInfo(m, k) ((m)->key_sym_map[(k)].group_info)
+#define XkbCMKeyNumGroups(m, k) (XkbNumGroups((m)->key_sym_map[(k)].group_info))
+#define XkbCMKeyGroupWidth(m, k, g) (XkbCMKeyType((m), (k), (g))->num_levels)
+#define XkbCMKeyGroupsWidth(m, k) ((m)->key_sym_map[(k)].width)
+#define XkbCMKeyTypeIndex(m, k, g) ((m)->key_sym_map[(k)].kt_index[(g) & 0x3])
+#define XkbCMKeyType(m, k, g) (&(m)->types[XkbCMKeyTypeIndex((m), (k), (g))])
+#define XkbCMKeyNumSyms(m, k) (XkbCMKeyGroupsWidth((m), (k)) * \
+ XkbCMKeyNumGroups((m), (k)))
+#define XkbCMKeySymsOffset(m, k) ((m)->key_sym_map[(k)].offset)
+#define XkbCMKeySymsPtr(m, k) (&(m)->syms[XkbCMKeySymsOffset((m), (k))])
/*
* Compatibility structures and access macros
@@ -358,6 +379,8 @@ typedef struct _XkbCompatMapRec {
typedef struct _XkbIndicatorMapRec {
unsigned char flags;
+ /* FIXME: For some reason, interepretation of groups is wildly
+ * different between which being base/latched/locked. */
unsigned char which_groups;
unsigned char groups;
unsigned char which_mods;
@@ -365,12 +388,12 @@ typedef struct _XkbIndicatorMapRec {
unsigned int ctrls;
} XkbIndicatorMapRec, *XkbIndicatorMapPtr;
-#define XkbIM_IsAuto(i) ((((i)->flags&XkbIM_NoAutomatic)==0)&&\
+#define XkbIM_IsAuto(i) (!((i)->flags & XkbIM_NoAutomatic) && \
(((i)->which_groups&&(i)->groups)||\
((i)->which_mods&&(i)->mods.mask)||\
- ((i)->ctrls)))
-#define XkbIM_InUse(i) (((i)->flags)||((i)->which_groups)||\
- ((i)->which_mods)||((i)->ctrls))
+ (i)->ctrls))
+#define XkbIM_InUse(i) ((i)->flags || (i)->which_groups || (i)->which_mods || \
+ (i)->ctrls)
typedef struct _XkbIndicatorRec {
@@ -428,28 +451,30 @@ typedef struct _XkbDesc {
XkbCompatMapPtr compat;
XkbGeometryPtr geom;
} XkbDescRec, *XkbDescPtr;
-#define XkbKeyKeyTypeIndex(d,k,g) (XkbCMKeyTypeIndex((d)->map,k,g))
-#define XkbKeyKeyType(d,k,g) (XkbCMKeyType((d)->map,k,g))
-#define XkbKeyGroupWidth(d,k,g) (XkbCMKeyGroupWidth((d)->map,k,g))
-#define XkbKeyGroupsWidth(d,k) (XkbCMKeyGroupsWidth((d)->map,k))
+#define XkbKeyKeyTypeIndex(d, k, g) (XkbCMKeyTypeIndex((d)->map, (k), (g)))
+#define XkbKeyKeyType(d, k, g) (XkbCMKeyType((d)->map, (k), (g)))
+#define XkbKeyGroupWidth(d, k, g) (XkbCMKeyGroupWidth((d)->map, (k), (g)))
+#define XkbKeyGroupsWidth(d, k) (XkbCMKeyGroupsWidth((d)->map, (k)))
#define XkbKeyGroupInfo(d,k) (XkbCMKeyGroupInfo((d)->map,(k)))
#define XkbKeyNumGroups(d,k) (XkbCMKeyNumGroups((d)->map,(k)))
#define XkbKeyNumSyms(d,k) (XkbCMKeyNumSyms((d)->map,(k)))
#define XkbKeySymsPtr(d,k) (XkbCMKeySymsPtr((d)->map,(k)))
-#define XkbKeySym(d,k,n) (XkbKeySymsPtr(d,k)[n])
+#define XkbKeySym(d, k, n) (XkbKeySymsPtr((d), (k))[(n)])
#define XkbKeySymEntry(d,k,sl,g) \
- (XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))))
+ (XkbKeySym((d), (k), (XkbKeyGroupsWidth((d), (k)) * (g)) + (sl)))
#define XkbKeyAction(d,k,n) \
- (XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)
+ (XkbKeyHasActions((d), (k)) ? & XkbKeyActionsPtr((d), (k))[(n)] : NULL)
#define XkbKeyActionEntry(d,k,sl,g) \
- (XkbKeyHasActions(d,k)?\
- XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)
-
-#define XkbKeyHasActions(d,k) ((d)->server->key_acts[k]!=0)
-#define XkbKeyNumActions(d,k) (XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1)
-#define XkbKeyActionsPtr(d,k) (XkbSMKeyActionsPtr((d)->server,k))
-#define XkbKeycodeInRange(d,k) (((k)>=(d)->min_key_code)&&\
- ((k)<=(d)->max_key_code))
+ (XkbKeyHasActions((d), (k)) ? \
+ XkbKeyAction((d), (k), ((XkbKeyGroupsWidth((d), (k)) * (g)) + (sl))) : \
+ NULL)
+
+#define XkbKeyHasActions(d, k) (!!(d)->server->key_acts[(k)])
+#define XkbKeyNumActions(d, k) (XkbKeyHasActions((d), (k)) ? \
+ XkbKeyNumSyms((d), (k)) : 1)
+#define XkbKeyActionsPtr(d, k) (XkbSMKeyActionsPtr((d)->server, (k)))
+#define XkbKeycodeInRange(d, k) ((k) >= (d)->min_key_code && \
+ (k) <= (d)->max_key_code)
#define XkbNumKeys(d) ((d)->max_key_code-(d)->min_key_code+1)
@@ -587,9 +612,9 @@ typedef struct _XkbDeviceInfo {
XkbDeviceLedInfoPtr leds;
} XkbDeviceInfoRec,*XkbDeviceInfoPtr;
-#define XkbXI_DevHasBtnActs(d) (((d)->num_btns>0)&&((d)->btn_acts!=NULL))
-#define XkbXI_LegalDevBtn(d,b) (XkbXI_DevHasBtnActs(d)&&((b)<(d)->num_btns))
-#define XkbXI_DevHasLeds(d) (((d)->num_leds>0)&&((d)->leds!=NULL))
+#define XkbXI_DevHasBtnActs(d) ((d)->num_btns > 0 && (d)->btn_acts)
+#define XkbXI_LegalDevBtn(d,b) (XkbXI_DevHasBtnActs(d) && (b) < (d)->num_btns)
+#define XkbXI_DevHasLeds(d) ((d)->num_leds > 0 && (d)->leds)
typedef struct _XkbDeviceLedChanges {
unsigned short led_class;
commit edeb033f29ae2d52e86c543ccbf22fb7ae1fdb7f
Author: Daniel Stone <daniel at fooishbar.org>
Date: Wed Oct 15 18:07:52 2008 +0100
XKB: Explicitly decode action data
Rather than requiring a one-to-one correspondence between XKM and struct
formats in action data, explicitly fill the action data, so we can break
API.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index 1b6149b..dc6e0d2 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -417,6 +417,7 @@ xkmSymInterpretDesc wire;
unsigned tmp;
int nRead=0;
XkbCompatMapPtr compat;
+XkbAction *act;
if ((tmp= XkmGetCountedString(file,name,100))<1) {
_XkbLibError(_XkbErrBadLength,"ReadXkmCompatMap",0);
@@ -447,13 +448,96 @@ XkbCompatMapPtr compat;
interp->virtual_mod= wire.virtualMod;
interp->flags= wire.flags;
interp->act.type= wire.actionType;
- interp->act.data[0]= wire.actionData[0];
- interp->act.data[1]= wire.actionData[1];
- interp->act.data[2]= wire.actionData[2];
- interp->act.data[3]= wire.actionData[3];
- interp->act.data[4]= wire.actionData[4];
- interp->act.data[5]= wire.actionData[5];
- interp->act.data[6]= wire.actionData[6];
+ act = (XkbAction *) &interp->act;
+
+ switch (interp->act.type) {
+ case XkbSA_SetMods:
+ case XkbSA_LatchMods:
+ case XkbSA_LockMods:
+ act->mods.flags = wire.actionData[0];
+ act->mods.mask = wire.actionData[1];
+ act->mods.real_mods = wire.actionData[2];
+ act->mods.vmods1 = wire.actionData[3];
+ act->mods.vmods2 = wire.actionData[4];
+ break;
+ case XkbSA_SetGroup:
+ case XkbSA_LatchGroup:
+ case XkbSA_LockGroup:
+ act->group.flags = wire.actionData[0];
+ act->group.group_XXX = wire.actionData[1];
+ break;
+ case XkbSA_MovePtr:
+ act->ptr.flags = wire.actionData[0];
+ act->ptr.high_XXX = wire.actionData[1];
+ act->ptr.low_XXX = wire.actionData[2];
+ act->ptr.high_YYY = wire.actionData[3];
+ act->ptr.low_YYY = wire.actionData[4];
+ break;
+ case XkbSA_PtrBtn:
+ case XkbSA_LockPtrBtn:
+ act->btn.flags = wire.actionData[0];
+ act->btn.count = wire.actionData[1];
+ act->btn.button = wire.actionData[2];
+ break;
+ case XkbSA_DeviceBtn:
+ case XkbSA_LockDeviceBtn:
+ act->devbtn.flags = wire.actionData[0];
+ act->devbtn.count = wire.actionData[1];
+ act->devbtn.button = wire.actionData[2];
+ act->devbtn.device = wire.actionData[3];
+ break;
+ case XkbSA_SetPtrDflt:
+ act->dflt.flags = wire.actionData[0];
+ act->dflt.affect = wire.actionData[1];
+ act->dflt.valueXXX = wire.actionData[2];
+ break;
+ case XkbSA_ISOLock:
+ act->iso.flags = wire.actionData[0];
+ act->iso.mask = wire.actionData[1];
+ act->iso.real_mods = wire.actionData[2];
+ act->iso.group_XXX = wire.actionData[3];
+ act->iso.affect = wire.actionData[4];
+ act->iso.vmods1 = wire.actionData[5];
+ act->iso.vmods2 = wire.actionData[6];
+ break;
+ case XkbSA_SwitchScreen:
+ act->screen.flags = wire.actionData[0];
+ act->screen.screenXXX = wire.actionData[1];
+ break;
+ case XkbSA_SetControls:
+ case XkbSA_LockControls:
+ act->ctrls.flags = wire.actionData[0];
+ act->ctrls.ctrls3 = wire.actionData[1];
+ act->ctrls.ctrls2 = wire.actionData[2];
+ act->ctrls.ctrls1 = wire.actionData[3];
+ act->ctrls.ctrls0 = wire.actionData[4];
+ break;
+ case XkbSA_RedirectKey:
+ act->redirect.new_key = wire.actionData[0];
+ act->redirect.mods_mask = wire.actionData[1];
+ act->redirect.mods = wire.actionData[2];
+ act->redirect.vmods_mask0 = wire.actionData[3];
+ act->redirect.vmods_mask1 = wire.actionData[4];
+ act->redirect.vmods0 = wire.actionData[4];
+ act->redirect.vmods1 = wire.actionData[5];
+ break;
+ case XkbSA_DeviceValuator:
+ act->devval.device = wire.actionData[0];
+ act->devval.v1_what = wire.actionData[1];
+ act->devval.v1_ndx = wire.actionData[2];
+ act->devval.v1_value = wire.actionData[3];
+ act->devval.v2_what = wire.actionData[4];
+ act->devval.v2_ndx = wire.actionData[5];
+ act->devval.v2_what = wire.actionData[6];
+ break;
+ case XkbSA_XFree86Private:
+ case XkbSA_Terminate:
+ /* no args, kinda (note: untrue for xfree86). */
+ break;
+ case XkbSA_ActionMessage:
+ /* unsupported. */
+ break;
+ }
}
if ((num_si>0)&&(changes)) {
changes->compat.first_si= 0;
commit 699824a35791735b4b4378adf8648e3aaa599ace
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Jul 18 16:41:29 2008 +0300
XKB: Remove descriptions from maprules
We don't use them, as they're not up to the task. We'll get a better
solution someday, promise.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/include/xkbrules.h b/include/xkbrules.h
index 0a15de2..0f3f934 100644
--- a/include/xkbrules.h
+++ b/include/xkbrules.h
@@ -44,17 +44,6 @@ typedef struct _XkbRF_VarDefs {
char * options;
} XkbRF_VarDefsRec,*XkbRF_VarDefsPtr;
-typedef struct _XkbRF_VarDesc {
- char * name;
- char * desc;
-} XkbRF_VarDescRec, *XkbRF_VarDescPtr;
-
-typedef struct _XkbRF_DescribeVars {
- int sz_desc;
- int num_desc;
- XkbRF_VarDescPtr desc;
-} XkbRF_DescribeVarsRec,*XkbRF_DescribeVarsPtr;
-
typedef struct _XkbRF_Rule {
int number;
int layout_num;
@@ -85,11 +74,6 @@ typedef struct _XkbRF_Group {
#define XkbRF_Invalid (1L<<5)
typedef struct _XkbRF_Rules {
- XkbRF_DescribeVarsRec models;
- XkbRF_DescribeVarsRec layouts;
- XkbRF_DescribeVarsRec variants;
- XkbRF_DescribeVarsRec options;
-
unsigned short sz_rules;
unsigned short num_rules;
XkbRF_RulePtr rules;
@@ -111,12 +95,6 @@ extern _X_EXPORT Bool XkbRF_GetComponents(
struct _XkbComponentNames * /* names */
);
-extern _X_EXPORT XkbRF_RulePtr XkbRF_AddRule(
- XkbRF_RulesPtr /* rules */
-);
-
-extern _X_EXPORT XkbRF_GroupPtr XkbRF_AddGroup(XkbRF_RulesPtr rules);
-
extern _X_EXPORT Bool XkbRF_LoadRules(
FILE * /* file */,
XkbRF_RulesPtr /* rules */
@@ -130,43 +108,13 @@ extern _X_EXPORT Bool XkbRF_LoadRulesByName(
/***====================================================================***/
-extern _X_EXPORT XkbRF_VarDescPtr XkbRF_AddVarDesc(
- XkbRF_DescribeVarsPtr /* vars */
-);
-
-extern _X_EXPORT XkbRF_VarDescPtr XkbRF_AddVarDescCopy(
- XkbRF_DescribeVarsPtr /* vars */,
- XkbRF_VarDescPtr /* copy_from */
-);
-
-extern _X_EXPORT Bool XkbRF_LoadDescriptions(
- FILE * /* file */,
- XkbRF_RulesPtr /* rules */
-);
-
-extern _X_EXPORT Bool XkbRF_LoadDescriptionsByName(
- char * /* base */,
- char * /* locale */,
- XkbRF_RulesPtr /* rules */
-);
-
-extern _X_EXPORT XkbRF_RulesPtr XkbRF_Load(
- char * /* base */,
- char * /* locale */,
- Bool /* wantDesc */,
- Bool /* wantRules */
-);
-
extern _X_EXPORT XkbRF_RulesPtr XkbRF_Create(void);
-/***====================================================================***/
-
extern _X_EXPORT void XkbRF_Free(
XkbRF_RulesPtr /* rules */,
Bool /* freeRules */
);
-
/***====================================================================***/
#define _XKB_RF_NAMES_PROP_ATOM "_XKB_RULES_NAMES"
diff --git a/xkb/maprules.c b/xkb/maprules.c
index 61c7f86..a0141a3 100644
--- a/xkb/maprules.c
+++ b/xkb/maprules.c
@@ -52,6 +52,8 @@
/***====================================================================***/
+
+
#define DFLT_LINE_SIZE 128
typedef struct {
@@ -856,7 +858,7 @@ XkbRF_GetComponents( XkbRF_RulesPtr rules,
names->compat && names->geometry);
}
-XkbRF_RulePtr
+static XkbRF_RulePtr
XkbRF_AddRule(XkbRF_RulesPtr rules)
{
if (rules->sz_rules<1) {
@@ -878,7 +880,7 @@ XkbRF_AddRule(XkbRF_RulesPtr rules)
return &rules->rules[rules->num_rules++];
}
-XkbRF_GroupPtr
+static XkbRF_GroupPtr
XkbRF_AddGroup(XkbRF_RulesPtr rules)
{
if (rules->sz_groups<1) {
@@ -967,185 +969,6 @@ Bool ok;
/***====================================================================***/
-#define HEAD_NONE 0
-#define HEAD_MODEL 1
-#define HEAD_LAYOUT 2
-#define HEAD_VARIANT 3
-#define HEAD_OPTION 4
-#define HEAD_EXTRA 5
-
-XkbRF_VarDescPtr
-XkbRF_AddVarDesc(XkbRF_DescribeVarsPtr vars)
-{
- if (vars->sz_desc<1) {
- vars->sz_desc= 16;
- vars->num_desc= 0;
- vars->desc= _XkbTypedCalloc(vars->sz_desc,XkbRF_VarDescRec);
- }
- else if (vars->num_desc>=vars->sz_desc) {
- vars->sz_desc*= 2;
- vars->desc= _XkbTypedRealloc(vars->desc,vars->sz_desc,XkbRF_VarDescRec);
- }
- if (!vars->desc) {
- vars->sz_desc= vars->num_desc= 0;
- DebugF("Allocation failure in XkbRF_AddVarDesc\n");
- return NULL;
- }
- vars->desc[vars->num_desc].name= NULL;
- vars->desc[vars->num_desc].desc= NULL;
- return &vars->desc[vars->num_desc++];
-}
-
-XkbRF_VarDescPtr
-XkbRF_AddVarDescCopy(XkbRF_DescribeVarsPtr vars,XkbRF_VarDescPtr from)
-{
-XkbRF_VarDescPtr nd;
-
- if ((nd=XkbRF_AddVarDesc(vars))!=NULL) {
- nd->name= _XkbDupString(from->name);
- nd->desc= _XkbDupString(from->desc);
- }
- return nd;
-}
-
-Bool
-XkbRF_LoadDescriptions(FILE *file,XkbRF_RulesPtr rules)
-{
-InputLine line;
-XkbRF_VarDescRec tmp;
-char *tok;
-int len,headingtype;
-
- bzero((char *)&tmp, sizeof(XkbRF_VarDescRec));
- headingtype = HEAD_NONE;
- InitInputLine(&line);
- for ( ; GetInputLine(file,&line,False); line.num_line= 0) {
- if (line.line[0]=='!') {
- tok = strtok(&(line.line[1]), " \t");
- if (strcasecmp(tok,"model") == 0)
- headingtype = HEAD_MODEL;
- else if (strcasecmp(tok,"layout") == 0)
- headingtype = HEAD_LAYOUT;
- else if (strcasecmp(tok,"variant") == 0)
- headingtype = HEAD_VARIANT;
- else if (strcasecmp(tok,"option") == 0)
- headingtype = HEAD_OPTION;
- else {
- ErrorF("Broken rules file: unknown type for line %s\n",
- line.line);
- ErrorF("Not parsing rules file further\n");
- XkbRF_Free(rules, False);
- FreeInputLine(&line);
- return False;
- }
- continue;
- }
-
- if (headingtype == HEAD_NONE) {
- DebugF("Must have a heading before first line of data\n");
- DebugF("Illegal line of data ignored\n");
- continue;
- }
-
- len = strlen(line.line);
- if ((tmp.name= strtok(line.line, " \t")) == NULL) {
- DebugF("Huh? No token on line\n");
- DebugF("Illegal line of data ignored\n");
- continue;
- }
- if (strlen(tmp.name) == len) {
- DebugF("No description found\n");
- DebugF("Illegal line of data ignored\n");
- continue;
- }
-
- tok = line.line + strlen(tmp.name) + 1;
- while ((*tok!='\n')&&isspace(*tok))
- tok++;
- if (*tok == '\0') {
- DebugF("No description found\n");
- DebugF("Illegal line of data ignored\n");
- continue;
- }
- tmp.desc= tok;
- switch (headingtype) {
- case HEAD_MODEL:
- XkbRF_AddVarDescCopy(&rules->models,&tmp);
- break;
- case HEAD_LAYOUT:
- XkbRF_AddVarDescCopy(&rules->layouts,&tmp);
- break;
- case HEAD_VARIANT:
- XkbRF_AddVarDescCopy(&rules->variants,&tmp);
- break;
- case HEAD_OPTION:
- XkbRF_AddVarDescCopy(&rules->options,&tmp);
- break;
- }
- }
- FreeInputLine(&line);
- if ((rules->models.num_desc==0) && (rules->layouts.num_desc==0) &&
- (rules->variants.num_desc==0) && (rules->options.num_desc==0))
- return False;
-
- return True;
-}
-
-Bool
-XkbRF_LoadDescriptionsByName(char *base,char *locale,XkbRF_RulesPtr rules)
-{
-FILE * file;
-char buf[PATH_MAX];
-Bool ok;
-
- if ((!base)||(!rules))
- return False;
- if (locale) {
- if (strlen(base)+strlen(locale)+6 > PATH_MAX)
- return False;
- sprintf(buf,"%s-%s.lst", base, locale);
- }
- else {
- if (strlen(base)+5 > PATH_MAX)
- return False;
- sprintf(buf,"%s.lst", base);
- }
-
- file= fopen(buf, "r");
- if ((!file)&&(locale)) { /* fallback if locale was specified */
- sprintf(buf,"%s.lst", base);
-
- file= fopen(buf, "r");
- }
- if (!file)
- return False;
- ok= XkbRF_LoadDescriptions(file,rules);
- fclose(file);
- return ok;
-}
-
-/***====================================================================***/
-
-XkbRF_RulesPtr
-XkbRF_Load(char *base,char *locale,Bool wantDesc,Bool wantRules)
-{
-XkbRF_RulesPtr rules;
-
- if ((!base)||((!wantDesc)&&(!wantRules)))
- return NULL;
- if ((rules=_XkbTypedCalloc(1,XkbRF_RulesRec))==NULL)
- return NULL;
- if (wantDesc&&(!XkbRF_LoadDescriptionsByName(base,locale,rules))) {
- XkbRF_Free(rules,True);
- return NULL;
- }
- if (wantRules&&(!XkbRF_LoadRulesByName(base,locale,rules))) {
- XkbRF_Free(rules,True);
- return NULL;
- }
- return rules;
-}
-
XkbRF_RulesPtr
XkbRF_Create(void)
{
@@ -1154,24 +977,6 @@ XkbRF_Create(void)
/***====================================================================***/
-static void
-XkbRF_ClearVarDescriptions(XkbRF_DescribeVarsPtr var)
-{
-register int i;
-
- for (i=0;i<var->num_desc;i++) {
- if (var->desc[i].name)
- _XkbFree(var->desc[i].name);
- if (var->desc[i].desc)
- _XkbFree(var->desc[i].desc);
- var->desc[i].name= var->desc[i].desc= NULL;
- }
- if (var->desc)
- _XkbFree(var->desc);
- var->desc= NULL;
- return;
-}
-
void
XkbRF_Free(XkbRF_RulesPtr rules,Bool freeRules)
{
@@ -1181,10 +986,6 @@ XkbRF_GroupPtr group;
if (!rules)
return;
- XkbRF_ClearVarDescriptions(&rules->models);
- XkbRF_ClearVarDescriptions(&rules->layouts);
- XkbRF_ClearVarDescriptions(&rules->variants);
- XkbRF_ClearVarDescriptions(&rules->options);
if (rules->rules) {
for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) {
if (rule->model) _XkbFree(rule->model);
commit 1ad80678d88525159e55bb814205fd4eaca060a3
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Jul 18 16:29:35 2008 +0300
XKB: Remove support for setting combined keymaps
We don't do full keymaps anymore. Deal.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/include/xkbfile.h b/include/xkbfile.h
index 346f213..a4b99ee 100644
--- a/include/xkbfile.h
+++ b/include/xkbfile.h
@@ -284,10 +284,6 @@ extern _X_EXPORT Bool XkbWriteXKBGeometry(
void * /* priv */
);
-extern _X_EXPORT void XkbEnsureSafeMapName(
- char * /* name */
-);
-
extern _X_EXPORT Bool XkbWriteXKBKeymapForNames(
FILE * /* file */,
XkbComponentNamesPtr /* names */,
diff --git a/include/xkbrules.h b/include/xkbrules.h
index 0001481..0a15de2 100644
--- a/include/xkbrules.h
+++ b/include/xkbrules.h
@@ -69,7 +69,6 @@ typedef struct _XkbRF_Rule {
char * types;
char * compat;
char * geometry;
- char * keymap;
unsigned flags;
} XkbRF_RuleRec,*XkbRF_RulePtr;
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index a28967c..b2b1736 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -962,13 +962,12 @@ extern Bool XkbCopyKeymap(
#include <X11/extensions/XKMformat.h>
#include "xkbrules.h"
-#define _XkbListKeymaps 0
-#define _XkbListKeycodes 1
-#define _XkbListTypes 2
-#define _XkbListCompat 3
-#define _XkbListSymbols 4
-#define _XkbListGeometry 5
-#define _XkbListNumComponents 6
+#define _XkbListKeycodes 0
+#define _XkbListTypes 1
+#define _XkbListCompat 2
+#define _XkbListSymbols 3
+#define _XkbListGeometry 4
+#define _XkbListNumComponents 5
typedef struct _XkbSrvListInfo {
int szPool;
diff --git a/include/xkbstr.h b/include/xkbstr.h
index 5eebe41..ba7debb 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -527,7 +527,6 @@ typedef struct _XkbChanges {
* database.
*/
typedef struct _XkbComponentNames {
- char * keymap;
char * keycodes;
char * types;
char * compat;
diff --git a/xkb/ddxList.c b/xkb/ddxList.c
index da2f9a8..3ff3d81 100644
--- a/xkb/ddxList.c
+++ b/xkb/ddxList.c
@@ -61,7 +61,7 @@ extern int Win32System(const char *cmdline);
/***====================================================================***/
static char *componentDirs[_XkbListNumComponents] = {
- "keymap", "keycodes", "types", "compat", "symbols", "geometry"
+ "keycodes", "types", "compat", "symbols", "geometry"
};
/***====================================================================***/
@@ -280,9 +280,7 @@ XkbDDXList(DeviceIntPtr dev,XkbSrvListInfoPtr list,ClientPtr client)
{
Status status;
- status= XkbDDXListComponent(dev,_XkbListKeymaps,list,client);
- if (status==Success)
- status= XkbDDXListComponent(dev,_XkbListKeycodes,list,client);
+ status= XkbDDXListComponent(dev,_XkbListKeycodes,list,client);
if (status==Success)
status= XkbDDXListComponent(dev,_XkbListTypes,list,client);
if (status==Success)
diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index 8d7f837..6954dd1 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -177,7 +177,7 @@ OutputDirectory(
}
}
-static Bool
+static Bool
XkbDDXCompileKeymapByNames( XkbDescPtr xkb,
XkbComponentNamesPtr names,
unsigned want,
@@ -204,7 +204,6 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb,
snprintf(keymap, sizeof(keymap), "server-%s", display);
- XkbEnsureSafeMapName(keymap);
OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
#ifdef WIN32
diff --git a/xkb/maprules.c b/xkb/maprules.c
index 6dfcc99..61c7f86 100644
--- a/xkb/maprules.c
+++ b/xkb/maprules.c
@@ -193,15 +193,14 @@ Bool endOfFile,spacePending,slashPending,inComment;
#define TYPES 6
#define COMPAT 7
#define GEOMETRY 8
-#define KEYMAP 9
-#define MAX_WORDS 10
+#define MAX_WORDS 9
#define PART_MASK 0x000F
#define COMPONENT_MASK 0x03F0
static char * cname[MAX_WORDS] = {
"model", "layout", "variant", "option",
- "keycodes", "symbols", "types", "compat", "geometry", "keymap"
+ "keycodes", "symbols", "types", "compat", "geometry"
};
typedef struct _RemapSpec {
@@ -336,13 +335,6 @@ Bool found;
remap->num_remap= 0;
return;
}
- if (((present&COMPONENT_MASK)&(1<<KEYMAP))&&
- ((present&COMPONENT_MASK)!=(1<<KEYMAP))) {
- DebugF("Keymap cannot appear with other components\n");
- DebugF("Illegal mapping ignored\n");
- remap->num_remap= 0;
- return;
- }
remap->number++;
return;
}
@@ -459,7 +451,6 @@ Bool append = False;
rule->types= _XkbDupString(tmp.name[TYPES]);
rule->compat= _XkbDupString(tmp.name[COMPAT]);
rule->geometry= _XkbDupString(tmp.name[GEOMETRY]);
- rule->keymap= NULL;
rule->layout_num = rule->variant_num = 0;
for (i = 0; i < nread; i++) {
@@ -859,12 +850,10 @@ XkbRF_GetComponents( XkbRF_RulesPtr rules,
names->compat= XkbRF_SubstituteVars(names->compat, &mdefs);
if (names->geometry)
names->geometry= XkbRF_SubstituteVars(names->geometry, &mdefs);
- if (names->keymap)
- names->keymap= XkbRF_SubstituteVars(names->keymap, &mdefs);
FreeMultiDefs(&mdefs);
return (names->keycodes && names->symbols && names->types &&
- names->compat && names->geometry ) || names->keymap;
+ names->compat && names->geometry);
}
XkbRF_RulePtr
@@ -1045,6 +1034,7 @@ int len,headingtype;
ErrorF("Broken rules file: unknown type for line %s\n",
line.line);
ErrorF("Not parsing rules file further\n");
+ XkbRF_Free(rules, False);
FreeInputLine(&line);
return False;
}
diff --git a/xkb/xkb.c b/xkb/xkb.c
index d986b28..b99b261 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5492,7 +5492,6 @@ ProcXkbListComponents(ClientPtr client)
str= (unsigned char *)&stuff[1];
bzero(&list,sizeof(XkbSrvListInfoRec));
list.maxRtrn= stuff->maxNames;
- list.pattern[_XkbListKeymaps]= GetComponentSpec(&str,False,&status);
list.pattern[_XkbListKeycodes]= GetComponentSpec(&str,False,&status);
list.pattern[_XkbListTypes]= GetComponentSpec(&str,False,&status);
list.pattern[_XkbListCompat]= GetComponentSpec(&str,False,&status);
@@ -5515,7 +5514,7 @@ ProcXkbListComponents(ClientPtr client)
rep.deviceID = dev->id;
rep.sequenceNumber = client->sequence;
rep.length = XkbPaddedSize(list.nPool)/4;
- rep.nKeymaps = list.nFound[_XkbListKeymaps];
+ rep.nKeymaps = 0;
rep.nKeycodes = list.nFound[_XkbListKeycodes];
rep.nTypes = list.nFound[_XkbListTypes];
rep.nCompatMaps = list.nFound[_XkbListCompat];
@@ -5581,7 +5580,8 @@ ProcXkbGetKbdByName(ClientPtr client)
xkb = dev->key->xkbInfo->desc;
status= Success;
str= (unsigned char *)&stuff[1];
- names.keymap= GetComponentSpec(&str,True,&status);
+ if (GetComponentSpec(&str,True,&status)) /* keymap, unsupported */
+ return BadMatch;
names.keycodes= GetComponentSpec(&str,True,&status);
names.types= GetComponentSpec(&str,True,&status);
names.compat= GetComponentSpec(&str,True,&status);
@@ -5873,7 +5873,6 @@ ProcXkbGetKbdByName(ClientPtr client)
XkbFreeKeyboard(new,XkbAllComponentsMask,True);
new= NULL;
}
- if (names.keymap) { _XkbFree(names.keymap); names.keymap= NULL; }
if (names.keycodes) { _XkbFree(names.keycodes); names.keycodes= NULL; }
if (names.types) { _XkbFree(names.types); names.types= NULL; }
if (names.compat) { _XkbFree(names.compat); names.compat= NULL; }
diff --git a/xkb/xkbfmisc.c b/xkb/xkbfmisc.c
index dd403ea..349c79a 100644
--- a/xkb/xkbfmisc.c
+++ b/xkb/xkbfmisc.c
@@ -170,7 +170,7 @@ int multi_section;
unsigned wantNames,wantConfig,wantDflts;
complete= 0;
- if ((name=names->keymap)==NULL) name= "default";
+ name= "default";
if (COMPLETE(names->keycodes)) complete|= XkmKeyNamesMask;
if (COMPLETE(names->types)) complete|= XkmTypesMask;
if (COMPLETE(names->compat)) complete|= XkmCompatMapMask;
@@ -412,29 +412,6 @@ unsigned rtrn;
return rtrn;
}
-/* all latin-1 alphanumerics, plus parens, slash, minus, underscore and */
-/* wildcards */
-
-static unsigned char componentSpecLegal[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0x83,
- 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff
-};
-
-void
-XkbEnsureSafeMapName(char *name)
-{
- if (name==NULL)
- return;
- while (*name!='\0') {
- if ((componentSpecLegal[(*name)/8]&(1<<((*name)%8)))==0)
- *name= '_';
- name++;
- }
- return;
-}
-
/***====================================================================***/
#define UNMATCHABLE(c) (((c)=='(')||((c)==')')||((c)=='/'))
commit 133e0bd6f1cc147a2ddbbe1519d10300e7dbe669
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Jul 18 16:27:57 2008 +0300
XKB: Remove 'extra' functionality from rules parsing
When we find something weird in the rules, don't stash it as an extra
freeform component, just state that the rules file is likely broken and
move on with our lives.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/include/xkbrules.h b/include/xkbrules.h
index e8917f0..0001481 100644
--- a/include/xkbrules.h
+++ b/include/xkbrules.h
@@ -42,10 +42,6 @@ typedef struct _XkbRF_VarDefs {
char * layout;
char * variant;
char * options;
- unsigned short sz_extra;
- unsigned short num_extra;
- char * extra_names;
- char ** extra_values;
} XkbRF_VarDefsRec,*XkbRF_VarDefsPtr;
typedef struct _XkbRF_VarDesc {
@@ -94,10 +90,6 @@ typedef struct _XkbRF_Rules {
XkbRF_DescribeVarsRec layouts;
XkbRF_DescribeVarsRec variants;
XkbRF_DescribeVarsRec options;
- unsigned short sz_extra;
- unsigned short num_extra;
- char ** extra_names;
- XkbRF_DescribeVarsPtr extra;
unsigned short sz_rules;
unsigned short num_rules;
@@ -148,11 +140,6 @@ extern _X_EXPORT XkbRF_VarDescPtr XkbRF_AddVarDescCopy(
XkbRF_VarDescPtr /* copy_from */
);
-extern _X_EXPORT XkbRF_DescribeVarsPtr XkbRF_AddVarToDescribe(
- XkbRF_RulesPtr /* rules */,
- char * /* name */
-);
-
extern _X_EXPORT Bool XkbRF_LoadDescriptions(
FILE * /* file */,
XkbRF_RulesPtr /* rules */
@@ -171,10 +158,7 @@ extern _X_EXPORT XkbRF_RulesPtr XkbRF_Load(
Bool /* wantRules */
);
-extern _X_EXPORT XkbRF_RulesPtr XkbRF_Create(
- int /* sz_rules */,
- int /* sz_extra */
-);
+extern _X_EXPORT XkbRF_RulesPtr XkbRF_Create(void);
/***====================================================================***/
diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index c24b2cc..8d7f837 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -404,7 +404,7 @@ XkbRF_RulesPtr rules;
return False;
}
- rules = XkbRF_Create(0, 0);
+ rules = XkbRF_Create();
if (!rules) {
LogMessage(X_ERROR, "XKB: Couldn't create rules struct\n");
fclose(file);
diff --git a/xkb/maprules.c b/xkb/maprules.c
index b56055f..6dfcc99 100644
--- a/xkb/maprules.c
+++ b/xkb/maprules.c
@@ -1019,41 +1019,13 @@ XkbRF_VarDescPtr nd;
return nd;
}
-XkbRF_DescribeVarsPtr
-XkbRF_AddVarToDescribe(XkbRF_RulesPtr rules,char *name)
-{
- if (rules->sz_extra<1) {
- rules->num_extra= 0;
- rules->sz_extra= 1;
- rules->extra_names= _XkbTypedCalloc(rules->sz_extra,char *);
- rules->extra= _XkbTypedCalloc(rules->sz_extra, XkbRF_DescribeVarsRec);
- }
- else if (rules->num_extra>=rules->sz_extra) {
- rules->sz_extra*= 2;
- rules->extra_names= _XkbTypedRealloc(rules->extra_names,rules->sz_extra,
- char *);
- rules->extra=_XkbTypedRealloc(rules->extra, rules->sz_extra,
- XkbRF_DescribeVarsRec);
- }
- if ((!rules->extra_names)||(!rules->extra)) {
- DebugF("allocation error in extra parts\n");
- rules->sz_extra= rules->num_extra= 0;
- rules->extra_names= NULL;
- rules->extra= NULL;
- return NULL;
- }
- rules->extra_names[rules->num_extra]= _XkbDupString(name);
- bzero(&rules->extra[rules->num_extra],sizeof(XkbRF_DescribeVarsRec));
- return &rules->extra[rules->num_extra++];
-}
-
Bool
XkbRF_LoadDescriptions(FILE *file,XkbRF_RulesPtr rules)
{
InputLine line;
XkbRF_VarDescRec tmp;
char *tok;
-int len,headingtype,extra_ndx = 0;
+int len,headingtype;
bzero((char *)&tmp, sizeof(XkbRF_VarDescRec));
headingtype = HEAD_NONE;
@@ -1069,23 +1041,13 @@ int len,headingtype,extra_ndx = 0;
headingtype = HEAD_VARIANT;
else if (strcasecmp(tok,"option") == 0)
headingtype = HEAD_OPTION;
- else {
- int i;
- headingtype = HEAD_EXTRA;
- extra_ndx= -1;
- for (i=0;(i<rules->num_extra)&&(extra_ndx<0);i++) {
- if (!strcasecmp(tok,rules->extra_names[i]))
- extra_ndx= i;
- }
- if (extra_ndx<0) {
- XkbRF_DescribeVarsPtr var;
- DebugF("Extra heading \"%s\" encountered\n",tok);
- var= XkbRF_AddVarToDescribe(rules,tok);
- if (var)
- extra_ndx= var-rules->extra;
- else headingtype= HEAD_NONE;
- }
- }
+ else {
+ ErrorF("Broken rules file: unknown type for line %s\n",
+ line.line);
+ ErrorF("Not parsing rules file further\n");
+ FreeInputLine(&line);
+ return False;
+ }
continue;
}
@@ -1129,17 +1091,13 @@ int len,headingtype,extra_ndx = 0;
case HEAD_OPTION:
XkbRF_AddVarDescCopy(&rules->options,&tmp);
break;
- case HEAD_EXTRA:
- XkbRF_AddVarDescCopy(&rules->extra[extra_ndx],&tmp);
- break;
}
}
FreeInputLine(&line);
if ((rules->models.num_desc==0) && (rules->layouts.num_desc==0) &&
- (rules->variants.num_desc==0) && (rules->options.num_desc==0) &&
- (rules->num_extra==0)) {
+ (rules->variants.num_desc==0) && (rules->options.num_desc==0))
return False;
- }
+
return True;
}
@@ -1199,31 +1157,9 @@ XkbRF_RulesPtr rules;
}
XkbRF_RulesPtr
-XkbRF_Create(int szRules,int szExtra)
+XkbRF_Create(void)
{
-XkbRF_RulesPtr rules;
-
- if ((rules=_XkbTypedCalloc(1,XkbRF_RulesRec))==NULL)
- return NULL;
- if (szRules>0) {
- rules->sz_rules= szRules;
- rules->rules= _XkbTypedCalloc(rules->sz_rules,XkbRF_RuleRec);
- if (!rules->rules) {
- _XkbFree(rules);
- return NULL;
- }
- }
- if (szExtra>0) {
- rules->sz_extra= szExtra;
- rules->extra= _XkbTypedCalloc(rules->sz_extra,XkbRF_DescribeVarsRec);
- if (!rules->extra) {
- if (rules->rules)
- _XkbFree(rules->rules);
- _XkbFree(rules);
- return NULL;
- }
- }
- return rules;
+ return _XkbTypedCalloc(1, XkbRF_RulesRec);
}
/***====================================================================***/
@@ -1259,14 +1195,6 @@ XkbRF_GroupPtr group;
XkbRF_ClearVarDescriptions(&rules->layouts);
XkbRF_ClearVarDescriptions(&rules->variants);
XkbRF_ClearVarDescriptions(&rules->options);
- if (rules->extra) {
- for (i = 0; i < rules->num_extra; i++) {
- XkbRF_ClearVarDescriptions(&rules->extra[i]);
- }
- _XkbFree(rules->extra);
- rules->num_extra= rules->sz_extra= 0;
- rules->extra= NULL;
- }
if (rules->rules) {
for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) {
if (rule->model) _XkbFree(rule->model);
commit cc5c6d628aa0dc87c2cc9d063972e09ad747a596
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Apr 25 18:45:37 2008 +0300
XKB: Remove unsupported Xi operation flags
We support every XKB operation on Xi devices, so always report that we
support everything, and that nothing is ever unsupported.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/xkb/xkb.c b/xkb/xkb.c
index f818a72..d986b28 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5964,10 +5964,8 @@ Bool classOk;
}
}
if (nFBs>0) {
- if (rep->supported&XkbXI_IndicatorsMask) {
- rep->nDeviceLedFBs= nFBs;
- rep->length+= (length/4);
- }
+ rep->nDeviceLedFBs= nFBs;
+ rep->length+= (length/4);
return Success;
}
if (classOk) client->errorValue= _XkbErrCode2(XkbErr_BadId,id);
@@ -6091,7 +6089,7 @@ xkbGetDeviceInfoReply rep;
int status,nDeviceLedFBs;
unsigned length,nameLen;
CARD16 ledClass,ledID;
-unsigned wanted,supported;
+unsigned wanted;
char * str;
REQUEST(xkbGetDeviceInfoReq);
@@ -6182,7 +6180,6 @@ char * str;
return status;
}
length= rep.length*4;
- supported= rep.supported;
nDeviceLedFBs = rep.nDeviceLedFBs;
if (client->swapped) {
register int n;
@@ -6222,19 +6219,6 @@ char * str;
ErrorF("[xkb] Wrote %d fewer bytes than expected\n",length);
return BadLength;
}
- if (stuff->wanted&(~supported)) {
- xkbExtensionDeviceNotify ed;
- bzero((char *)&ed,SIZEOF(xkbExtensionDeviceNotify));
- ed.ledClass= ledClass;
- ed.ledID= ledID;
- ed.ledsDefined= 0;
- ed.ledState= 0;
- ed.firstBtn= ed.nBtns= 0;
- ed.reason= XkbXI_UnsupportedFeatureMask;
- ed.supported= supported;
- ed.unsupported= stuff->wanted&(~supported);
- XkbSendExtensionDeviceNotify(dev,client,&ed);
- }
return client->noClientException;
}
diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index 96e527b..ed80b04 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -667,7 +667,7 @@ int initialized;
XkbInterestPtr interest;
Time time = 0;
CARD32 defined, state;
-CARD16 reason, supported = 0;
+CARD16 reason;
interest = dev->xkb_interest;
if (!interest)
@@ -688,7 +688,6 @@ CARD16 reason, supported = 0;
pEv->deviceID = dev->id;
pEv->sequenceNumber = interest->client->sequence;
pEv->time = time = GetTimeInMillis();
- supported= pEv->supported;
initialized= 1;
}
else {
@@ -697,14 +696,7 @@ CARD16 reason, supported = 0;
pEv->ledsDefined= defined;
pEv->ledState= state;
pEv->reason= reason;
- pEv->supported= supported;
- }
- if (client!=interest->client) {
- /* only report UnsupportedFeature to the client that */
- /* issued the failing request */
- pEv->reason&= ~XkbXI_UnsupportedFeatureMask;
- if ((interest->extDevNotifyMask&reason)==0)
- continue;
+ pEv->supported= XkbXI_AllFeaturesMask;
}
if ( interest->client->swapped ) {
register int n;
diff --git a/xkb/xkbLEDs.c b/xkb/xkbLEDs.c
index 68ab5ff..c61296b 100644
--- a/xkb/xkbLEDs.c
+++ b/xkb/xkbLEDs.c
@@ -283,7 +283,7 @@ unsigned oldState;
ed->ledID= sli->id;
ed->ledsDefined= sli->namesPresent|sli->mapsPresent;
ed->ledState= sli->effectiveState;
- ed->unsupported|= XkbXI_IndicatorStateMask;
+ ed->unsupported= 0;
ed->supported= XkbXI_AllFeaturesMask;
if (changes!=&my_changes) changes= NULL;
@@ -875,7 +875,7 @@ xkbExtensionDeviceNotify my_ed;
ed->ledID= sli->id;
ed->ledsDefined= sli->namesPresent|sli->mapsPresent;
ed->ledState= sli->effectiveState;
- ed->unsupported|= XkbXI_IndicatorMapsMask;
+ ed->unsupported= 0;
ed->supported= XkbXI_AllFeaturesMask;
XkbUpdateLedAutoState(dev,sli,changed_maps,ed,changes,cause);
@@ -956,7 +956,7 @@ Bool kb_changed;
ed->ledID= sli->id;
ed->ledsDefined= sli->namesPresent|sli->mapsPresent;
ed->ledState= sli->effectiveState;
- ed->unsupported|= XkbXI_IndicatorStateMask;
+ ed->unsupported= 0;
ed->supported= XkbXI_AllFeaturesMask;
}
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index f84e892..d03195f 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -711,8 +711,7 @@ unsigned char grp;
if (!state || !ctrls)
return;
- state->mods= (state->base_mods|state->latched_mods);
- state->mods|= state->locked_mods;
+ state->mods= (state->base_mods|state->latched_mods|state->locked_mods);
state->lookup_mods= state->mods&(~ctrls->internal.mask);
state->grab_mods= state->lookup_mods&(~ctrls->ignore_lock.mask);
state->grab_mods|=
commit 32db27a7f867b503c2840ca7b815e96d10be9210
Author: Daniel Stone <daniel at fooishbar.org>
Date: Thu Apr 17 12:42:01 2008 -0700
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 <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 824972c..f06aed0 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 81e6608..ee08bed 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 1adaa78..1b6458f 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 bce886f..9a14044 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 55ff9f8..744b6ac 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 455513d..12ca8ab 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 740f661..fc3d940 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 7746484..6a9f493 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 2e38cf8..9b34a7a 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 35be521..022816d 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<<j;
- }
- XFreeModifiermap(modifier_keymap);
-
keySyms.minKeyCode = min_keycode;
keySyms.maxKeyCode = max_keycode;
keySyms.mapWidth = mapWidth;
@@ -189,8 +175,8 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
options = XKB_DFLT_OPTIONS;
XkbSetRulesDflts(rules, model, layout, variants, options);
- XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modmap,
- xnestBell, xnestChangeKeyboardControl);
+ XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms,
+ xnestBell, xnestChangeKeyboardControl);
XkbDDXChangeControls(pDev, xkb->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 21736d1..9e8da8b 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 f270431..41168f3 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 cdd68d5..76523aa 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 21750c9..f818a72 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 d85fbd4..bcee26c 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 8960bca..f84e892 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;
commit f062e90a95f9b7ae5458ef2100615e8ace9b66a7
Author: Daniel Stone <daniel at fooishbar.org>
Date: Wed Apr 16 19:15:30 2008 +0300
Input: Remove modifierKeyMap
Since modifierKeyMap is generated from modifierMap, just remove it, and
only generate it when we need to send the modifier map to the client.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 1b2c463..824972c 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -201,21 +201,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH);
- if (dk->maxKeysPerModifier)
- {
- mk->modifierKeyMap = xrealloc(mk->modifierKeyMap,
- 8 * dk->maxKeysPerModifier);
- if (!mk->modifierKeyMap)
- FatalError("[Xi] no memory for class shift.\n");
- memcpy(mk->modifierKeyMap, dk->modifierKeyMap,
- (8 * dk->maxKeysPerModifier));
- } else
- {
- xfree(mk->modifierKeyMap);
- mk->modifierKeyMap = NULL;
- }
-
- mk->maxKeysPerModifier = dk->maxKeysPerModifier;
mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode;
mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
@@ -498,7 +483,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
if (from->key)
{
- KeyCode *oldModKeyMap;
KeySym *oldMap;
struct _XkbSrvInfo *oldXkbInfo;
if (!to->key)
@@ -515,7 +499,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
classes->key = NULL;
}
- oldModKeyMap = to->key->modifierKeyMap;
oldMap = to->key->curKeySyms.map;
oldXkbInfo = to->key->xkbInfo;
@@ -528,7 +511,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
memcpy(oldMap, from->key->curKeySyms.map, bytes);
}
- to->key->modifierKeyMap = oldModKeyMap;
to->key->curKeySyms.map = oldMap;
to->key->xkbInfo = oldXkbInfo;
@@ -1664,86 +1646,6 @@ SetButtonMapping(ClientPtr client, DeviceIntPtr dev, int nElts, BYTE * map)
return Success;
}
-int
-SetModifierMapping(ClientPtr client, DeviceIntPtr dev, int len, int rlen,
- int numKeyPerModifier, KeyCode * inputMap, KeyClassPtr * k)
-{
- KeyCode *map = NULL;
- int inputMapLen;
- int i;
-
- *k = dev->key;
- if (*k == NULL)
- return BadMatch;
- if (len != ((numKeyPerModifier << 1) + rlen))
- return BadLength;
-
- inputMapLen = 8 * numKeyPerModifier;
-
- /*
- * Now enforce the restriction that "all of the non-zero keycodes must be
- * in the range specified by min-keycode and max-keycode in the
- * connection setup (else a Value error)"
- */
- i = inputMapLen;
- while (i--) {
- if (inputMap[i]
- && (inputMap[i] < (*k)->curKeySyms.minKeyCode
- || inputMap[i] > (*k)->curKeySyms.maxKeyCode)) {
- client->errorValue = inputMap[i];
- return -1; /* BadValue collides with MappingFailed */
- }
- }
-
- /*
- * Now enforce the restriction that none of the old or new
- * modifier keys may be down while we change the mapping, and
- * that the DDX layer likes the choice.
- */
- if (!AllModifierKeysAreUp(dev, (*k)->modifierKeyMap,
- (int)(*k)->maxKeysPerModifier, inputMap,
- (int)numKeyPerModifier)
- || !AllModifierKeysAreUp(dev, inputMap, (int)numKeyPerModifier,
- (*k)->modifierKeyMap,
- (int)(*k)->maxKeysPerModifier)) {
- return MappingBusy;
- } else {
- for (i = 0; i < inputMapLen; i++) {
- if (inputMap[i] && !LegalModifier(inputMap[i], dev)) {
- return MappingFailed;
- }
- }
- }
-
- /*
- * Now build the keyboard's modifier bitmap from the
- * list of keycodes.
- */
- if (inputMapLen) {
- map = (KeyCode *) xalloc(inputMapLen);
- if (!map)
- return BadAlloc;
- }
- if ((*k)->modifierKeyMap)
- xfree((*k)->modifierKeyMap);
- if (inputMapLen) {
- (*k)->modifierKeyMap = map;
- memmove((char *)(*k)->modifierKeyMap, (char *)inputMap, inputMapLen);
- } else
- (*k)->modifierKeyMap = NULL;
-
- (*k)->maxKeysPerModifier = numKeyPerModifier;
- for (i = 0; i < MAP_LENGTH; i++)
- (*k)->modifierMap[i] = 0;
- for (i = 0; i < inputMapLen; i++)
- if (inputMap[i]) {
- (*k)->modifierMap[inputMap[i]]
- |= (1 << (i / (*k)->maxKeysPerModifier));
- }
-
- return (MappingSuccess);
-}
-
void
SendDeviceMappingNotify(ClientPtr client, CARD8 request,
KeyCode firstKeyCode, CARD8 count, DeviceIntPtr dev)
diff --git a/Xi/getmmap.c b/Xi/getmmap.c
index 0ae2ccc..ddf27a5 100644
--- a/Xi/getmmap.c
+++ b/Xi/getmmap.c
@@ -87,36 +87,34 @@ SProcXGetDeviceModifierMapping(ClientPtr client)
int
ProcXGetDeviceModifierMapping(ClientPtr client)
{
- CARD8 maxkeys;
DeviceIntPtr dev;
xGetDeviceModifierMappingReply rep;
- KeyClassPtr kp;
- int rc;
+ KeyCode *modkeymap = NULL;
+ int ret, max_keys_per_mod;
REQUEST(xGetDeviceModifierMappingReq);
REQUEST_SIZE_MATCH(xGetDeviceModifierMappingReq);
- rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
+ ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
+ if (ret != Success)
+ return ret;
- kp = dev->key;
- if (kp == NULL)
- return BadMatch;
-
- maxkeys = kp->maxKeysPerModifier;
+ ret = generate_modkeymap(client, dev, &modkeymap, &max_keys_per_mod);
+ if (ret != Success)
+ return ret;
rep.repType = X_Reply;
rep.RepType = X_GetDeviceModifierMapping;
- rep.numKeyPerModifier = maxkeys;
+ rep.numKeyPerModifier = max_keys_per_mod;
rep.sequenceNumber = client->sequence;
/* length counts 4 byte quantities - there are 8 modifiers 1 byte big */
- rep.length = 2 * maxkeys;
+ rep.length = max_keys_per_mod << 1;
WriteReplyToClient(client, sizeof(xGetDeviceModifierMappingReply), &rep);
+ WriteToClient(client, max_keys_per_mod * 8, (char *) modkeymap);
+
+ xfree(modkeymap);
- /* Reply with the (modified by DDX) map that SetModifierMapping passed in */
- WriteToClient(client, 8 * maxkeys, (char *)kp->modifierKeyMap);
return Success;
}
diff --git a/Xi/setmmap.c b/Xi/setmmap.c
index ddfc1bd..8a0ab3e 100644
--- a/Xi/setmmap.c
+++ b/Xi/setmmap.c
@@ -91,33 +91,39 @@ ProcXSetDeviceModifierMapping(ClientPtr client)
int ret;
xSetDeviceModifierMappingReply rep;
DeviceIntPtr dev;
- KeyClassPtr kp;
REQUEST(xSetDeviceModifierMappingReq);
REQUEST_AT_LEAST_SIZE(xSetDeviceModifierMappingReq);
- ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
- if (ret != Success)
- return ret;
+ if (stuff->length != ((sizeof(xSetDeviceModifierMappingReq) >> 2) +
+ (stuff->numKeyPerModifier << 1)))
+ return BadLength;
rep.repType = X_Reply;
rep.RepType = X_SetDeviceModifierMapping;
rep.length = 0;
rep.sequenceNumber = client->sequence;
- ret = SetModifierMapping(client, dev, stuff->length,
- (sizeof(xSetDeviceModifierMappingReq) >> 2),
- stuff->numKeyPerModifier, (BYTE *) & stuff[1],
- &kp);
+ ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
+ if (ret != Success)
+ return ret;
+
+ ret = change_modmap(client, dev, (KeyCode *) &stuff[1],
+ stuff->numKeyPerModifier);
+ if (ret == Success)
+ ret = MappingSuccess;
if (ret == MappingSuccess || ret == MappingBusy || ret == MappingFailed) {
rep.success = ret;
- if (ret == MappingSuccess)
- SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev);
WriteReplyToClient(client, sizeof(xSetDeviceModifierMappingReply),
&rep);
- } else if (ret == -1)
- return BadValue;
+ }
+ else if (ret == -1) {
+ return BadValue;
+ }
+ else {
+ return ret;
+ }
return Success;
}
diff --git a/dix/Makefile.am b/dix/Makefile.am
index 4c2395d..34eeb6d 100644
--- a/dix/Makefile.am
+++ b/dix/Makefile.am
@@ -25,6 +25,7 @@ libdix_la_SOURCES = \
glyphcurs.c \
grabs.c \
initatoms.c \
+ inpututils.c \
main.c \
pixmap.c \
privates.c \
diff --git a/dix/devices.c b/dix/devices.c
index 6748e48..a4ff641 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -620,7 +620,6 @@ FreeDeviceClass(int type, pointer *class)
(*k)->xkbInfo = NULL;
}
xfree((*k)->curKeySyms.map);
- xfree((*k)->modifierKeyMap);
xfree((*k));
break;
}
@@ -1453,109 +1452,10 @@ BadDeviceMap(BYTE *buff, int length, unsigned low, unsigned high, XID *errval)
return FALSE;
}
-Bool
-AllModifierKeysAreUp(DeviceIntPtr dev, CARD8 *map1, int per1,
- CARD8 *map2, int per2)
-{
- int i, j, k;
- CARD8 *down = dev->key->down;
-
- for (i = 8; --i >= 0; map2 += per2)
- {
- for (j = per1; --j >= 0; map1++)
- {
- if (*map1 && BitIsOn(down, *map1))
- {
- for (k = per2; (--k >= 0) && (*map1 != map2[k]);)
- ;
- if (k < 0)
- return FALSE;
- }
- }
- }
- return TRUE;
-}
-
-static int
-DoSetModifierMapping(ClientPtr client, KeyCode *inputMap,
- int numKeyPerModifier, xSetModifierMappingReply *rep)
-{
- DeviceIntPtr pDev = NULL;
- DeviceIntPtr cp = PickKeyboard(client); /* ClientPointer keyboard */
- int rc, i = 0, inputMapLen = numKeyPerModifier * 8;
-
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
- if (pDev == cp || (!pDev->isMaster && (pDev->u.master == cp) && pDev->key)) {
- for (i = 0; i < inputMapLen; i++) {
- /* Check that all the new modifiers fall within the advertised
- * keycode range, and are okay with the DDX. */
- if (inputMap[i] && ((inputMap[i] < pDev->key->curKeySyms.minKeyCode ||
- inputMap[i] > pDev->key->curKeySyms.maxKeyCode) ||
- !LegalModifier(inputMap[i], pDev))) {
- client->errorValue = inputMap[i];
- return BadValue;
- }
- }
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
- if (rc != Success)
- return rc;
-
- /* None of the modifiers (old or new) may be down while we change
- * the map. */
- if (!AllModifierKeysAreUp(pDev, pDev->key->modifierKeyMap,
- pDev->key->maxKeysPerModifier,
- inputMap, numKeyPerModifier) ||
- !AllModifierKeysAreUp(pDev, inputMap, numKeyPerModifier,
- pDev->key->modifierKeyMap,
- pDev->key->maxKeysPerModifier)) {
- rep->success = MappingBusy;
- return Success;
- }
- }
- }
-
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
-
- if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
- bzero(pDev->key->modifierMap, MAP_LENGTH);
-
- /* Annoyingly, we lack a modifierKeyMap size, so we have to just free
- * and re-alloc it every time. */
- if (pDev->key->modifierKeyMap)
- xfree(pDev->key->modifierKeyMap);
-
- if (inputMapLen) {
- pDev->key->modifierKeyMap = (KeyCode *) xalloc(inputMapLen);
- if (!pDev->key->modifierKeyMap)
- return BadAlloc;
-
- memcpy(pDev->key->modifierKeyMap, inputMap, inputMapLen);
- pDev->key->maxKeysPerModifier = numKeyPerModifier;
-
- for (i = 0; i < inputMapLen; i++) {
- if (inputMap[i]) {
- pDev->key->modifierMap[inputMap[i]] |=
- (1 << (((unsigned int)i) / numKeyPerModifier));
- }
- }
- }
- else {
- pDev->key->modifierKeyMap = NULL;
- pDev->key->maxKeysPerModifier = 0;
- }
- }
- }
-
- rep->success = Success;
- return Success;
-}
-
int
ProcSetModifierMapping(ClientPtr client)
{
xSetModifierMappingReply rep;
- DeviceIntPtr dev;
int rc;
REQUEST(xSetModifierMappingReq);
REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq);
@@ -1568,14 +1468,16 @@ ProcSetModifierMapping(ClientPtr client)
rep.length = 0;
rep.sequenceNumber = client->sequence;
- rc = DoSetModifierMapping(client, (KeyCode *)&stuff[1],
- stuff->numKeyPerModifier, &rep);
- if (rc != Success)
+ rc = change_modmap(client, PickKeyboard(client), (KeyCode *)&stuff[1],
+ stuff->numKeyPerModifier);
+ if (rc == MappingFailed || rc == -1)
+ rc = BadValue;
+ if (rc != Success && rc != MappingSuccess && rc != MappingFailed &&
+ rc != MappingBusy)
return rc;
- for (dev = inputInfo.devices; dev; dev = dev->next)
- if (dev->key && dev->coreEvents)
- SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev);
+ rep.success = rc;
+
WriteReplyToClient(client, sizeof(xSetModifierMappingReply), &rep);
return client->noClientException;
}
@@ -1584,26 +1486,26 @@ int
ProcGetModifierMapping(ClientPtr client)
{
xGetModifierMappingReply rep;
- DeviceIntPtr dev = PickKeyboard(client);
- KeyClassPtr keyc = dev->key;
- int rc;
+ int ret, max_keys_per_mod = 0;
+ KeyCode *modkeymap = NULL;
REQUEST_SIZE_MATCH(xReq);
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
- if (rc != Success)
- return rc;
+ ret = generate_modkeymap(client, PickKeyboard(client), &modkeymap,
+ &max_keys_per_mod);
+ if (ret != Success)
+ return ret;
rep.type = X_Reply;
- rep.numKeyPerModifier = keyc->maxKeysPerModifier;
+ rep.numKeyPerModifier = max_keys_per_mod;
rep.sequenceNumber = client->sequence;
/* length counts 4 byte quantities - there are 8 modifiers 1 byte big */
- rep.length = keyc->maxKeysPerModifier << 1;
+ rep.length = max_keys_per_mod << 1;
WriteReplyToClient(client, sizeof(xGetModifierMappingReply), &rep);
+ (void)WriteToClient(client, max_keys_per_mod * 8, (char *) modkeymap);
+
+ xfree(modkeymap);
- /* Use the (modified by DDX) map that SetModifierMapping passed in */
- (void)WriteToClient(client, (int)(keyc->maxKeysPerModifier << 3),
- (char *)keyc->modifierKeyMap);
return client->noClientException;
}
diff --git a/dix/getevents.c b/dix/getevents.c
index 112bb10..81e6608 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -84,22 +84,35 @@ GetMotionHistorySize(void)
return MOTION_HISTORY_SIZE;
}
-static void
-set_key_down(DeviceIntPtr pDev, int key_code)
+void
+set_key_down(DeviceIntPtr pDev, int key_code, int type)
{
- pDev->key->postdown[key_code >> 3] |= (1 << (key_code & 7));
+ if (type == KEY_PROCESSED)
+ pDev->key->down[key_code >> 3] |= (1 << (key_code & 7));
+ else
+ pDev->key->postdown[key_code >> 3] |= (1 << (key_code & 7));
}
-static void
-set_key_up(DeviceIntPtr pDev, int key_code)
+void
+set_key_up(DeviceIntPtr pDev, int key_code, int type)
{
- pDev->key->postdown[key_code >> 3] &= ~(1 << (key_code & 7));
+ if (type == KEY_PROCESSED)
+ pDev->key->down[key_code >> 3] &= ~(1 << (key_code & 7));
+ else
+ pDev->key->postdown[key_code >> 3] &= ~(1 << (key_code & 7));
}
-static Bool
-key_is_down(DeviceIntPtr pDev, int key_code)
+Bool
+key_is_down(DeviceIntPtr pDev, int key_code, int type)
{
- return !!(pDev->key->postdown[key_code >> 3] & (1 << (key_code & 7)));
+ int ret = 0;
+
+ if (type & KEY_PROCESSED)
+ ret |= !!(pDev->key->down[key_code >> 3] & (1 << (key_code & 7)));
+ else if (type & KEY_POSTED)
+ ret |= !!(pDev->key->postdown[key_code >> 3] & (1 << (key_code & 7)));
+
+ return ret;
}
static Bool
@@ -787,8 +800,6 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
int num_valuators, int *valuators) {
int numEvents = 0;
CARD32 ms = 0;
- KeySym *map;
- KeySym sym;
deviceKeyButtonPointer *kbp = NULL;
if (!events ||!pDev->key || !pDev->focus || !pDev->kbdfeed ||
@@ -798,16 +809,12 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
numEvents = 1;
- map = pDev->key->curKeySyms.map;
- sym = map[(key_code - pDev->key->curKeySyms.minKeyCode)
- * pDev->key->curKeySyms.mapWidth];
-
events = updateFromMaster(events, pDev, &numEvents);
numEvents += countValuatorEvents(num_valuators);
/* Handle core repeating, via press/release/press/release. */
- if (type == KeyPress && key_is_down(pDev, key_code)) {
+ if (type == KeyPress && key_is_down(pDev, key_code, KEY_POSTED)) {
/* If autorepeating is disabled either globally or just for that key,
* or we have a modifier, don't generate a repeat event. */
if (!pDev->kbdfeed->ctrl.autoRepeat ||
@@ -824,11 +831,11 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
kbp->detail = key_code;
if (type == KeyPress) {
kbp->type = DeviceKeyPress;
- set_key_down(pDev, key_code);
+ set_key_down(pDev, key_code, KEY_POSTED);
}
else if (type == KeyRelease) {
kbp->type = DeviceKeyRelease;
- set_key_up(pDev, key_code);
+ set_key_up(pDev, key_code, KEY_POSTED);
}
events++;
diff --git a/dix/inpututils.c b/dix/inpututils.c
new file mode 100644
index 0000000..1adaa78
--- /dev/null
+++ b/dix/inpututils.c
@@ -0,0 +1,239 @@
+/*
+ * Copyright © 2008 Daniel Stone
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Daniel Stone <daniel at fooishbar.org>
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include "dix-config.h"
+#endif
+
+#include "exevents.h"
+#include "misc.h"
+#include "input.h"
+#include "inputstr.h"
+#include "xace.h"
+
+/* Check if a modifier map change is okay with the device.
+ * Returns -1 for BadValue, as it collides with MappingBusy; this particular
+ * caveat can be removed with LegalModifier, as we have no other reason to
+ * set MappingFailed. Sigh. */
+static int
+check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
+{
+ int ret, i;
+ KeySymsPtr syms;
+
+ ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
+ if (ret != Success)
+ return ret;
+
+ if (!dev->key)
+ return BadMatch;
+ syms = &dev->key->curKeySyms;
+
+ for (i = 0; i < MAP_LENGTH; i++) {
+ if (!modmap[i])
+ continue;
+
+ /* Check that all the new modifiers fall within the advertised
+ * keycode range. */
+ if (i < syms->minKeyCode || i > syms->maxKeyCode) {
+ client->errorValue = i;
+ return -1;
+ }
+
+ /* Make sure the mapping is okay with the DDX. */
+ if (!LegalModifier(i, dev)) {
+ client->errorValue = i;
+ return MappingFailed;
+ }
+
+ /* None of the new modifiers may be down while we change the
+ * map. */
+ if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
+ client->errorValue = i;
+ return MappingBusy;
+ }
+ }
+
+ /* 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])
+ continue;
+ if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
+ client->errorValue = i;
+ return MappingBusy;
+ }
+ }
+
+ return Success;
+}
+
+static int
+check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
+ DeviceIntPtr slave, CARD8 *modmap)
+{
+ KeySymsPtr master_syms, slave_syms;
+ int i, j;
+
+ if (!slave->key || !master->key)
+ return 0;
+
+ master_syms = &master->key->curKeySyms;
+ slave_syms = &slave->key->curKeySyms;
+
+ /* Ignore devices with a clearly different keymap. */
+ if (slave_syms->minKeyCode != master_syms->minKeyCode ||
+ slave_syms->maxKeyCode != master_syms->maxKeyCode)
+ return 0;
+
+ for (i = 0; i < MAP_LENGTH; i++) {
+ if (!modmap[i])
+ continue;
+
+ /* If we have different symbols for any modifier on an
+ * extended keyboard, ignore the whole remap request. */
+ for (j = 0; j < slave_syms->mapWidth && j < master_syms->mapWidth; j++)
+ if (slave_syms->map[modmap[i] * slave_syms->mapWidth + j] !=
+ master_syms->map[modmap[i] * master_syms->mapWidth + j])
+ return 0;
+ }
+
+ if (check_modmap_change(client, slave, modmap) != Success)
+ return 0;
+
+ return 1;
+}
+
+/* Actually change the modifier map, and send notifications. Cannot fail. */
+static void
+do_modmap_change(ClientPtr client, DeviceIntPtr dev, CARD8 *modmap)
+{
+ memcpy(dev->key->modifierMap, modmap, MAP_LENGTH);
+ SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev);
+}
+
+/* Rebuild modmap (key -> mod) from map (mod -> key). */
+static int build_modmap_from_modkeymap(CARD8 *modmap, KeyCode *modkeymap,
+ int max_keys_per_mod)
+{
+ int i, mod = 0, len = max_keys_per_mod * 8;
+
+ memset(modmap, 0, MAP_LENGTH);
+
+ for (i = 0; i < len; i++) {
+ if (!modkeymap[i])
+ continue;
+
+ if (modmap[modkeymap[i]])
+ return BadValue;
+
+ if (!(i % max_keys_per_mod))
+ mod++;
+ modmap[modkeymap[i]] = mod;
+ }
+
+ return Success;
+}
+
+int
+change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
+ int max_keys_per_mod)
+{
+ int ret;
+ CARD8 modmap[MAP_LENGTH];
+ DeviceIntPtr slave;
+
+ ret = build_modmap_from_modkeymap(modmap, modkeymap, max_keys_per_mod);
+ if (ret != Success)
+ return ret;
+
+ /* If we can't perform the change on the requested device, bail out. */
+ ret = check_modmap_change(client, dev, modmap);
+ if (ret != Success)
+ return ret;
+ do_modmap_change(client, dev, modmap);
+
+ /* If we're acting on a master, change the slaves as well. */
+ if (dev->isMaster) {
+ for (slave = inputInfo.devices; slave; slave = slave->next) {
+ if (slave != dev && !slave->isMaster && slave->u.master == dev)
+ if (check_modmap_change_slave(client, dev, slave, modmap))
+ do_modmap_change(client, slave, modmap);
+ }
+ }
+
+ return Success;
+}
+
+int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
+ KeyCode **modkeymap_out, int *max_keys_per_mod_out)
+{
+ CARD8 keys_per_mod[8];
+ int max_keys_per_mod;
+ KeyCode *modkeymap;
+ int i, j, ret;
+
+ ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
+ if (ret != Success)
+ return ret;
+
+ if (!dev->key)
+ return BadMatch;
+
+ /* Count the number of keys per modifier to determine how wide we
+ * should make the map. */
+ max_keys_per_mod = 0;
+ for (i = 0; i < 8; i++)
+ 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 (++keys_per_mod[j] > max_keys_per_mod)
+ max_keys_per_mod = keys_per_mod[j];
+ }
+ }
+ }
+
+ modkeymap = xcalloc(max_keys_per_mod * 8, sizeof(KeyCode));
+ if (!modkeymap)
+ return BadAlloc;
+
+ for (i = 0; i < 8; i++)
+ 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)) {
+ modkeymap[(j * max_keys_per_mod) + keys_per_mod[j]] = i;
+ keys_per_mod[j]++;
+ }
+ }
+ }
+
+ *max_keys_per_mod_out = max_keys_per_mod;
+ *modkeymap_out = modkeymap;
+
+ return Success;
+}
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 72f94b4..21736d1 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -370,6 +370,10 @@ void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr pDev,
KeySymsRec keySyms;
DEBUG_LOG("DarwinKeyboardReloadHandler\n");
+ if (pDev->key) {
+ if (pDev->key->curKeySyms.map) xfree(pDev->key->curKeySyms.map);
+ xfree(pDev->key);
+ }
DarwinLoadKeyboardMapping(&keySyms);
DarwinKeyboardSetDeviceKeyMap(&keySyms);
diff --git a/include/exevents.h b/include/exevents.h
index 2504baf..8ddfbf9 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -31,6 +31,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define EXEVENTS_H
#include <X11/extensions/XIproto.h>
+#include "inputstr.h"
/**
* Attached to the devPrivates of each client. Specifies the version number as
@@ -136,15 +137,6 @@ extern _X_EXPORT int SetButtonMapping (
int /* nElts */,
BYTE * /* map */);
-extern _X_EXPORT int SetModifierMapping(
- ClientPtr /* client */,
- DeviceIntPtr /* dev */,
- int /* len */,
- int /* rlen */,
- int /* numKeyPerModifier */,
- KeyCode * /* inputMap */,
- KeyClassPtr * /* k */);
-
extern _X_EXPORT void SendDeviceMappingNotify(
ClientPtr /* client, */,
CARD8 /* request, */,
diff --git a/include/input.h b/include/input.h
index db75f6c..a38dbfa 100644
--- a/include/input.h
+++ b/include/input.h
@@ -222,6 +222,15 @@ typedef struct _InputOption {
struct _InputOption *next;
} InputOption;
+/* Key has been run through all input processing and events sent to clients. */
+#define KEY_PROCESSED 1
+/* Key has not been fully processed, no events have been sent. */
+#define KEY_POSTED 2
+
+extern void set_key_down(DeviceIntPtr pDev, int key_code, int type);
+extern void set_key_up(DeviceIntPtr pDev, int key_code, int type);
+extern int key_is_down(DeviceIntPtr pDev, int key_code, int type);
+
extern _X_EXPORT void InitCoreDevices(void);
extern _X_EXPORT DeviceIntPtr AddInputDevice(
@@ -373,13 +382,6 @@ extern _X_EXPORT Bool BadDeviceMap(
unsigned /*high*/,
XID* /*errval*/);
-extern _X_EXPORT Bool AllModifierKeysAreUp(
- DeviceIntPtr /*device*/,
- CARD8* /*map1*/,
- int /*per1*/,
- CARD8* /*map2*/,
- int /*per2*/);
-
extern _X_EXPORT void NoteLedState(
DeviceIntPtr /*keybd*/,
int /*led*/,
@@ -498,6 +500,12 @@ extern _X_EXPORT int AllocMasterDevice(ClientPtr client,
extern _X_EXPORT void DeepCopyDeviceClasses(DeviceIntPtr from,
DeviceIntPtr to);
+/* Helper functions. */
+extern int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
+ KeyCode **modkeymap, int *max_keys_per_mod);
+extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map,
+ int max_keys_per_mod);
+
/* Implemented by the DDX. */
extern _X_EXPORT int NewInputDeviceRequest(
InputOption *options,
diff --git a/include/inputstr.h b/include/inputstr.h
index 7ff8dcb..cdd68d5 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -137,11 +137,9 @@ typedef struct _GrabRec {
typedef struct _KeyClassRec {
CARD8 down[DOWN_LENGTH];
CARD8 postdown[DOWN_LENGTH];
- KeyCode *modifierKeyMap;
KeySymsRec curKeySyms;
int modifierKeyCount[8];
CARD8 modifierMap[MAP_LENGTH];
- CARD8 maxKeysPerModifier;
struct _XkbSrvInfo *xkbInfo;
} KeyClassRec, *KeyClassPtr;
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index c7a6d99..8960bca 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -438,36 +438,7 @@ int maxNumberOfGroups;
if (nGroups > maxNumberOfGroups)
maxNumberOfGroups = nGroups;
}
- if (_XkbCoreKeycodeInRange(keyc,key)) {
- if (keyc->modifierMap[key]!=0) {
- register unsigned bit,i,mask;
- mask= keyc->modifierMap[key];
- for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
- if (mask&bit) {
- keysPerMod[i]++;
- if (keysPerMod[i]>maxKeysPerMod)
- maxKeysPerMod= keysPerMod[i];
- }
- }
- }
- }
- }
-
- if (maxKeysPerMod>0) {
- tmp= maxKeysPerMod*XkbNumModifiers;
- if (keyc->modifierKeyMap==NULL)
- keyc->modifierKeyMap= (KeyCode *)_XkbCalloc(1, tmp);
- else if (keyc->maxKeysPerModifier<maxKeysPerMod)
- keyc->modifierKeyMap= (KeyCode *)_XkbRealloc(keyc->modifierKeyMap,tmp);
- if (keyc->modifierKeyMap==NULL)
- FatalError("Couldn't allocate modifierKeyMap in UpdateCore\n");
- bzero(keyc->modifierKeyMap,tmp);
}
- else if ((keyc->maxKeysPerModifier>0)&&(keyc->modifierKeyMap!=NULL)) {
- _XkbFree(keyc->modifierKeyMap);
- keyc->modifierKeyMap= NULL;
- }
- keyc->maxKeysPerModifier= maxKeysPerMod;
if (maxSymsPerKey>0) {
/* See Section 12.4 of the XKB Protocol spec. Because of the
@@ -489,7 +460,6 @@ int maxNumberOfGroups;
}
keyc->curKeySyms.mapWidth= maxSymsPerKey;
- bzero(keysPerMod,sizeof(keysPerMod));
for (key=firstCommon;key<=lastCommon;key++) {
if (keyc->curKeySyms.map!=NULL) {
KeySym *pCore,*pXKB;
@@ -568,17 +538,6 @@ int maxNumberOfGroups;
pXKB+= XkbKeyGroupsWidth(xkb,key);
}
}
- if (keyc->modifierMap[key]!=0) {
- register unsigned bit,i,mask;
- mask= keyc->modifierMap[key];
- for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
- if (mask&bit) {
- tmp= i*maxKeysPerMod+keysPerMod[i];
- keyc->modifierKeyMap[tmp]= key;
- keysPerMod[i]++;
- }
- }
- }
}
return;
}
commit cf6a2fc2bd94b392cfea120444d5e032d26f1d37
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sun Mar 30 17:25:39 2008 +0300
Input: Ignore modifiers in core input processing
Modifiers get cleared by the XKB code when we drop down into core input
processing, so just delete the dead code path to simplify things a bit.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index fec0dab..1b2c463 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -763,8 +763,6 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
ValuatorClassPtr v = NULL;
deviceValuator *xV = (deviceValuator *) xE;
BYTE *kptr = NULL;
- CARD16 modifiers = 0,
- mask = 0;
/* This event is always the first we get, before the actual events with
* the data. However, the way how the DDX is set up, "device" will
@@ -855,7 +853,6 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
if (!k)
return DONT_PROCESS;
- modifiers = k->modifierMap[key];
kptr = &k->down[key >> 3];
if (*kptr & bit) { /* allow ddx to generate multiple downs */
return IS_REPEAT;
@@ -863,13 +860,6 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
if (device->valuator)
device->valuator->motionHintWindow = NullWindow;
*kptr |= bit;
- for (i = 0, mask = 1; modifiers; i++, mask <<= 1) {
- if (mask & modifiers) {
- /* This key affects modifier "i" */
- k->modifierKeyCount[i]++;
- modifiers &= ~mask;
- }
- }
} else if (xE->u.u.type == DeviceKeyRelease) {
if (!k)
return DONT_PROCESS;
@@ -877,19 +867,9 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
kptr = &k->down[key >> 3];
if (!(*kptr & bit)) /* guard against duplicates */
return DONT_PROCESS;
- modifiers = k->modifierMap[key];
if (device->valuator)
device->valuator->motionHintWindow = NullWindow;
*kptr &= ~bit;
- for (i = 0, mask = 1; modifiers; i++, mask <<= 1) {
- if (mask & modifiers) {
- /* This key affects modifier "i" */
- if (--k->modifierKeyCount[i] <= 0) {
- k->modifierKeyCount[i] = 0;
- }
- modifiers &= ~mask;
- }
- }
} else if (xE->u.u.type == DeviceButtonPress) {
if (!b)
return DONT_PROCESS;
diff --git a/dix/events.c b/dix/events.c
index 3a40dcb..5e8fc9b 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3663,7 +3663,6 @@ CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
{
int key, bit;
BYTE *kptr;
- CARD8 modifiers;
GrabPtr grab;
GrabInfoPtr grabinfo;
Bool deactivateGrab = FALSE;
@@ -3694,7 +3693,6 @@ CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
key = xE->u.u.detail;
kptr = &keyc->down[key >> 3];
bit = 1 << (key & 7);
- modifiers = keyc->modifierMap[key];
switch (xE->u.u.type)
{
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 272a785..c46bd84 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -798,7 +798,6 @@ _XkbFilterRedirectKey( XkbSrvInfoPtr xkbi,
unsigned keycode,
XkbAction * pAction)
{
-unsigned realMods = 0;
xEvent ev;
int x,y;
XkbStateRec old;
@@ -852,13 +851,10 @@ ProcessInputProc backupproc;
XkbComputeDerivedState(xkbi);
}
- realMods = xkbi->device->key->modifierMap[ev.u.u.detail];
- xkbi->device->key->modifierMap[ev.u.u.detail] = 0;
UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
xkbi->device->public.processInputProc(&ev,xkbi->device,1);
COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
backupproc,xkbUnwrapProc);
- xkbi->device->key->modifierMap[ev.u.u.detail] = realMods;
if ( mask || mods )
xkbi->state= old;
@@ -887,13 +883,10 @@ ProcessInputProc backupproc;
XkbComputeDerivedState(xkbi);
}
- realMods = xkbi->device->key->modifierMap[ev.u.u.detail];
- xkbi->device->key->modifierMap[ev.u.u.detail] = 0;
UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
xkbi->device->public.processInputProc(&ev,xkbi->device,1);
COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
backupproc,xkbUnwrapProc);
- xkbi->device->key->modifierMap[ev.u.u.detail] = realMods;
if ( mask || mods )
xkbi->state= old;
@@ -1078,7 +1071,6 @@ void
XkbHandleActions(DeviceIntPtr dev,DeviceIntPtr kbd,xEvent *xE,int count)
{
int key,bit,i;
-CARD8 realMods = 0;
XkbSrvInfoPtr xkbi;
KeyClassPtr keyc;
int changed,sendEvent;
@@ -1216,19 +1208,15 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
if (sendEvent) {
DeviceIntPtr tmpdev;
- if (keyEvent) {
- realMods = keyc->modifierMap[key];
- keyc->modifierMap[key] = 0;
+ if (keyEvent)
tmpdev = dev;
- } else
+ else
tmpdev = GetPairedDevice(dev);
UNWRAP_PROCESS_INPUT_PROC(tmpdev,xkbPrivPtr, backupproc);
dev->public.processInputProc(xE,tmpdev,count);
COND_WRAP_PROCESS_INPUT_PROC(tmpdev, xkbPrivPtr,
backupproc,xkbUnwrapProc);
- if (keyEvent)
- keyc->modifierMap[key] = realMods;
}
else if (keyEvent) {
FixKeyState(xE,dev);
commit 6727ee94086d238f9f99379280d4e4827f388cce
Author: Daniel Stone <daniel at fooishbar.org>
Date: Sat Aug 9 16:45:45 2008 +0300
Input: Remove state from KeyClassRec
We already have state fully stored within XKB, so instead of duplicating it,
just generate the values to send to clients when required.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 323bc8d..fec0dab 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -220,28 +220,19 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
- /*
- * Copy state from the extended keyboard to core. If you omit this,
- * holding Ctrl on keyboard one, and pressing Q on keyboard two, will
- * cause your app to quit. This feels wrong to me, hence the below
- * code.
- *
- * XXX: If you synthesise core modifier events, the state will get
- * clobbered here. You'll have to work out something sensible
- * to fix that. Good luck.
- */
-
-#define KEYBOARD_MASK (ShiftMask | LockMask | ControlMask | Mod1Mask | \
- Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask)
- mk->state &= ~(KEYBOARD_MASK);
- mk->state |= (dk->state & KEYBOARD_MASK);
-#undef KEYBOARD_MASK
for (i = 0; i < 8; i++)
mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
FatalError("Couldn't pivot keymap from device to core!\n");
+ /* Copy the state here. This means we'll only have consistency
+ * between state and active keymap, rather than between state and
+ * keycodes pressed, but there's pretty much no way to win here,
+ * so might as well go for the one that would seem to give the
+ * least nonsensical result. */
+ mk->xkbInfo->state = dk->xkbInfo->state;
+
if (lastMapNotifyDevice != master) {
SendMappingNotify(master, MappingKeyboard,
mk->curKeySyms.minKeyCode,
@@ -250,13 +241,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
serverClient);
lastMapNotifyDevice = master;
}
-
- /* Copy the state here. This means we'll only have consistency
- * between state and active keymap, rather than between state and
- * keycodes pressed, but there's pretty much no way to win here,
- * so might as well go for the one that would seem to give the
- * least nonsensical result. */
- mk->xkbInfo->state = dk->xkbInfo->state;
}
/**
@@ -879,12 +863,10 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
if (device->valuator)
device->valuator->motionHintWindow = NullWindow;
*kptr |= bit;
- k->prev_state = k->state;
for (i = 0, mask = 1; modifiers; i++, mask <<= 1) {
if (mask & modifiers) {
/* This key affects modifier "i" */
k->modifierKeyCount[i]++;
- k->state |= mask;
modifiers &= ~mask;
}
}
@@ -899,13 +881,11 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
if (device->valuator)
device->valuator->motionHintWindow = NullWindow;
*kptr &= ~bit;
- k->prev_state = k->state;
for (i = 0, mask = 1; modifiers; i++, mask <<= 1) {
if (mask & modifiers) {
/* This key affects modifier "i" */
if (--k->modifierKeyCount[i] <= 0) {
k->modifierKeyCount[i] = 0;
- k->state &= ~mask;
}
modifiers &= ~mask;
}
@@ -1003,7 +983,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
}
/* State needs to be assembled BEFORE the device is updated. */
- state = (kbd) ? kbd->key->state : 0;
+ state = (kbd) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->state) : 0;
state |= (mouse) ? (mouse->button->state) : 0;
ret = UpdateDeviceState(device, xE, count);
@@ -1047,7 +1027,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
device->name);
xV->device_state = 0;
if (k)
- xV->device_state |= k->state;
+ xV->device_state |= XkbStateFieldFromRec(&k->xkbInfo->state);
if (b)
xV->device_state |= b->state;
}
diff --git a/Xi/querydp.c b/Xi/querydp.c
index 8d8be81..ab59e66 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -42,6 +42,7 @@
#include "extnsionst.h"
#include "exevents.h"
#include "exglobals.h"
+#include "xkbsrv.h"
#ifdef PANORAMIX
#include "panoramiXsrv.h"
@@ -105,7 +106,9 @@ ProcXQueryDevicePointer(ClientPtr client)
rep.RepType = X_QueryDevicePointer;
rep.length = 0;
rep.sequenceNumber = client->sequence;
- rep.mask = pDev->button->state | (kbd && kbd->key) ? kbd->key->state : 0;
+ rep.mask = pDev->button->state;
+ if (kbd && kbd->key)
+ rep.mask |= XkbStateFieldFromRec(&kbd->key->xkbInfo->state);
rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
rep.rootX = pSprite->hot.x;
rep.rootY = pSprite->hot.y;
diff --git a/dix/events.c b/dix/events.c
index 95bb3e9..3a40dcb 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3683,11 +3683,14 @@ CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
}
}
+
/* ProcessOtherEvent already updated the keyboard's state, so we need to
* access prev_state here! */
- XE_KBPTR.state = (keyc->prev_state | GetPairedDevice(keybd)->button->state);
+ XE_KBPTR.state = XkbStateFieldFromRec(&keybd->key->xkbInfo->prev_state);
+ XE_KBPTR.state |= GetPairedDevice(keybd)->button->state;
XE_KBPTR.rootX = keybd->spriteInfo->sprite->hot.x;
XE_KBPTR.rootY = keybd->spriteInfo->sprite->hot.y;
+
key = xE->u.u.detail;
kptr = &keyc->down[key >> 3];
bit = 1 << (key & 7);
@@ -4800,7 +4803,8 @@ ProcQueryPointer(ClientPtr client)
MaybeStopHint(mouse, client);
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
- rep.mask = mouse->button->state | kbd->key->state;
+ rep.mask = mouse->button->state;
+ rep.mask |= XkbStateFieldFromRec(&inputInfo.keyboard->key->xkbInfo->state);
rep.length = 0;
rep.root = (RootWindow(mouse))->drawable.id;
rep.rootX = pSprite->hot.x;
diff --git a/hw/dmx/input/atKeynames.h b/hw/dmx/input/atKeynames.h
index 85f13ac..e632ca2 100644
--- a/hw/dmx/input/atKeynames.h
+++ b/hw/dmx/input/atKeynames.h
@@ -67,7 +67,6 @@
#define ScrollLockMask Mod5Mask
#define KeyPressed(k) (keyc->postdown[k >> 3] & (1 << (k & 7)))
-#define ModifierDown(k) ((keyc->state & (k)) == (k))
/*
* NOTE: The AT/MF keyboards can generate (via the 8042) two (MF: three)
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 92f5216..2e38cf8 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -1925,7 +1925,8 @@ KdCheckLock (void)
if (tmp->LockLed && tmp->dixdev && tmp->dixdev->key) {
keyc = tmp->dixdev->key;
isSet = (tmp->leds & (1 << (tmp->LockLed-1))) != 0;
- shouldBeSet = (keyc->state & LockMask) != 0;
+ /* FIXME: Just use XKB indicators! */
+ shouldBeSet = !!(XkbStateFieldFromRec(&keyc->xkbInfo->state) & LockMask);
if (isSet != shouldBeSet)
KdSetLed (tmp, tmp->LockLed, shouldBeSet);
}
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index b7036cd..2f8c689 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -1043,7 +1043,8 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr keybd)
de->u.event.dx = 0;
de->u.event.dy = 0;
de->u.event.screen = pScreen->myNum;
- de->u.event.state = keyc->state | pointer->button->state;
+ de->u.event.state = XkbStateFieldFromRec(&keyc->xkbInfo->state);
+ de->u.event.state |= pointer->button->state;
de->u.u.type = (IEventBase - 1) + coreEquiv; /* change to XI event */
UpdateDeviceState(keybd, (xEvent*)de, 1);
@@ -1090,7 +1091,8 @@ DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
* Fill in remaining event state
*/
de->u.event.screen = pScreen->myNum;
- de->u.event.state = butc->state | GetPairedDevice(mouse)->key->state;
+ de->u.event.state = butc->state;
+ de->u.event.state |= XkbStateFieldFromRec(&GetPairedDevice(mouse)->key->xkbInfo->state);
de->u.u.type = (IEventBase - 1) + coreEquiv; /* change to XI event */
UpdateDeviceState(mouse, (xEvent*)de, 1);
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 1babf12..a1beea0 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -398,7 +398,6 @@ xf86PrintBacktrace(void)
}
#define KeyPressed(k) (keyc->postdown[k >> 3] & (1 << (k & 7)))
-#define ModifierDown(k) ((keyc->state & (k)) == (k))
static void
xf86ReleaseKeys(DeviceIntPtr pDev)
diff --git a/include/inputstr.h b/include/inputstr.h
index d1a965b..7ff8dcb 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -142,8 +142,6 @@ typedef struct _KeyClassRec {
int modifierKeyCount[8];
CARD8 modifierMap[MAP_LENGTH];
CARD8 maxKeysPerModifier;
- unsigned short state;
- unsigned short prev_state;
struct _XkbSrvInfo *xkbInfo;
} KeyClassRec, *KeyClassPtr;
diff --git a/xkb/xkb.c b/xkb/xkb.c
index ad3529d..21750c9 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -559,7 +559,7 @@ ProcXkbGetState(ClientPtr client)
rep.sequenceNumber= client->sequence;
rep.length = 0;
rep.deviceID = dev->id;
- rep.mods = dev->key->state&0xff;
+ rep.mods = XkbStateFieldFromRec(xkb) & 0xff;
rep.baseMods = xkb->base_mods;
rep.lockedMods = xkb->locked_mods;
rep.latchedMods = xkb->latched_mods;
@@ -626,7 +626,6 @@ ProcXkbLatchLockState(ClientPtr client)
return status;
XkbComputeDerivedState(tmpd->key->xkbInfo);
- tmpd->key->state = XkbStateFieldFromRec(newState);
changed = XkbStateChangedFlags(&oldState, newState);
if (changed) {
diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index 85d4096..b98b0d8 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -748,7 +748,6 @@ deviceKeyButtonPointer *kbp = xE;
XkbUpdateIndicators(dev,changed_leds,True,NULL,&cause);
}
}
- dev->key->state= XkbStateFieldFromRec(&xkbi->state);
}
if (((xkbi->flags&_XkbStateNotifyInProgress)==0)&&(changed!=0)) {
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 315ff0d..272a785 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -802,7 +802,7 @@ unsigned realMods = 0;
xEvent ev;
int x,y;
XkbStateRec old;
-unsigned mods,mask,oldCoreState = 0,oldCorePrevState = 0;
+unsigned mods,mask;
xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device);
ProcessInputProc backupproc;
@@ -843,8 +843,6 @@ ProcessInputProc backupproc;
if ( mask || mods ) {
old= xkbi->state;
- oldCoreState= xkbi->device->key->state;
- oldCorePrevState= xkbi->device->key->prev_state;
xkbi->state.base_mods&= ~mask;
xkbi->state.base_mods|= (mods&mask);
xkbi->state.latched_mods&= ~mask;
@@ -852,8 +850,6 @@ ProcessInputProc backupproc;
xkbi->state.locked_mods&= ~mask;
xkbi->state.locked_mods|= (mods&mask);
XkbComputeDerivedState(xkbi);
- xkbi->device->key->state= xkbi->device->key->prev_state=
- xkbi->state.mods;
}
realMods = xkbi->device->key->modifierMap[ev.u.u.detail];
@@ -864,11 +860,8 @@ ProcessInputProc backupproc;
backupproc,xkbUnwrapProc);
xkbi->device->key->modifierMap[ev.u.u.detail] = realMods;
- if ( mask || mods ) {
- xkbi->device->key->state= oldCoreState;
- xkbi->device->key->prev_state= oldCorePrevState;
+ if ( mask || mods )
xkbi->state= old;
- }
}
else if (filter->keycode==keycode) {
@@ -885,8 +878,6 @@ ProcessInputProc backupproc;
if ( mask || mods ) {
old= xkbi->state;
- oldCoreState= xkbi->device->key->state;
- oldCorePrevState= xkbi->device->key->prev_state;
xkbi->state.base_mods&= ~mask;
xkbi->state.base_mods|= (mods&mask);
xkbi->state.latched_mods&= ~mask;
@@ -894,8 +885,6 @@ ProcessInputProc backupproc;
xkbi->state.locked_mods&= ~mask;
xkbi->state.locked_mods|= (mods&mask);
XkbComputeDerivedState(xkbi);
- xkbi->device->key->state= xkbi->device->key->prev_state=
- xkbi->state.mods;
}
realMods = xkbi->device->key->modifierMap[ev.u.u.detail];
@@ -906,11 +895,8 @@ ProcessInputProc backupproc;
backupproc,xkbUnwrapProc);
xkbi->device->key->modifierMap[ev.u.u.detail] = realMods;
- if ( mask || mods ) {
- xkbi->device->key->state= oldCoreState;
- xkbi->device->key->prev_state= oldCorePrevState;
+ if ( mask || mods )
xkbi->state= old;
- }
filter->keycode= 0;
filter->active= 0;
@@ -1250,8 +1236,6 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
xkbi->prev_state= oldState;
XkbComputeDerivedState(xkbi);
- keyc->prev_state= keyc->state;
- keyc->state= XkbStateFieldFromRec(&xkbi->state);
changed = XkbStateChangedFlags(&oldState,&xkbi->state);
if (genStateNotify) {
if (changed) {
commit 08363c5830bdea34012dcd954b45ccfdc79a3a7e
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Dec 26 18:38:25 2008 +1100
Input: Overhaul keyboard initialisation process
XkbInitKeyboardDeviceStruct is now the only valid keyboard
initialisation: all the details are hidden behind here. This now makes
it impossible to supply a core keymap at startup.
If dev->key is valid, dev->key->xkbInfo->desc is also valid.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 1802b18..323bc8d 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -191,7 +191,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
{
static DeviceIntPtr lastMapNotifyDevice = NULL;
KeyClassPtr mk, dk; /* master, device */
- BOOL sendNotify = FALSE;
int i;
if (device == master)
@@ -240,14 +239,8 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
for (i = 0; i < 8; i++)
mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
- if (dk->xkbInfo && dk->xkbInfo->desc) {
- if (!mk->xkbInfo || !mk->xkbInfo->desc) {
- XkbInitDevice(master);
- XkbFinishDeviceInit(master);
- }
- if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
- FatalError("Couldn't pivot keymap from device to core!\n");
- }
+ if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
+ FatalError("Couldn't pivot keymap from device to core!\n");
if (lastMapNotifyDevice != master) {
SendMappingNotify(master, MappingKeyboard,
diff --git a/dix/devices.c b/dix/devices.c
index 9d6651d..6748e48 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -483,54 +483,24 @@ CoreKeyboardCtl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
static int
CoreKeyboardProc(DeviceIntPtr pDev, int what)
{
- CARD8 *modMap;
- KeySymsRec keySyms;
- XkbComponentNamesRec names;
- ClassesPtr classes;
+ XkbRMLVOSet rmlvo;
switch (what) {
case DEVICE_INIT:
- if (!(classes = xcalloc(1, sizeof(ClassesRec))))
- {
- ErrorF("[dix] Could not allocate device classes.\n");
- return BadAlloc;
- }
-
- keySyms.minKeyCode = 8;
- keySyms.maxKeyCode = 255;
- keySyms.mapWidth = 4;
- keySyms.map = (KeySym *)xcalloc(sizeof(KeySym),
- (keySyms.maxKeyCode -
- keySyms.minKeyCode + 1) *
- keySyms.mapWidth);
- if (!keySyms.map) {
- ErrorF("[dix] Couldn't allocate core keymap\n");
- xfree(classes);
- return BadAlloc;
- }
-
- modMap = xcalloc(1, MAP_LENGTH);
- if (!modMap) {
- ErrorF("[dix] Couldn't allocate core modifier map\n");
- xfree(classes);
- return BadAlloc;
- }
-
- bzero(&names, sizeof(names));
- XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modMap,
- CoreKeyboardBell, CoreKeyboardCtl);
+ XkbGetRulesDflts(&rmlvo);
+ InitKeyboardDeviceStruct(pDev, &rmlvo, CoreKeyboardBell,
+ CoreKeyboardCtl);
+ return Success;
- xfree(keySyms.map);
- xfree(modMap);
- break;
+ case DEVICE_ON:
+ case DEVICE_OFF:
+ return Success;
case DEVICE_CLOSE:
- break;
-
- default:
- break;
+ return Success;
}
- return Success;
+
+ return BadMatch;
}
/**
@@ -1102,73 +1072,7 @@ SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
return TRUE;
}
-static Bool
-InitModMap(KeyClassPtr keyc)
-{
- int i, j;
- CARD8 keysPerModifier[8];
- CARD8 mask;
-
- keyc->maxKeysPerModifier = 0;
- for (i = 0; i < 8; i++)
- keysPerModifier[i] = 0;
- for (i = 8; i < MAP_LENGTH; i++)
- {
- for (j = 0, mask = 1; j < 8; j++, mask <<= 1)
- {
- if (mask & keyc->modifierMap[i])
- {
- if (++keysPerModifier[j] > keyc->maxKeysPerModifier)
- keyc->maxKeysPerModifier = keysPerModifier[j];
- }
- }
- }
- keyc->modifierKeyMap = xcalloc(8, keyc->maxKeysPerModifier);
- if (!keyc->modifierKeyMap && keyc->maxKeysPerModifier)
- return (FALSE);
- for (i = 0; i < 8; i++)
- keysPerModifier[i] = 0;
- for (i = 8; i < MAP_LENGTH; i++)
- {
- for (j = 0, mask = 1; j < 8; j++, mask <<= 1)
- {
- if (mask & keyc->modifierMap[i])
- {
- keyc->modifierKeyMap[(j*keyc->maxKeysPerModifier) +
- keysPerModifier[j]] = i;
- keysPerModifier[j]++;
- }
- }
- }
- return TRUE;
-}
-
-Bool
-InitKeyClassDeviceStruct(DeviceIntPtr dev, KeySymsPtr pKeySyms, CARD8 pModifiers[])
-{
- KeyClassPtr keyc;
-
- keyc = xcalloc(1, sizeof(KeyClassRec));
- if (!keyc)
- return FALSE;
- keyc->curKeySyms.minKeyCode = pKeySyms->minKeyCode;
- keyc->curKeySyms.maxKeyCode = pKeySyms->maxKeyCode;
- if (pModifiers)
- memmove((char *)keyc->modifierMap, (char *)pModifiers, MAP_LENGTH);
- if (!SetKeySymsMap(&keyc->curKeySyms, pKeySyms) || !InitModMap(keyc))
- {
- xfree(keyc->curKeySyms.map);
- xfree(keyc->modifierKeyMap);
- xfree(keyc);
- return FALSE;
- }
- dev->key = keyc;
- dev->key->xkbInfo= NULL;
- XkbInitDevice(dev);
- return TRUE;
-}
-
-Bool
+_X_EXPORT Bool
InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons,
CARD8 *map)
{
@@ -1349,30 +1253,7 @@ InitFocusClassDeviceStruct(DeviceIntPtr dev)
return TRUE;
}
-Bool
-InitKbdFeedbackClassDeviceStruct(DeviceIntPtr dev, BellProcPtr bellProc,
- KbdCtrlProcPtr controlProc)
-{
- KbdFeedbackPtr feedc;
-
- feedc = (KbdFeedbackPtr)xalloc(sizeof(KbdFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->BellProc = bellProc;
- feedc->CtrlProc = controlProc;
- defaultKeyboardControl.autoRepeat = TRUE;
- feedc->ctrl = defaultKeyboardControl;
- feedc->ctrl.id = 0;
- if ((feedc->next = dev->kbdfeed) != 0)
- feedc->ctrl.id = dev->kbdfeed->ctrl.id + 1;
- dev->kbdfeed = feedc;
- feedc->xkb_sli= NULL;
- XkbFinishDeviceInit(dev);
- (*dev->kbdfeed->CtrlProc)(dev,&dev->kbdfeed->ctrl);
- return TRUE;
-}
-
-Bool
+_X_EXPORT Bool
InitPtrFeedbackClassDeviceStruct(DeviceIntPtr dev, PtrCtrlProcPtr controlProc)
{
PtrFeedbackPtr feedc;
@@ -1517,19 +1398,7 @@ InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons,
InitPtrFeedbackClassDeviceStruct(dev, controlProc));
}
-Bool
-InitKeyboardDeviceStruct(DevicePtr device, KeySymsPtr pKeySyms,
- CARD8 pModifiers[], BellProcPtr bellProc,
- KbdCtrlProcPtr controlProc)
-{
- DeviceIntPtr dev = (DeviceIntPtr)device;
-
- return(InitKeyClassDeviceStruct(dev, pKeySyms, pModifiers) &&
- InitFocusClassDeviceStruct(dev) &&
- InitKbdFeedbackClassDeviceStruct(dev, bellProc, controlProc));
-}
-
-void
+_X_EXPORT void
SendMappingNotify(DeviceIntPtr pDev, unsigned request, unsigned firstKeyCode,
unsigned count, ClientPtr client)
{
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 670cc37..92f5216 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -746,7 +746,7 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
DevicePtr pDev = (DevicePtr)pDevice;
KdKeyboardInfo *ki;
Atom xiclass;
- XkbComponentNamesRec names;
+ XkbRMLVOSet rmlvo;
if (!pDev)
return BadImplementation;
@@ -795,16 +795,13 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
KdInitModMap(ki);
KdInitAutoRepeats(ki);
- memset(&names, 0, sizeof(XkbComponentNamesRec));
-
- XkbSetRulesDflts (ki->xkbRules, ki->xkbModel, ki->xkbLayout,
- ki->xkbVariant, ki->xkbOptions);
-
- ret = XkbInitKeyboardDeviceStruct (pDevice,
- &names,
- &ki->keySyms,
- ki->modmap,
- KdBell, KdKbdCtrl);
+ memset(&rmlvo, 0, sizeof(rmlvo));
+ rmlvo.rules = ki->xkbRules;
+ rmlvo.model = ki->xkbModel;
+ rmlvo.layout = ki->xkbLayout;
+ rmlvo.variant = ki->xkbVariant;
+ rmlvo.options = ki->xkbOptions;
+ ret = InitKeyboardDeviceStruct (pDevice, &rmlvo, KdBell, KdKbdCtrl);
if (!ret) {
ErrorF("Couldn't initialise keyboard %s\n", ki->name);
return BadImplementation;
diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index d2abfc2..e53ac4b 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -259,21 +259,19 @@ GetLK201Mappings(KeySymsPtr pKeySyms, CARD8 *pModMap)
static int
vfbKeybdProc(DeviceIntPtr pDevice, int onoff)
{
- KeySymsRec keySyms;
- CARD8 modMap[MAP_LENGTH];
DevicePtr pDev = (DevicePtr)pDevice;
+ XkbRMLVOSet rmlvo;
switch (onoff)
{
- case DEVICE_INIT:
- GetLK201Mappings(&keySyms, modMap);
- InitKeyboardDeviceStruct(pDev, &keySyms, modMap,
- (BellProcPtr)NoopDDA, (KbdCtrlProcPtr)NoopDDA);
- break;
- case DEVICE_ON:
+ case DEVICE_INIT:
+ XkbGetRulesDflts(&rmlvo);
+ InitKeyboardDeviceStruct(pDevice, &rmlvo, NULL, NULL);
+ break;
+ case DEVICE_ON:
pDev->on = TRUE;
break;
- case DEVICE_OFF:
+ case DEVICE_OFF:
pDev->on = FALSE;
break;
case DEVICE_CLOSE:
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index e6960c8..cbba3ed 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -83,7 +83,7 @@ typedef enum {
*/
#define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4)
#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(5, 0)
-#define ABI_XINPUT_VERSION SET_ABI_VERSION(4, 0)
+#define ABI_XINPUT_VERSION SET_ABI_VERSION(5, 0)
#define ABI_EXTENSION_VERSION SET_ABI_VERSION(2, 0)
#define ABI_FONT_VERSION SET_ABI_VERSION(0, 6)
diff --git a/include/input.h b/include/input.h
index cf546e0..db75f6c 100644
--- a/include/input.h
+++ b/include/input.h
@@ -53,6 +53,7 @@ SOFTWARE.
#include <X11/Xmd.h>
#include <X11/Xproto.h>
#include "window.h" /* for WindowPtr */
+#include "xkbrules.h"
#define DEVICE_INIT 0
#define DEVICE_ON 1
@@ -268,11 +269,6 @@ extern _X_EXPORT Bool SetKeySymsMap(
KeySymsPtr /*dst*/,
KeySymsPtr /*src*/);
-extern _X_EXPORT Bool InitKeyClassDeviceStruct(
- DeviceIntPtr /*device*/,
- KeySymsPtr /*pKeySyms*/,
- CARD8 /*pModifiers*/[]);
-
extern _X_EXPORT Bool InitButtonClassDeviceStruct(
DeviceIntPtr /*device*/,
int /*numButtons*/,
@@ -304,11 +300,6 @@ typedef void (*KbdCtrlProcPtr)(
DeviceIntPtr /*device*/,
KeybdCtrl * /*ctrl*/);
-extern _X_EXPORT Bool InitKbdFeedbackClassDeviceStruct(
- DeviceIntPtr /*device*/,
- BellProcPtr /*bellProc*/,
- KbdCtrlProcPtr /*controlProc*/);
-
typedef void (*PtrCtrlProcPtr)(
DeviceIntPtr /*device*/,
PtrCtrl * /*ctrl*/);
@@ -363,9 +354,8 @@ extern _X_EXPORT Bool InitPointerDeviceStruct(
int /*numAxes*/);
extern _X_EXPORT Bool InitKeyboardDeviceStruct(
- DevicePtr /*device*/,
- KeySymsPtr /*pKeySyms*/,
- CARD8 /*pModifiers*/[],
+ DeviceIntPtr /*device*/,
+ XkbRMLVOSet * /*rmlvo*/,
BellProcPtr /*bellProc*/,
KbdCtrlProcPtr /*controlProc*/);
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index af87d8f..a28967c 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -54,6 +54,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <X11/extensions/XKBproto.h>
#include "xkbstr.h"
+#include "xkbrules.h"
#include "inputstr.h"
typedef struct _XkbInterest {
@@ -870,31 +871,18 @@ extern _X_EXPORT void XkbClearAllLatchesAndLocks(
XkbEventCausePtr /* cause */
);
+extern _X_EXPORT void XkbGetRulesDflts(
+ XkbRMLVOSet * /* rmlvo */
+);
+
extern _X_EXPORT void XkbSetRulesDflts(
- char * /* rulesFile */,
- char * /* model */,
- char * /* layout */,
- char * /* variant */,
- char * /* options */
+ XkbRMLVOSet * /* rmlvo */
);
extern _X_EXPORT void XkbDeleteRulesDflts(
void
);
-extern _X_EXPORT void XkbInitDevice(
- DeviceIntPtr /* pXDev */
-);
-
-extern _X_EXPORT Bool XkbInitKeyboardDeviceStruct(
- DeviceIntPtr /* pXDev */,
- XkbComponentNamesPtr /* pNames */,
- KeySymsPtr /* pSyms */,
- CARD8 /* pMods */[],
- BellProcPtr /* bellProc */,
- KbdCtrlProcPtr /* ctrlProc */
-);
-
extern _X_EXPORT int SProcXkbDispatch(
ClientPtr /* client */
);
@@ -922,10 +910,6 @@ extern _X_EXPORT Status XkbChangeKeycodeRange(
XkbChangesPtr /* changes */
);
-extern _X_EXPORT int XkbFinishDeviceInit(
- DeviceIntPtr /* pXDev */
-);
-
extern _X_EXPORT void XkbFreeSrvLedInfo(
XkbSrvLedInfoPtr /* sli */
);
@@ -1021,6 +1005,11 @@ extern _X_EXPORT Bool XkbDDXNamesFromRules(
XkbComponentNamesPtr /* names */
);
+extern _X_EXPORT XkbDescPtr XkbCompileKeymap(
+ DeviceIntPtr /* dev */,
+ XkbRMLVOSet * /* rmlvo */
+);
+
_XFUNCPROTOEND
#define XkbAtomGetString(s) NameForAtom(s)
diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index b4ac535..c24b2cc 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -428,3 +428,36 @@ XkbRF_RulesPtr rules;
return complete;
}
+
+XkbDescPtr
+XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
+{
+ XkbComponentNamesRec kccgst;
+ XkbRF_VarDefsRec mlvo;
+ XkbDescPtr xkb;
+ char name[PATH_MAX];
+
+ if (!dev || !rmlvo) {
+ LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
+ return NULL;
+ }
+
+ mlvo.model = rmlvo->model;
+ mlvo.layout = rmlvo->layout;
+ mlvo.variant = rmlvo->variant;
+ mlvo.options = rmlvo->options;
+
+ /* XDNFR already logs for us. */
+ if (!XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, &kccgst))
+ return NULL;
+
+ /* XDLKBN too, but it might return 0 as well as allocating. */
+ if (!XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, 0, &xkb, name,
+ PATH_MAX)) {
+ if (xkb)
+ XkbFreeKeyboard(xkb, 0, TRUE);
+ return NULL;
+ }
+
+ return xkb;
+}
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index e800482..d85fbd4 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -93,36 +93,35 @@ char * XkbBaseDirectory= XKB_BASE_DIRECTORY;
char * XkbBinDirectory= XKB_BIN_DIRECTORY;
static int XkbWantAccessX= 0;
-static Bool rulesDefined= False;
-static char * XkbRulesFile= NULL;
+static char * XkbRulesDflt= NULL;
static char * XkbModelDflt= NULL;
static char * XkbLayoutDflt= NULL;
static char * XkbVariantDflt= NULL;
static char * XkbOptionsDflt= NULL;
+static char * XkbRulesUsed= NULL;
static char * XkbModelUsed= NULL;
static char * XkbLayoutUsed= NULL;
static char * XkbVariantUsed= NULL;
static char * XkbOptionsUsed= NULL;
-static XkbDescPtr xkb_cached_map = NULL;
-
static Bool XkbWantRulesProp= XKB_DFLT_RULES_PROP;
/***====================================================================***/
-static char *
-XkbGetRulesDflts(XkbRF_VarDefsPtr defs)
+void
+XkbGetRulesDflts(XkbRMLVOSet *rmlvo)
{
- if (XkbModelDflt) defs->model= XkbModelDflt;
- else defs->model= XKB_DFLT_MODEL;
- if (XkbLayoutDflt) defs->layout= XkbLayoutDflt;
- else defs->layout= XKB_DFLT_LAYOUT;
- if (XkbVariantDflt) defs->variant= XkbVariantDflt;
- else defs->variant= XKB_DFLT_VARIANT;
- if (XkbOptionsDflt) defs->options= XkbOptionsDflt;
- else defs->options= XKB_DFLT_OPTIONS;
- return (rulesDefined?XkbRulesFile:XKB_DFLT_RULES);
+ if (XkbRulesDflt) rmlvo->rules = XkbRulesDflt;
+ else rmlvo->rules = XKB_DFLT_RULES;
+ if (XkbModelDflt) rmlvo->model= XkbModelDflt;
+ else rmlvo->model= XKB_DFLT_MODEL;
+ if (XkbLayoutDflt) rmlvo->layout= XkbLayoutDflt;
+ else rmlvo->layout= XKB_DFLT_LAYOUT;
+ if (XkbVariantDflt) rmlvo->variant= XkbVariantDflt;
+ else rmlvo->variant= XKB_DFLT_VARIANT;
+ if (XkbOptionsDflt) rmlvo->options= XkbOptionsDflt;
+ else rmlvo->options= XKB_DFLT_OPTIONS;
}
static Bool
@@ -132,9 +131,7 @@ int len,out;
Atom name;
char * pval;
- if (rulesDefined && (!XkbRulesFile))
- return False;
- len= (XkbRulesFile?strlen(XkbRulesFile):strlen(XKB_DFLT_RULES));
+ len= (XkbRulesUsed?strlen(XkbRulesUsed):0);
len+= (XkbModelUsed?strlen(XkbModelUsed):0);
len+= (XkbLayoutUsed?strlen(XkbLayoutUsed):0);
len+= (XkbVariantUsed?strlen(XkbVariantUsed):0);
@@ -156,12 +153,9 @@ char * pval;
return True;
}
out= 0;
- if (XkbRulesFile) {
- strcpy(&pval[out],XkbRulesFile);
- out+= strlen(XkbRulesFile);
- } else {
- strcpy(&pval[out],XKB_DFLT_RULES);
- out+= strlen(XKB_DFLT_RULES);
+ if (XkbRulesUsed) {
+ strcpy(&pval[out],XkbRulesUsed);
+ out+= strlen(XkbRulesUsed);
}
pval[out++]= '\0';
if (XkbModelUsed) {
@@ -195,71 +189,55 @@ char * pval;
}
static void
-XkbSetRulesUsed(XkbRF_VarDefsPtr defs)
+XkbSetRulesUsed(XkbRMLVOSet *rmlvo)
{
+ if (XkbRulesUsed)
+ _XkbFree(XkbRulesUsed);
+ XkbRulesUsed= (rmlvo->rules?_XkbDupString(rmlvo->rules):NULL);
if (XkbModelUsed)
_XkbFree(XkbModelUsed);
- XkbModelUsed= (defs->model?_XkbDupString(defs->model):NULL);
+ XkbModelUsed= (rmlvo->model?_XkbDupString(rmlvo->model):NULL);
if (XkbLayoutUsed)
_XkbFree(XkbLayoutUsed);
- XkbLayoutUsed= (defs->layout?_XkbDupString(defs->layout):NULL);
+ XkbLayoutUsed= (rmlvo->layout?_XkbDupString(rmlvo->layout):NULL);
if (XkbVariantUsed)
_XkbFree(XkbVariantUsed);
- XkbVariantUsed= (defs->variant?_XkbDupString(defs->variant):NULL);
+ XkbVariantUsed= (rmlvo->variant?_XkbDupString(rmlvo->variant):NULL);
if (XkbOptionsUsed)
_XkbFree(XkbOptionsUsed);
- XkbOptionsUsed= (defs->options?_XkbDupString(defs->options):NULL);
+ XkbOptionsUsed= (rmlvo->options?_XkbDupString(rmlvo->options):NULL);
if (XkbWantRulesProp)
QueueWorkProc(XkbWriteRulesProp,NULL,NULL);
return;
}
-/**
- * Set the default RMLVO for the next device to be initialised.
- * If a parameter is NULL, the previous setting will be used. Use empty
- * strings if you want to delete a previous setting.
- *
- * If @rulesFile is NULL and no previous @rulesFile has been set, the
- * built-in default is chosen as default.
- */
void
-XkbSetRulesDflts(char *rulesFile,char *model,char *layout,
- char *variant,char *options)
+XkbSetRulesDflts(XkbRMLVOSet *rmlvo)
{
- if (!rulesFile && !XkbRulesFile)
- {
- LogMessage(X_WARNING, "[xkb] No rule given, and no previous rule "
- "defined. Defaulting to '%s'.\n",
- XKB_DFLT_RULES);
- rulesFile = XKB_DFLT_RULES;
+ if (rmlvo->rules) {
+ if (XkbRulesDflt)
+ _XkbFree(XkbRulesDflt);
+ XkbRulesDflt= _XkbDupString(rmlvo->rules);
}
-
- if (rulesFile) {
- if (XkbRulesFile)
- _XkbFree(XkbRulesFile);
- XkbRulesFile= _XkbDupString(rulesFile);
- rulesDefined= True;
- }
-
- if (model) {
+ if (rmlvo->model) {
if (XkbModelDflt)
_XkbFree(XkbModelDflt);
- XkbModelDflt= _XkbDupString(model);
+ XkbModelDflt= _XkbDupString(rmlvo->model);
}
- if (layout) {
+ if (rmlvo->layout) {
if (XkbLayoutDflt)
_XkbFree(XkbLayoutDflt);
- XkbLayoutDflt= _XkbDupString(layout);
+ XkbLayoutDflt= _XkbDupString(rmlvo->layout);
}
- if (variant) {
+ if (rmlvo->variant) {
if (XkbVariantDflt)
_XkbFree(XkbVariantDflt);
- XkbVariantDflt= _XkbDupString(variant);
+ XkbVariantDflt= _XkbDupString(rmlvo->variant);
}
- if (options) {
+ if (rmlvo->options) {
if (XkbOptionsDflt)
_XkbFree(XkbOptionsDflt);
- XkbOptionsDflt= _XkbDupString(options);
+ XkbOptionsDflt= _XkbDupString(rmlvo->options);
}
return;
}
@@ -267,8 +245,8 @@ XkbSetRulesDflts(char *rulesFile,char *model,char *layout,
void
XkbDeleteRulesDflts(void)
{
- _XkbFree(XkbRulesFile);
- XkbRulesFile = NULL;
+ _XkbFree(XkbRulesDflt);
+ XkbRulesDflt = NULL;
_XkbFree(XkbModelDflt);
XkbModelDflt = NULL;
_XkbFree(XkbLayoutDflt);
@@ -277,9 +255,6 @@ XkbDeleteRulesDflts(void)
XkbVariantDflt = NULL;
_XkbFree(XkbOptionsDflt);
XkbOptionsDflt = NULL;
-
- XkbFreeKeyboard(xkb_cached_map, XkbAllComponentsMask, True);
- xkb_cached_map = NULL;
}
/***====================================================================***/
@@ -467,292 +442,123 @@ XkbControlsPtr ctrls;
return Success;
}
-void
-XkbInitDevice(DeviceIntPtr pXDev)
+_X_EXPORT Bool
+InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
+ BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func)
{
-int i;
-XkbSrvInfoPtr xkbi;
-XkbChangesRec changes;
-unsigned check;
-XkbEventCauseRec cause;
-
- bzero(&changes,sizeof(XkbChangesRec));
- pXDev->key->xkbInfo= xkbi= _XkbTypedCalloc(1,XkbSrvInfoRec);
- if ( xkbi ) {
- XkbDescPtr xkb;
+ int i;
+ unsigned int check;
+ XkbSrvInfoPtr xkbi;
+ XkbDescPtr xkb;
+ XkbSrvLedInfoPtr sli;
+ XkbChangesRec changes;
+ XkbEventCauseRec cause;
+
+ if (dev->key || dev->kbdfeed || !rmlvo)
+ return False;
- if (xkb_cached_map) {
- xkbi->desc = xkb_cached_map;
- xkb_cached_map = NULL;
- }
- else {
- xkbi->desc= XkbAllocKeyboard();
- if (!xkbi->desc)
- FatalError("Couldn't allocate keyboard description\n");
- xkbi->desc->min_key_code = pXDev->key->curKeySyms.minKeyCode;
- xkbi->desc->max_key_code = pXDev->key->curKeySyms.maxKeyCode;
- }
- xkb= xkbi->desc;
- if (xkb->min_key_code == 0)
- xkb->min_key_code = pXDev->key->curKeySyms.minKeyCode;
- if (xkb->max_key_code == 0)
- xkb->max_key_code = pXDev->key->curKeySyms.maxKeyCode;
- if ((pXDev->key->curKeySyms.minKeyCode!=xkbi->desc->min_key_code)||
- (pXDev->key->curKeySyms.maxKeyCode!=xkbi->desc->max_key_code)) {
- /* 12/9/95 (ef) -- XXX! Maybe we should try to fix up one or */
- /* the other here, but for now just complain */
- /* can't just update the core range without */
- /* reallocating the KeySymsRec (pain) */
- ErrorF("[xkb] Internal Error!! XKB and core keymap have different range\n");
- }
- if (XkbAllocClientMap(xkb,XkbAllClientInfoMask,0)!=Success)
- FatalError("Couldn't allocate client map in XkbInitDevice\n");
- i= XkbNumKeys(xkb)/3+1;
- if (XkbAllocServerMap(xkb,XkbAllServerInfoMask,i)!=Success)
- FatalError("Couldn't allocate server map in XkbInitDevice\n");
-
- xkbi->dfltPtrDelta=1;
- xkbi->device = pXDev;
-
- XkbInitSemantics(xkb);
- XkbInitNames(xkbi);
- XkbInitRadioGroups(xkbi);
-
- /* 12/31/94 (ef) -- XXX! Should check if state loaded from file */
- bzero(&xkbi->state,sizeof(XkbStateRec));
-
- XkbInitControls(pXDev,xkbi);
-
- if (xkb->defined & XkmSymbolsMask)
- memcpy(pXDev->key->modifierMap, xkb->map->modmap,
- xkb->max_key_code + 1);
- else
- memcpy(xkb->map->modmap, pXDev->key->modifierMap,
- xkb->max_key_code + 1);
-
- XkbInitIndicatorMap(xkbi);
-
- XkbDDXInitDevice(pXDev);
-
- if (xkb->defined & XkmSymbolsMask)
- XkbUpdateCoreDescription(pXDev, True);
- else
- XkbUpdateKeyTypesFromCore(pXDev, xkb->min_key_code,
- XkbNumKeys(xkb), &changes);
-
- XkbSetCauseUnknown(&cause);
- XkbUpdateActions(pXDev,xkb->min_key_code, XkbNumKeys(xkb),&changes,
- &check,&cause);
- /* For sanity. The first time the connection
- * is opened, the client side min and max are set
- * using QueryMinMaxKeyCodes() which grabs them
- * from pXDev.
- */
- pXDev->key->curKeySyms.minKeyCode = xkb->min_key_code;
- pXDev->key->curKeySyms.maxKeyCode = xkb->max_key_code;
+ memset(&changes, 0, sizeof(changes));
+ XkbSetCauseUnknown(&cause);
+
+ dev->key = xcalloc(1, sizeof(*dev->key));
+ if (!dev->key) {
+ ErrorF("XKB: Failed to allocate key class\n");
+ return False;
}
- return;
-}
-#if MAP_LENGTH > XkbMaxKeyCount
-#undef XkbMaxKeyCount
-#define XkbMaxKeyCount MAP_LENGTH
-#endif
+ dev->kbdfeed = xcalloc(1, sizeof(*dev->kbdfeed));
+ if (!dev->kbdfeed) {
+ ErrorF("XKB: Failed to allocate key feedback class\n");
+ goto unwind_key;
+ }
-Bool
-XkbInitKeyboardDeviceStruct(
- DeviceIntPtr dev,
- XkbComponentNamesPtr names,
- KeySymsPtr pSymsIn,
- CARD8 pModsIn[],
- void (*bellProc)(
- int /*percent*/,
- DeviceIntPtr /*device*/,
- pointer /*ctrl*/,
- int),
- void (*ctrlProc)(
- DeviceIntPtr /*device*/,
- KeybdCtrl * /*ctrl*/))
-{
-KeySymsRec tmpSyms,*pSyms;
-CARD8 tmpMods[XkbMaxLegalKeyCode+1],*pMods;
-char name[PATH_MAX],*rules;
-Bool ok=False;
-XkbRF_VarDefsRec defs;
-XkbDescPtr xkb;
-
- if ((dev->key!=NULL)||(dev->kbdfeed!=NULL))
- return False;
- pSyms= pSymsIn;
- pMods= pModsIn;
- bzero(&defs,sizeof(XkbRF_VarDefsRec));
- rules= XkbGetRulesDflts(&defs);
-
- /*
- * The strings are duplicated because it is not guaranteed that
- * they are allocated, or that they are allocated for every server
- * generation. Eventually they will be freed at the end of this
- * function.
- */
- names->keymap = NULL;
- if (names->keycodes) names->keycodes = _XkbDupString(names->keycodes);
- if (names->types) names->types = _XkbDupString(names->types);
- if (names->compat) names->compat = _XkbDupString(names->compat);
- if (names->geometry) names->geometry = _XkbDupString(names->geometry);
- if (names->symbols) names->symbols = _XkbDupString(names->symbols);
-
- if (defs.model && defs.layout && rules) {
- XkbComponentNamesRec rNames;
- bzero(&rNames,sizeof(XkbComponentNamesRec));
- if (XkbDDXNamesFromRules(dev,rules,&defs,&rNames)) {
- if (rNames.keycodes) {
- if (!names->keycodes)
- names->keycodes = rNames.keycodes;
- else
- _XkbFree(rNames.keycodes);
- }
- if (rNames.types) {
- if (!names->types)
- names->types = rNames.types;
- else _XkbFree(rNames.types);
- }
- if (rNames.compat) {
- if (!names->compat)
- names->compat = rNames.compat;
- else _XkbFree(rNames.compat);
- }
- if (rNames.symbols) {
- if (!names->symbols)
- names->symbols = rNames.symbols;
- else _XkbFree(rNames.symbols);
- }
- if (rNames.geometry) {
- if (!names->geometry)
- names->geometry = rNames.geometry;
- else _XkbFree(rNames.geometry);
- }
- XkbSetRulesUsed(&defs);
- }
+ xkbi = xcalloc(1, sizeof(*xkbi));
+ if (!xkbi) {
+ ErrorF("XKB: Failed to allocate XKB info\n");
+ goto unwind_kbdfeed;
+ }
+ dev->key->xkbInfo = xkbi;
+
+ xkb = XkbCompileKeymap(dev, rmlvo);
+ if (!xkb) {
+ ErrorF("XKB: Failed to compile keymap\n");
+ goto unwind_info;
}
+ xkbi->desc = xkb;
- ok = (Bool) XkbDDXLoadKeymapByNames(dev,names,XkmAllIndicesMask,0,
- &xkb,name,PATH_MAX);
+ if (xkb->min_key_code == 0)
+ xkb->min_key_code = 8;
+ if (xkb->max_key_code == 0)
+ xkb->max_key_code = 255;
- if (ok && (xkb!=NULL)) {
- KeyCode minKC,maxKC;
+ i = XkbNumKeys(xkb) / 3 + 1;
+ if (XkbAllocClientMap(xkb, XkbAllClientInfoMask, 0) != Success)
+ goto unwind_desc;
+ if (XkbAllocServerMap(xkb, XkbAllServerInfoMask, i) != Success)
+ goto unwind_desc;
- minKC= xkb->min_key_code;
- maxKC= xkb->max_key_code;
- if (XkbIsLegalKeycode(minKC)&&XkbIsLegalKeycode(maxKC)&&(minKC<=maxKC)&&
- ((minKC!=pSyms->minKeyCode)||(maxKC!=pSyms->maxKeyCode))) {
- if (xkb->map!=NULL) {
- KeySym *inSym,*outSym;
- int width= pSymsIn->mapWidth;
+ xkbi->dfltPtrDelta = 1;
+ xkbi->device = dev;
- tmpSyms.minKeyCode= minKC;
- tmpSyms.maxKeyCode= maxKC;
+ XkbInitSemantics(xkb);
+ XkbInitNames(xkbi);
+ XkbInitRadioGroups(xkbi);
- if (minKC<pSymsIn->minKeyCode)
- minKC= pSymsIn->minKeyCode;
- if (maxKC>pSymsIn->maxKeyCode)
- maxKC= pSymsIn->maxKeyCode;
+ XkbInitControls(dev, xkbi);
- tmpSyms.mapWidth= width;
- tmpSyms.map= _XkbTypedCalloc(width*XkbNumKeys(xkb),KeySym);
- inSym= &pSymsIn->map[(minKC-pSymsIn->minKeyCode)*width];
- outSym= &tmpSyms.map[(minKC-tmpSyms.minKeyCode)*width];
- memcpy(outSym,inSym,((maxKC-minKC+1)*width)*sizeof(KeySym));
- pSyms= &tmpSyms;
- }
- if ((xkb->map!=NULL)&&(xkb->map->modmap!=NULL)) {
- bzero(tmpMods,XkbMaxKeyCount);
- memcpy(tmpMods,xkb->map->modmap,maxKC+1);
- pMods= tmpMods;
- }
- }
- /* Store the map here so we can pick it back up in XkbInitDevice.
- * Sigh. */
- xkb_cached_map = xkb;
- }
- else {
- LogMessage(X_WARNING, "Couldn't load XKB keymap, falling back to pre-XKB keymap\n");
- }
- ok= InitKeyboardDeviceStruct((DevicePtr)dev,pSyms,pMods,bellProc,ctrlProc);
- xkb_cached_map = NULL;
- if ((pSyms==&tmpSyms)&&(pSyms->map!=NULL)) {
- _XkbFree(pSyms->map);
- pSyms->map= NULL;
- }
-
- if (names->keycodes) _XkbFree(names->keycodes);
- names->keycodes = NULL;
- if (names->types) _XkbFree(names->types);
- names->types = NULL;
- if (names->compat) _XkbFree(names->compat);
- names->compat = NULL;
- if (names->geometry) _XkbFree(names->geometry);
- names->geometry = NULL;
- if (names->symbols) _XkbFree(names->symbols);
- names->symbols = NULL;
-
- return ok;
-}
+ /* XXX: Doesn't XUCD make this redundant? */
+ memcpy(dev->key->modifierMap, xkb->map->modmap, xkb->max_key_code + 1);
-/***====================================================================***/
+ XkbInitIndicatorMap(xkbi);
- /*
- * InitKeyClassDeviceStruct initializes the key class before it
- * initializes the keyboard feedback class for a device.
- * UpdateActions can't set up the correct autorepeat for keyboard
- * initialization because the keyboard feedback isn't created yet.
- * Instead, UpdateActions notes the "correct" autorepeat in the
- * SrvInfo structure and InitKbdFeedbackClass calls UpdateAutoRepeat
- * to apply the computed autorepeat once the feedback class exists.
- *
- * DIX will apply the changed autorepeat, so there's no need to
- * do so here. This function returns True if both RepeatKeys and
- * the core protocol autorepeat ctrls are set (i.e. should use
- * software autorepeat), false otherwise.
- *
- * This function also computes the autorepeat accelerators for the
- * default indicator feedback.
- */
-int
-XkbFinishDeviceInit(DeviceIntPtr pXDev)
-{
-XkbSrvInfoPtr xkbi;
-XkbDescPtr xkb;
-int softRepeat;
-XkbSrvLedInfoPtr sli;
+ XkbDDXInitDevice(dev);
- xkbi = NULL;
- if (pXDev && pXDev->key && pXDev->key->xkbInfo && pXDev->kbdfeed) {
- xkbi= pXDev->key->xkbInfo;
- xkb= xkbi->desc;
- /* If we come from DeepCopyDeviceClasses, the CtrlProc was already set
- * to XkbDDXKeybdCtrlProc, overwriting it leads to happy recursion.
- */
- if (pXDev->kbdfeed && pXDev->kbdfeed->CtrlProc != XkbDDXKeybdCtrlProc) {
- xkbi->kbdProc= pXDev->kbdfeed->CtrlProc;
- pXDev->kbdfeed->CtrlProc= XkbDDXKeybdCtrlProc;
- }
- if (pXDev->kbdfeed->ctrl.autoRepeat)
- xkb->ctrls->enabled_ctrls|= XkbRepeatKeysMask;
- softRepeat= (xkb->ctrls->enabled_ctrls&XkbRepeatKeysMask)!=0;
- if (pXDev->kbdfeed) {
- memcpy(pXDev->kbdfeed->ctrl.autoRepeats,
- xkb->ctrls->per_key_repeat,XkbPerKeyBitArraySize);
- softRepeat= softRepeat&&pXDev->kbdfeed->ctrl.autoRepeat;
- }
- }
- else softRepeat= 0;
- sli= XkbFindSrvLedInfo(pXDev,XkbDfltXIClass,XkbDfltXIId,0);
- if (sli && xkbi)
- XkbCheckIndicatorMaps(xkbi->device,sli,XkbAllIndicatorsMask);
- else DebugF("[xkb] No indicator feedback in XkbFinishInit (shouldn't happen)!\n");
- return softRepeat;
+ XkbUpdateCoreDescription(dev, True);
+
+ XkbUpdateActions(dev, xkb->min_key_code, XkbNumKeys(xkb), &changes,
+ &check, &cause);
+ dev->key->curKeySyms.minKeyCode = xkb->min_key_code;
+ dev->key->curKeySyms.maxKeyCode = xkb->max_key_code;
+
+ InitFocusClassDeviceStruct(dev);
+
+ xkbi->kbdProc = ctrl_func;
+ dev->kbdfeed->CtrlProc = XkbDDXKeybdCtrlProc;
+
+ dev->kbdfeed->ctrl = defaultKeyboardControl;
+ if (dev->kbdfeed->ctrl.autoRepeat)
+ xkb->ctrls->enabled_ctrls |= XkbRepeatKeysMask;
+
+ memcpy(dev->kbdfeed->ctrl.autoRepeats, xkb->ctrls->per_key_repeat,
+ XkbPerKeyBitArraySize);
+
+ sli = XkbFindSrvLedInfo(dev, XkbDfltXIClass, XkbDfltXIId, 0);
+ if (sli)
+ XkbCheckIndicatorMaps(dev, sli, XkbAllIndicatorsMask);
+ else
+ DebugF("XKB: No indicator feedback in XkbFinishInit!\n");
+
+ dev->kbdfeed->CtrlProc(dev,&dev->kbdfeed->ctrl);
+
+ XkbSetRulesDflts(rmlvo);
+ XkbSetRulesUsed(rmlvo);
+
+ return TRUE;
+
+unwind_desc:
+ XkbFreeKeyboard(xkb, 0, TRUE);
+unwind_info:
+ xfree(xkbi);
+unwind_kbdfeed:
+ xfree(dev->kbdfeed);
+unwind_key:
+ xfree(dev->key);
+ return FALSE;
}
+
+/***====================================================================***/
+
/*
* Be very careful about what does and doesn't get freed by this
* function. To reduce fragmentation, XkbInitDevice allocates a
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index abfd6fb..c7a6d99 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -382,10 +382,6 @@ int maxNumberOfGroups;
else if (resize) {
keyc->curKeySyms.minKeyCode= xkb->min_key_code;
keyc->curKeySyms.maxKeyCode= xkb->max_key_code;
- tmp= keyc->curKeySyms.mapWidth*_XkbCoreNumKeys(keyc);
- keyc->curKeySyms.map= _XkbTypedRealloc(keyc->curKeySyms.map,tmp,KeySym);
- if (!keyc->curKeySyms.map)
- FatalError("Couldn't allocate keysyms\n");
first= firstCommon= xkb->min_key_code;
last= lastCommon= xkb->max_key_code;
}
@@ -622,8 +618,6 @@ XkbEventCauseRec cause;
XkbChangesRec changes;
unsigned check;
- if (kbd->key->xkbInfo==NULL)
- XkbInitDevice(kbd);
bzero(&changes,sizeof(XkbChangesRec));
check= 0;
if (request==MappingKeyboard) {
commit 40877c6680863bd6a8475f2bb0c54df55bcf0b0e
Author: Daniel Stone <daniel at fooishbar.org>
Date: Tue Mar 18 10:05:57 2008 +0200
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 at fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
diff --git a/Xi/exevents.c b/Xi/exevents.c
index b136e01..1802b18 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -74,10 +74,8 @@ SOFTWARE.
#include "listdev.h" /* for CopySwapXXXClass */
#include "xace.h"
-#ifdef XKB
#include <X11/extensions/XKBproto.h>
#include "xkbsrv.h"
-#endif
#define WID(w) ((w) ? ((w)->drawable.id) : 0)
#define AllModifiersMask ( \
@@ -304,11 +302,9 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
(*k)->BellProc = it->BellProc;
(*k)->CtrlProc = it->CtrlProc;
(*k)->ctrl = it->ctrl;
-#ifdef XKB
if ((*k)->xkb_sli)
XkbFreeSrvLedInfo((*k)->xkb_sli);
(*k)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, *k, NULL);
-#endif
k = &(*k)->next;
}
@@ -489,11 +485,9 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
}
(*l)->CtrlProc = it->CtrlProc;
(*l)->ctrl = it->ctrl;
-#ifdef XKB
if ((*l)->xkb_sli)
XkbFreeSrvLedInfo((*l)->xkb_sli);
(*l)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, NULL, *l);
-#endif
l = &(*l)->next;
}
@@ -529,9 +523,7 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
{
KeyCode *oldModKeyMap;
KeySym *oldMap;
-#ifdef XKB
struct _XkbSrvInfo *oldXkbInfo;
-#endif
if (!to->key)
{
classes = dixLookupPrivate(&to->devPrivates,
@@ -548,9 +540,7 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
oldModKeyMap = to->key->modifierKeyMap;
oldMap = to->key->curKeySyms.map;
-#ifdef XKB
oldXkbInfo = to->key->xkbInfo;
-#endif
if (!oldMap) /* newly created key struct */
{
@@ -563,9 +553,7 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
to->key->modifierKeyMap = oldModKeyMap;
to->key->curKeySyms.map = oldMap;
-#ifdef XKB
to->key->xkbInfo = oldXkbInfo;
-#endif
CopyKeyClass(from, to);
} else if (to->key && !from->key)
@@ -624,7 +612,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
classes->button = NULL;
}
-#ifdef XKB
if (from->button->xkb_acts)
{
if (!to->button->xkb_acts)
@@ -637,7 +624,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
sizeof(XkbAction));
} else
xfree(to->button->xkb_acts);
-#endif
} else if (to->button && !from->button)
{
ClassesPtr classes;
@@ -1821,10 +1807,8 @@ SendDeviceMappingNotify(ClientPtr client, CARD8 request,
ev->count = count;
}
-#ifdef XKB
if (request == MappingKeyboard || request == MappingModifier)
XkbApplyMappingChange(dev, request, firstKeyCode, count, client);
-#endif
SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) ev, 1);
}
diff --git a/configure.ac b/configure.ac
index a9a67d8..a0a89d9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1014,8 +1014,6 @@ AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes)
AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
AC_DEFINE(XKB, 1, [Build XKB])
-AC_DEFINE(XKB_IN_SERVER, 1, [Build XKB server])
-AC_DEFINE(XKB_DFLT_DISABLED, 0, [Disable XKB per default])
AC_DEFINE_DIR(XKB_BASE_DIRECTORY, XKBPATH, [Path to XKB data])
AC_DEFINE_DIR(XKB_BIN_DIRECTORY, bindir, [Path to XKB bin dir])
diff --git a/dix/devices.c b/dix/devices.c
index f2410fd..9d6651d 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -63,12 +63,7 @@ SOFTWARE.
#include "dixstruct.h"
#include "ptrveloc.h"
#include "site.h"
-#ifndef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#endif
-#ifdef XKB
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
#include "privates.h"
#include "xace.h"
#include "mi.h"
@@ -490,9 +485,7 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
{
CARD8 *modMap;
KeySymsRec keySyms;
-#ifdef XKB
XkbComponentNamesRec names;
-#endif
ClassesPtr classes;
switch (what) {
@@ -523,19 +516,9 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
return BadAlloc;
}
-#ifdef XKB
- if (!noXkbExtension) {
- bzero(&names, sizeof(names));
- XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modMap,
- CoreKeyboardBell, CoreKeyboardCtl);
- }
- else
-#endif
- {
- /* FIXME Our keymap here isn't exactly useful. */
- InitKeyboardDeviceStruct((DevicePtr)pDev, &keySyms, modMap,
- CoreKeyboardBell, CoreKeyboardCtl);
- }
+ bzero(&names, sizeof(names));
+ XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modMap,
+ CoreKeyboardBell, CoreKeyboardCtl);
xfree(keySyms.map);
xfree(modMap);
@@ -661,13 +644,11 @@ FreeDeviceClass(int type, pointer *class)
case KeyClass:
{
KeyClassPtr* k = (KeyClassPtr*)class;
-#ifdef XKB
if ((*k)->xkbInfo)
{
XkbFreeInfo((*k)->xkbInfo);
(*k)->xkbInfo = NULL;
}
-#endif
xfree((*k)->curKeySyms.map);
xfree((*k)->modifierKeyMap);
xfree((*k));
@@ -676,10 +657,8 @@ FreeDeviceClass(int type, pointer *class)
case ButtonClass:
{
ButtonClassPtr *b = (ButtonClassPtr*)class;
-#ifdef XKB
if ((*b)->xkb_acts)
xfree((*b)->xkb_acts);
-#endif
xfree((*b));
break;
}
@@ -724,10 +703,8 @@ FreeFeedbackClass(int type, pointer *class)
KbdFeedbackPtr k, knext;
for (k = (*kbdfeed); k; k = knext) {
knext = k->next;
-#ifdef XKB
if (k->xkb_sli)
XkbFreeSrvLedInfo(k->xkb_sli);
-#endif
xfree(k);
}
break;
@@ -785,10 +762,8 @@ FreeFeedbackClass(int type, pointer *class)
for (l = (*leds); l; l = lnext) {
lnext = l->next;
-#ifdef XKB
if (l->xkb_sli)
XkbFreeSrvLedInfo(l->xkb_sli);
-#endif
xfree(l);
}
break;
@@ -859,11 +834,8 @@ CloseDevice(DeviceIntPtr dev)
FreeAllDeviceClasses(classes);
}
-
-#ifdef XKB
while (dev->xkb_interest)
XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
-#endif
if (DevHasCursor(dev) && dev->spriteInfo->sprite) {
xfree(dev->spriteInfo->sprite->spriteTrace);
@@ -920,9 +892,7 @@ CloseDownDevices(void)
inputInfo.off_devices = NULL;
inputInfo.keyboard = NULL;
inputInfo.pointer = NULL;
-#ifdef XKB
XkbDeleteRulesDflts();
-#endif
}
/**
@@ -1193,10 +1163,8 @@ InitKeyClassDeviceStruct(DeviceIntPtr dev, KeySymsPtr pKeySyms, CARD8 pModifiers
return FALSE;
}
dev->key = keyc;
-#ifdef XKB
dev->key->xkbInfo= NULL;
- if (!noXkbExtension) XkbInitDevice(dev);
-#endif
+ XkbInitDevice(dev);
return TRUE;
}
@@ -1392,19 +1360,14 @@ InitKbdFeedbackClassDeviceStruct(DeviceIntPtr dev, BellProcPtr bellProc,
return FALSE;
feedc->BellProc = bellProc;
feedc->CtrlProc = controlProc;
-#ifdef XKB
defaultKeyboardControl.autoRepeat = TRUE;
-#endif
feedc->ctrl = defaultKeyboardControl;
feedc->ctrl.id = 0;
if ((feedc->next = dev->kbdfeed) != 0)
feedc->ctrl.id = dev->kbdfeed->ctrl.id + 1;
dev->kbdfeed = feedc;
-#ifdef XKB
feedc->xkb_sli= NULL;
- if (!noXkbExtension)
- XkbFinishDeviceInit(dev);
-#endif
+ XkbFinishDeviceInit(dev);
(*dev->kbdfeed->CtrlProc)(dev,&dev->kbdfeed->ctrl);
return TRUE;
}
@@ -1517,9 +1480,7 @@ InitLedFeedbackClassDeviceStruct (DeviceIntPtr dev, LedCtrlProcPtr controlProc)
feedc->ctrl.id = 0;
if ( (feedc->next = dev->leds) )
feedc->ctrl.id = dev->leds->ctrl.id + 1;
-#ifdef XKB
feedc->xkb_sli= NULL;
-#endif
dev->leds = feedc;
(*controlProc)(dev, &feedc->ctrl);
return TRUE;
@@ -1582,25 +1543,18 @@ SendMappingNotify(DeviceIntPtr pDev, unsigned request, unsigned firstKeyCode,
event.u.mappingNotify.firstKeyCode = firstKeyCode;
event.u.mappingNotify.count = count;
}
-#ifdef XKB
- if (!noXkbExtension &&
- ((request == MappingKeyboard) || (request == MappingModifier))) {
+ if (request == MappingKeyboard || request == MappingModifier)
XkbApplyMappingChange(pDev,request,firstKeyCode,count, client);
- }
-#endif
/* 0 is the server client */
for (i=1; i<currentMaxClients; i++)
{
if (clients[i] && clients[i]->clientState == ClientStateRunning)
{
-#ifdef XKB
- if (!noXkbExtension &&
- (request == MappingKeyboard) &&
- (clients[i]->xkbClientFlags != 0) &&
- (clients[i]->mapNotifyMask&XkbKeySymsMask))
+ if (request == MappingKeyboard &&
+ clients[i]->xkbClientFlags != 0 &&
+ (clients[i]->mapNotifyMask & XkbKeySymsMask))
continue;
-#endif
event.u.u.sequenceNumber = clients[i]->sequence;
WriteEventsToClient(clients[i], 1, &event);
}
@@ -2097,15 +2051,13 @@ DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
client->errorValue = t;
return BadValue;
}
-#ifdef XKB
- if (!noXkbExtension) {
- XkbEventCauseRec cause;
- XkbSetCauseCoreReq(&cause,X_ChangeKeyboardControl,client);
- XkbSetIndicators(keybd,((led == DO_ALL) ? ~0L : (1L<<(led-1))),
- ctrl.leds, &cause);
- ctrl.leds = keybd->kbdfeed->ctrl.leds;
- }
-#endif
+
+ XkbEventCauseRec cause;
+ XkbSetCauseCoreReq(&cause,X_ChangeKeyboardControl,client);
+ XkbSetIndicators(keybd,((led == DO_ALL) ? ~0L : (1L<<(led-1))),
+ ctrl.leds, &cause);
+ ctrl.leds = keybd->kbdfeed->ctrl.leds;
+
break;
case KBKey:
key = (KeyCode)*vlist;
@@ -2123,10 +2075,8 @@ DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
mask = (1 << (key & 7));
t = (CARD8)*vlist;
vlist++;
-#ifdef XKB
- if (!noXkbExtension && key != DO_ALL)
+ if (key != DO_ALL)
XkbDisableComputedAutoRepeats(keybd,key);
-#endif
if (t == AutoRepeatModeOff) {
if (key == DO_ALL)
ctrl.autoRepeat = FALSE;
@@ -2159,14 +2109,9 @@ DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
}
keybd->kbdfeed->ctrl = ctrl;
-#ifdef XKB
/* The XKB RepeatKeys control and core protocol global autorepeat */
/* value are linked */
- if (!noXkbExtension)
- XkbSetRepeatKeys(keybd, key, keybd->kbdfeed->ctrl.autoRepeat);
- else
-#endif
- (*keybd->kbdfeed->CtrlProc)(keybd, &keybd->kbdfeed->ctrl);
+ XkbSetRepeatKeys(keybd, key, keybd->kbdfeed->ctrl.autoRepeat);
return Success;
@@ -2275,14 +2220,8 @@ ProcBell(ClientPtr client)
rc = XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixBellAccess);
if (rc != Success)
return rc;
-#ifdef XKB
- if (!noXkbExtension)
- XkbHandleBell(FALSE, FALSE, keybd, newpercent,
- &keybd->kbdfeed->ctrl, 0, None, NULL, client);
- else
-#endif
- (*keybd->kbdfeed->BellProc)(newpercent, keybd,
- &keybd->kbdfeed->ctrl, 0);
+ XkbHandleBell(FALSE, FALSE, keybd, newpercent,
+ &keybd->kbdfeed->ctrl, 0, None, NULL, client);
}
}
@@ -2633,15 +2572,9 @@ AllocMasterDevice(ClientPtr client, char* name, DeviceIntPtr* ptr, DeviceIntPtr*
strcpy(pointer->name, name);
strcat(pointer->name, " pointer");
-#ifdef XKB
pointer->public.processInputProc = ProcessOtherEvent;
pointer->public.realInputProc = ProcessOtherEvent;
- if (!noXkbExtension)
- XkbSetExtension(pointer, ProcessPointerEvent);
-#else
- pointer->public.processInputProc = ProcessPointerEvent;
- pointer->public.realInputProc = ProcessPointerEvent;
-#endif
+ XkbSetExtension(pointer, ProcessPointerEvent);
pointer->deviceGrab.ActivateGrab = ActivatePointerGrab;
pointer->deviceGrab.DeactivateGrab = DeactivatePointerGrab;
pointer->coreEvents = TRUE;
@@ -2661,15 +2594,9 @@ AllocMasterDevice(ClientPtr client, char* name, DeviceIntPtr* ptr, DeviceIntPtr*
strcpy(keyboard->name, name);
strcat(keyboard->name, " keyboard");
-#ifdef XKB
keyboard->public.processInputProc = ProcessOtherEvent;
keyboard->public.realInputProc = ProcessOtherEvent;
- if (!noXkbExtension)
- XkbSetExtension(keyboard, ProcessKeyboardEvent);
-#else
- keyboard->public.processInputProc = ProcessKeyboardEvent;
- keyboard->public.realInputProc = ProcessKeyboardEvent;
-#endif
+ XkbSetExtension(keyboard, ProcessKeyboardEvent);
keyboard->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
keyboard->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
keyboard->coreEvents = TRUE;
diff --git a/dix/dispatch.c b/dix/dispatch.c
index ee105f8..09fd3af 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -136,13 +136,8 @@ int ProcInitialConnection();
#endif
#include "privates.h"
#include "xace.h"
-#ifdef XKB
-#ifndef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#endif
#include "inputstr.h"
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
#ifdef XSERVER_DTRACE
#include "registry.h"
@@ -3478,15 +3473,11 @@ void InitClient(ClientPtr client, int i, pointer ospriv)
client->priority = 0;
client->clientState = ClientStateInitial;
client->devPrivates = NULL;
-#ifdef XKB
- if (!noXkbExtension) {
- client->xkbClientFlags = 0;
- client->mapNotifyMask = 0;
- client->newKeyboardNotifyMask = 0;
- client->vMinor = client->vMajor = 0;
- QueryMinMaxKeyCodes(&client->minKC,&client->maxKC);
- }
-#endif
+ client->xkbClientFlags = 0;
+ client->mapNotifyMask = 0;
+ client->newKeyboardNotifyMask = 0;
+ client->vMinor = client->vMajor = 0;
+ QueryMinMaxKeyCodes(&client->minKC,&client->maxKC);
client->replyBytesRemaining = 0;
client->fontResFunc = NULL;
client->smart_priority = 0;
diff --git a/dix/events.c b/dix/events.c
index a1aec2f..95bb3e9 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -133,11 +133,10 @@ of the copyright holder.
#endif
#include "globals.h"
-#ifdef XKB
#include <X11/extensions/XKBproto.h>
-#include <xkbsrv.h>
+#include "xkbsrv.h"
+/* XKB FIXME: why is this here? */
extern Bool XkbFilterEvents(ClientPtr, int, xEvent *);
-#endif
#include "xace.h"
@@ -1078,12 +1077,10 @@ EnqueueEvent(xEvent *xE, DeviceIntPtr device, int count)
NoticeTime(xE);
-#ifdef XKB
/* Fix for key repeating bug. */
if (device->key != NULL && device->key->xkbInfo != NULL &&
xE->u.u.type == KeyRelease)
AccessXCancelRepeatKey(device->key->xkbInfo, xE->u.u.detail);
-#endif
if (DeviceEventCallback)
{
@@ -2116,11 +2113,8 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
pDev->valuator->motionHintWindow = pWin;
else
{
- if (((type == DeviceMotionNotify)
-#ifdef XKB
- || (type == DeviceButtonPress)
-#endif
- ) && deliveries)
+ if ((type == DeviceMotionNotify || type == DeviceButtonPress) &&
+ deliveries)
CheckDeviceGrabAndHintWindow (pWin, type,
(deviceKeyButtonPointer*) pEvents,
grab, client, deliveryMask);
@@ -3246,7 +3240,6 @@ CheckPassiveGrabsOnWindow(
tempGrab.next = NULL;
for (; grab; grab = grab->next)
{
-#ifdef XKB
DeviceIntPtr gdev;
XkbSrvInfoPtr xkbi = NULL;
@@ -3260,40 +3253,16 @@ CheckPassiveGrabsOnWindow(
}
if (gdev && gdev->key)
xkbi= gdev->key->xkbInfo;
-#endif
tempGrab.modifierDevice = grab->modifierDevice;
- if ((device == grab->modifierDevice) &&
- ((xE->u.u.type == KeyPress) || (xE->u.u.type == DeviceKeyPress)))
- tempGrab.modifiersDetail.exact =
-#ifdef XKB
- (noXkbExtension) ?
- ((gdev) ? gdev->key->prev_state : 0) :
- ((xkbi) ? xkbi->state.grab_mods : 0);
-#else
- (gdev) ? gdev->key->prev_state : 0;
-#endif
- else
- tempGrab.modifiersDetail.exact =
-#ifdef XKB
- (noXkbExtension) ?
- ((gdev) ? gdev->key->state : 0) :
- ((xkbi) ? xkbi->state.grab_mods : 0);
-#else
- (gdev) ? gdev->key->state : 0;
-#endif
- /* ignore the device for core events when comparing grabs */
+ tempGrab.modifiersDetail.exact = xkbi ? xkbi->state.grab_mods : 0;
+ /* ignore the device for core events when comparing grabs */
if (GrabMatchesSecond(&tempGrab, grab, (xE->u.u.type < LASTEvent)) &&
(!grab->confineTo ||
(grab->confineTo->realized &&
BorderSizeNotEmpty(device, grab->confineTo))))
{
-#ifdef XKB
- if (!noXkbExtension) {
- XE_KBPTR.state &= 0x1f00;
- XE_KBPTR.state |=
- tempGrab.modifiersDetail.exact&(~0x1f00);
- }
-#endif
+ XE_KBPTR.state &= 0x1f00;
+ XE_KBPTR.state |= tempGrab.modifiersDetail.exact&(~0x1f00);
grabinfo = &device->deviceGrab;
/* A passive grab may have been created for a different device
than it is assigned to at this point in time.
@@ -3690,11 +3659,7 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
* @param count Number of elements in xE.
*/
void
-#ifdef XKB
CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
-#else
-ProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
-#endif
{
int key, bit;
BYTE *kptr;
@@ -3765,7 +3730,6 @@ ProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
XaceHook(XACE_KEY_AVAIL, xE, keybd, count);
}
-#ifdef XKB
/* This function is used to set the key pressed or key released state -
this is only used when the pressing of keys does not cause
the device's processInputProc to be called, as in for example Mouse Keys.
@@ -3795,7 +3759,6 @@ FixKeyState (xEvent *xE, DeviceIntPtr keybd)
else
FatalError("Impossible keyboard event");
}
-#endif
/**
* Main pointer event processing function for core pointer events.
@@ -3810,32 +3773,18 @@ FixKeyState (xEvent *xE, DeviceIntPtr keybd)
* @param count Number of elements in xE.
*/
void
-#ifdef XKB
CoreProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count)
-#else
-ProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count)
-#endif
{
GrabPtr grab = mouse->deviceGrab.grab;
Bool deactivateGrab = FALSE;
ButtonClassPtr butc = mouse->button;
SpritePtr pSprite = mouse->spriteInfo->sprite;
-#ifdef XKB
XkbSrvInfoPtr xkbi= GetPairedDevice(mouse)->key->xkbInfo;
-#endif
if (!syncEvents.playingEvents)
NoticeTime(xE)
- XE_KBPTR.state = (butc->state | (
-#ifdef XKB
- (noXkbExtension ?
- inputInfo.keyboard->key->state :
- xkbi->state.grab_mods)
-#else
- inputInfo.keyboard->key->state
-#endif
- ));
+ XE_KBPTR.state = (butc->state | xkbi->state.grab_mods);
{
NoticeTime(xE);
if (DeviceEventCallback)
@@ -4171,18 +4120,10 @@ CoreEnterLeaveEvent(
event.u.enterLeave.child = child;
event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
ELFlagSameScreen : 0;
-#ifdef XKB
- if (!noXkbExtension) {
- event.u.enterLeave.state = mouse->button->state & 0x1f00;
- if (keybd)
- event.u.enterLeave.state |=
+ event.u.enterLeave.state = mouse->button->state & 0x1f00;
+ if (keybd)
+ event.u.enterLeave.state |=
XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
- } else
-#endif
- {
- event.u.enterLeave.state = (keybd) ? keybd->key->state : 0;
- event.u.enterLeave.state |= mouse->button->state;
- }
event.u.enterLeave.mode = mode;
focus = (keybd) ? keybd->focus->win : None;
if ((focus != NoneWin) &&
@@ -4262,18 +4203,9 @@ DeviceEnterLeaveEvent(
devEnterLeave->mode = mode;
devEnterLeave->mode |= (sameScreen ? (ELFlagSameScreen << 4) : 0);
-#ifdef XKB
- if (!noXkbExtension) {
- devEnterLeave->state = mouse->button->state & 0x1f00;
- if (keybd)
- devEnterLeave->state |=
- XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
- } else
-#endif
- {
- devEnterLeave->state = (keybd) ? keybd->key->state : 0;
- devEnterLeave->state |= mouse->button->state;
- }
+ devEnterLeave->state = mouse->button->state & 0x1f00;
+ if (keybd)
+ devEnterLeave->state |= XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
mskidx = mouse->id;
inputMasks = wOtherInputMasks(pWin);
@@ -5540,10 +5472,8 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
int i,
eventlength = sizeof(xEvent);
-#ifdef XKB
- if ((!noXkbExtension)&&(!XkbFilterEvents(pClient, count, events)))
+ if (!XkbFilterEvents(pClient, count, events))
return;
-#endif
#ifdef PANORAMIX
if(!noPanoramiXExtension &&
diff --git a/dix/getevents.c b/dix/getevents.c
index 44636d7..112bb10 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -42,10 +42,8 @@
#include "dixevents.h"
#include "mipointer.h"
-#ifdef XKB
#include <X11/extensions/XKBproto.h>
#include "xkbsrv.h"
-#endif
#ifdef PANORAMIX
#include "panoramiX.h"
@@ -454,15 +452,9 @@ updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator,
*/
int
GetMaximumEventsNum(void) {
- /* One base event -- device, plus valuator events.
- * Multiply by two if we're doing non-XKB key repeats. */
+ /* One base event -- device, plus valuator events. */
int ret = 1 + MAX_VALUATOR_EVENTS;
-#ifdef XKB
- if (noXkbExtension)
-#endif
- ret *= 2;
-
/* One possible DeviceClassesChangedEvent */
ret++;
@@ -814,25 +806,7 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
numEvents += countValuatorEvents(num_valuators);
-#ifdef XKB
- if (noXkbExtension)
-#endif
- {
- switch (sym) {
- case XK_Num_Lock:
- case XK_Caps_Lock:
- case XK_Scroll_Lock:
- case XK_Shift_Lock:
- if (type == KeyRelease)
- return 0;
- else if (type == KeyPress && key_is_down(pDev, key_code))
- type = KeyRelease;
- }
- }
-
- /* Handle core repeating, via press/release/press/release.
- * FIXME: In theory, if you're repeating with two keyboards in non-XKB,
- * you could get unbalanced events here. */
+ /* Handle core repeating, via press/release/press/release. */
if (type == KeyPress && key_is_down(pDev, key_code)) {
/* If autorepeating is disabled either globally or just for that key,
* or we have a modifier, don't generate a repeat event. */
@@ -840,17 +814,6 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
!key_autorepeats(pDev, key_code) ||
pDev->key->modifierMap[key_code])
return 0;
-
-#ifdef XKB
- if (noXkbExtension)
-#endif
- {
- numEvents += GetKeyboardValuatorEvents(events, pDev,
- KeyRelease, key_code,
- first_valuator, num_valuators,
- valuators);
- events += numEvents;
- }
}
ms = GetTimeInMillis();
diff --git a/hw/dmx/dmxclient.h b/hw/dmx/dmxclient.h
index f0c3608..147d14e 100644
--- a/hw/dmx/dmxclient.h
+++ b/hw/dmx/dmxclient.h
@@ -91,10 +91,8 @@ typedef XID KeySym64;
#undef PictFormatType
#endif
-#ifdef XKB
#include <X11/extensions/XKB.h>
-#include <X11/extensions/XKBstr.h>
-#endif
+#include "xkbstr.h"
#include <X11/extensions/XI.h>
@@ -134,14 +132,9 @@ extern int ChangeDeviceNotify;
/* Some protocol gets included last, after undefines. */
#include <X11/XKBlib.h>
-#ifdef XKB
#include <X11/extensions/XKBproto.h>
-#ifndef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#endif
-#include <xkbsrv.h>
+#include "xkbstr.h"
#undef XPointer
-#endif
#include <X11/extensions/XIproto.h>
#endif
diff --git a/hw/dmx/input/dmxcommon.c b/hw/dmx/input/dmxcommon.c
index e77bb79..2bffb17 100644
--- a/hw/dmx/input/dmxcommon.c
+++ b/hw/dmx/input/dmxcommon.c
@@ -258,7 +258,6 @@ void dmxCommonKbdGetMap(DevicePtr pDev, KeySymsPtr pKeySyms, CARD8 *pModMap)
* specified \a pDev. */
void dmxCommonKbdGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info)
{
-#ifdef XKB
GETPRIVFROMPDEV;
GETDMXINPUTFROMPRIV;
char *pt;
@@ -284,7 +283,6 @@ void dmxCommonKbdGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info)
if ((pt = strchr(info->names.keycodes, '+'))) *pt = '\0';
}
dmxCommonRestoreState(priv);
-#endif
}
/** Turn \a pDev on (i.e., take input from \a pDev). */
@@ -577,7 +575,6 @@ void dmxCommonSaveState(pointer private)
if (dmxInput->console) priv = dmxInput->devs[0]->private;
if (!priv->display || priv->stateSaved) return;
DMXDBG0("dmxCommonSaveState\n");
-#ifdef XKB
if (dmxUseXKB && (priv->xkb = XkbAllocKeyboard())) {
if (XkbGetIndicatorMap(priv->display, XkbAllIndicatorsMask, priv->xkb)
|| XkbGetNames(priv->display, XkbAllNamesMask, priv->xkb)) {
@@ -596,7 +593,6 @@ void dmxCommonSaveState(pointer private)
}
}
}
-#endif
XGetKeyboardControl(priv->display, &ks);
priv->savedKctrl.click = ks.key_click_percent;
@@ -636,14 +632,12 @@ void dmxCommonRestoreState(pointer private)
priv->stateSaved = 0;
DMXDBG0("dmxCommonRestoreState\n");
-#ifdef XKB
if (priv->xkb) {
*priv->xkb->indicators = priv->savedIndicators;
XkbSetIndicatorMap(priv->display, ~0, priv->xkb);
XkbFreeKeyboard(priv->xkb, 0, True);
priv->xkb = 0;
}
-#endif
for (start = GetTimeInMillis(); GetTimeInMillis() - start < 5000;) {
CARD32 tmp;
diff --git a/hw/dmx/input/dmxcommon.h b/hw/dmx/input/dmxcommon.h
index a9b260c..68f2b52 100644
--- a/hw/dmx/input/dmxcommon.h
+++ b/hw/dmx/input/dmxcommon.h
@@ -54,14 +54,10 @@
XModifierKeymap *savedModMap; \
int stateSaved
-#ifdef XKB
#define DMX_COMMON_XKB \
DMX_COMMON_OTHER; \
XkbDescPtr xkb; \
XkbIndicatorRec savedIndicators
-#else
-#define DMX_COMMON_XKB DMX_COMMON_OTHER
-#endif
#define DMX_COMMON_PRIVATE \
DMX_COMMON_XKB; \
diff --git a/hw/dmx/input/dmxdummy.c b/hw/dmx/input/dmxdummy.c
index 2afe258..971892b 100644
--- a/hw/dmx/input/dmxdummy.c
+++ b/hw/dmx/input/dmxdummy.c
@@ -60,9 +60,7 @@ void dmxDummyKbdGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info)
info->freemap = 0;
info->focusClass = 1;
info->kbdFeedbackClass = 1;
-#ifdef XKB
info->force = 1;
-#endif
}
/** Return information about the dummy mouse device specified in \a pDev
diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index a0eb80f..bce886f 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -306,15 +306,13 @@ static void _dmxKeyboardKbdCtrlProc(DMXLocalInputInfoPtr dmxLocal,
dmxLocal->kctrl = *ctrl;
if (dmxLocal->kCtrl) {
dmxLocal->kCtrl(&dmxLocal->pDevice->public, ctrl);
-#ifdef XKB
- if (!noXkbExtension && dmxLocal->pDevice->kbdfeed) {
+ if (dmxLocal->pDevice->kbdfeed) {
XkbEventCauseRec cause;
XkbSetCauseUnknown(&cause);
/* Generate XKB events, as necessary */
XkbUpdateIndicators(dmxLocal->pDevice, XkbAllIndicatorsMask, False,
NULL, &cause);
}
-#endif
}
}
@@ -370,7 +368,6 @@ void dmxKeyboardBellProc(int percent, DeviceIntPtr pDevice,
}
}
-#ifdef XKB
static void dmxKeyboardFreeNames(XkbComponentNamesPtr names)
{
if (names->keymap) XFree(names->keymap);
@@ -380,76 +377,61 @@ static void dmxKeyboardFreeNames(XkbComponentNamesPtr names)
if (names->symbols) XFree(names->symbols);
if (names->geometry) XFree(names->geometry);
}
-#endif
static int dmxKeyboardOn(DeviceIntPtr pDevice, DMXLocalInitInfo *info)
{
-#ifdef XKB
GETDMXINPUTFROMPDEVICE;
-#else
- DevicePtr pDev = &pDevice->public;
-#endif
-#ifdef XKB
- if (noXkbExtension) {
-#endif
- if (!InitKeyboardDeviceStruct(pDev, &info->keySyms, info->modMap,
- dmxKeyboardBellProc,
- dmxKeyboardKbdCtrlProc))
- return BadImplementation;
-#ifdef XKB
+ XkbSetRulesDflts(dmxConfigGetXkbRules(),
+ dmxConfigGetXkbModel(),
+ dmxConfigGetXkbLayout(),
+ dmxConfigGetXkbVariant(),
+ dmxConfigGetXkbOptions());
+ if (!info->force && (dmxInput->keycodes
+ || dmxInput->symbols
+ || dmxInput->geometry)) {
+ if (info->freenames) dmxKeyboardFreeNames(&info->names);
+ info->freenames = 0;
+ info->names.keycodes = dmxInput->keycodes;
+ info->names.types = NULL;
+ info->names.compat = NULL;
+ info->names.symbols = dmxInput->symbols;
+ info->names.geometry = dmxInput->geometry;
+
+ dmxLogInput(dmxInput, "XKEYBOARD: From command line: %s",
+ info->names.keycodes);
+ if (info->names.symbols && *info->names.symbols)
+ dmxLogInputCont(dmxInput, " %s", info->names.symbols);
+ if (info->names.geometry && *info->names.geometry)
+ dmxLogInputCont(dmxInput, " %s", info->names.geometry);
+ dmxLogInputCont(dmxInput, "\n");
+ } else if (info->names.keycodes) {
+ dmxLogInput(dmxInput, "XKEYBOARD: From device: %s",
+ info->names.keycodes);
+ if (info->names.symbols && *info->names.symbols)
+ dmxLogInputCont(dmxInput, " %s", info->names.symbols);
+ if (info->names.geometry && *info->names.geometry)
+ dmxLogInputCont(dmxInput, " %s", info->names.geometry);
+ dmxLogInputCont(dmxInput, "\n");
} else {
- XkbSetRulesDflts(dmxConfigGetXkbRules(),
- dmxConfigGetXkbModel(),
- dmxConfigGetXkbLayout(),
- dmxConfigGetXkbVariant(),
- dmxConfigGetXkbOptions());
- if (!info->force && (dmxInput->keycodes
- || dmxInput->symbols
- || dmxInput->geometry)) {
- if (info->freenames) dmxKeyboardFreeNames(&info->names);
- info->freenames = 0;
- info->names.keycodes = dmxInput->keycodes;
- info->names.types = NULL;
- info->names.compat = NULL;
- info->names.symbols = dmxInput->symbols;
- info->names.geometry = dmxInput->geometry;
-
- dmxLogInput(dmxInput, "XKEYBOARD: From command line: %s",
- info->names.keycodes);
- if (info->names.symbols && *info->names.symbols)
- dmxLogInputCont(dmxInput, " %s", info->names.symbols);
- if (info->names.geometry && *info->names.geometry)
- dmxLogInputCont(dmxInput, " %s", info->names.geometry);
- dmxLogInputCont(dmxInput, "\n");
- } else if (info->names.keycodes) {
- dmxLogInput(dmxInput, "XKEYBOARD: From device: %s",
- info->names.keycodes);
- if (info->names.symbols && *info->names.symbols)
- dmxLogInputCont(dmxInput, " %s", info->names.symbols);
- if (info->names.geometry && *info->names.geometry)
- dmxLogInputCont(dmxInput, " %s", info->names.geometry);
- dmxLogInputCont(dmxInput, "\n");
- } else {
- dmxLogInput(dmxInput, "XKEYBOARD: Defaults: %s %s %s %s %s\n",
- dmxConfigGetXkbRules(),
- dmxConfigGetXkbLayout(),
- dmxConfigGetXkbModel(),
- dmxConfigGetXkbVariant()
- ? dmxConfigGetXkbVariant() : "",
- dmxConfigGetXkbOptions()
- ? dmxConfigGetXkbOptions() : "");
- }
- XkbInitKeyboardDeviceStruct(pDevice,
- &info->names,
- &info->keySyms,
- info->modMap,
- dmxKeyboardBellProc,
- dmxKeyboardKbdCtrlProc);
+ dmxLogInput(dmxInput, "XKEYBOARD: Defaults: %s %s %s %s %s\n",
+ dmxConfigGetXkbRules(),
+ dmxConfigGetXkbLayout(),
+ dmxConfigGetXkbModel(),
+ dmxConfigGetXkbVariant()
+ ? dmxConfigGetXkbVariant() : "",
+ dmxConfigGetXkbOptions()
+ ? dmxConfigGetXkbOptions() : "");
}
+ XkbInitKeyboardDeviceStruct(pDevice,
+ &info->names,
+ &info->keySyms,
+ info->modMap,
+ dmxKeyboardBellProc,
+ dmxKeyboardKbdCtrlProc);
+
if (info->freenames) dmxKeyboardFreeNames(&info->names);
-#endif
return Success;
}
@@ -552,9 +534,7 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
XFree(info.keySyms.map);
info.keySyms.map = NULL;
}
-#ifdef XKB
if (info.xkb) XkbFreeKeyboard(info.xkb, 0, True);
-#endif
return Success;
}
diff --git a/hw/dmx/input/dmxinputinit.h b/hw/dmx/input/dmxinputinit.h
index 6f491ed..2e625cf 100644
--- a/hw/dmx/input/dmxinputinit.h
+++ b/hw/dmx/input/dmxinputinit.h
@@ -87,12 +87,10 @@ typedef struct _DMXLocalInitInfo {
KeySymsRec keySyms; /**< Key symbols */
int freemap; /**< If non-zero, free keySyms.map */
CARD8 modMap[MAP_LENGTH]; /**< Modifier map */
-#ifdef XKB
XkbDescPtr xkb; /**< XKB description */
XkbComponentNamesRec names; /**< XKB component names */
int freenames; /**< Non-zero if names should be free'd */
int force; /**< Do not allow command line override */
-#endif
int buttonClass; /**< Non-zero if buttons are present */
int numButtons; /**< Number of buttons */
diff --git a/hw/dmx/input/usb-keyboard.c b/hw/dmx/input/usb-keyboard.c
index efec270..455513d 100644
--- a/hw/dmx/input/usb-keyboard.c
+++ b/hw/dmx/input/usb-keyboard.c
@@ -434,8 +434,6 @@ void kbdUSBGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info)
kbdUSBGetMap(pDev, &info->keySyms, info->modMap);
info->focusClass = 1;
info->kbdFeedbackClass = 1;
-#ifdef XKB
info->names.keycodes = xstrdup("powerpcps2");
info->force = 1;
-#endif
}
diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c
index ae981b7..d36c31d 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 4b95669..7746484 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 816e933..670cc37 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);
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index bb67898..8df9780 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -65,11 +65,7 @@
#include "xf86Xinput.h"
extern DeviceAssocRec mouse_assoc;
-#ifdef XKB
-#undef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
#ifdef RENDER
#include "picture.h"
@@ -697,7 +693,6 @@ typedef enum {
FLAG_ALLOWNONLOCAL,
FLAG_ALLOWMOUSEOPENFAIL,
FLAG_VTSYSREQ,
- FLAG_XKBDISABLE,
FLAG_SAVER_BLANKTIME,
FLAG_DPMS_STANDBYTIME,
FLAG_DPMS_SUSPENDTIME,
@@ -736,8 +731,6 @@ static OptionInfoRec FlagOptions[] = {
{0}, FALSE },
{ FLAG_VTSYSREQ, "VTSysReq", OPTV_BOOLEAN,
{0}, FALSE },
- { FLAG_XKBDISABLE, "XkbDisable", OPTV_BOOLEAN,
- {0}, FALSE },
{ FLAG_SAVER_BLANKTIME, "BlankTime" , OPTV_INTEGER,
{0}, FALSE },
{ FLAG_DPMS_STANDBYTIME, "StandbyTime", OPTV_INTEGER,
@@ -887,16 +880,6 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
#endif
}
- if (xf86GetOptValBool(FlagOptions, FLAG_XKBDISABLE, &value)) {
-#ifdef XKB
- noXkbExtension = value;
- xf86Msg(X_CONFIG, "Xkb %s\n", value ? "disabled" : "enabled");
-#else
- if (!value)
- xf86Msg(X_WARNING, "Xserver doesn't support XKB\n");
-#endif
- }
-
xf86Info.pmFlag = TRUE;
if (xf86GetOptValBool(FlagOptions, FLAG_NOPM, &value))
xf86Info.pmFlag = !value;
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 9c701c5..b7036cd 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -42,9 +42,7 @@
#include "globals.h"
#include "servermd.h"
#include "micmap.h"
-#ifdef XKB
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
#include "xf86Xinput.h"
#include "exglobals.h"
#include "exevents.h"
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index d5d06ad..46b102b 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -379,10 +379,7 @@ xf86ActivateDevice(LocalDevicePtr local)
}
RegisterOtherDevice(dev);
-#ifdef XKB
- if (!noXkbExtension)
- XkbSetExtension(dev, ProcessKeyboardEvent);
-#endif
+ XkbSetExtension(dev, ProcessKeyboardEvent);
if (serverGeneration == 1)
xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n",
diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c
index cedaa7a..35be521 100644
--- a/hw/xnest/Keyboard.c
+++ b/hw/xnest/Keyboard.c
@@ -33,9 +33,8 @@ is" without express or implied warranty.
#include "Args.h"
#include "Events.h"
-#ifdef XKB
#include <X11/extensions/XKB.h>
-#include <xkbsrv.h>
+#include "xkbsrv.h"
#include <X11/extensions/XKBconfig.h>
extern Bool
@@ -59,7 +58,6 @@ extern Status XkbGetControls(
unsigned long /* which */,
XkbDescPtr /* desc */
);
-#endif
DeviceIntPtr xnestKeyboardDevice = NULL;
@@ -124,6 +122,10 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
CARD8 modmap[MAP_LENGTH];
int i, j;
XKeyboardState values;
+ XkbComponentNamesRec names;
+ XkbDescPtr xkb;
+ char *rules, *model, *layout, *variants, *options;
+ int op, event, error, major, minor;
switch (onoff)
{
@@ -168,50 +170,29 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
keySyms.mapWidth = mapWidth;
keySyms.map = keymap;
-#ifdef XKB
- if (noXkbExtension) {
-XkbError:
-#endif
- XGetKeyboardControl(xnestDisplay, &values);
-
- memmove((char *) defaultKeyboardControl.autoRepeats,
- (char *) values.auto_repeats, sizeof(values.auto_repeats));
-
- InitKeyboardDeviceStruct(&pDev->public, &keySyms, modmap,
- xnestBell, xnestChangeKeyboardControl);
-#ifdef XKB
- } else {
- XkbComponentNamesRec names;
- char *rules, *model, *layout, *variants, *options;
-
- XkbDescPtr xkb;
- int op, event, error, major, minor;
-
- if (XkbQueryExtension(xnestDisplay, &op, &event, &error, &major, &minor) == 0) {
- ErrorF("Unable to initialize XKEYBOARD extension.\n");
+ if (XkbQueryExtension(xnestDisplay, &op, &event, &error, &major, &minor) == 0) {
+ ErrorF("Unable to initialize XKEYBOARD extension.\n");
goto XkbError;
- }
- xkb = XkbGetKeyboard(xnestDisplay, XkbGBN_AllComponentsMask, XkbUseCoreKbd);
- if (xkb == NULL || xkb->geom == NULL) {
+ }
+ xkb = XkbGetKeyboard(xnestDisplay, XkbGBN_AllComponentsMask, XkbUseCoreKbd);
+ if (xkb == NULL || xkb->geom == NULL) {
ErrorF("Couldn't get keyboard.\n");
- goto XkbError;
- }
- XkbGetControls(xnestDisplay, XkbAllControlsMask, xkb);
+ goto XkbError;
+ }
+ XkbGetControls(xnestDisplay, XkbAllControlsMask, xkb);
- memset(&names, 0, sizeof(XkbComponentNamesRec));
- rules = XKB_DFLT_RULES;
- model = XKB_DFLT_MODEL;
- layout = XKB_DFLT_LAYOUT;
- variants = XKB_DFLT_VARIANT;
- options = XKB_DFLT_OPTIONS;
+ memset(&names, 0, sizeof(XkbComponentNamesRec));
+ rules = XKB_DFLT_RULES;
+ model = XKB_DFLT_MODEL;
+ layout = XKB_DFLT_LAYOUT;
+ variants = XKB_DFLT_VARIANT;
+ options = XKB_DFLT_OPTIONS;
- XkbSetRulesDflts(rules, model, layout, variants, options);
- XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modmap,
+ XkbSetRulesDflts(rules, model, layout, variants, options);
+ XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modmap,
xnestBell, xnestChangeKeyboardControl);
- XkbDDXChangeControls(pDev, xkb->ctrls, xkb->ctrls);
- XkbFreeKeyboard(xkb, 0, False);
- }
-#endif
+ XkbDDXChangeControls(pDev, xkb->ctrls, xkb->ctrls);
+ XkbFreeKeyboard(xkb, 0, False);
xfree(keymap);
break;
case DEVICE_ON:
@@ -228,6 +209,17 @@ XkbError:
break;
}
return Success;
+
+XkbError:
+ XGetKeyboardControl(xnestDisplay, &values);
+ memmove((char *)defaultKeyboardControl.autoRepeats,
+ (char *)values.auto_repeats,
+ sizeof(values.auto_repeats));
+
+ InitKeyboardDeviceStruct(&pDev->public, &keySyms,
+ xnestBell, xnestChangeKeyboardControl);
+ xfree(keymap);
+ return Success;
}
Bool
diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
index 291593b..1b37bb7 100644
--- a/hw/xwin/InitOutput.c
+++ b/hw/xwin/InitOutput.c
@@ -42,8 +42,8 @@ from The Open Group.
#ifdef __CYGWIN__
#include <mntent.h>
#endif
-#if defined(XKB) && defined(WIN32)
-#include <xkbsrv.h>
+#if defined(WIN32)
+#include "xkbsrv.h"
#endif
#ifdef RELOCATE_PROJECTROOT
#include <shlobj.h>
@@ -667,7 +667,6 @@ winFixupPaths (void)
winMsg (X_DEFAULT, "Logfile set to \"%s\"\n", g_pszLogFile);
}
}
-#ifdef XKB
{
static char xkbbasedir[MAX_PATH];
@@ -677,7 +676,6 @@ winFixupPaths (void)
XkbBaseDirectory = xkbbasedir;
XkbBinDirectory = basedir;
}
-#endif /* XKB */
#endif /* RELOCATE_PROJECTROOT */
}
@@ -857,7 +855,6 @@ winUseMsg (void)
"\tSpecify a keyboard device from the configuration file.\n");
#endif
-#ifdef XKB
ErrorF ("-xkbrules XKBRules\n"
"\tEquivalent to XKBRules in XF86Config files.\n");
@@ -874,7 +871,6 @@ winUseMsg (void)
ErrorF ("-xkboptions XKBOptions\n"
"\tEquivalent to XKBOptions in XF86Config files.\n");
-#endif
ErrorF ("-logfile filename\n"
"\tWrite logmessages to <filename> instead of /tmp/Xwin.log.\n");
diff --git a/hw/xwin/winconfig.c b/hw/xwin/winconfig.c
index 38966bf..5f5b482 100644
--- a/hw/xwin/winconfig.c
+++ b/hw/xwin/winconfig.c
@@ -36,12 +36,7 @@
#include "winmsg.h"
#include "globals.h"
-#ifdef XKB
-#ifndef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#endif
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
#ifdef XWIN_XF86CONFIG
#ifndef CONFIGPATH
@@ -67,15 +62,11 @@ WinCmdlineRec g_cmdline = {
#ifdef XWIN_XF86CONFIG
NULL, /* keyboard */
#endif
-#ifdef XKB
- FALSE, /* noXkbExtension */
- NULL, /* xkbMap */
NULL, /* xkbRules */
NULL, /* xkbModel */
NULL, /* xkbLayout */
NULL, /* xkbVariant */
NULL, /* xkbOptions */
-#endif
NULL, /* screenname */
NULL, /* mousename */
FALSE, /* emulate3Buttons */
@@ -87,7 +78,6 @@ winInfoRec g_winInfo = {
0, /* leds */
500, /* delay */
30 /* rate */
-#ifdef XKB
}
,
{ /* xkb */
@@ -97,14 +87,6 @@ winInfoRec g_winInfo = {
NULL, /* layout */
NULL, /* variant */
NULL, /* options */
- NULL, /* initialMap */
- NULL, /* keymap */
- NULL, /* types */
- NULL, /* compat */
- NULL, /* keycodes */
- NULL, /* symbols */
- NULL /* geometry */
-#endif
}
,
{
@@ -228,11 +210,9 @@ winReadConfigfile ()
Bool
winConfigKeyboard (DeviceIntPtr pDevice)
{
-#ifdef XKB
char layoutName[KL_NAMELENGTH];
static unsigned int layoutNum = 0;
int keyboardType;
-#endif
#ifdef XWIN_XF86CONFIG
XF86ConfInputPtr kbd = NULL;
XF86ConfInputPtr input_list = NULL;
@@ -242,7 +222,6 @@ winConfigKeyboard (DeviceIntPtr pDevice)
char *s = NULL;
/* Setup defaults */
-#ifdef XKB
g_winInfo.xkb.disable = FALSE;
# ifdef PC98 /* japanese */ /* not implemented */
g_winInfo.xkb.rules = "xfree98";
@@ -358,15 +337,6 @@ winConfigKeyboard (DeviceIntPtr pDevice)
}
}
- g_winInfo.xkb.initialMap = NULL;
- g_winInfo.xkb.keymap = NULL;
- g_winInfo.xkb.types = NULL;
- g_winInfo.xkb.compat = NULL;
- g_winInfo.xkb.keycodes = NULL;
- g_winInfo.xkb.symbols = NULL;
- g_winInfo.xkb.geometry = NULL;
-#endif /* XKB */
-
/* parse the configuration */
#ifdef XWIN_XF86CONFIG
if (g_cmdline.keyboard)
@@ -418,168 +388,101 @@ winConfigKeyboard (DeviceIntPtr pDevice)
}
#endif
-#ifdef XKB
- from = X_DEFAULT;
- if (g_cmdline.noXkbExtension)
- {
- from = X_CMDLINE;
- g_winInfo.xkb.disable = TRUE;
- }
-#ifdef XWIN_XF86CONFIG
- else if (kbd->inp_option_lst)
- {
- int b = winSetBoolOption (kbd->inp_option_lst, "XkbDisable", FALSE);
- if (b)
- {
- from = X_CONFIG;
- g_winInfo.xkb.disable = TRUE;
- }
- }
-#endif
- if (g_winInfo.xkb.disable)
- {
- winMsg (from, "XkbExtension disabled\n");
- }
- else
- {
- s = NULL;
- if (g_cmdline.xkbRules)
- {
- s = g_cmdline.xkbRules;
- from = X_CMDLINE;
- }
+ s = NULL;
+ if (g_cmdline.xkbRules)
+ {
+ s = g_cmdline.xkbRules;
+ from = X_CMDLINE;
+ }
#ifdef XWIN_XF86CONFIG
- else
- {
- s = winSetStrOption (kbd->inp_option_lst, "XkbRules", NULL);
- from = X_CONFIG;
- }
+ else
+ {
+ s = winSetStrOption (kbd->inp_option_lst, "XkbRules", NULL);
+ from = X_CONFIG;
+ }
#endif
- if (s)
- {
- g_winInfo.xkb.rules = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: rules: \"%s\"\n", s);
- }
+ if (s)
+ {
+ g_winInfo.xkb.rules = NULL_IF_EMPTY (s);
+ winMsg (from, "XKB: rules: \"%s\"\n", s);
+ }
- s = NULL;
- if (g_cmdline.xkbModel)
- {
- s = g_cmdline.xkbModel;
- from = X_CMDLINE;
- }
+ s = NULL;
+ if (g_cmdline.xkbModel)
+ {
+ s = g_cmdline.xkbModel;
+ from = X_CMDLINE;
+ }
#ifdef XWIN_XF86CONFIG
- else
- {
- s = winSetStrOption (kbd->inp_option_lst, "XkbModel", NULL);
- from = X_CONFIG;
- }
+ else
+ {
+ s = winSetStrOption (kbd->inp_option_lst, "XkbModel", NULL);
+ from = X_CONFIG;
+ }
#endif
- if (s)
- {
- g_winInfo.xkb.model = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: model: \"%s\"\n", s);
- }
+ if (s)
+ {
+ g_winInfo.xkb.model = NULL_IF_EMPTY (s);
+ winMsg (from, "XKB: model: \"%s\"\n", s);
+ }
- s = NULL;
- if (g_cmdline.xkbLayout)
- {
- s = g_cmdline.xkbLayout;
- from = X_CMDLINE;
- }
+ s = NULL;
+ if (g_cmdline.xkbLayout)
+ {
+ s = g_cmdline.xkbLayout;
+ from = X_CMDLINE;
+ }
#ifdef XWIN_XF86CONFIG
- else
- {
- s = winSetStrOption (kbd->inp_option_lst, "XkbLayout", NULL);
- from = X_CONFIG;
- }
+ else
+ {
+ s = winSetStrOption (kbd->inp_option_lst, "XkbLayout", NULL);
+ from = X_CONFIG;
+ }
#endif
- if (s)
- {
- g_winInfo.xkb.layout = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: layout: \"%s\"\n", s);
- }
+ if (s)
+ {
+ g_winInfo.xkb.layout = NULL_IF_EMPTY (s);
+ winMsg (from, "XKB: layout: \"%s\"\n", s);
+ }
- s = NULL;
- if (g_cmdline.xkbVariant)
- {
- s = g_cmdline.xkbVariant;
- from = X_CMDLINE;
- }
+ s = NULL;
+ if (g_cmdline.xkbVariant)
+ {
+ s = g_cmdline.xkbVariant;
+ from = X_CMDLINE;
+ }
#ifdef XWIN_XF86CONFIG
- else
- {
- s = winSetStrOption (kbd->inp_option_lst, "XkbVariant", NULL);
- from = X_CONFIG;
- }
+ else
+ {
+ s = winSetStrOption (kbd->inp_option_lst, "XkbVariant", NULL);
+ from = X_CONFIG;
+ }
#endif
- if (s)
- {
- g_winInfo.xkb.variant = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: variant: \"%s\"\n", s);
- }
+ if (s)
+ {
+ g_winInfo.xkb.variant = NULL_IF_EMPTY (s);
+ winMsg (from, "XKB: variant: \"%s\"\n", s);
+ }
- s = NULL;
- if (g_cmdline.xkbOptions)
- {
- s = g_cmdline.xkbOptions;
- from = X_CMDLINE;
- }
+ s = NULL;
+ if (g_cmdline.xkbOptions)
+ {
+ s = g_cmdline.xkbOptions;
+ from = X_CMDLINE;
+ }
#ifdef XWIN_XF86CONFIG
- else
- {
- s = winSetStrOption (kbd->inp_option_lst, "XkbOptions", NULL);
- from = X_CONFIG;
- }
+ else
+ {
+ s = winSetStrOption (kbd->inp_option_lst, "XkbOptions", NULL);
+ from = X_CONFIG;
+ }
#endif
- if (s)
- {
- g_winInfo.xkb.options = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: options: \"%s\"\n", s);
- }
-
-#ifdef XWIN_XF86CONFIG
- from = X_CMDLINE;
-
- if ((s = winSetStrOption (kbd->inp_option_lst, "XkbKeymap", NULL)))
- {
- g_winInfo.xkb.keymap = NULL_IF_EMPTY (s);
- winMsg (X_CONFIG, "XKB: keymap: \"%s\" "
- " (overrides other XKB settings)\n", s);
- }
-
- if ((s = winSetStrOption (kbd->inp_option_lst, "XkbCompat", NULL)))
- {
- g_winInfo.xkb.compat = NULL_IF_EMPTY (s);
- winMsg (X_CONFIG, "XKB: compat: \"%s\"\n", s);
- }
-
- if ((s = winSetStrOption (kbd->inp_option_lst, "XkbTypes", NULL)))
- {
- g_winInfo.xkb.types = NULL_IF_EMPTY (s);
- winMsg (X_CONFIG, "XKB: types: \"%s\"\n", s);
- }
-
- if ((s =
- winSetStrOption (kbd->inp_option_lst, "XkbKeycodes", NULL)))
- {
- g_winInfo.xkb.keycodes = NULL_IF_EMPTY (s);
- winMsg (X_CONFIG, "XKB: keycodes: \"%s\"\n", s);
- }
-
- if ((s =
- winSetStrOption (kbd->inp_option_lst, "XkbGeometry", NULL)))
- {
- g_winInfo.xkb.geometry = NULL_IF_EMPTY (s);
- winMsg (X_CONFIG, "XKB: geometry: \"%s\"\n", s);
- }
+ if (s)
+ {
+ g_winInfo.xkb.options = NULL_IF_EMPTY (s);
+ winMsg (from, "XKB: options: \"%s\"\n", s);
+ }
- if ((s = winSetStrOption (kbd->inp_option_lst, "XkbSymbols", NULL)))
- {
- g_winInfo.xkb.symbols = NULL_IF_EMPTY (s);
- winMsg (X_CONFIG, "XKB: symbols: \"%s\"\n", s);
- }
-#endif
-#endif
}
#ifdef XWIN_XF86CONFIG
}
diff --git a/hw/xwin/winconfig.h b/hw/xwin/winconfig.h
index 4b56d63..71c4582 100644
--- a/hw/xwin/winconfig.h
+++ b/hw/xwin/winconfig.h
@@ -194,15 +194,11 @@ typedef struct
#ifdef XWIN_XF86CONFIG
char *keyboard;
#endif
-#ifdef XKB
- Bool noXkbExtension;
- char *xkbMap;
char *xkbRules;
char *xkbModel;
char *xkbLayout;
char *xkbVariant;
char *xkbOptions;
-#endif
/* layout */
char *screenname;
/* mouse settings */
@@ -309,7 +305,6 @@ typedef struct
long rate;
}
keyboard;
-#ifdef XKB
struct
{
Bool disable;
@@ -318,16 +313,8 @@ typedef struct
char *layout;
char *variant;
char *options;
- char *initialMap;
- char *keymap;
- char *types;
- char *compat;
- char *keycodes;
- char *symbols;
- char *geometry;
}
xkb;
-#endif
struct
{
Bool emulate3Buttons;
diff --git a/hw/xwin/winkeybd.c b/hw/xwin/winkeybd.c
index 24a7b43..f270431 100644
--- a/hw/xwin/winkeybd.c
+++ b/hw/xwin/winkeybd.c
@@ -40,12 +40,7 @@
#include "winconfig.h"
#include "winmsg.h"
-#ifdef XKB
-#ifndef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#endif
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
static Bool g_winKeyState[NUM_KEYCODES];
@@ -224,11 +219,9 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
KeySymsRec keySyms;
CARD8 modMap[MAP_LENGTH];
DevicePtr pDevice = (DevicePtr) pDeviceInt;
-#ifdef XKB
XkbComponentNamesRec names;
XkbSrvInfoPtr xkbi;
XkbControlsPtr ctrl;
-#endif
switch (iState)
{
@@ -237,23 +230,16 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
winGetKeyMappings (&keySyms, modMap);
-#ifdef XKB
/* FIXME: Maybe we should use winGetKbdLeds () here? */
defaultKeyboardControl.leds = g_winInfo.keyboard.leds;
-#else
- defaultKeyboardControl.leds = g_winInfo.keyboard.leds;
-#endif
-#ifdef XKB
if (g_winInfo.xkb.disable)
{
-#endif
InitKeyboardDeviceStruct (pDevice,
&keySyms,
modMap,
winKeybdBell,
winKeybdCtrl);
-#ifdef XKB
}
else
{
@@ -279,9 +265,7 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
XkbInitKeyboardDeviceStruct (pDeviceInt, &names, &keySyms,
modMap, winKeybdBell, winKeybdCtrl);
}
-#endif
-#ifdef XKB
if (!g_winInfo.xkb.disable)
{
xkbi = pDeviceInt->key->xkbInfo;
@@ -296,7 +280,6 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
winErrorFVerb (1, "winKeybdProc - Error initializing keyboard AutoRepeat (No XKB)\n");
}
}
-#endif
g_winInternalModeKeyStatesPtr = &(pDeviceInt->key->state);
break;
diff --git a/hw/xwin/winprocarg.c b/hw/xwin/winprocarg.c
index f346bed..38ee9a2 100755
--- a/hw/xwin/winprocarg.c
+++ b/hw/xwin/winprocarg.c
@@ -1369,16 +1369,6 @@ ddxProcessArgument (int argc, char *argv[], int i)
}
#endif
-#ifdef XKB
- /*
- * Look for the '-kb' argument
- */
- if (IS_OPTION ("-kb"))
- {
- g_cmdline.noXkbExtension = TRUE;
- return 0; /* Let DIX parse this again */
- }
-
if (IS_OPTION ("-xkbrules"))
{
CHECK_ARGS (1);
@@ -1409,7 +1399,6 @@ ddxProcessArgument (int argc, char *argv[], int i)
g_cmdline.xkbOptions = argv[++i];
return 2;
}
-#endif
if (IS_OPTION ("-keyhook"))
{
diff --git a/hw/xwin/winwndproc.c b/hw/xwin/winwndproc.c
index 460efe6..36cde35 100644
--- a/hw/xwin/winwndproc.c
+++ b/hw/xwin/winwndproc.c
@@ -42,9 +42,7 @@
#include "winmsg.h"
#include "inputstr.h"
-#ifdef XKB
extern BOOL winCheckKeyPressed(WPARAM wParam, LPARAM lParam);
-#endif
extern void winFixShiftKeys (int iScanCode);
@@ -1031,7 +1029,6 @@ winWindowProc (HWND hwnd, UINT message,
if ((wParam == VK_LWIN || wParam == VK_RWIN) && !g_fKeyboardHookLL)
break;
-#ifdef XKB
/*
* Discard presses generated from Windows auto-repeat
* ago: Only discard them if XKB is not disabled
@@ -1052,7 +1049,6 @@ winWindowProc (HWND hwnd, UINT message,
return 0;
}
}
-#endif
/* Discard fake Ctrl_L presses that precede AltGR on non-US keyboards */
if (winIsFakeCtrl_L (message, wParam, lParam))
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index e1d226c..1af477d 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -315,15 +315,6 @@
/* Support Xinerama extension */
#undef XINERAMA
-/* Build XKB */
-#undef XKB
-
-/* Enable XKB per default */
-#undef XKB_DFLT_DISABLED
-
-/* Build XKB server */
-#undef XKB_IN_SERVER
-
/* Vendor release */
#undef XORG_RELEASE
diff --git a/include/dix.h b/include/dix.h
index 4aa03c2..b210846 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -408,11 +408,9 @@ extern _X_EXPORT void DeliverGrabbedEvent(
Bool /* deactivateGrab */,
int /* count */);
-#ifdef XKB
extern _X_EXPORT void FixKeyState(
xEvent * /* xE */,
DeviceIntPtr /* keybd */);
-#endif /* XKB */
extern _X_EXPORT void RecalculateDeliverableEvents(
WindowPtr /* pWin */);
diff --git a/include/dixstruct.h b/include/dixstruct.h
index 4ca061b..8bafcde 100644
--- a/include/dixstruct.h
+++ b/include/dixstruct.h
@@ -112,13 +112,11 @@ typedef struct _Client {
int priority;
ClientState clientState;
PrivateRec *devPrivates;
-#ifdef XKB
unsigned short xkbClientFlags;
unsigned short mapNotifyMask;
unsigned short newKeyboardNotifyMask;
unsigned short vMajor,vMinor;
KeyCode minKC,maxKC;
-#endif
#ifdef DEBUG
unsigned char requestLog[MAX_REQUEST_LOG];
diff --git a/include/globals.h b/include/globals.h
index e70e7c6..5ac3905 100644
--- a/include/globals.h
+++ b/include/globals.h
@@ -114,11 +114,6 @@ extern _X_EXPORT Bool noXFree86VidModeExtension;
extern _X_EXPORT Bool noXFixesExtension;
#endif
-#ifdef XKB
-/* noXkbExtension is defined in xkb/xkbInit.c */
-extern _X_EXPORT Bool noXkbExtension;
-#endif
-
#ifdef PANORAMIX
extern _X_EXPORT Bool noPanoramiXExtension;
#endif
diff --git a/include/input.h b/include/input.h
index 2dd29f8..cf546e0 100644
--- a/include/input.h
+++ b/include/input.h
@@ -409,7 +409,6 @@ extern _X_EXPORT void ProcessKeyboardEvent(
DeviceIntPtr /*keybd*/,
int /*count*/);
-#ifdef XKB
extern _X_EXPORT void CoreProcessPointerEvent(
xEventPtr /*xE*/,
DeviceIntPtr /*mouse*/,
@@ -419,7 +418,6 @@ extern _X_EXPORT _X_DEPRECATED void CoreProcessKeyboardEvent(
xEventPtr /*xE*/,
DeviceIntPtr /*keybd*/,
int /*count*/) _X_DEPRECATED;
-#endif
extern _X_EXPORT Bool LegalModifier(
unsigned int /*key*/,
diff --git a/include/inputstr.h b/include/inputstr.h
index bcfc09e..d1a965b 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -144,11 +144,7 @@ typedef struct _KeyClassRec {
CARD8 maxKeysPerModifier;
unsigned short state;
unsigned short prev_state;
-#ifdef XKB
struct _XkbSrvInfo *xkbInfo;
-#else
- void *pad0;
-#endif
} KeyClassRec, *KeyClassPtr;
typedef struct _AxisInfo {
@@ -192,11 +188,7 @@ typedef struct _ButtonClassRec {
Mask motionMask;
CARD8 down[DOWN_LENGTH];
CARD8 map[MAP_LENGTH];
-#ifdef XKB
union _XkbAction *xkb_acts;
-#else
- void *pad0;
-#endif
} ButtonClassRec, *ButtonClassPtr;
typedef struct _FocusClassRec {
@@ -244,11 +236,7 @@ typedef struct _KbdFeedbackClassRec {
KbdCtrlProcPtr CtrlProc;
KeybdCtrl ctrl;
KbdFeedbackPtr next;
-#ifdef XKB
struct _XkbSrvLedInfo *xkb_sli;
-#else
- void *pad0;
-#endif
} KbdFeedbackClassRec;
typedef struct _PtrFeedbackClassRec {
@@ -280,11 +268,7 @@ typedef struct _LedFeedbackClassRec {
LedCtrlProcPtr CtrlProc;
LedCtrl ctrl;
LedFeedbackPtr next;
-#ifdef XKB
struct _XkbSrvLedInfo *xkb_sli;
-#else
- void *pad0;
-#endif
} LedFeedbackClassRec;
@@ -446,11 +430,7 @@ typedef struct _DeviceIntRec {
StringFeedbackPtr stringfeed;
BellFeedbackPtr bell;
LedFeedbackPtr leds;
-#ifdef XKB
struct _XkbInterest *xkb_interest;
-#else
- void *pad0;
-#endif
char *config_info; /* used by the hotplug layer */
PrivateRec *devPrivates;
int nPrivates;
diff --git a/include/site.h b/include/site.h
index fec8707..c07cbbf 100644
--- a/include/site.h
+++ b/include/site.h
@@ -90,11 +90,7 @@ SOFTWARE.
#define DEFAULT_BELL 50
#define DEFAULT_BELL_PITCH 400
#define DEFAULT_BELL_DURATION 100
-#ifdef XKB
#define DEFAULT_AUTOREPEAT TRUE
-#else
-#define DEFAULT_AUTOREPEAT FALSE
-#endif
#define DEFAULT_AUTOREPEATS {\
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index c6f6e9e..af87d8f 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -295,8 +295,6 @@ extern _X_EXPORT int XkbKeyboardErrorCode;
extern _X_EXPORT char * XkbBaseDirectory;
extern _X_EXPORT char * XkbBinDirectory;
-extern _X_EXPORT Bool noXkbExtension;
-
extern _X_EXPORT pointer XkbLastRepeatEvent;
extern _X_EXPORT CARD32 xkbDebugFlags;
diff --git a/include/xorg-server.h.in b/include/xorg-server.h.in
index 57b8a82..ca6aec2 100644
--- a/include/xorg-server.h.in
+++ b/include/xorg-server.h.in
@@ -103,15 +103,9 @@
/* Build XKB */
#undef XKB
-/* Enable XKB per default */
-#undef XKB_DFLT_DISABLED
-
/* XKB default rules */
#undef XKB_DFLT_RULES
-/* Build XKB support in server */
-#undef XKB_IN_SERVER
-
/* Support loadable input and output drivers */
#undef XLOADABLE
diff --git a/mi/miinitext.c b/mi/miinitext.c
index 92d6cd2..9520957 100644
--- a/mi/miinitext.c
+++ b/mi/miinitext.c
@@ -134,10 +134,6 @@ extern Bool noXFree86VidModeExtension;
#ifdef XFIXES
extern Bool noXFixesExtension;
#endif
-#ifdef XKB
-/* |noXkbExtension| is defined in xc/programs/Xserver/xkb/xkbInit.c */
-extern Bool noXkbExtension;
-#endif
#ifdef PANORAMIX
extern Bool noPanoramiXExtension;
#endif
@@ -167,9 +163,7 @@ typedef void (*InitExtension)(INITARGS);
#define _XTEST_SERVER_
#include <X11/extensions/XTest.h>
#endif
-#ifdef XKB
#include <X11/extensions/XKB.h>
-#endif
#ifdef XCSECURITY
#include "securitysrv.h"
#include <X11/extensions/securstr.h>
@@ -213,9 +207,7 @@ extern void XvExtensionInit(INITARGS);
extern void XvMCExtensionInit(INITARGS);
#endif
extern void SyncExtensionInit(INITARGS);
-#ifdef XKB
extern void XkbExtensionInit(INITARGS);
-#endif
extern void XCMiscExtensionInit(INITARGS);
#ifdef XRECORD
extern void RecordExtensionInit(INITARGS);
@@ -340,9 +332,7 @@ static ExtensionToggle ExtensionToggleList[] =
{ "XINERAMA", &noPanoramiXExtension },
#endif
{ "XInputExtension", NULL },
-#ifdef XKB
- { "XKEYBOARD", &noXkbExtension },
-#endif
+ { "XKEYBOARD", NULL },
#ifdef XSELINUX
{ "SELinux", &noSELinuxExtension },
#endif
@@ -416,9 +406,7 @@ InitExtensions(int argc, char *argv[])
}
#endif
SyncExtensionInit();
-#if defined(XKB)
- if (!noXkbExtension) XkbExtensionInit();
-#endif
+ XkbExtensionInit();
XCMiscExtensionInit();
#ifdef XRECORD
if (!noTestExtensions) RecordExtensionInit();
@@ -493,9 +481,7 @@ static ExtensionModule staticExtensions[] = {
#endif
{ BigReqExtensionInit, "BIG-REQUESTS", NULL, NULL, NULL },
{ SyncExtensionInit, "SYNC", NULL, NULL, NULL },
-#ifdef XKB
- { XkbExtensionInit, XkbName, &noXkbExtension, NULL, NULL },
-#endif
+ { XkbExtensionInit, XkbName, NULL, NULL, NULL },
{ XCMiscExtensionInit, "XC-MISC", NULL, NULL, NULL },
#ifdef XCSECURITY
{ SecurityExtensionInit, SECURITY_EXTENSION_NAME, &noSecurityExtension, NULL, NULL },
diff --git a/os/utils.c b/os/utils.c
index 55f8a98..0ed89dd 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -118,9 +118,7 @@ __stdcall unsigned long GetTickCount(void);
#include "dixstruct.h"
-#ifdef XKB
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
#ifdef RENDER
#include "picture.h"
@@ -180,7 +178,6 @@ Bool noXFree86VidModeExtension = FALSE;
#ifdef XFIXES
Bool noXFixesExtension = FALSE;
#endif
-/* noXkbExtension is defined in xkb/xkbInit.c */
#ifdef PANORAMIX
/* Xinerama is disabled by default unless enabled via +xinerama */
Bool noPanoramiXExtension = TRUE;
@@ -551,9 +548,7 @@ void UseMsg(void)
#ifdef XDMCP
XdmcpUseMsg();
#endif
-#ifdef XKB
XkbUseMsg();
-#endif
ddxUseMsg();
}
@@ -722,13 +717,11 @@ ProcessCommandLine(int argc, char *argv[])
UseMsg();
exit(0);
}
-#ifdef XKB
else if ( (skip=XkbProcessArguments(argc,argv,i))!=0 ) {
if (skip>0)
i+= skip-1;
else UseMsg();
}
-#endif
#ifdef RLIMIT_DATA
else if ( strcmp( argv[i], "-ld") == 0)
{
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index 573e731..e800482 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -85,9 +85,6 @@ typedef struct _SrvXkmInfo {
/***====================================================================***/
-#ifndef XKB_DFLT_DISABLED
-#define XKB_DFLT_DISABLED True
-#endif
#ifndef XKB_DFLT_RULES_PROP
#define XKB_DFLT_RULES_PROP True
#endif
@@ -110,7 +107,6 @@ static char * XkbOptionsUsed= NULL;
static XkbDescPtr xkb_cached_map = NULL;
-Bool noXkbExtension= XKB_DFLT_DISABLED;
static Bool XkbWantRulesProp= XKB_DFLT_RULES_PROP;
/***====================================================================***/
@@ -817,15 +813,7 @@ extern unsigned char XkbDfltAccessXOptions;
int
XkbProcessArguments(int argc,char *argv[],int i)
{
- if (strcmp(argv[i],"-kb")==0) {
- noXkbExtension= True;
- return 1;
- }
- else if (strcmp(argv[i],"+kb")==0) {
- noXkbExtension= False;
- return 1;
- }
- else if (strncmp(argv[i], "-xkbdir", 7) == 0) {
+ if (strncmp(argv[i], "-xkbdir", 7) == 0) {
if(++i < argc) {
#if !defined(WIN32) && !defined(__CYGWIN__)
if (getuid() != geteuid()) {
commit f9da417163b6b2d6234d2542c1f375e33db7159a
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Mar 28 19:26:42 2008 +0200
Xephyr: Disable state inheritance hack
Prepare for the impending removal of the state field by disabling this hack
for a while: it's hell of nasty and I'm amazed it ever really worked.
Basically, on focus out, it should do as current DDXes do and fake releases
for all keys (not just mangle the core state) that are currently down;
buttons too. When focus comes back in, we already have a KeymapNotify that
lets us know what's currently down, so we can use this to fake the
appropriate keypresses, and send it through the event routing layer.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index ab8459c..740f661 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -753,6 +753,18 @@ ephyrUpdateModifierState(unsigned int state)
if (!pkeydev)
return;
+/* This is pretty broken.
+ *
+ * What should happen is that focus out should do as a VT switch does in
+ * traditional servers: fake releases for all keys (and buttons too, come
+ * to think of it) currently down. Then, on focus in, get the state from
+ * the host, and fake keypresses for everything currently down.
+ *
+ * So I'm leaving this broken for a little while. Sorry, folks.
+ *
+ * -daniels
+ */
+#if 0
keyc = pkeydev->key;
state = state & 0xff;
@@ -798,6 +810,7 @@ ephyrUpdateModifierState(unsigned int state)
break;
}
}
+#endif
}
static void
commit 5c281446d2a8c38511d45baee6f0d25a640f12e1
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Mar 28 11:56:34 2008 +0200
XKB: Remove lock actions disabling
For some reason, XKB allows clients to set a global (!) flag that simply
turns lock keys into state no-ops. Ignore this flag.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index ee04063..c6f6e9e 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -291,12 +291,9 @@ extern _X_EXPORT void xkbUnwrapProc(DeviceIntPtr, DeviceHandleProc, pointer);
extern _X_EXPORT int XkbReqCode;
extern _X_EXPORT int XkbEventBase;
-extern _X_EXPORT int XkbDisableLockActions;
extern _X_EXPORT int XkbKeyboardErrorCode;
extern _X_EXPORT char * XkbBaseDirectory;
extern _X_EXPORT char * XkbBinDirectory;
-extern _X_EXPORT int XkbDfltRepeatDelay;
-extern _X_EXPORT int XkbDfltRepeatInterval;
extern _X_EXPORT Bool noXkbExtension;
diff --git a/xkb/xkb.c b/xkb/xkb.c
index f6dfb08..ad3529d 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -6611,8 +6611,6 @@ int rc;
xkbDebugFlags = newFlags;
xkbDebugCtrls = newCtrls;
- XkbDisableLockActions= (xkbDebugCtrls&XkbDF_DisableLocks);
-
rep.type= X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 424fc63..315ff0d 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -85,41 +85,6 @@ static XkbAction fake;
fake.type = XkbSA_NoAction;
return fake;
}
- if (XkbDisableLockActions) {
- switch (act->type) {
- case XkbSA_LockMods:
- fake.mods.type = XkbSA_SetMods;
- fake.mods.flags = 0;
- fake.mods.mask = act->mods.mask;
- return fake;
- case XkbSA_LatchMods:
- fake.mods.type = XkbSA_SetMods;
- fake.mods.flags = 0;
- fake.mods.mask = act->mods.mask;
- return fake;
- case XkbSA_ISOLock:
- if (act->iso.flags&XkbSA_ISODfltIsGroup) {
- fake.group.type = XkbSA_SetGroup;
- fake.group.flags = act->iso.flags&XkbSA_GroupAbsolute;
- XkbSASetGroup(&fake.group,XkbSAGroup(&act->iso));
- }
- else {
- fake.mods.type = XkbSA_SetMods;
- fake.mods.flags = 0;
- fake.mods.mask = act->iso.mask;
- }
- return fake;
- case XkbSA_LockGroup:
- case XkbSA_LatchGroup:
- /* We want everything from the latch/lock action except the
- * type should be changed to set.
- */
- fake = *act;
- fake.group.type = XkbSA_SetGroup;
- return fake;
- }
- }
- else
if (xkb->ctrls->enabled_ctrls&XkbStickyKeysMask) {
if (act->any.type==XkbSA_SetMods) {
fake.mods.type = XkbSA_LatchMods;
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index a12cb79..abfd6fb 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -68,8 +68,6 @@ DEALINGS IN THE SOFTWARE.
#include "xkbgeom.h"
#include "xkb.h"
-int XkbDisableLockActions = 0;
-
/***====================================================================***/
int
commit 2f7cb7306709d5266688e05a066701d309323035
Author: Daniel Stone <daniel at fooishbar.org>
Date: Fri Dec 26 18:36:30 2008 +1100
XKB: Add XkbRMLVOSet
XkbRMLVOSet is just a set of strings for rules, model, layout, variant
and options; use that in preference to XkbRF_VarDefsRec, which is a
hideously complicated monster that somehow managed to not include the
actual rules.
While we're at it, clean up xkbrules.h so it doesn't require xkbstr.h.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
diff --git a/include/xkbrules.h b/include/xkbrules.h
index ff77ddc..e8917f0 100644
--- a/include/xkbrules.h
+++ b/include/xkbrules.h
@@ -29,6 +29,14 @@
/***====================================================================***/
+typedef struct _XkbRMLVOSet {
+ char * rules;
+ char * model;
+ char * layout;
+ char * variant;
+ char * options;
+} XkbRMLVOSet;
+
typedef struct _XkbRF_VarDefs {
char * model;
char * layout;
@@ -103,10 +111,13 @@ typedef struct _XkbRF_Rules {
_XFUNCPROTOBEGIN
+/* Seems preferable to dragging xkbstr.h in. */
+struct _XkbComponentNames;
+
extern _X_EXPORT Bool XkbRF_GetComponents(
XkbRF_RulesPtr /* rules */,
XkbRF_VarDefsPtr /* var_defs */,
- XkbComponentNamesPtr /* names */
+ struct _XkbComponentNames * /* names */
);
extern _X_EXPORT XkbRF_RulePtr XkbRF_AddRule(
More information about the xorg-commit
mailing list