Merge remote-tracking branch 'whot/for-keith'
This commit is contained in:
commit
6a6c3afe71
|
@ -50,7 +50,7 @@ int
|
||||||
SProcXIPassiveGrabDevice(ClientPtr client)
|
SProcXIPassiveGrabDevice(ClientPtr client)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
xXIModifierInfo *mods;
|
uint32_t *mods;
|
||||||
|
|
||||||
REQUEST(xXIPassiveGrabDeviceReq);
|
REQUEST(xXIPassiveGrabDeviceReq);
|
||||||
|
|
||||||
|
@ -63,12 +63,10 @@ SProcXIPassiveGrabDevice(ClientPtr client)
|
||||||
swaps(&stuff->mask_len);
|
swaps(&stuff->mask_len);
|
||||||
swaps(&stuff->num_modifiers);
|
swaps(&stuff->num_modifiers);
|
||||||
|
|
||||||
mods = (xXIModifierInfo *) &stuff[1];
|
mods = (uint32_t *) &stuff[1];
|
||||||
|
|
||||||
for (i = 0; i < stuff->num_modifiers; i++, mods++) {
|
for (i = 0; i < stuff->num_modifiers; i++, mods++) {
|
||||||
swapl(&mods->base_mods);
|
swapl(mods);
|
||||||
swapl(&mods->latched_mods);
|
|
||||||
swapl(&mods->locked_mods);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ProcXIPassiveGrabDevice(client);
|
return ProcXIPassiveGrabDevice(client);
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
#include "panoramiXsrv.h"
|
#include "panoramiXsrv.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "inpututils.h"
|
||||||
#include "xiquerypointer.h"
|
#include "xiquerypointer.h"
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -127,8 +128,8 @@ ProcXIQueryPointer(ClientPtr client)
|
||||||
.sequenceNumber = client->sequence,
|
.sequenceNumber = client->sequence,
|
||||||
.length = 6,
|
.length = 6,
|
||||||
.root = (GetCurrentRootWindow(pDev))->drawable.id,
|
.root = (GetCurrentRootWindow(pDev))->drawable.id,
|
||||||
.root_x = FP1616(pSprite->hot.x, 0),
|
.root_x = double_to_fp1616(pSprite->hot.x),
|
||||||
.root_y = FP1616(pSprite->hot.y, 0),
|
.root_y = double_to_fp1616(pSprite->hot.y),
|
||||||
.child = None
|
.child = None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -166,8 +167,8 @@ ProcXIQueryPointer(ClientPtr client)
|
||||||
|
|
||||||
if (pSprite->hot.pScreen == pWin->drawable.pScreen) {
|
if (pSprite->hot.pScreen == pWin->drawable.pScreen) {
|
||||||
rep.same_screen = xTrue;
|
rep.same_screen = xTrue;
|
||||||
rep.win_x = FP1616(pSprite->hot.x - pWin->drawable.x, 0);
|
rep.win_x = double_to_fp1616(pSprite->hot.x - pWin->drawable.x);
|
||||||
rep.win_y = FP1616(pSprite->hot.y - pWin->drawable.y, 0);
|
rep.win_y = double_to_fp1616(pSprite->hot.y - pWin->drawable.y);
|
||||||
for (t = pSprite->win; t; t = t->parent)
|
for (t = pSprite->win; t; t = t->parent)
|
||||||
if (t->parent == pWin) {
|
if (t->parent == pWin) {
|
||||||
rep.child = t->drawable.id;
|
rep.child = t->drawable.id;
|
||||||
|
@ -182,11 +183,11 @@ ProcXIQueryPointer(ClientPtr client)
|
||||||
|
|
||||||
#ifdef PANORAMIX
|
#ifdef PANORAMIX
|
||||||
if (!noPanoramiXExtension) {
|
if (!noPanoramiXExtension) {
|
||||||
rep.root_x += FP1616(screenInfo.screens[0]->x, 0);
|
rep.root_x += double_to_fp1616(screenInfo.screens[0]->x);
|
||||||
rep.root_y += FP1616(screenInfo.screens[0]->y, 0);
|
rep.root_y += double_to_fp1616(screenInfo.screens[0]->y);
|
||||||
if (stuff->win == rep.root) {
|
if (stuff->win == rep.root) {
|
||||||
rep.win_x += FP1616(screenInfo.screens[0]->x, 0);
|
rep.win_x += double_to_fp1616(screenInfo.screens[0]->x);
|
||||||
rep.win_y += FP1616(screenInfo.screens[0]->y, 0);
|
rep.win_y += double_to_fp1616(screenInfo.screens[0]->y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "enterleave.h"
|
#include "enterleave.h"
|
||||||
#include "eventconvert.h"
|
#include "eventconvert.h"
|
||||||
#include "xkbsrv.h"
|
#include "xkbsrv.h"
|
||||||
|
#include "inpututils.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
|
@ -799,8 +800,8 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
|
||||||
xi2event->deviceid = dev->id;
|
xi2event->deviceid = dev->id;
|
||||||
xi2event->sourceid = dev->id; /* a device doesn't change focus by itself */
|
xi2event->sourceid = dev->id; /* a device doesn't change focus by itself */
|
||||||
xi2event->mode = mode;
|
xi2event->mode = mode;
|
||||||
xi2event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
|
xi2event->root_x = double_to_fp1616(mouse->spriteInfo->sprite->hot.x);
|
||||||
xi2event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
|
xi2event->root_y = double_to_fp1616(mouse->spriteInfo->sprite->hot.y);
|
||||||
|
|
||||||
for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
|
for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
|
||||||
if (BitIsOn(mouse->button->down, i))
|
if (BitIsOn(mouse->button->down, i))
|
||||||
|
|
|
@ -673,8 +673,8 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
|
||||||
xde->valuators_len = vallen;
|
xde->valuators_len = vallen;
|
||||||
xde->deviceid = ev->deviceid;
|
xde->deviceid = ev->deviceid;
|
||||||
xde->sourceid = ev->sourceid;
|
xde->sourceid = ev->sourceid;
|
||||||
xde->root_x = FP1616(ev->root_x, ev->root_x_frac);
|
xde->root_x = double_to_fp1616(ev->root_x + ev->root_x_frac);
|
||||||
xde->root_y = FP1616(ev->root_y, ev->root_y_frac);
|
xde->root_y = double_to_fp1616(ev->root_y + ev->root_y_frac);
|
||||||
|
|
||||||
if (ev->type == ET_TouchUpdate)
|
if (ev->type == ET_TouchUpdate)
|
||||||
xde->flags |= (ev->flags & TOUCH_PENDING_END) ? XITouchPendingEnd : 0;
|
xde->flags |= (ev->flags & TOUCH_PENDING_END) ? XITouchPendingEnd : 0;
|
||||||
|
|
|
@ -2444,8 +2444,8 @@ FixUpEventFromWindow(SpritePtr pSprite,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSprite->hot.pScreen == pWin->drawable.pScreen) {
|
if (pSprite->hot.pScreen == pWin->drawable.pScreen) {
|
||||||
event->event_x = event->root_x - FP1616(pWin->drawable.x, 0);
|
event->event_x = event->root_x - double_to_fp1616(pWin->drawable.x);
|
||||||
event->event_y = event->root_y - FP1616(pWin->drawable.y, 0);
|
event->event_y = event->root_y - double_to_fp1616(pWin->drawable.y);
|
||||||
event->child = child;
|
event->child = child;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -4573,8 +4573,8 @@ DeviceEnterLeaveEvent(DeviceIntPtr mouse,
|
||||||
event->deviceid = mouse->id;
|
event->deviceid = mouse->id;
|
||||||
event->sourceid = sourceid;
|
event->sourceid = sourceid;
|
||||||
event->mode = mode;
|
event->mode = mode;
|
||||||
event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
|
event->root_x = double_to_fp1616(mouse->spriteInfo->sprite->hot.x);
|
||||||
event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
|
event->root_y = double_to_fp1616(mouse->spriteInfo->sprite->hot.y);
|
||||||
|
|
||||||
for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
|
for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
|
||||||
if (BitIsOn(mouse->button->down, i))
|
if (BitIsOn(mouse->button->down, i))
|
||||||
|
|
|
@ -163,17 +163,6 @@ key_autorepeats(DeviceIntPtr pDev, int key_code)
|
||||||
(1 << (key_code & 7)));
|
(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
|
static void
|
||||||
init_touch_ownership(DeviceIntPtr dev, TouchOwnershipEvent *event, Time ms)
|
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;
|
event = &events->device_event;
|
||||||
num_events++;
|
num_events++;
|
||||||
|
|
||||||
init_event(dev, event, ms);
|
init_device_event(event, dev, ms);
|
||||||
/* if submitted for master device, get the sourceid from there */
|
/* if submitted for master device, get the sourceid from there */
|
||||||
if (flags & TOUCH_CLIENT_ID) {
|
if (flags & TOUCH_CLIENT_ID) {
|
||||||
event->sourceid = touchpoint.dix_ti->sourceid;
|
event->sourceid = touchpoint.dix_ti->sourceid;
|
||||||
|
|
|
@ -38,6 +38,14 @@
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#ifndef K_OFF
|
||||||
|
#define K_OFF 0x4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef KDSKBMUTE
|
||||||
|
#define KDSKBMUTE 0x4B51
|
||||||
|
#endif
|
||||||
|
|
||||||
static Bool KeepTty = FALSE;
|
static Bool KeepTty = FALSE;
|
||||||
static int activeVT = -1;
|
static int activeVT = -1;
|
||||||
|
|
||||||
|
@ -213,19 +221,23 @@ xf86OpenConsole(void)
|
||||||
tcgetattr(xf86Info.consoleFd, &tty_attr);
|
tcgetattr(xf86Info.consoleFd, &tty_attr);
|
||||||
SYSCALL(ioctl(xf86Info.consoleFd, KDGKBMODE, &tty_mode));
|
SYSCALL(ioctl(xf86Info.consoleFd, KDGKBMODE, &tty_mode));
|
||||||
|
|
||||||
#ifdef K_OFF
|
/* disable kernel special keys and buffering, new style */
|
||||||
/* disable kernel special keys and buffering */
|
SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMUTE, 1));
|
||||||
SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_OFF));
|
|
||||||
if (ret < 0)
|
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)
|
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 */
|
/* ... and drain events, else the kernel gets angry */
|
||||||
xf86SetConsoleHandler(drain_console, NULL);
|
xf86SetConsoleHandler(drain_console, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nTty = tty_attr;
|
nTty = tty_attr;
|
||||||
|
@ -271,6 +283,7 @@ xf86CloseConsole(void)
|
||||||
xf86Msg(X_WARNING, "xf86CloseConsole: KDSETMODE failed: %s\n",
|
xf86Msg(X_WARNING, "xf86CloseConsole: KDSETMODE failed: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
|
|
||||||
|
SYSCALL(ioctl(xf86Info.consoleFd, KDSKBMUTE, 0));
|
||||||
SYSCALL(ioctl(xf86Info.consoleFd, KDSKBMODE, tty_mode));
|
SYSCALL(ioctl(xf86Info.consoleFd, KDSKBMODE, tty_mode));
|
||||||
tcsetattr(xf86Info.consoleFd, TCSANOW, &tty_attr);
|
tcsetattr(xf86Info.consoleFd, TCSANOW, &tty_attr);
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,6 @@
|
||||||
#include "events.h"
|
#include "events.h"
|
||||||
#include "eventstr.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 EventToCore(InternalEvent *event, xEvent **core, int *count);
|
||||||
_X_EXPORT int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
|
_X_EXPORT int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
|
||||||
_X_EXPORT int EventToXI2(InternalEvent *ev, xEvent **xi);
|
_X_EXPORT int EventToXI2(InternalEvent *ev, xEvent **xi);
|
||||||
|
|
|
@ -835,23 +835,6 @@ extern void XkbFakeDeviceButton(DeviceIntPtr /* dev */ ,
|
||||||
#define _XkbListGeometry 4
|
#define _XkbListGeometry 4
|
||||||
#define _XkbListNumComponents 5
|
#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 */ ,
|
extern _X_EXPORT unsigned int XkbDDXLoadKeymapByNames(DeviceIntPtr /* keybd */ ,
|
||||||
XkbComponentNamesPtr
|
XkbComponentNamesPtr
|
||||||
/* names */ ,
|
/* 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_x == 0); /* set in FixUpEventFromWindow */
|
||||||
assert(out->event_y == 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_x == double_to_fp1616(in->root_x + in->root_x_frac));
|
||||||
assert(out->root_y == FP1616(in->root_y, in->root_y_frac));
|
assert(out->root_y == double_to_fp1616(in->root_y + in->root_y_frac));
|
||||||
|
|
||||||
buttons = 0;
|
buttons = 0;
|
||||||
for (i = 0; i < bits_to_bytes(sizeof(in->buttons)); i++) {
|
for (i = 0; i < bits_to_bytes(sizeof(in->buttons)); i++) {
|
||||||
|
|
|
@ -1300,6 +1300,10 @@ CreatePointerBarrierClient(ScreenPtr screen, ClientPtr client,
|
||||||
|
|
||||||
ret->screen = screen;
|
ret->screen = screen;
|
||||||
ret->num_devices = stuff->num_devices;
|
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];
|
in_devices = (CARD16 *) &stuff[1];
|
||||||
for (i = 0; i < stuff->num_devices; i++) {
|
for (i = 0; i < stuff->num_devices; i++) {
|
||||||
|
|
|
@ -6,8 +6,7 @@ DDX_SRCS = \
|
||||||
ddxBeep.c \
|
ddxBeep.c \
|
||||||
ddxCtrls.c \
|
ddxCtrls.c \
|
||||||
ddxLEDs.c \
|
ddxLEDs.c \
|
||||||
ddxLoad.c \
|
ddxLoad.c
|
||||||
ddxList.c
|
|
||||||
|
|
||||||
DIX_SRCS = \
|
DIX_SRCS = \
|
||||||
xkb.c \
|
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;
|
DeviceIntPtr dev;
|
||||||
xkbListComponentsReply rep;
|
xkbListComponentsReply rep;
|
||||||
unsigned len;
|
unsigned len;
|
||||||
int status;
|
|
||||||
unsigned char *str;
|
unsigned char *str;
|
||||||
XkbSrvListInfoRec list;
|
uint8_t size;
|
||||||
|
int i;
|
||||||
|
|
||||||
REQUEST(xkbListComponentsReq);
|
REQUEST(xkbListComponentsReq);
|
||||||
REQUEST_AT_LEAST_SIZE(xkbListComponentsReq);
|
REQUEST_AT_LEAST_SIZE(xkbListComponentsReq);
|
||||||
|
@ -5632,40 +5632,33 @@ ProcXkbListComponents(ClientPtr client)
|
||||||
|
|
||||||
CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
|
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];
|
str = (unsigned char *) &stuff[1];
|
||||||
memset(&list, 0, sizeof(XkbSrvListInfoRec));
|
for (i = 0; i < 6; i++) {
|
||||||
list.maxRtrn = stuff->maxNames;
|
size = *((uint8_t *)str);
|
||||||
list.pattern[_XkbListKeycodes] = GetComponentSpec(&str, FALSE, &status);
|
len = (str + size + 1) - ((unsigned char *) stuff);
|
||||||
list.pattern[_XkbListTypes] = GetComponentSpec(&str, FALSE, &status);
|
if ((XkbPaddedSize(len) / 4) > stuff->length)
|
||||||
list.pattern[_XkbListCompat] = GetComponentSpec(&str, FALSE, &status);
|
return BadLength;
|
||||||
list.pattern[_XkbListSymbols] = GetComponentSpec(&str, FALSE, &status);
|
str += (size + 1);
|
||||||
list.pattern[_XkbListGeometry] = GetComponentSpec(&str, FALSE, &status);
|
}
|
||||||
if (status != Success)
|
|
||||||
return status;
|
|
||||||
len = str - ((unsigned char *) stuff);
|
|
||||||
if ((XkbPaddedSize(len) / 4) != stuff->length)
|
if ((XkbPaddedSize(len) / 4) != stuff->length)
|
||||||
return BadLength;
|
return BadLength;
|
||||||
if ((status = XkbDDXList(dev, &list, client)) != Success) {
|
|
||||||
free(list.pool);
|
|
||||||
list.pool = NULL;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
rep = (xkbListComponentsReply) {
|
rep = (xkbListComponentsReply) {
|
||||||
.type = X_Reply,
|
.type = X_Reply,
|
||||||
.deviceID = dev->id,
|
.deviceID = dev->id,
|
||||||
.sequenceNumber = client->sequence,
|
.sequenceNumber = client->sequence,
|
||||||
.length = XkbPaddedSize(list.nPool) / 4,
|
.length = 0,
|
||||||
.nKeymaps = 0,
|
.nKeymaps = 0,
|
||||||
.nKeycodes = list.nFound[_XkbListKeycodes],
|
.nKeycodes = 0,
|
||||||
.nTypes = list.nFound[_XkbListTypes],
|
.nTypes = 0,
|
||||||
.nCompatMaps = list.nFound[_XkbListCompat],
|
.nCompatMaps = 0,
|
||||||
.nSymbols = list.nFound[_XkbListSymbols],
|
.nSymbols = 0,
|
||||||
.nGeometries = list.nFound[_XkbListGeometry],
|
.nGeometries = 0,
|
||||||
.extra = 0
|
.extra = 0
|
||||||
};
|
};
|
||||||
if (list.nTotal > list.maxRtrn)
|
|
||||||
rep.extra = (list.nTotal - list.maxRtrn);
|
|
||||||
if (client->swapped) {
|
if (client->swapped) {
|
||||||
swaps(&rep.sequenceNumber);
|
swaps(&rep.sequenceNumber);
|
||||||
swapl(&rep.length);
|
swapl(&rep.length);
|
||||||
|
@ -5678,11 +5671,6 @@ ProcXkbListComponents(ClientPtr client)
|
||||||
swaps(&rep.extra);
|
swaps(&rep.extra);
|
||||||
}
|
}
|
||||||
WriteToClient(client, SIZEOF(xkbListComponentsReply), &rep);
|
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;
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user