Commit a667131e authored by Ulrich Sibiller's avatar Ulrich Sibiller Committed by Mihai Moldovan

Lift XFIXES to xorg-xserver-7.1/1.1.0 state (XFIXES 4.0)

parent 164263e1
......@@ -62,6 +62,7 @@ HEADERS = \
security.h securstr.h \
sync.h syncstr.h \
dpms.h dpmsstr.h \
shapeconst.h \
$(NULL)
all::
......
/************************************************************
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_ */
......@@ -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
......
......@@ -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_ */
......@@ -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) */
......
......@@ -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;
}
......@@ -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
......
......@@ -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_ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment