summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-11-18 21:50:20 -0800
committerKeith Packard <keithp@keithp.com>2012-11-18 21:50:20 -0800
commit6a6c3afe71ac82a93d9fd0034dd5bbdcf0eae1ea (patch)
tree4eda841124faca581a452acdb81643ed5ed470d7
parent14c9e245bae2447f0e57a3ea4daa8d2085fa8b8f (diff)
parent6f145084d5b9ca4a023dfc538a69bbf30edeac4a (diff)
Merge remote-tracking branch 'whot/for-keith'
-rw-r--r--Xi/xipassivegrab.c8
-rw-r--r--Xi/xiquerypointer.c17
-rw-r--r--dix/enterleave.c5
-rw-r--r--dix/eventconvert.c4
-rw-r--r--dix/events.c8
-rw-r--r--dix/getevents.c13
-rw-r--r--hw/xfree86/os-support/linux/lnx_init.c33
-rw-r--r--include/eventconvert.h2
-rw-r--r--include/xkbsrv.h17
-rw-r--r--test/xi2/protocol-eventconvert.c4
-rw-r--r--xfixes/cursor.c4
-rw-r--r--xkb/Makefile.am3
-rw-r--r--xkb/ddxList.c302
-rw-r--r--xkb/xkb.c50
14 files changed, 71 insertions, 399 deletions
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index ddab53dec..62a3a469f 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -50,7 +50,7 @@ int
SProcXIPassiveGrabDevice(ClientPtr client)
{
int i;
- xXIModifierInfo *mods;
+ uint32_t *mods;
REQUEST(xXIPassiveGrabDeviceReq);
@@ -63,12 +63,10 @@ SProcXIPassiveGrabDevice(ClientPtr client)
swaps(&stuff->mask_len);
swaps(&stuff->num_modifiers);
- mods = (xXIModifierInfo *) &stuff[1];
+ mods = (uint32_t *) &stuff[1];
for (i = 0; i < stuff->num_modifiers; i++, mods++) {
- swapl(&mods->base_mods);
- swapl(&mods->latched_mods);
- swapl(&mods->locked_mods);
+ swapl(mods);
}
return ProcXIPassiveGrabDevice(client);
diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c
index 7e6852dd0..e9bdd428d 100644
--- a/Xi/xiquerypointer.c
+++ b/Xi/xiquerypointer.c
@@ -50,6 +50,7 @@
#include "panoramiXsrv.h"
#endif
+#include "inpututils.h"
#include "xiquerypointer.h"
/***********************************************************************
@@ -127,8 +128,8 @@ ProcXIQueryPointer(ClientPtr client)
.sequenceNumber = client->sequence,
.length = 6,
.root = (GetCurrentRootWindow(pDev))->drawable.id,
- .root_x = FP1616(pSprite->hot.x, 0),
- .root_y = FP1616(pSprite->hot.y, 0),
+ .root_x = double_to_fp1616(pSprite->hot.x),
+ .root_y = double_to_fp1616(pSprite->hot.y),
.child = None
};
@@ -166,8 +167,8 @@ ProcXIQueryPointer(ClientPtr client)
if (pSprite->hot.pScreen == pWin->drawable.pScreen) {
rep.same_screen = xTrue;
- rep.win_x = FP1616(pSprite->hot.x - pWin->drawable.x, 0);
- rep.win_y = FP1616(pSprite->hot.y - pWin->drawable.y, 0);
+ rep.win_x = double_to_fp1616(pSprite->hot.x - pWin->drawable.x);
+ rep.win_y = double_to_fp1616(pSprite->hot.y - pWin->drawable.y);
for (t = pSprite->win; t; t = t->parent)
if (t->parent == pWin) {
rep.child = t->drawable.id;
@@ -182,11 +183,11 @@ ProcXIQueryPointer(ClientPtr client)
#ifdef PANORAMIX
if (!noPanoramiXExtension) {
- rep.root_x += FP1616(screenInfo.screens[0]->x, 0);
- rep.root_y += FP1616(screenInfo.screens[0]->y, 0);
+ rep.root_x += double_to_fp1616(screenInfo.screens[0]->x);
+ rep.root_y += double_to_fp1616(screenInfo.screens[0]->y);
if (stuff->win == rep.root) {
- rep.win_x += FP1616(screenInfo.screens[0]->x, 0);
- rep.win_y += FP1616(screenInfo.screens[0]->y, 0);
+ rep.win_x += double_to_fp1616(screenInfo.screens[0]->x);
+ rep.win_y += double_to_fp1616(screenInfo.screens[0]->y);
}
}
#endif
diff --git a/dix/enterleave.c b/dix/enterleave.c
index 431566ffe..54f4b8554 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -39,6 +39,7 @@
#include "enterleave.h"
#include "eventconvert.h"
#include "xkbsrv.h"
+#include "inpututils.h"
/**
* @file
@@ -799,8 +800,8 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
xi2event->deviceid = dev->id;
xi2event->sourceid = dev->id; /* a device doesn't change focus by itself */
xi2event->mode = mode;
- xi2event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
- xi2event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
+ xi2event->root_x = double_to_fp1616(mouse->spriteInfo->sprite->hot.x);
+ xi2event->root_y = double_to_fp1616(mouse->spriteInfo->sprite->hot.y);
for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
if (BitIsOn(mouse->button->down, i))
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 41a3174a6..2e422d7a1 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -673,8 +673,8 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
xde->valuators_len = vallen;
xde->deviceid = ev->deviceid;
xde->sourceid = ev->sourceid;
- xde->root_x = FP1616(ev->root_x, ev->root_x_frac);
- xde->root_y = FP1616(ev->root_y, ev->root_y_frac);
+ xde->root_x = double_to_fp1616(ev->root_x + ev->root_x_frac);
+ xde->root_y = double_to_fp1616(ev->root_y + ev->root_y_frac);
if (ev->type == ET_TouchUpdate)
xde->flags |= (ev->flags & TOUCH_PENDING_END) ? XITouchPendingEnd : 0;
diff --git a/dix/events.c b/dix/events.c
index e790bfc20..3282ef818 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2444,8 +2444,8 @@ FixUpEventFromWindow(SpritePtr pSprite,
}
if (pSprite->hot.pScreen == pWin->drawable.pScreen) {
- event->event_x = event->root_x - FP1616(pWin->drawable.x, 0);
- event->event_y = event->root_y - FP1616(pWin->drawable.y, 0);
+ event->event_x = event->root_x - double_to_fp1616(pWin->drawable.x);
+ event->event_y = event->root_y - double_to_fp1616(pWin->drawable.y);
event->child = child;
}
else {
@@ -4573,8 +4573,8 @@ DeviceEnterLeaveEvent(DeviceIntPtr mouse,
event->deviceid = mouse->id;
event->sourceid = sourceid;
event->mode = mode;
- event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
- event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
+ event->root_x = double_to_fp1616(mouse->spriteInfo->sprite->hot.x);
+ event->root_y = double_to_fp1616(mouse->spriteInfo->sprite->hot.y);
for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
if (BitIsOn(mouse->button->down, i))
diff --git a/dix/getevents.c b/dix/getevents.c
index 8b4379d1c..2a686e877 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -164,17 +164,6 @@ key_autorepeats(DeviceIntPtr pDev, int key_code)
}
static void
-init_event(DeviceIntPtr dev, DeviceEvent *event, Time ms)
-{
- memset(event, 0, sizeof(DeviceEvent));
- event->header = ET_Internal;
- event->length = sizeof(DeviceEvent);
- event->time = ms;
- event->deviceid = dev->id;
- event->sourceid = dev->id;
-}
-
-static void
init_touch_ownership(DeviceIntPtr dev, TouchOwnershipEvent *event, Time ms)
{
memset(event, 0, sizeof(TouchOwnershipEvent));
@@ -1915,7 +1904,7 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
event = &events->device_event;
num_events++;
- init_event(dev, event, ms);
+ init_device_event(event, dev, ms);
/* if submitted for master device, get the sourceid from there */
if (flags & TOUCH_CLIENT_ID) {
event->sourceid = touchpoint.dix_ti->sourceid;
diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
index 68c296b0f..bcb039f3f 100644
--- a/hw/xfree86/os-support/linux/lnx_init.c
+++ b/hw/xfree86/os-support/linux/lnx_init.c
@@ -38,6 +38,14 @@
#include <sys/stat.h>
+#ifndef K_OFF
+#define K_OFF 0x4
+#endif
+
+#ifndef KDSKBMUTE
+#define KDSKBMUTE 0x4B51
+#endif
+
static Bool KeepTty = FALSE;
static int activeVT = -1;
@@ -213,19 +221,23 @@ xf86OpenConsole(void)
tcgetattr(xf86Info.consoleFd, &tty_attr);
SYSCALL(ioctl(xf86Info.consoleFd, KDGKBMODE, &tty_mode));
-#ifdef K_OFF
- /* disable kernel special keys and buffering */
- SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_OFF));
+ /* disable kernel special keys and buffering, new style */
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMUTE, 1));
if (ret < 0)
-#endif
{
- SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW));
+ /* disable kernel special keys and buffering, old style */
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_OFF));
if (ret < 0)
- FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed %s\n",
- strerror(errno));
-
- /* need to keep the buffer clean, else the kernel gets angry */
- xf86SetConsoleHandler(drain_console, NULL);
+ {
+ /* fine, just disable special keys */
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW));
+ if (ret < 0)
+ FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed %s\n",
+ strerror(errno));
+
+ /* ... and drain events, else the kernel gets angry */
+ xf86SetConsoleHandler(drain_console, NULL);
+ }
}
nTty = tty_attr;
@@ -271,6 +283,7 @@ xf86CloseConsole(void)
xf86Msg(X_WARNING, "xf86CloseConsole: KDSETMODE failed: %s\n",
strerror(errno));
+ SYSCALL(ioctl(xf86Info.consoleFd, KDSKBMUTE, 0));
SYSCALL(ioctl(xf86Info.consoleFd, KDSKBMODE, tty_mode));
tcsetattr(xf86Info.consoleFd, TCSANOW, &tty_attr);
diff --git a/include/eventconvert.h b/include/eventconvert.h
index 4c56d534a..01172f0ee 100644
--- a/include/eventconvert.h
+++ b/include/eventconvert.h
@@ -29,8 +29,6 @@
#include "events.h"
#include "eventstr.h"
-#define FP1616(integral, frac) ((integral) * (1 << 16) + (frac) * (1 << 16))
-
_X_EXPORT int EventToCore(InternalEvent *event, xEvent **core, int *count);
_X_EXPORT int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
_X_EXPORT int EventToXI2(InternalEvent *ev, xEvent **xi);
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index d58478543..2b926a980 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -835,23 +835,6 @@ extern void XkbFakeDeviceButton(DeviceIntPtr /* dev */ ,
#define _XkbListGeometry 4
#define _XkbListNumComponents 5
-typedef struct _XkbSrvListInfo {
- int szPool;
- int nPool;
- char *pool;
-
- int maxRtrn;
- int nTotal;
-
- char *pattern[_XkbListNumComponents];
- int nFound[_XkbListNumComponents];
-} XkbSrvListInfoRec, *XkbSrvListInfoPtr;
-
-extern _X_EXPORT Status XkbDDXList(DeviceIntPtr /* dev */ ,
- XkbSrvListInfoPtr /* listing */ ,
- ClientPtr /* client */
- );
-
extern _X_EXPORT unsigned int XkbDDXLoadKeymapByNames(DeviceIntPtr /* keybd */ ,
XkbComponentNamesPtr
/* names */ ,
diff --git a/test/xi2/protocol-eventconvert.c b/test/xi2/protocol-eventconvert.c
index 1188e8b25..bb3177cc1 100644
--- a/test/xi2/protocol-eventconvert.c
+++ b/test/xi2/protocol-eventconvert.c
@@ -338,8 +338,8 @@ test_values_XIDeviceEvent(DeviceEvent *in, xXIDeviceEvent * out, BOOL swap)
assert(out->event_x == 0); /* set in FixUpEventFromWindow */
assert(out->event_y == 0); /* set in FixUpEventFromWindow */
- assert(out->root_x == FP1616(in->root_x, in->root_x_frac));
- assert(out->root_y == FP1616(in->root_y, in->root_y_frac));
+ assert(out->root_x == double_to_fp1616(in->root_x + in->root_x_frac));
+ assert(out->root_y == double_to_fp1616(in->root_y + in->root_y_frac));
buttons = 0;
for (i = 0; i < bits_to_bytes(sizeof(in->buttons)); i++) {
diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 7c223ddc5..bd175b40f 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -1300,6 +1300,10 @@ CreatePointerBarrierClient(ScreenPtr screen, ClientPtr client,
ret->screen = screen;
ret->num_devices = stuff->num_devices;
+ if (ret->num_devices > 0)
+ ret->device_ids = (int*)&ret[1];
+ else
+ ret->device_ids = NULL;
in_devices = (CARD16 *) &stuff[1];
for (i = 0; i < stuff->num_devices; i++) {
diff --git a/xkb/Makefile.am b/xkb/Makefile.am
index fb3ccbf6f..e386ce5a2 100644
--- a/xkb/Makefile.am
+++ b/xkb/Makefile.am
@@ -6,8 +6,7 @@ DDX_SRCS = \
ddxBeep.c \
ddxCtrls.c \
ddxLEDs.c \
- ddxLoad.c \
- ddxList.c
+ ddxLoad.c
DIX_SRCS = \
xkb.c \
diff --git a/xkb/ddxList.c b/xkb/ddxList.c
deleted file mode 100644
index 729c5aecf..000000000
--- a/xkb/ddxList.c
+++ /dev/null
@@ -1,302 +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 <ctype.h>
-#include <X11/X.h>
-#include <X11/Xos.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include <X11/extensions/XKM.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#define XKBSRV_NEED_FILE_FUNCS
-#include <xkbsrv.h>
-#include <X11/extensions/XI.h>
-
-#ifdef WIN32
-/* from ddxLoad.c */
-#define W32_tmparg " '%s'"
-#define W32_tmpfile ,tmpname
-#define W32_tmplen strlen(tmpname)+3
-#else
-#define W32_tmparg
-#define W32_tmpfile
-#define W32_tmplen 0
-#endif
-
-/***====================================================================***/
-
-static const char *componentDirs[_XkbListNumComponents] = {
- "keycodes", "types", "compat", "symbols", "geometry"
-};
-
-/***====================================================================***/
-
-static Status
-_AddListComponent(XkbSrvListInfoPtr list,
- int what, unsigned flags, char *str, ClientPtr client)
-{
- int slen, wlen;
- unsigned char *wire8;
- unsigned short *wire16;
- char *tmp;
-
- if (list->nTotal >= list->maxRtrn) {
- list->nTotal++;
- return Success;
- }
- tmp = strchr(str, ')');
- if ((tmp == NULL) && ((tmp = strchr(str, '(')) == NULL)) {
- slen = strlen(str);
- while ((slen > 0) && isspace(str[slen - 1])) {
- slen--;
- }
- }
- else {
- slen = (tmp - str + 1);
- }
- wlen = (((slen + 1) / 2) * 2) + 4; /* four bytes for flags and length, pad to */
- /* 2-byte boundary */
- if ((list->szPool - list->nPool) < wlen) {
- if (wlen > 1024)
- list->szPool += XkbPaddedSize(wlen * 2);
- else
- list->szPool += 1024;
- list->pool = realloc(list->pool, list->szPool * sizeof(char));
- if (!list->pool)
- return BadAlloc;
- }
- wire16 = (unsigned short *) &list->pool[list->nPool];
- wire8 = (unsigned char *) &wire16[2];
- wire16[0] = flags;
- wire16[1] = slen;
- memcpy(wire8, str, slen);
- if (client->swapped) {
- swaps(&wire16[0]);
- swaps(&wire16[1]);
- }
- list->nPool += wlen;
- list->nFound[what]++;
- list->nTotal++;
- return Success;
-}
-
-/***====================================================================***/
-static Status
-XkbDDXListComponent(DeviceIntPtr dev,
- int what, XkbSrvListInfoPtr list, ClientPtr client)
-{
- char *file, *map, *tmp, *buf = NULL;
- FILE *in;
- Status status;
- Bool haveDir;
-
-#ifdef WIN32
- char tmpname[PATH_MAX];
-#else
- int rval;
-#endif
-
- if ((list->pattern[what] == NULL) || (list->pattern[what][0] == '\0'))
- return Success;
- file = list->pattern[what];
- map = strrchr(file, '(');
- if (map != NULL) {
- map++;
- tmp = strrchr(map, ')');
- if ((tmp == NULL) || (tmp[1] != '\0')) {
- /* illegal pattern. No error, but no match */
- return Success;
- }
- }
-
- in = NULL;
- haveDir = TRUE;
-#ifdef WIN32
- strcpy(tmpname, Win32TempDir());
- strcat(tmpname, "\\xkb_XXXXXX");
- (void) mktemp(tmpname);
-#endif
- if (XkbBaseDirectory != NULL) {
- if ((list->pattern[what][0] == '*') && (list->pattern[what][1] == '\0')) {
- if (asprintf(&buf, "%s/%s.dir", XkbBaseDirectory,
- componentDirs[what]) == -1)
- buf = NULL;
- else
- in = fopen(buf, "r");
- }
- if (!in) {
- haveDir = FALSE;
- free(buf);
- if (asprintf
- (&buf,
- "'%s/xkbcomp' '-R%s/%s' -w %ld -l -vlfhpR '%s'" W32_tmparg,
- XkbBinDirectory, XkbBaseDirectory, componentDirs[what],
- (long) ((xkbDebugFlags < 2) ? 1 :
- ((xkbDebugFlags > 10) ? 10 : xkbDebugFlags)),
- file W32_tmpfile) == -1)
- buf = NULL;
- }
- }
- else {
- if ((list->pattern[what][0] == '*') && (list->pattern[what][1] == '\0')) {
- if (asprintf(&buf, "%s.dir", componentDirs[what]) == -1)
- buf = NULL;
- else
- in = fopen(buf, "r");
- }
- if (!in) {
- haveDir = FALSE;
- free(buf);
- if (asprintf
- (&buf,
- "xkbcomp -R%s -w %ld -l -vlfhpR '%s'" W32_tmparg,
- componentDirs[what],
- (long) ((xkbDebugFlags < 2) ? 1 :
- ((xkbDebugFlags > 10) ? 10 : xkbDebugFlags)),
- file W32_tmpfile) == -1)
- buf = NULL;
- }
- }
- status = Success;
- if (!haveDir) {
-#ifndef WIN32
- in = Popen(buf, "r");
-#else
- if (xkbDebugFlags)
- DebugF("[xkb] xkbList executes: %s\n", buf);
- if (System(buf) < 0)
- ErrorF("[xkb] Could not invoke keymap compiler\n");
- else
- in = fopen(tmpname, "r");
-#endif
- }
- if (!in) {
- free(buf);
-#ifdef WIN32
- unlink(tmpname);
-#endif
- return BadImplementation;
- }
- list->nFound[what] = 0;
- free(buf);
- buf = malloc(PATH_MAX * sizeof(char));
- if (!buf) {
- fclose(in);
-#ifdef WIN32
- unlink(tmpname);
-#endif
- return BadAlloc;
- }
- while ((status == Success) && ((tmp = fgets(buf, PATH_MAX, in)) != NULL)) {
- unsigned flags;
- register unsigned int i;
-
- if (*tmp == '#') /* comment, skip it */
- continue;
- if (!strncmp(tmp, "Warning:", 8) || !strncmp(tmp, " ", 8))
- /* skip warnings too */
- continue;
- flags = 0;
- /* each line in the listing is supposed to start with two */
- /* groups of eight characters, which specify the general */
- /* flags and the flags that are specific to the component */
- /* if they're missing, fail with BadImplementation */
- for (i = 0; (i < 8) && (status == Success); i++) { /* read the general flags */
- if (isalpha(*tmp))
- flags |= (1L << i);
- else if (*tmp != '-')
- status = BadImplementation;
- tmp++;
- }
- if (status != Success)
- break;
- if (!isspace(*tmp)) {
- status = BadImplementation;
- break;
- }
- else
- tmp++;
- for (i = 0; (i < 8) && (status == Success); i++) { /* read the component flags */
- if (isalpha(*tmp))
- flags |= (1L << (i + 8));
- else if (*tmp != '-')
- status = BadImplementation;
- tmp++;
- }
- if (status != Success)
- break;
- if (isspace(*tmp)) {
- while (isspace(*tmp)) {
- tmp++;
- }
- }
- else {
- status = BadImplementation;
- break;
- }
- status = _AddListComponent(list, what, flags, tmp, client);
- }
-#ifndef WIN32
- if (haveDir)
- fclose(in);
- else if ((rval = Pclose(in)) != 0) {
- if (xkbDebugFlags)
- ErrorF("[xkb] xkbcomp returned exit code %d\n", rval);
- }
-#else
- fclose(in);
- unlink(tmpname);
-#endif
- free(buf);
- return status;
-}
-
-/***====================================================================***/
-
-/* ARGSUSED */
-Status
-XkbDDXList(DeviceIntPtr dev, XkbSrvListInfoPtr list, ClientPtr client)
-{
- Status status;
-
- status = XkbDDXListComponent(dev, _XkbListKeycodes, list, client);
- if (status == Success)
- status = XkbDDXListComponent(dev, _XkbListTypes, list, client);
- if (status == Success)
- status = XkbDDXListComponent(dev, _XkbListCompat, list, client);
- if (status == Success)
- status = XkbDDXListComponent(dev, _XkbListSymbols, list, client);
- if (status == Success)
- status = XkbDDXListComponent(dev, _XkbListGeometry, list, client);
- return status;
-}
diff --git a/xkb/xkb.c b/xkb/xkb.c
index efb178c7c..c67896f06 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5620,9 +5620,9 @@ ProcXkbListComponents(ClientPtr client)
DeviceIntPtr dev;
xkbListComponentsReply rep;
unsigned len;
- int status;
unsigned char *str;
- XkbSrvListInfoRec list;
+ uint8_t size;
+ int i;
REQUEST(xkbListComponentsReq);
REQUEST_AT_LEAST_SIZE(xkbListComponentsReq);
@@ -5632,40 +5632,33 @@ ProcXkbListComponents(ClientPtr client)
CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
- status = Success;
+ /* The request is followed by six Pascal strings (i.e. size in characters
+ * followed by a string pattern) describing what the client wants us to
+ * list. We don't care, but might as well check they haven't got the
+ * length wrong. */
str = (unsigned char *) &stuff[1];
- memset(&list, 0, sizeof(XkbSrvListInfoRec));
- list.maxRtrn = stuff->maxNames;
- list.pattern[_XkbListKeycodes] = GetComponentSpec(&str, FALSE, &status);
- list.pattern[_XkbListTypes] = GetComponentSpec(&str, FALSE, &status);
- list.pattern[_XkbListCompat] = GetComponentSpec(&str, FALSE, &status);
- list.pattern[_XkbListSymbols] = GetComponentSpec(&str, FALSE, &status);
- list.pattern[_XkbListGeometry] = GetComponentSpec(&str, FALSE, &status);
- if (status != Success)
- return status;
- len = str - ((unsigned char *) stuff);
+ for (i = 0; i < 6; i++) {
+ size = *((uint8_t *)str);
+ len = (str + size + 1) - ((unsigned char *) stuff);
+ if ((XkbPaddedSize(len) / 4) > stuff->length)
+ return BadLength;
+ str += (size + 1);
+ }
if ((XkbPaddedSize(len) / 4) != stuff->length)
return BadLength;
- if ((status = XkbDDXList(dev, &list, client)) != Success) {
- free(list.pool);
- list.pool = NULL;
- return status;
- }
rep = (xkbListComponentsReply) {
.type = X_Reply,
.deviceID = dev->id,
.sequenceNumber = client->sequence,
- .length = XkbPaddedSize(list.nPool) / 4,
+ .length = 0,
.nKeymaps = 0,
- .nKeycodes = list.nFound[_XkbListKeycodes],
- .nTypes = list.nFound[_XkbListTypes],
- .nCompatMaps = list.nFound[_XkbListCompat],
- .nSymbols = list.nFound[_XkbListSymbols],
- .nGeometries = list.nFound[_XkbListGeometry],
+ .nKeycodes = 0,
+ .nTypes = 0,
+ .nCompatMaps = 0,
+ .nSymbols = 0,
+ .nGeometries = 0,
.extra = 0
};
- if (list.nTotal > list.maxRtrn)
- rep.extra = (list.nTotal - list.maxRtrn);
if (client->swapped) {
swaps(&rep.sequenceNumber);
swapl(&rep.length);
@@ -5678,11 +5671,6 @@ ProcXkbListComponents(ClientPtr client)
swaps(&rep.extra);
}
WriteToClient(client, SIZEOF(xkbListComponentsReply), &rep);
- if (list.nPool && list.pool) {
- WriteToClient(client, XkbPaddedSize(list.nPool), list.pool);
- free(list.pool);
- list.pool = NULL;
- }
return Success;
}