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,20 +221,24 @@ xf86OpenConsole(void)
 | 
			
		|||
            tcgetattr(xf86Info.consoleFd, &tty_attr);
 | 
			
		||||
            SYSCALL(ioctl(xf86Info.consoleFd, KDGKBMODE, &tty_mode));
 | 
			
		||||
 | 
			
		||||
#ifdef K_OFF
 | 
			
		||||
            /* disable kernel special keys and buffering */
 | 
			
		||||
            /* disable kernel special keys and buffering, new style */
 | 
			
		||||
            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));
 | 
			
		||||
                if (ret < 0)
 | 
			
		||||
#endif
 | 
			
		||||
                {
 | 
			
		||||
                    /* 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);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            nTty = tty_attr;
 | 
			
		||||
            nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
 | 
			
		||||
| 
						 | 
				
			
			@ -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