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,20 +221,24 @@ 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));
 | 
				
			||||||
 | 
					            if (ret < 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                /* disable kernel special keys and buffering, old style */
 | 
				
			||||||
                SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_OFF));
 | 
					                SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_OFF));
 | 
				
			||||||
                if (ret < 0)
 | 
					                if (ret < 0)
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
					                    /* fine, just disable special keys */
 | 
				
			||||||
                    SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW));
 | 
					                    SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW));
 | 
				
			||||||
                    if (ret < 0)
 | 
					                    if (ret < 0)
 | 
				
			||||||
                        FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed %s\n",
 | 
					                        FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed %s\n",
 | 
				
			||||||
                                   strerror(errno));
 | 
					                                   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;
 | 
				
			||||||
            nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
 | 
					            nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
 | 
				
			||||||
| 
						 | 
					@ -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