[X2Go-Commits] [nx-libs] 21/38: Lift XFIXES to xorg-xserver-7.1/1.1.0 state (XFIXES 4.0)

git-admin at x2go.org git-admin at x2go.org
Mon Feb 26 06:45:03 CET 2018


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch 3.6.x
in repository nx-libs.

commit a667131e2846355b7b2099635761a79e22bcbe68
Author: Ulrich Sibiller <uli42 at gmx.de>
Date:   Tue Oct 31 01:54:47 2017 +0100

    Lift XFIXES to xorg-xserver-7.1/1.1.0 state (XFIXES 4.0)
---
 nx-X11/include/extensions/Imakefile                |   1 +
 nx-X11/include/extensions/shapeconst.h             |  55 +++++
 nx-X11/include/extensions/xfixesproto.h            |  56 ++++-
 nx-X11/include/extensions/xfixeswire.h             |  20 +-
 .../programs/Xserver/include/protocol-versions.h   |   2 +-
 nx-X11/programs/Xserver/xfixes/cursor.c            | 275 ++++++++++++++++++++-
 nx-X11/programs/Xserver/xfixes/xfixes.c            |   7 +
 nx-X11/programs/Xserver/xfixes/xfixesint.h         |  14 ++
 8 files changed, 421 insertions(+), 9 deletions(-)

diff --git a/nx-X11/include/extensions/Imakefile b/nx-X11/include/extensions/Imakefile
index f1760d2..cdd2446 100644
--- a/nx-X11/include/extensions/Imakefile
+++ b/nx-X11/include/extensions/Imakefile
@@ -62,6 +62,7 @@ HEADERS = \
 	security.h securstr.h \
 	sync.h syncstr.h \
 	dpms.h dpmsstr.h \
+	shapeconst.h \
 	$(NULL)
 
 all::
diff --git a/nx-X11/include/extensions/shapeconst.h b/nx-X11/include/extensions/shapeconst.h
new file mode 100644
index 0000000..9088956
--- /dev/null
+++ b/nx-X11/include/extensions/shapeconst.h
@@ -0,0 +1,55 @@
+/************************************************************
+
+Copyright 1989, 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.
+
+********************************************************/
+
+#ifndef _SHAPECONST_H_
+#define _SHAPECONST_H_
+
+/*
+ * Protocol requests constants and alignment values
+ * These would really be in SHAPE's X.h and Xproto.h equivalents
+ */
+
+#define SHAPENAME "SHAPE"
+
+#define SHAPE_MAJOR_VERSION	1	/* current version numbers */
+#define SHAPE_MINOR_VERSION	1
+
+#define ShapeSet			0
+#define ShapeUnion			1
+#define ShapeIntersect			2
+#define ShapeSubtract			3
+#define ShapeInvert			4
+
+#define ShapeBounding			0
+#define ShapeClip			1
+#define ShapeInput			2
+
+#define ShapeNotifyMask			(1L << 0)
+#define ShapeNotify			0
+
+#define ShapeNumberEvents		(ShapeNotify + 1)
+
+#endif /* _SHAPECONST_H_ */
diff --git a/nx-X11/include/extensions/xfixesproto.h b/nx-X11/include/extensions/xfixesproto.h
index b3f35e8..2cde204 100644
--- a/nx-X11/include/extensions/xfixesproto.h
+++ b/nx-X11/include/extensions/xfixesproto.h
@@ -27,9 +27,7 @@
 
 #include <nx-X11/Xmd.h>
 #include <nx-X11/extensions/xfixeswire.h>
-#define _SHAPE_SERVER_
-#include <X11/extensions/shape.h>
-#undef _SHAPE_SERVER_
+#include <nx-X11/extensions/shapeconst.h>
 
 #define Window CARD32
 #define Drawable CARD32
@@ -462,6 +460,58 @@ typedef struct {
 
 #define sz_xXFixesExpandRegionReq	20
 
+/*************** Version 4.0 ******************/
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   xfixesReqType;
+    CARD16  length B16;
+    Window  window B32;
+} xXFixesHideCursorReq;
+
+#define sz_xXFixesHideCursorReq	sizeof(xXFixesHideCursorReq)
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   xfixesReqType;
+    CARD16  length B16;
+    Window  window B32;
+} xXFixesShowCursorReq;
+
+#define sz_xXFixesShowCursorReq	sizeof(xXFixesShowCursorReq)
+
+/*************** Version 5.0 ******************/
+
+#define Barrier CARD32
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   xfixesReqType;
+    CARD16  length B16;
+    Barrier barrier B32;
+    Window  window B32;
+    INT16   x1 B16;
+    INT16   y1 B16;
+    INT16   x2 B16;
+    INT16   y2 B16;
+    CARD32  directions;
+    CARD16  pad B16;
+    CARD16  num_devices B16;
+    /* array of CARD16 devices */
+} xXFixesCreatePointerBarrierReq;
+
+#define sz_xXFixesCreatePointerBarrierReq 28
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   xfixesReqType;
+    CARD16  length B16;
+    Barrier barrier B32;
+} xXFixesDestroyPointerBarrierReq;
+
+#define sz_xXFixesDestroyPointerBarrierReq 8
+
+#undef Barrier
 #undef Region
 #undef Picture
 #undef Window
diff --git a/nx-X11/include/extensions/xfixeswire.h b/nx-X11/include/extensions/xfixeswire.h
index 60851f2..4d86bdd 100644
--- a/nx-X11/include/extensions/xfixeswire.h
+++ b/nx-X11/include/extensions/xfixeswire.h
@@ -27,7 +27,7 @@
 #define _XFIXESWIRE_H_
 
 #define XFIXES_NAME	"XFIXES"
-#define XFIXES_MAJOR	3
+#define XFIXES_MAJOR	4
 #define XFIXES_MINOR	0
 
 /*************** Version 1 ******************/
@@ -62,8 +62,14 @@
 #define X_XFixesChangeCursorByName	    27
 /*************** Version 3 ******************/
 #define X_XFixesExpandRegion		    28
+/*************** Version 4 ******************/
+#define X_XFixesHideCursor		    29
+#define X_XFixesShowCursor		    30
+/*************** Version 5 ******************/
+#define X_XFixesCreatePointerBarrier	    31
+#define X_XFixesDestroyPointerBarrier	    32
 
-#define XFixesNumberRequests		    29
+#define XFixesNumberRequests		    (X_XFixesDestroyPointerBarrier+1)
 
 /* Selection events share one event number */
 #define XFixesSelectionNotify		    0
@@ -88,7 +94,8 @@
 
 /* errors */
 #define BadRegion			    0
-#define XFixesNumberErrors		    (BadRegion+1)
+#define BadBarrier			    1
+#define XFixesNumberErrors		    (BadBarrier+1)
 
 #define SaveSetNearest			    0
 #define SaveSetRoot			    1
@@ -101,4 +108,11 @@
 #define WindowRegionBounding		    0
 #define WindowRegionClip		    1
 
+/*************** Version 5 ******************/
+
+#define BarrierPositiveX		    (1L << 0)
+#define BarrierPositiveY		    (1L << 1)
+#define BarrierNegativeX		    (1L << 2)
+#define BarrierNegativeY		    (1L << 3)
+
 #endif	/* _XFIXESWIRE_H_ */
diff --git a/nx-X11/programs/Xserver/include/protocol-versions.h b/nx-X11/programs/Xserver/include/protocol-versions.h
index 9b9319f..7c5ea64 100644
--- a/nx-X11/programs/Xserver/include/protocol-versions.h
+++ b/nx-X11/programs/Xserver/include/protocol-versions.h
@@ -148,7 +148,7 @@
 #define SERVER_XFIXES_MAJOR_VERSION		5
 #define SERVER_XFIXES_MINOR_VERSION		0
 #else /* !defined(NXAGENT_SERVER) */
-#define SERVER_XFIXES_MAJOR_VERSION		3
+#define SERVER_XFIXES_MAJOR_VERSION		4
 #define SERVER_XFIXES_MINOR_VERSION		0
 #endif /* !defined(NXAGENT_SERVER) */
 
diff --git a/nx-X11/programs/Xserver/xfixes/cursor.c b/nx-X11/programs/Xserver/xfixes/cursor.c
index 00a912b..e0705ed 100644
--- a/nx-X11/programs/Xserver/xfixes/cursor.c
+++ b/nx-X11/programs/Xserver/xfixes/cursor.c
@@ -35,10 +35,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 +70,29 @@ typedef struct _CursorEvent {
 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 +109,13 @@ CursorDisplayCursor (ScreenPtr pScreen,
     Bool		ret;
 
     Unwrap (cs, pScreen, DisplayCursor);
-    ret = (*pScreen->DisplayCursor) (pScreen, pCursor);
+
+    if (cs->pCursorHideCounts != NULL) {
+	ret = (*pScreen->DisplayCursor) (pScreen, pInvisibleCursor);
+    } else {
+	ret = (*pScreen->DisplayCursor) (pScreen, pCursor);
+    }
+
     if (pCursor != CursorCurrent)
     {
 	CursorEventPtr	e;
@@ -96,7 +123,7 @@ CursorDisplayCursor (ScreenPtr pScreen,
 	CursorCurrent = pCursor;
 	for (e = cursorEvents; e; e = e->next)
 	{
-	    if ((e->eventMask & XFixesDisplayCursorNotifyMask))
+	    if (e->eventMask & XFixesDisplayCursorNotifyMask)
 	    {
 		xXFixesCursorNotifyEvent	ev;
 		ev.type = XFixesEventBase + XFixesCursorNotify;
@@ -121,6 +148,7 @@ CursorCloseScreen (ScreenPtr pScreen)
 
     Unwrap (cs, pScreen, CloseScreen);
     Unwrap (cs, pScreen, DisplayCursor);
+    deleteCursorHideCountsForScreen(pScreen);
     ret = (*pScreen->CloseScreen) (pScreen);
     free (cs);
     if (screenInfo.numScreens <= 1)
@@ -674,6 +702,197 @@ SProcXFixesChangeCursorByName (ClientPtr client)
     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) malloc(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,
+		      (void *) pChc)) {
+	free(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) {
+	    free(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)
+{
+    REQUEST(xXFixesHideCursorReq);
+
+    swaps (&stuff->length);
+    REQUEST_SIZE_MATCH (xXFixesHideCursorReq);
+    swapl (&stuff->window);
+    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)
+{
+    REQUEST(xXFixesShowCursorReq);
+
+    swaps (&stuff->length);
+    REQUEST_SIZE_MATCH (xXFixesShowCursorReq);
+    swapl (&stuff->window);
+    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
 static int
 CursorFreeClient (void * data, XID id)
 {
@@ -693,6 +912,18 @@ CursorFreeClient (void * data, XID id)
 }
 
 static int
+CursorFreeHideCount (void * data, XID id)
+{
+    CursorHideCountPtr pChc = (CursorHideCountPtr) data;
+    ScreenPtr pScreen = pChc->pScreen;
+
+    deleteCursorHideCount(pChc, pChc->pScreen);
+    (void) CursorDisplayCursor(pScreen, CursorCurrent);
+
+    return 1;
+}
+
+static int
 CursorFreeWindow (void * data, XID id)
 {
     WindowPtr		pWindow = (WindowPtr) data;
@@ -709,6 +940,36 @@ CursorFreeWindow (void * data, XID id)
     return 1;
 }
 
+static CursorPtr
+createInvisibleCursor (void)
+{
+    CursorPtr pCursor;
+    static unsigned int *psrcbits, *pmaskbits;
+    CursorMetricRec cm;
+
+    psrcbits = (unsigned int *) malloc(4);
+    pmaskbits = (unsigned int *) malloc(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)
 {
@@ -731,10 +992,20 @@ XFixesCursorInit (void)
 	    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;
 }
 
diff --git a/nx-X11/programs/Xserver/xfixes/xfixes.c b/nx-X11/programs/Xserver/xfixes/xfixes.c
index 1403be8..3b58151 100644
--- a/nx-X11/programs/Xserver/xfixes/xfixes.c
+++ b/nx-X11/programs/Xserver/xfixes/xfixes.c
@@ -75,6 +75,7 @@ static const int version_requests[] = {
     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]))
@@ -112,6 +113,9 @@ int	(*ProcXFixesVector[XFixesNumberRequests])(ClientPtr) = {
     ProcXFixesChangeCursorByName,
 /*************** Version 3 ******************/
     ProcXFixesExpandRegion,
+/*************** Version 4 ****************/
+    ProcXFixesHideCursor,
+    ProcXFixesShowCursor,
 };
 
 static int
@@ -171,6 +175,9 @@ int	(*SProcXFixesVector[XFixesNumberRequests])(ClientPtr) = {
     SProcXFixesChangeCursorByName,
 /*************** Version 3 ******************/
     SProcXFixesExpandRegion,
+/*************** Version 4 ****************/
+    SProcXFixesHideCursor,
+    SProcXFixesShowCursor,
 };
 
 static int
diff --git a/nx-X11/programs/Xserver/xfixes/xfixesint.h b/nx-X11/programs/Xserver/xfixes/xfixesint.h
index 70550f5..fcbc77b 100644
--- a/nx-X11/programs/Xserver/xfixes/xfixesint.h
+++ b/nx-X11/programs/Xserver/xfixes/xfixesint.h
@@ -239,4 +239,18 @@ ProcXFixesExpandRegion (ClientPtr client);
 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_ */

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/nx-libs.git


More information about the x2go-commits mailing list