Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 82963 Details for
Bug 127333
Several GTK+ applications crash after upgrade to Xorg7.0
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
1.0.2-overlay-windows.patch
1.0.2-overlay-windows.patch (text/plain), 34.57 KB, created by
Donnie Berkholz (RETIRED)
on 2006-03-23 13:29:29 UTC
(
hide
)
Description:
1.0.2-overlay-windows.patch
Filename:
MIME Type:
Creator:
Donnie Berkholz (RETIRED)
Created:
2006-03-23 13:29:29 UTC
Size:
34.57 KB
patch
obsolete
>Index: xorg/composite/compalloc.c >=================================================================== >RCS file: /cvs/xorg/xserver/xorg/composite/compalloc.c,v >retrieving revision 1.8 >retrieving revision 1.9 >diff -u -b -B -r1.8 -r1.9 >--- xorg/composite/compalloc.c 12 Jan 2006 22:14:55 -0000 1.8 >+++ xorg/composite/compalloc.c 13 Mar 2006 21:59:55 -0000 1.9 >@@ -1,6 +1,26 @@ > /* > * $Id: compalloc.c,v 1.7 2005/07/03 07:37:34 daniels Exp $ > * >+ * Copyright © 2006 Sun Microsystems >+ * >+ * 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 of Sun Microsystems not be used in >+ * advertising or publicity pertaining to distribution of the software without >+ * specific, written prior permission. Sun Microsystems makes no >+ * representations about the suitability of this software for any purpose. It >+ * is provided "as is" without express or implied warranty. >+ * >+ * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, >+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO >+ * EVENT SHALL SUN MICROSYSTEMS 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. >+ * > * Copyright © 2003 Keith Packard > * > * Permission to use, copy, modify, distribute, and sell this software and its >@@ -58,6 +78,11 @@ > CompWindowPtr cw = GetCompWindow (pWin); > CompClientWindowPtr ccw; > Bool wasMapped = pWin->mapped; >+ CompScreenPtr cs = GetCompScreen(pWin->drawable.pScreen); >+ >+ if (pWin == cs->pOverlayWin) { >+ return Success; >+ } > > /* > * Only one Manual update is allowed >Index: xorg/composite/compext.c >=================================================================== >RCS file: /cvs/xorg/xserver/xorg/composite/compext.c,v >retrieving revision 1.5 >retrieving revision 1.6 >diff -u -b -B -r1.5 -r1.6 >--- xorg/composite/compext.c 3 Jul 2005 07:37:34 -0000 1.5 >+++ xorg/composite/compext.c 13 Mar 2006 21:59:55 -0000 1.6 >@@ -1,5 +1,26 @@ > /* >- * $Id: compext.c,v 1.4 2005/07/03 07:01:17 daniels Exp $ >+ * $Id: compext.c,v 1.5 2005/07/03 07:37:34 daniels Exp $ >+ * >+ * >+ * Copyright © 2006 Sun Microsystems >+ * >+ * 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 of Sun Microsystems not be used in >+ * advertising or publicity pertaining to distribution of the software without >+ * specific, written prior permission. Sun Microsystems makes no >+ * representations about the suitability of this software for any purpose. It >+ * is provided "as is" without express or implied warranty. >+ * >+ * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, >+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO >+ * EVENT SHALL SUN MICROSYSTEMS 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. > * > * Copyright © 2003 Keith Packard > * >@@ -32,6 +53,10 @@ > int CompositeClientPrivateIndex; > RESTYPE CompositeClientWindowType; > RESTYPE CompositeClientSubwindowsType; >+RESTYPE CompositeClientOverlayType; >+ >+static void deleteCompOverlayClient (CompOverlayClientPtr pOcToDel, >+ ScreenPtr pScreen); > > typedef struct _CompositeClient { > int major_version; >@@ -77,6 +102,26 @@ > } > > static int >+FreeCompositeClientOverlay (pointer value, XID ccwid) >+{ >+ CompOverlayClientPtr pOc = (CompOverlayClientPtr) value; >+ ScreenPtr pScreen = pOc->pScreen; >+ CompScreenPtr cs; >+ >+ deleteCompOverlayClient(pOc, pScreen); >+ >+ /* Unmap overlay window when there are no more clients using it */ >+ cs = GetCompScreen(pScreen); >+ if (cs->pOverlayClients == NULL) { >+ if (cs->pOverlayWin != NULL) { >+ UnmapWindow(cs->pOverlayWin, FALSE); >+ } >+ } >+ >+ return Success; >+} >+ >+static int > ProcCompositeQueryVersion (ClientPtr client) > { > CompositeClientPtr pCompositeClient = GetCompositeClient (client); >@@ -243,6 +288,229 @@ > return(client->noClientException); > } > >+ >+/* >+ * Routines for manipulating the per-screen overlay clients list. >+ * This list indicates which clients have called GetOverlayWindow >+ * for this screen. >+ */ >+ >+/* Return the screen's overlay client list element for the given client */ >+static CompOverlayClientPtr >+findCompOverlayClient (ClientPtr pClient, ScreenPtr pScreen) >+{ >+ CompScreenPtr cs = GetCompScreen(pScreen); >+ CompOverlayClientPtr pOc; >+ >+ for (pOc = cs->pOverlayClients; pOc != NULL; pOc = pOc->pNext) { >+ if (pOc->pClient == pClient) { >+ return pOc; >+ } >+ } >+ >+ return NULL; >+} >+ >+static int >+createCompOverlayClient (ClientPtr pClient, ScreenPtr pScreen) >+{ >+ CompScreenPtr cs = GetCompScreen(pScreen); >+ CompOverlayClientPtr pOc; >+ >+ pOc = (CompOverlayClientPtr) xalloc(sizeof(CompOverlayClientRec)); >+ if (pOc == NULL) { >+ return BadAlloc; >+ } >+ pOc->pClient = pClient; >+ pOc->pScreen = pScreen; >+ pOc->resource = FakeClientID(pClient->index); >+ pOc->pNext = cs->pOverlayClients; >+ cs->pOverlayClients = pOc; >+ >+ /* >+ * Create a resource for this element so it can be deleted >+ * when the client goes away. >+ */ >+ if (!AddResource (pOc->resource, CompositeClientOverlayType, >+ (pointer) pOc)) { >+ xfree(pOc); >+ return BadAlloc; >+ } >+ >+ return Success; >+} >+ >+/* >+ * Delete the given overlay client list element from its screen list. >+ */ >+static void >+deleteCompOverlayClient (CompOverlayClientPtr pOcToDel, ScreenPtr pScreen) >+{ >+ CompScreenPtr cs = GetCompScreen(pScreen); >+ CompOverlayClientPtr pOc, pNext; >+ CompOverlayClientPtr pOcLast = NULL; >+ >+ pOc = cs->pOverlayClients; >+ while (pOc != NULL) { >+ pNext = pOc->pNext; >+ if (pOc == pOcToDel) { >+ xfree(pOc); >+ if (pOcLast == NULL) { >+ cs->pOverlayClients = pNext; >+ } else { >+ pOcLast->pNext = pNext; >+ } >+ break; >+ } >+ pOcLast = pOc; >+ pOc = pNext; >+ } >+} >+ >+/* >+ * Delete all the hide-counts list elements for this screen. >+ */ >+void >+deleteCompOverlayClientsForScreen (ScreenPtr pScreen) >+{ >+ CompScreenPtr cs = GetCompScreen(pScreen); >+ CompOverlayClientPtr pOc, pTmp; >+ >+ pOc = cs->pOverlayClients; >+ while (pOc != NULL) { >+ pTmp = pOc->pNext; >+ FreeResource(pOc->resource, 0); >+ pOc = pTmp; >+ } >+ cs->pOverlayClients = NULL; >+} >+ >+/* >+** If necessary, create the overlay window. And map it >+** Note: I found it excessively difficult to destroy this window >+** during compCloseScreen; DeleteWindow can't be called because >+** the input devices are already shut down. So we are going to >+** just allocate an overlay window once per screen per X server >+** invocation. >+*/ >+ >+static WindowPtr >+createOverlayWindow (ScreenPtr pScreen) >+{ >+ int wid = FakeClientID(0); >+ WindowPtr pWin; >+ XID overrideRedirect = TRUE; >+ int result; >+ >+ pWin = CreateWindow ( >+ wid, WindowTable[pScreen->myNum], >+ 0, 0, pScreen->width, pScreen->height, 0, >+ InputOutput, CWOverrideRedirect, &overrideRedirect, >+ WindowTable[pScreen->myNum]->drawable.depth, >+ serverClient, pScreen->rootVisual, &result); >+ if (pWin == NULL) { >+ return NULL; >+ } >+ >+ if (!AddResource(wid, RT_WINDOW, (pointer)pWin)) { >+ DeleteWindow(pWin, None); >+ return NULL; >+ } >+ >+ return pWin; >+} >+ >+int >+ProcCompositeGetOverlayWindow (ClientPtr client) >+{ >+ REQUEST(xCompositeGetOverlayWindowReq); >+ xCompositeGetOverlayWindowReply rep; >+ WindowPtr pWin; >+ ScreenPtr pScreen; >+ CompScreenPtr cs; >+ CompOverlayClientPtr pOc; >+ >+ REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq); >+ pWin = (WindowPtr) LookupIDByType (stuff->window, RT_WINDOW); >+ if (!pWin) >+ { >+ client->errorValue = stuff->window; >+ return BadWindow; >+ } >+ pScreen = pWin->drawable.pScreen; >+ >+ cs = GetCompScreen(pScreen); >+ if (cs->pOverlayWin == NULL) { >+ cs->pOverlayWin = createOverlayWindow(pScreen); >+ if (cs->pOverlayWin == NULL) { >+ return BadAlloc; >+ } >+ } >+ MapWindow(cs->pOverlayWin, serverClient); >+ >+ /* Record that client is using this overlay window */ >+ pOc = findCompOverlayClient(client, pScreen); >+ if (pOc == NULL) { >+ int ret = createCompOverlayClient(client, pScreen); >+ if (ret != Success) { >+ return ret; >+ } >+ } >+ >+ rep.type = X_Reply; >+ rep.sequenceNumber = client->sequence; >+ rep.length = 0; >+ rep.overlayWin = cs->pOverlayWin->drawable.id; >+ >+ if (client->swapped) >+ { >+ int n; >+ swaps(&rep.sequenceNumber, n); >+ swapl(&rep.length, n); >+ swapl(&rep.overlayWin, n); >+ } >+ (void) WriteToClient(client, sz_xCompositeGetOverlayWindowReply, (char *)&rep); >+ >+ return client->noClientException; >+} >+ >+int >+ProcCompositeReleaseOverlayWindow (ClientPtr client) >+{ >+ REQUEST(xCompositeReleaseOverlayWindowReq); >+ WindowPtr pWin; >+ ScreenPtr pScreen; >+ CompOverlayClientPtr pOc; >+ CompScreenPtr cs; >+ >+ REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq); >+ pWin = (WindowPtr) LookupIDByType (stuff->window, RT_WINDOW); >+ if (!pWin) >+ { >+ client->errorValue = stuff->window; >+ return BadWindow; >+ } >+ pScreen = pWin->drawable.pScreen; >+ >+ /* >+ * Has client queried a reference to the overlay window >+ * on this screen? If not, generate an error. >+ */ >+ pOc = findCompOverlayClient(client, pWin->drawable.pScreen); >+ if (pOc == NULL) { >+ return BadMatch; >+ } >+ >+ deleteCompOverlayClient(pOc, pOc->pScreen); >+ >+ cs = GetCompScreen(pScreen); >+ if (cs->pOverlayClients == NULL) { >+ UnmapWindow(cs->pOverlayWin, FALSE); >+ } >+ >+ return client->noClientException; >+} >+ > int (*ProcCompositeVector[CompositeNumberRequests])(ClientPtr) = { > ProcCompositeQueryVersion, > ProcCompositeRedirectWindow, >@@ -251,6 +519,8 @@ > ProcCompositeUnredirectSubwindows, > ProcCompositeCreateRegionFromBorderClip, > ProcCompositeNameWindowPixmap, >+ ProcCompositeGetOverlayWindow, >+ ProcCompositeReleaseOverlayWindow, > }; > > static int >@@ -351,6 +621,30 @@ > return (*ProcCompositeVector[stuff->compositeReqType]) (client); > } > >+int >+SProcCompositeGetOverlayWindow (ClientPtr client) >+{ >+ int n; >+ REQUEST(xCompositeGetOverlayWindowReq); >+ >+ swaps (&stuff->length, n); >+ REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq); >+ swapl(&stuff->window, n); >+ return (*ProcCompositeVector[stuff->compositeReqType]) (client); >+} >+ >+int >+SProcCompositeReleaseOverlayWindow (ClientPtr client) >+{ >+ int n; >+ REQUEST(xCompositeReleaseOverlayWindowReq); >+ >+ swaps (&stuff->length, n); >+ REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq); >+ swapl(&stuff->window, n); >+ return (*ProcCompositeVector[stuff->compositeReqType]) (client); >+} >+ > int (*SProcCompositeVector[CompositeNumberRequests])(ClientPtr) = { > SProcCompositeQueryVersion, > SProcCompositeRedirectWindow, >@@ -359,6 +653,8 @@ > SProcCompositeUnredirectSubwindows, > SProcCompositeCreateRegionFromBorderClip, > SProcCompositeNameWindowPixmap, >+ SProcCompositeGetOverlayWindow, >+ SProcCompositeReleaseOverlayWindow, > }; > > static int >@@ -386,6 +682,10 @@ > if (!CompositeClientSubwindowsType) > return; > >+ CompositeClientOverlayType = CreateNewResourceType (FreeCompositeClientOverlay); >+ if (!CompositeClientOverlayType) >+ return; >+ > CompositeClientPrivateIndex = AllocateClientPrivateIndex (); > if (!AllocateClientPrivate (CompositeClientPrivateIndex, > sizeof (CompositeClientRec))) >@@ -400,7 +700,6 @@ > return; > CompositeReqCode = (CARD8) extEntry->base; > >- > for (s = 0; s < screenInfo.numScreens; s++) > if (!compScreenInit (screenInfo.screens[s])) > return; >Index: xorg/composite/compinit.c >=================================================================== >RCS file: /cvs/xorg/xserver/xorg/composite/compinit.c,v >retrieving revision 1.9 >retrieving revision 1.10 >diff -u -b -B -r1.9 -r1.10 >--- xorg/composite/compinit.c 3 Jul 2005 07:37:34 -0000 1.9 >+++ xorg/composite/compinit.c 13 Mar 2006 21:59:55 -0000 1.10 >@@ -1,5 +1,25 @@ > /* >- * $Id: compinit.c,v 1.8 2005/07/03 07:01:17 daniels Exp $ >+ * $Id: compinit.c,v 1.9 2005/07/03 07:37:34 daniels Exp $ >+ * >+ * Copyright © 2006 Sun Microsystems >+ * >+ * 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 of Sun Microsystems not be used in >+ * advertising or publicity pertaining to distribution of the software without >+ * specific, written prior permission. Sun Microsystems makes no >+ * representations about the suitability of this software for any purpose. It >+ * is provided "as is" without express or implied warranty. >+ * >+ * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, >+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO >+ * EVENT SHALL SUN MICROSYSTEMS 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. > * > * Copyright © 2003 Keith Packard > * >@@ -55,6 +76,15 @@ > pScreen->CreateWindow = cs->CreateWindow; > pScreen->CopyWindow = cs->CopyWindow; > pScreen->PositionWindow = cs->PositionWindow; >+ >+ deleteCompOverlayClientsForScreen(pScreen); >+ >+ /* >+ ** Note: no need to call DeleteWindow; the server has >+ ** already destroyed it. >+ */ >+ cs->pOverlayWin = NULL; >+ > xfree (cs); > pScreen->devPrivates[CompScreenPrivateIndex].ptr = 0; > ret = (*pScreen->CloseScreen) (index, pScreen); >@@ -333,6 +363,8 @@ > return FALSE; > > cs->damaged = FALSE; >+ cs->pOverlayWin = NULL; >+ cs->pOverlayClients = NULL; > > if (!compAddAlternateVisuals (pScreen, cs)) > { >Index: xorg/composite/compint.h >=================================================================== >RCS file: /cvs/xorg/xserver/xorg/composite/compint.h,v >retrieving revision 1.8 >retrieving revision 1.9 >diff -u -b -B -r1.8 -r1.9 >--- xorg/composite/compint.h 3 Jul 2005 08:53:37 -0000 1.8 >+++ xorg/composite/compint.h 13 Mar 2006 21:59:55 -0000 1.9 >@@ -1,6 +1,26 @@ > /* > * $Id: compint.h,v 1.7 2005/07/03 07:01:17 daniels Exp $ > * >+ * Copyright © 2006 Sun Microsystems >+ * >+ * 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 of Sun Microsystems not be used in >+ * advertising or publicity pertaining to distribution of the software without >+ * specific, written prior permission. Sun Microsystems makes no >+ * representations about the suitability of this software for any purpose. It >+ * is provided "as is" without express or implied warranty. >+ * >+ * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, >+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO >+ * EVENT SHALL SUN MICROSYSTEMS 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. >+ * > * Copyright © 2003 Keith Packard > * > * Permission to use, copy, modify, distribute, and sell this software and its >@@ -95,6 +115,15 @@ > #define NUM_COMP_ALTERNATE_VISUALS 1 > #endif > >+typedef struct _CompOverlayClientRec *CompOverlayClientPtr; >+ >+typedef struct _CompOverlayClientRec { >+ CompOverlayClientPtr pNext; >+ ClientPtr pClient; >+ ScreenPtr pScreen; >+ XID resource; >+} CompOverlayClientRec; >+ > typedef struct _CompScreen { > PositionWindowProcPtr PositionWindow; > CopyWindowProcPtr CopyWindow; >@@ -126,6 +155,10 @@ > CloseScreenProcPtr CloseScreen; > Bool damaged; > XID alternateVisuals[NUM_COMP_ALTERNATE_VISUALS]; >+ >+ WindowPtr pOverlayWin; >+ CompOverlayClientPtr pOverlayClients; >+ > } CompScreenRec, *CompScreenPtr; > > extern int CompScreenPrivateIndex; >@@ -257,4 +290,25 @@ > void > compWindowUpdate (WindowPtr pWin); > >+void >+deleteCompOverlayClientsForScreen (ScreenPtr pScreen); >+ >+int >+ProcCompositeGetOverlayWindow (ClientPtr client); >+ >+int >+ProcCompositeReleaseOverlayWindow (ClientPtr client); >+ >+int >+SProcCompositeGetOverlayWindow (ClientPtr client); >+ >+int >+SProcCompositeReleaseOverlayWindow (ClientPtr client); >+ >+WindowPtr >+CompositeRealChildHead (WindowPtr pWin); >+ >+int >+DeleteWindowNoInputDevices(pointer value, XID wid); >+ > #endif /* _COMPINT_H_ */ >Index: xorg/composite/compwindow.c >=================================================================== >RCS file: /cvs/xorg/xserver/xorg/composite/compwindow.c,v >retrieving revision 1.11 >retrieving revision 1.12 >diff -u -b -B -r1.11 -r1.12 >--- xorg/composite/compwindow.c 3 Jul 2005 07:37:34 -0000 1.11 >+++ xorg/composite/compwindow.c 13 Mar 2006 21:59:55 -0000 1.12 >@@ -1,5 +1,25 @@ > /* >- * $Id: compwindow.c,v 1.10 2005/07/03 07:01:17 daniels Exp $ >+ * $Id: compwindow.c,v 1.11 2005/07/03 07:37:34 daniels Exp $ >+ * >+ * Copyright © 2006 Sun Microsystems >+ * >+ * 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 of Sun Microsystems not be used in >+ * advertising or publicity pertaining to distribution of the software without >+ * specific, written prior permission. Sun Microsystems makes no >+ * representations about the suitability of this software for any purpose. It >+ * is provided "as is" without express or implied warranty. >+ * >+ * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, >+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO >+ * EVENT SHALL SUN MICROSYSTEMS 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. > * > * Copyright © 2003 Keith Packard > * >@@ -753,3 +773,34 @@ > } > } > } >+ >+WindowPtr >+CompositeRealChildHead (WindowPtr pWin) >+{ >+ WindowPtr pChild, pChildBefore; >+ CompScreenPtr cs; >+ >+ if (!pWin->parent && >+ (screenIsSaved == SCREEN_SAVER_ON) && >+ (HasSaverWindow (pWin->drawable.pScreen->myNum))) { >+ >+ /* First child is the screen saver; see if next child is the overlay */ >+ pChildBefore = pWin->firstChild; >+ pChild = pChildBefore->nextSib; >+ >+ } else { >+ pChildBefore = NullWindow; >+ pChild = pWin->firstChild; >+ } >+ >+ if (!pChild) { >+ return NullWindow; >+ } >+ >+ cs = GetCompScreen(pWin->drawable.pScreen); >+ if (pChild == cs->pOverlayWin) { >+ return pChild; >+ } else { >+ return pChildBefore; >+ } >+} >Index: xorg/xfixes/cursor.c >=================================================================== >RCS file: /cvs/xorg/xserver/xorg/xfixes/cursor.c,v >retrieving revision 1.6 >retrieving revision 1.7 >diff -u -b -B -r1.6 -r1.7 >--- xorg/xfixes/cursor.c 3 Jul 2005 07:37:35 -0000 1.6 >+++ xorg/xfixes/cursor.c 13 Mar 2006 21:59:55 -0000 1.7 >@@ -1,6 +1,26 @@ > /* > * $Id: cursor.c,v 1.5 2005/07/03 07:02:08 daniels Exp $ > * >+ * Copyright © 2006 Sun Microsystems >+ * >+ * 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 of Sun Microsystems not be used in >+ * advertising or publicity pertaining to distribution of the software without >+ * specific, written prior permission. Sun Microsystems makes no >+ * representations about the suitability of this software for any purpose. It >+ * is provided "as is" without express or implied warranty. >+ * >+ * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, >+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO >+ * EVENT SHALL SUN MICROSYSTEMS 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. >+ * > * Copyright © 2002 Keith Packard > * > * Permission to use, copy, modify, distribute, and sell this software and its >@@ -35,10 +55,14 @@ > #include "windowstr.h" > > static RESTYPE CursorClientType; >+static RESTYPE CursorHideCountType; > static RESTYPE CursorWindowType; > static int CursorScreenPrivateIndex = -1; > static int CursorGeneration; > static CursorPtr CursorCurrent; >+static CursorPtr pInvisibleCursor = NULL; >+ >+static void deleteCursorHideCountsForScreen (ScreenPtr pScreen); > > #define VERIFY_CURSOR(pCursor, cursor, client, access) { \ > pCursor = (CursorPtr)SecurityLookupIDByType((client), (cursor), \ >@@ -66,12 +90,29 @@ > static CursorEventPtr cursorEvents; > > /* >+ * Each screen has a list of clients which have requested >+ * that the cursor be hid, and the number of times each >+ * client has requested. >+*/ >+ >+typedef struct _CursorHideCountRec *CursorHideCountPtr; >+ >+typedef struct _CursorHideCountRec { >+ CursorHideCountPtr pNext; >+ ClientPtr pClient; >+ ScreenPtr pScreen; >+ int hideCount; >+ XID resource; >+} CursorHideCountRec; >+ >+/* > * Wrap DisplayCursor to catch cursor change events > */ > > typedef struct _CursorScreen { > DisplayCursorProcPtr DisplayCursor; > CloseScreenProcPtr CloseScreen; >+ CursorHideCountPtr pCursorHideCounts; > } CursorScreenRec, *CursorScreenPtr; > > #define GetCursorScreen(s) ((CursorScreenPtr) ((s)->devPrivates[CursorScreenPrivateIndex].ptr)) >@@ -88,7 +129,13 @@ > Bool ret; > > Unwrap (cs, pScreen, DisplayCursor); >+ >+ if (cs->pCursorHideCounts != NULL) { >+ ret = (*pScreen->DisplayCursor) (pScreen, pInvisibleCursor); >+ } else { > ret = (*pScreen->DisplayCursor) (pScreen, pCursor); >+ } >+ > if (pCursor != CursorCurrent) > { > CursorEventPtr e; >@@ -122,6 +169,7 @@ > > Unwrap (cs, pScreen, CloseScreen); > Unwrap (cs, pScreen, DisplayCursor); >+ deleteCursorHideCountsForScreen(pScreen); > ret = (*pScreen->CloseScreen) (index, pScreen); > xfree (cs); > if (index == 0) >@@ -430,7 +478,7 @@ > SProcXFixesGetCursorName (ClientPtr client) > { > int n; >- REQUEST(xXFixesSetCursorNameReq); >+ REQUEST(xXFixesGetCursorNameReq); > > swaps (&stuff->length, n); > REQUEST_SIZE_MATCH(xXFixesGetCursorNameReq); >@@ -687,6 +735,199 @@ > return (*ProcXFixesVector[stuff->xfixesReqType]) (client); > } > >+/* >+ * Routines for manipulating the per-screen hide counts list. >+ * This list indicates which clients have requested cursor hiding >+ * for that screen. >+ */ >+ >+/* Return the screen's hide-counts list element for the given client */ >+static CursorHideCountPtr >+findCursorHideCount (ClientPtr pClient, ScreenPtr pScreen) >+{ >+ CursorScreenPtr cs = GetCursorScreen(pScreen); >+ CursorHideCountPtr pChc; >+ >+ for (pChc = cs->pCursorHideCounts; pChc != NULL; pChc = pChc->pNext) { >+ if (pChc->pClient == pClient) { >+ return pChc; >+ } >+ } >+ >+ return NULL; >+} >+ >+static int >+createCursorHideCount (ClientPtr pClient, ScreenPtr pScreen) >+{ >+ CursorScreenPtr cs = GetCursorScreen(pScreen); >+ CursorHideCountPtr pChc; >+ >+ pChc = (CursorHideCountPtr) xalloc(sizeof(CursorHideCountRec)); >+ if (pChc == NULL) { >+ return BadAlloc; >+ } >+ pChc->pClient = pClient; >+ pChc->pScreen = pScreen; >+ pChc->hideCount = 1; >+ pChc->resource = FakeClientID(pClient->index); >+ pChc->pNext = cs->pCursorHideCounts; >+ cs->pCursorHideCounts = pChc; >+ >+ /* >+ * Create a resource for this element so it can be deleted >+ * when the client goes away. >+ */ >+ if (!AddResource (pChc->resource, CursorHideCountType, >+ (pointer) pChc)) { >+ xfree(pChc); >+ return BadAlloc; >+ } >+ >+ return Success; >+} >+ >+/* >+ * Delete the given hide-counts list element from its screen list. >+ */ >+static void >+deleteCursorHideCount (CursorHideCountPtr pChcToDel, ScreenPtr pScreen) >+{ >+ CursorScreenPtr cs = GetCursorScreen(pScreen); >+ CursorHideCountPtr pChc, pNext; >+ CursorHideCountPtr pChcLast = NULL; >+ >+ pChc = cs->pCursorHideCounts; >+ while (pChc != NULL) { >+ pNext = pChc->pNext; >+ if (pChc == pChcToDel) { >+ xfree(pChc); >+ if (pChcLast == NULL) { >+ cs->pCursorHideCounts = pNext; >+ } else { >+ pChcLast->pNext = pNext; >+ } >+ return; >+ } >+ pChcLast = pChc; >+ pChc = pNext; >+ } >+} >+ >+/* >+ * Delete all the hide-counts list elements for this screen. >+ */ >+static void >+deleteCursorHideCountsForScreen (ScreenPtr pScreen) >+{ >+ CursorScreenPtr cs = GetCursorScreen(pScreen); >+ CursorHideCountPtr pChc, pTmp; >+ >+ pChc = cs->pCursorHideCounts; >+ while (pChc != NULL) { >+ pTmp = pChc->pNext; >+ FreeResource(pChc->resource, 0); >+ pChc = pTmp; >+ } >+ cs->pCursorHideCounts = NULL; >+} >+ >+int >+ProcXFixesHideCursor (ClientPtr client) >+{ >+ WindowPtr pWin; >+ CursorHideCountPtr pChc; >+ REQUEST(xXFixesHideCursorReq); >+ int ret; >+ >+ REQUEST_SIZE_MATCH (xXFixesHideCursorReq); >+ >+ pWin = (WindowPtr) LookupIDByType (stuff->window, RT_WINDOW); >+ if (!pWin) { >+ client->errorValue = stuff->window; >+ return BadWindow; >+ } >+ >+ /* >+ * Has client hidden the cursor before on this screen? >+ * If so, just increment the count. >+ */ >+ >+ pChc = findCursorHideCount(client, pWin->drawable.pScreen); >+ if (pChc != NULL) { >+ pChc->hideCount++; >+ return client->noClientException; >+ } >+ >+ /* >+ * This is the first time this client has hid the cursor >+ * for this screen. >+ */ >+ ret = createCursorHideCount(client, pWin->drawable.pScreen); >+ >+ if (ret == Success) { >+ (void) CursorDisplayCursor(pWin->drawable.pScreen, CursorCurrent); >+ } >+ >+ return ret; >+} >+ >+int >+SProcXFixesHideCursor (ClientPtr client) >+{ >+ int n; >+ REQUEST(xXFixesHideCursorReq); >+ >+ swaps (&stuff->length, n); >+ REQUEST_SIZE_MATCH (xXFixesHideCursorReq); >+ swapl (&stuff->window, n); >+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client); >+} >+ >+int >+ProcXFixesShowCursor (ClientPtr client) >+{ >+ WindowPtr pWin; >+ CursorHideCountPtr pChc; >+ REQUEST(xXFixesShowCursorReq); >+ >+ REQUEST_SIZE_MATCH (xXFixesShowCursorReq); >+ >+ pWin = (WindowPtr) LookupIDByType (stuff->window, RT_WINDOW); >+ if (!pWin) { >+ client->errorValue = stuff->window; >+ return BadWindow; >+ } >+ >+ /* >+ * Has client hidden the cursor on this screen? >+ * If not, generate an error. >+ */ >+ pChc = findCursorHideCount(client, pWin->drawable.pScreen); >+ if (pChc == NULL) { >+ return BadMatch; >+ } >+ >+ pChc->hideCount--; >+ if (pChc->hideCount <= 0) { >+ FreeResource(pChc->resource, 0); >+ } >+ >+ return (client->noClientException); >+} >+ >+int >+SProcXFixesShowCursor (ClientPtr client) >+{ >+ int n; >+ REQUEST(xXFixesShowCursorReq); >+ >+ swaps (&stuff->length, n); >+ REQUEST_SIZE_MATCH (xXFixesShowCursorReq); >+ swapl (&stuff->window, n); >+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client); >+} >+ > static int > CursorFreeClient (pointer data, XID id) > { >@@ -706,6 +947,18 @@ > } > > static int >+CursorFreeHideCount (pointer data, XID id) >+{ >+ CursorHideCountPtr pChc = (CursorHideCountPtr) data; >+ ScreenPtr pScreen = pChc->pScreen; >+ >+ deleteCursorHideCount(pChc, pChc->pScreen); >+ (void) CursorDisplayCursor(pScreen, CursorCurrent); >+ >+ return 1; >+} >+ >+static int > CursorFreeWindow (pointer data, XID id) > { > WindowPtr pWindow = (WindowPtr) data; >@@ -722,6 +975,36 @@ > return 1; > } > >+static CursorPtr >+createInvisibleCursor (void) >+{ >+ CursorPtr pCursor; >+ static unsigned int *psrcbits, *pmaskbits; >+ CursorMetricRec cm; >+ >+ psrcbits = (unsigned int *) xalloc(4); >+ pmaskbits = (unsigned int *) xalloc(4); >+ if (psrcbits == NULL || pmaskbits == NULL) { >+ return NULL; >+ } >+ *psrcbits = 0; >+ *pmaskbits = 0; >+ >+ cm.width = 1; >+ cm.height = 1; >+ cm.xhot = 0; >+ cm.yhot = 0; >+ >+ pCursor = AllocCursor( >+ (unsigned char *)psrcbits, >+ (unsigned char *)pmaskbits, >+ &cm, >+ 0, 0, 0, >+ 0, 0, 0); >+ >+ return pCursor; >+} >+ > Bool > XFixesCursorInit (void) > { >@@ -744,10 +1027,20 @@ > return FALSE; > Wrap (cs, pScreen, CloseScreen, CursorCloseScreen); > Wrap (cs, pScreen, DisplayCursor, CursorDisplayCursor); >+ cs->pCursorHideCounts = NULL; > SetCursorScreen (pScreen, cs); > } > CursorClientType = CreateNewResourceType(CursorFreeClient); >+ CursorHideCountType = CreateNewResourceType(CursorFreeHideCount); > CursorWindowType = CreateNewResourceType(CursorFreeWindow); >+ >+ if (pInvisibleCursor == NULL) { >+ pInvisibleCursor = createInvisibleCursor(); >+ if (pInvisibleCursor == NULL) { >+ return BadAlloc; >+ } >+ } >+ > return CursorClientType && CursorWindowType; > } > >Index: xorg/xfixes/xfixes.c >=================================================================== >RCS file: /cvs/xorg/xserver/xorg/xfixes/xfixes.c,v >retrieving revision 1.7 >retrieving revision 1.8 >diff -u -b -B -r1.7 -r1.8 >--- xorg/xfixes/xfixes.c 3 Jul 2005 07:37:35 -0000 1.7 >+++ xorg/xfixes/xfixes.c 13 Mar 2006 21:59:55 -0000 1.8 >@@ -1,5 +1,25 @@ > /* >- * $Id: xfixes.c,v 1.6 2005/07/03 07:02:08 daniels Exp $ >+ * $Id: xfixes.c,v 1.7 2005/07/03 07:37:35 daniels Exp $ >+ * >+ * Copyright © 2006 Sun Microsystems >+ * >+ * 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 of Sun Microsystems not be used in >+ * advertising or publicity pertaining to distribution of the software without >+ * specific, written prior permission. Sun Microsystems makes no >+ * representations about the suitability of this software for any purpose. It >+ * is provided "as is" without express or implied warranty. >+ * >+ * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, >+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO >+ * EVENT SHALL SUN MICROSYSTEMS 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. > * > * Copyright © 2002 Keith Packard > * >@@ -74,6 +94,7 @@ > X_XFixesGetCursorImage, /* Version 1 */ > X_XFixesChangeCursorByName, /* Version 2 */ > X_XFixesExpandRegion, /* Version 3 */ >+ X_XFixesShowCursor, /* Version 4 */ > }; > > #define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0])) >@@ -111,6 +132,9 @@ > ProcXFixesChangeCursorByName, > /*************** Version 3 ******************/ > ProcXFixesExpandRegion, >+/*************** Version 4 ****************/ >+ ProcXFixesHideCursor, >+ ProcXFixesShowCursor, > }; > > static int >@@ -171,6 +195,9 @@ > SProcXFixesChangeCursorByName, > /*************** Version 3 ******************/ > SProcXFixesExpandRegion, >+/*************** Version 4 ****************/ >+ SProcXFixesHideCursor, >+ SProcXFixesShowCursor, > }; > > static int >Index: xorg/xfixes/xfixesint.h >=================================================================== >RCS file: /cvs/xorg/xserver/xorg/xfixes/xfixesint.h,v >retrieving revision 1.7 >retrieving revision 1.8 >diff -u -b -B -r1.7 -r1.8 >--- xorg/xfixes/xfixesint.h 3 Jul 2005 08:53:54 -0000 1.7 >+++ xorg/xfixes/xfixesint.h 13 Mar 2006 21:59:55 -0000 1.8 >@@ -1,5 +1,25 @@ > /* >- * $Id: xfixesint.h,v 1.6 2005/07/03 07:02:08 daniels Exp $ >+ * $Id: xfixesint.h,v 1.7 2005/07/03 08:53:54 daniels Exp $ >+ * >+ * Copyright © 2006 Sun Microsystems >+ * >+ * 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 of Sun Microsystems not be used in >+ * advertising or publicity pertaining to distribution of the software without >+ * specific, written prior permission. Sun Microsystems makes no >+ * representations about the suitability of this software for any purpose. It >+ * is provided "as is" without express or implied warranty. >+ * >+ * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, >+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO >+ * EVENT SHALL SUN MICROSYSTEMS 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. > * > * Copyright © 2002 Keith Packard > * >@@ -240,4 +260,18 @@ > int > SProcXFixesExpandRegion (ClientPtr client); > >+/* Cursor Visibility (Version 4) */ >+ >+int >+ProcXFixesHideCursor (ClientPtr client); >+ >+int >+SProcXFixesHideCursor (ClientPtr client); >+ >+int >+ProcXFixesShowCursor (ClientPtr client); >+ >+int >+SProcXFixesShowCursor (ClientPtr client); >+ > #endif /* _XFIXESINT_H_ */
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 127333
:
82962
| 82963