Merge remote-tracking branch 'whot/for-keith'
This commit is contained in:
commit
6a6c3afe71
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -163,17 +163,6 @@ key_autorepeats(DeviceIntPtr pDev, int key_code)
|
|||
(1 << (key_code & 7)));
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
{
|
||||
/* 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));
|
||||
|
||||
/* need to keep the buffer clean, else the kernel gets angry */
|
||||
xf86SetConsoleHandler(drain_console, NULL);
|
||||
/* ... 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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */ ,
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -6,8 +6,7 @@ DDX_SRCS = \
|
|||
ddxBeep.c \
|
||||
ddxCtrls.c \
|
||||
ddxLEDs.c \
|
||||
ddxLoad.c \
|
||||
ddxList.c
|
||||
ddxLoad.c
|
||||
|
||||
DIX_SRCS = \
|
||||
xkb.c \
|
||||
|
|
302
xkb/ddxList.c
302
xkb/ddxList.c
|
@ -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;
|
||||
}
|
50
xkb/xkb.c
50
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user