diff options
Diffstat (limited to 'nx-X11/programs/Xserver/lbx/lbxdix.c')
-rw-r--r-- | nx-X11/programs/Xserver/lbx/lbxdix.c | 869 |
1 files changed, 0 insertions, 869 deletions
diff --git a/nx-X11/programs/Xserver/lbx/lbxdix.c b/nx-X11/programs/Xserver/lbx/lbxdix.c deleted file mode 100644 index e2a1a7adc..000000000 --- a/nx-X11/programs/Xserver/lbx/lbxdix.c +++ /dev/null @@ -1,869 +0,0 @@ -/* $Xorg: lbxdix.c,v 1.4 2001/02/09 02:05:16 xorgcvs Exp $ */ -/* - -Copyright 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - -*/ -/* - * Copyright 1993 Network Computing Devices, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, 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 Network Computing Devices, Inc. not be - * used in advertising or publicity pertaining to distribution of this - * software without specific, written prior permission. - * - * THIS SOFTWARE IS PROVIDED `AS-IS'. NETWORK COMPUTING DEVICES, INC., - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT - * LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE, OR NONINFRINGEMENT. IN NO EVENT SHALL NETWORK - * COMPUTING DEVICES, INC., BE LIABLE FOR ANY DAMAGES WHATSOEVER, INCLUDING - * SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS OF USE, DATA, - * OR PROFITS, EVEN IF ADVISED OF THE POSSIBILITY THEREOF, AND REGARDLESS OF - * WHETHER IN AN ACTION IN CONTRACT, TORT OR NEGLIGENCE, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ -/* $XFree86: xc/programs/Xserver/lbx/lbxdix.c,v 1.7 2001/08/23 14:46:57 alanh Exp $ */ - -/* various bits of DIX-level mangling */ - -#ifdef HAVE_DIX_CONFIG_H -#include <dix-config.h> -#endif - -#include <sys/types.h> -#include <stdio.h> -#define NEED_REPLIES -#define NEED_EVENTS -#include <X11/X.h> -#include <X11/Xproto.h> -#include "misc.h" -#include "os.h" -#include "dixstruct.h" -#include "resource.h" -#include "inputstr.h" -#include "servermd.h" -#include "dixfontstr.h" -#include "gcstruct.h" -#include "scrnintstr.h" -#include "windowstr.h" -#include "propertyst.h" -#define _XLBX_SERVER_ -#include <X11/extensions/lbxstr.h> -#include "lbxserve.h" -#include "lbxtags.h" -#include "lbxdata.h" -#include <X11/Xfuncproto.h> -#ifdef XAPPGROUP -#include <X11/extensions/Xagsrv.h> -#endif -#include "swaprep.h" - -int lbx_font_private = -1; - -void -LbxDixInit(void) -{ - TagInit(); - lbx_font_private = AllocateFontPrivateIndex(); -} - -/* ARGSUSED */ -void -LbxAllowMotion(ClientPtr client, - int num) -{ - LbxProxyPtr proxy = LbxProxy(client); - proxy->motion_allowed_events += num; -} - -extern xConnSetupPrefix connSetupPrefix; -extern char *ConnectionInfo; -extern int connBlockScreenStart; - -int -LbxSendConnSetup(ClientPtr client, - char *reason) -{ - int dlength; - int i, ndex, lim, wndex; - CARD32 dataBuf[16]; - xLbxConnSetupPrefix csp; - NewClientInfoRec nci; - LbxProxyPtr proxy = LbxProxy(client); - - if (reason) { - SendConnSetup(client, reason); - LbxForceOutput(proxy); /* expedient to avoid another state variable */ - return (client->noClientException); - } - - IncrementClientCount(); - - client->requestVector = client->swapped ? SwappedProcVector : ProcVector; - client->sequence = 0; - dataBuf[0] = client->clientAsMask; - - csp.success = TRUE; - csp.majorVersion = connSetupPrefix.majorVersion; - csp.minorVersion = connSetupPrefix.minorVersion; - csp.tag = 0; -#ifdef XAPPGROUP - if (!client->appgroup) { -#endif - csp.changeType = 1; /* LbxNormalDeltas */ - csp.length = 2 + /* tag + resource-id-base */ - screenInfo.numScreens; /* input-mask per screen */ - wndex = 0; ndex = 1; lim = screenInfo.numScreens; -#ifdef XAPPGROUP - } else { - csp.changeType = 2; /* LbxAppGroupDeltas */ - csp.length = 7 + /* tag, res-id-base, root, visual, colormap, b&w-pix */ - 1 + screenInfo.numScreens - screenInfo.numVideoScreens; - XagGetDeltaInfo (client, &dataBuf[1]); - for (i = 0; i < MAXSCREENS; i++) { - if ((CARD32) WindowTable[i]->drawable.id == dataBuf[1]) { - dataBuf[6] = WindowTable[i]->eventMask | wOtherEventMasks(WindowTable[i]); - break; - } - } - wndex = screenInfo.numVideoScreens; - ndex = 7; - lim = screenInfo.numScreens - screenInfo.numVideoScreens; - } -#endif - for (i = 0; i < lim; i++, ndex++, wndex++) { - dataBuf[ndex] = - WindowTable[wndex]->eventMask | wOtherEventMasks(WindowTable[wndex]); - } - dlength = (csp.length - 1) << 2; - - if (LbxProxyClient(proxy)->swapped) { - swaps(&csp.length, i); - } - - if (client->swapped) { - LbxWriteSConnSetupPrefix(client, &csp); - SwapLongs(dataBuf, (1 + screenInfo.numScreens)); - WriteToClient(client, dlength, (pointer) dataBuf); - } else { - WriteToClient(client, sizeof(xLbxConnSetupPrefix), (char *) &csp); - WriteToClient(client, dlength, (pointer) dataBuf); - } - - LbxForceOutput(proxy); /* expedient to avoid another state variable */ - client->clientState = ClientStateRunning; - if (ClientStateCallback) { - if (LbxProxyClient(proxy)->swapped != client->swapped) { - swaps(&csp.length, i); - } - nci.client = client; - nci.prefix = (xConnSetupPrefix*) &csp; - nci.setup = (xConnSetup *) ConnectionInfo; - CallCallbacks(&ClientStateCallback, (pointer) &nci); - } - - return client->noClientException; -} - -static XID modifier_map_tag; - -int -LbxGetModifierMapping(ClientPtr client) -{ - TagData td; - pointer tagdata; - xLbxGetModifierMappingReply rep; - register KeyClassPtr keyc = inputInfo.keyboard->key; - int dlength = keyc->maxKeysPerModifier << 3; - Bool tag_known = FALSE, - send_data; - int n; - - if (!modifier_map_tag) { - tagdata = (pointer) keyc->modifierKeyMap; - TagSaveTag(LbxTagTypeModmap, dlength, tagdata, &modifier_map_tag); - } else { - td = TagGetTag(modifier_map_tag); - tagdata = td->tdata; - tag_known = TagProxyMarked(modifier_map_tag, LbxProxyID(client)); - } - if (modifier_map_tag) - TagMarkProxy(modifier_map_tag, LbxProxyID(client)); - - send_data = (!modifier_map_tag || !tag_known); - - rep.type = X_Reply; - rep.keyspermod = keyc->maxKeysPerModifier; - rep.sequenceNumber = client->sequence; - rep.tag = modifier_map_tag; - rep.pad0 = rep.pad1 = rep.pad2 = rep.pad3 = rep.pad4 = 0; - - if (send_data) - rep.length = dlength >> 2; - else - rep.length = 0; - - if (client->swapped) { - swaps(&rep.sequenceNumber, n); - swapl(&rep.length, n); - swapl(&rep.tag, n); - } - WriteToClient(client, sizeof(xLbxGetModifierMappingReply), (char *)&rep); - - if (send_data) - WriteToClient(client, dlength, (char *) tagdata); - - return client->noClientException; -} - -void -LbxFlushModifierMapTag(void) -{ - - if (modifier_map_tag) - TagDeleteTag(modifier_map_tag); -} - -static XID keyboard_map_tag; - -int -LbxGetKeyboardMapping(ClientPtr client) -{ - TagData td; - pointer tagdata; - xLbxGetKeyboardMappingReply rep; - - REQUEST(xLbxGetKeyboardMappingReq); - KeySymsPtr curKeySyms = &inputInfo.keyboard->key->curKeySyms; - int dlength; - Bool tag_known = FALSE, - send_data; - int n; - - REQUEST_SIZE_MATCH(xLbxGetKeyboardMappingReq); - - if ((stuff->firstKeyCode < curKeySyms->minKeyCode) || - (stuff->firstKeyCode > curKeySyms->maxKeyCode)) { - client->errorValue = stuff->firstKeyCode; - return BadValue; - } - if (stuff->firstKeyCode + stuff->count > curKeySyms->maxKeyCode + 1) { - client->errorValue = stuff->count; - return BadValue; - } - rep.type = X_Reply; - rep.sequenceNumber = client->sequence; - rep.keysperkeycode = curKeySyms->mapWidth; - /* length is a count of 4 byte quantities and KeySyms are 4 bytes */ - - if (!keyboard_map_tag) { - tagdata = (pointer) &curKeySyms->map[(stuff->firstKeyCode - - curKeySyms->minKeyCode) * curKeySyms->mapWidth]; - dlength = (curKeySyms->mapWidth * stuff->count); - TagSaveTag(LbxTagTypeKeymap, dlength, tagdata, &keyboard_map_tag); - } else { - td = TagGetTag(keyboard_map_tag); - tagdata = td->tdata; - tag_known = TagProxyMarked(keyboard_map_tag, LbxProxyID(client)); - } - if (keyboard_map_tag) - TagMarkProxy(keyboard_map_tag, LbxProxyID(client)); - - send_data = (!keyboard_map_tag || !tag_known); - rep.type = X_Reply; - rep.keysperkeycode = curKeySyms->mapWidth; - rep.sequenceNumber = client->sequence; - rep.tag = keyboard_map_tag; - rep.pad0 = rep.pad1 = rep.pad2 = rep.pad3 = rep.pad4 = 0; - - if (send_data) - rep.length = (curKeySyms->mapWidth * stuff->count); - else - rep.length = 0; - - if (client->swapped) { - swaps(&rep.sequenceNumber, n); - swapl(&rep.length, n); - swapl(&rep.tag, n); - } - WriteToClient(client, sizeof(xLbxGetKeyboardMappingReply), (char *)&rep); - - if (send_data) { - client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write; - WriteSwappedDataToClient(client, - curKeySyms->mapWidth * stuff->count * sizeof(KeySym), - &curKeySyms->map[(stuff->firstKeyCode - curKeySyms->minKeyCode) * - curKeySyms->mapWidth]); - } - return client->noClientException; -} - -void -LbxFlushKeyboardMapTag(void) -{ - if (keyboard_map_tag) - TagDeleteTag(keyboard_map_tag); -} - -/* counts number of bits needed to hold value */ -static int -_bitsize(int val) -{ - int bits = 1; /* always need one for sign bit */ - - if (val == 0) - return (bits); - - if (val < 0) { - val = -val; - } - while (val) { - bits++; - val >>= 1; - } - - return bits; - -} - -/* - * squashes the font (if possible), returning the new length and - * a pointer to the new data (which has been allocated). if it can't - * squish, it just returns a 0 and the data is sent in raw form. - */ -int _lbx_fi_junklen = sizeof(BYTE) * 2 + sizeof(CARD16) + sizeof(CARD32); - -static int -squish_font_info(xQueryFontReply *qfr, - int rlen, - xLbxFontInfo **sqrep) -{ - int len, - hlen; - xLbxFontInfo *new; - xCharInfo *minb, - *maxb, - *ci, - bbox; - int i; - char *t; - xLbxCharInfo *chars; - int num_chars; - - num_chars = qfr->nCharInfos; - - if (num_chars == 0) - return 0; - - minb = &qfr->minBounds; - maxb = &qfr->maxBounds; - /* - * first do the quick check -- if the attribute fields aren't all the - * same, punt - */ - - if (minb->attributes != maxb->attributes) - return 0; - -#define compute(field) \ - bbox.field = max(_bitsize(minb->field), _bitsize(maxb->field)) - - compute(characterWidth); - compute(leftSideBearing); - compute(rightSideBearing); - compute(ascent); - compute(descent); - -#undef compute - - /* make sure it fits */ - if (!((bbox.characterWidth <= LBX_WIDTH_BITS) && - (bbox.leftSideBearing <= LBX_LEFT_BITS) && - (bbox.rightSideBearing <= LBX_RIGHT_BITS) && - (bbox.ascent <= LBX_ASCENT_BITS) && - (bbox.descent <= LBX_DESCENT_BITS))) { - return 0; - } - - hlen = sizeof(xLbxFontInfo) + qfr->nFontProps * sizeof(xFontProp); - - len = hlen + (num_chars * sizeof(xLbxCharInfo)); - - new = (xLbxFontInfo *) xalloc(len); - if (!new) - return 0; - - /* gross hack to avoid copying all the fields */ - t = (char *) qfr; - t += _lbx_fi_junklen; - - /* copy all but the char infos */ - memcpy((char *) new, (char *) t, hlen); - - t = (char *) new; - t += hlen; - chars = (xLbxCharInfo *) t; - - t = (char *) qfr; - t += sizeof(xQueryFontReply) + qfr->nFontProps * sizeof(xFontProp); - ci = (xCharInfo *) t; - - /* now copy & pack the charinfos */ - for (i = 0; i < num_chars; i++, chars++, ci++) { - chars->metrics = 0; - chars->metrics |= (LBX_MASK_BITS(ci->characterWidth, LBX_WIDTH_BITS) - << LBX_WIDTH_SHIFT); - chars->metrics |= (LBX_MASK_BITS(ci->leftSideBearing, LBX_LEFT_BITS) - << LBX_LEFT_SHIFT); - chars->metrics |= (LBX_MASK_BITS(ci->rightSideBearing, LBX_RIGHT_BITS) - << LBX_RIGHT_SHIFT); - chars->metrics |= (LBX_MASK_BITS(ci->ascent, LBX_ASCENT_BITS) - << LBX_ASCENT_SHIFT); - chars->metrics |= (LBX_MASK_BITS(ci->descent, LBX_DESCENT_BITS) - << LBX_DESCENT_SHIFT); - } - - *sqrep = new; - return len; -} - -int -LbxQueryFont(ClientPtr client) -{ - xQueryFontReply *reply; - xLbxQueryFontReply lbxrep; - FontPtr pFont; - register GC *pGC; - Bool send_data = FALSE; - Bool free_data = FALSE; - int rlength = 0; - FontTagInfoPtr ftip; - int sqlen = 0; - xLbxFontInfo *sqrep, - *sreply = NULL; - - REQUEST(xLbxQueryFontReq); - - REQUEST_SIZE_MATCH(xLbxQueryFontReq); - - client->errorValue = stuff->fid; /* EITHER font or gc */ - pFont = (FontPtr) SecurityLookupIDByType(client, stuff->fid, RT_FONT, - SecurityReadAccess); - if (!pFont) { - /* can't use VERIFY_GC because it might return BadGC */ - pGC = (GC *) SecurityLookupIDByType(client, stuff->fid, RT_GC, - SecurityReadAccess); - if (!pGC || !pGC->font) { /* catch a non-existent builtin font */ - client->errorValue = stuff->fid; - return (BadFont); /* procotol spec says only error is BadFont */ - } - pFont = pGC->font; - } - - /* get tag (if any) */ - ftip = (FontTagInfoPtr) FontGetPrivate(pFont, lbx_font_private); - - if (!ftip) { - xCharInfo *pmax = FONTINKMAX(pFont); - xCharInfo *pmin = FONTINKMIN(pFont); - int nprotoxcistructs; - - nprotoxcistructs = ( - pmax->rightSideBearing == pmin->rightSideBearing && - pmax->leftSideBearing == pmin->leftSideBearing && - pmax->descent == pmin->descent && - pmax->ascent == pmin->ascent && - pmax->characterWidth == pmin->characterWidth) ? - 0 : N2dChars(pFont); - - rlength = sizeof(xQueryFontReply) + - FONTINFONPROPS(FONTCHARSET(pFont)) * sizeof(xFontProp) + - nprotoxcistructs * sizeof(xCharInfo); - reply = (xQueryFontReply *) xalloc(rlength); - if (!reply) { - return (BadAlloc); - } - free_data = TRUE; - send_data = TRUE; - QueryFont(pFont, reply, nprotoxcistructs); - - sqlen = squish_font_info(reply, rlength, &sqrep); - if (!sqlen) { /* if it failed to squish, send it raw */ - char *t; - - lbxrep.compression = 0; - - sqlen = rlength - _lbx_fi_junklen; - t = (char *) reply; - sqrep = (xLbxFontInfo *) (t + _lbx_fi_junklen); - } else { - lbxrep.compression = 1; - xfree(reply); /* no longer needed */ - } - } else { /* just get data from tag */ - sqrep = ftip->fontinfo; - sqlen = ftip->size; - lbxrep.compression = ftip->compression; - } - - if (!ftip) { - /* data allocation is done when font is first queried */ - ftip = (FontTagInfoPtr) xalloc(sizeof(FontTagInfoRec)); - if (ftip && - TagSaveTag(LbxTagTypeFont, sqlen, (pointer) ftip, &ftip->tid)) { - FontSetPrivate(pFont, lbx_font_private, (pointer) ftip); - ftip->pfont = pFont; - ftip->size = sqlen; - ftip->fontinfo = sqrep; - ftip->compression = lbxrep.compression; - free_data = FALSE; - } else { - xfree(ftip); - } - } - if (ftip) { - if (!TagProxyMarked(ftip->tid, LbxProxyID(client))) - send_data = TRUE; - TagMarkProxy(ftip->tid, LbxProxyID(client)); - lbxrep.tag = ftip->tid; - } else { - lbxrep.tag = 0; - send_data = TRUE; - } - - lbxrep.type = X_Reply; - lbxrep.sequenceNumber = client->sequence; - lbxrep.pad0 = lbxrep.pad1 = lbxrep.pad2 = lbxrep.pad3 = lbxrep.pad4 = 0; - - if (send_data) - lbxrep.length = sqlen >> 2; - else - lbxrep.length = 0; - - if (client->swapped) { - int n; - - swaps(&lbxrep.sequenceNumber, n); - swapl(&lbxrep.length, n); - swapl(&lbxrep.tag, n); - sreply = (xLbxFontInfo *) ALLOCATE_LOCAL(sqlen); - if (!sreply) - return BadAlloc; - memcpy((char *) sreply, (char *) sqrep, sqlen); - LbxSwapFontInfo(sreply, lbxrep.compression); - sqrep = sreply; - } - WriteToClient(client, sizeof(xLbxQueryFontReply), (char *) &lbxrep); - if (send_data) - WriteToClient(client, sqlen, (char *)sqrep); - if (free_data) - xfree(sqrep); - if (sreply) - DEALLOCATE_LOCAL(sreply); - return (client->noClientException); -} - -void -LbxFreeFontTag(FontPtr pfont) -{ - FontTagInfoPtr ftip; - - ftip = (FontTagInfoPtr) FontGetPrivate(pfont, lbx_font_private); - if (ftip) - TagDeleteTag(ftip->tid); -} - -int -LbxInvalidateTag(ClientPtr client, - XID tag) -{ - TagClearProxy(tag, LbxProxyID(client)); - return client->noClientException; -} - -void -LbxSendInvalidateTag(ClientPtr client, - XID tag, - int tagtype) -{ - xLbxInvalidateTagEvent ev; - int n; - - ev.type = LbxEventCode; - ev.lbxType = LbxInvalidateTagEvent; - ev.sequenceNumber = client->sequence; - ev.tag = tag; - ev.tagType = tagtype; - ev.pad1 = ev.pad2 = ev.pad3 = ev.pad4 = ev.pad5 = 0; - - if (client->swapped) { - swaps(&ev.sequenceNumber, n); - swapl(&ev.tag, n); - swapl(&ev.tagType, n); - } - DBG(DBG_CLIENT, (stderr, "Invalidating tag %d\n", tag)); - WriteToClient(client, sizeof(xLbxInvalidateTagEvent), (char *) &ev); - LbxForceOutput(LbxProxy(client)); -} - -static void -LbxSendSendTagData(int pid, - XID tag, - int tagtype) -{ - xLbxSendTagDataEvent ev; - int n; - LbxProxyPtr proxy; - ClientPtr client; - LbxClientPtr lbxcp; - - proxy = LbxPidToProxy(pid); - lbxcp = (proxy != NULL) ? proxy->lbxClients[0] : NULL; - if (lbxcp && (client = lbxcp->client)) { - ev.type = LbxEventCode; - ev.lbxType = LbxSendTagDataEvent; - ev.sequenceNumber = client->sequence; - ev.tag = tag; - ev.tagType = tagtype; - ev.pad1 = ev.pad2 = ev.pad3 = ev.pad4 = ev.pad5 = 0; - - if (client->swapped) { - swaps(&ev.sequenceNumber, n); - swapl(&ev.tag, n); - swapl(&ev.tagType, n); - } - DBG(DBG_CLIENT, (stderr, "Requesting tag %d\n", tag)); - WriteToClient(client, sizeof(xLbxSendTagDataEvent), (char *) &ev); - LbxForceOutput(proxy); - } -} - -/* - * keep track of clients stalled waiting for tags to come back from - * a proxy. since multiple clinets can be waiting for the same tag, - * we have to keep a list of all of them. - */ - -typedef struct _sendtagq { - XID tag; - int num_stalled; - ClientPtr *stalled_clients; - struct _sendtagq *next; -} SendTagQRec, *SendTagQPtr; - -static SendTagQPtr queried_tags = NULL; - -#define LbxSendTagFailed -1 -#define LbxSendTagSendIt 0 -#define LbxSendTagAlreadySent 1 - -static Bool -LbxQueueSendTag(ClientPtr client, - XID tag) -{ - SendTagQPtr stqp, *prev, new; - ClientPtr *newlist; - - - /* see if we're asking for one already in the pipeline */ - for (prev = &queried_tags; (stqp = *prev); prev = &stqp->next) { - if (stqp->tag == tag) { - /* add new client to list */ - newlist = (ClientPtr *) xrealloc(stqp->stalled_clients, - (sizeof(ClientPtr) * (stqp->num_stalled + 1))); - if (!newlist) - return LbxSendTagFailed; - newlist[stqp->num_stalled++] = client; - stqp->stalled_clients = newlist; - DBG(DBG_CLIENT, (stderr, "Additional client requesting tag %d\n", tag)); - return LbxSendTagAlreadySent; - } - } - - /* make new one */ - new = (SendTagQPtr) xalloc(sizeof(SendTagQRec)); - newlist = (ClientPtr *) xalloc(sizeof(ClientPtr)); - if (!new || !newlist) { - xfree(new); - xfree(newlist); - return LbxSendTagFailed; - } - *newlist = client; - new->stalled_clients = newlist; - new->num_stalled = 1; - new->tag = tag; - new->next = NULL; - - /* stick on end of list */ - *prev = new; - return LbxSendTagSendIt; -} - -static SendTagQPtr -LbxFindQTag(XID tag) -{ - SendTagQPtr stqp; - - for (stqp = queried_tags; stqp; stqp = stqp->next) { - if (stqp->tag == tag) - return stqp; - } - return NULL; -} - -static void -LbxFreeQTag(SendTagQPtr stqp) -{ - xfree(stqp->stalled_clients); - xfree(stqp); -} - -static void -LbxRemoveQTag(XID tag) -{ - SendTagQPtr stqp, *prev; - - for (prev = &queried_tags; (stqp = *prev); prev = &stqp->next) { - if (stqp->tag == tag) { - *prev = stqp->next; - LbxFreeQTag(stqp); - return; - } - } -} - -Bool -LbxFlushQTag(XID tag) -{ - SendTagQPtr stqp; - ClientPtr *cp; - - stqp = LbxFindQTag(tag); - if (!stqp) - return FALSE; - for (cp = stqp->stalled_clients; --stqp->num_stalled >= 0; cp++) - AttendClient(*cp); - LbxRemoveQTag(tag); - return TRUE; -} - -void -ProcessQTagZombies(void) -{ - SendTagQPtr stqp; - ClientPtr *out, *in; - int i; - - for (stqp = queried_tags; stqp; stqp = stqp->next) { - out = stqp->stalled_clients; - for (in = out, i = stqp->num_stalled; --i >= 0; in++) { - if ((*in)->clientGone) - --stqp->num_stalled; - else - *out++ = *in; - } - } -} - -/* - * server sends this - */ - -void -LbxQueryTagData(ClientPtr client, - int owner_pid, - XID tag, - int tagtype) -{ - /* save the info and the client being stalled */ - if (LbxQueueSendTag(client, tag) == LbxSendTagSendIt) - LbxSendSendTagData(owner_pid, tag, tagtype); -} - -/* - * server recieves this - */ -int -LbxTagData(ClientPtr client, - XID tag, - unsigned long len, - pointer data) -{ - TagData td; - PropertyPtr pProp; - - td = TagGetTag(tag); - if (!td || td->data_type != LbxTagTypeProperty) - return Success; - if (!td->global) { - /* somebody changed contents while we were querying */ - TagDeleteTag(tag); - return Success; - } - LbxFlushQTag(tag); - pProp = (PropertyPtr) td->tdata; - if (pProp->tag_id != tag || pProp->owner_pid != LbxProxyID(client)) - return Success; - pProp->owner_pid = 0; - if (len != td->size) - pProp->size = len / (pProp->format >> 3); - pProp->data = xrealloc(pProp->data, len); - if (!pProp->data) { - pProp->size = 0; - return Success; - } - if (client->swapped) { - switch (pProp->format) { - case 32: - SwapLongs((CARD32 *) data, len >> 2); - break; - case 16: - SwapShorts((short *) data, len >> 1); - break; - default: - break; - } - } - memmove((char *) pProp->data, (char *) data, len); - return Success; -} - -/* when server resets, need to reset global tags */ -void -LbxResetTags(void) -{ - SendTagQPtr stqp; - - modifier_map_tag = 0; - keyboard_map_tag = 0; - - /* clean out any pending tag requests */ - while ((stqp = queried_tags)) { - queried_tags = stqp->next; - LbxFreeQTag(stqp); - } -} |