1 /*
2 
3 Copyright 1993 by Davor Matic
4 
5 Permission to use, copy, modify, distribute, and sell this software
6 and its documentation for any purpose is hereby granted without fee,
7 provided that the above copyright notice appear in all copies and that
8 both that copyright notice and this permission notice appear in
9 supporting documentation.  Davor Matic makes no representations about
10 the suitability of this software for any purpose.  It is provided "as
11 is" without express or implied warranty.
12 
13 */
14 
15 #ifdef HAVE_XNEST_CONFIG_H
16 #include <xnest-config.h>
17 #endif
18 
19 #include <X11/X.h>
20 #include <X11/Xproto.h>
21 #include "screenint.h"
22 #include "input.h"
23 #include "misc.h"
24 #include "cursor.h"
25 #include "cursorstr.h"
26 #include "scrnintstr.h"
27 #include "servermd.h"
28 #include "mipointrst.h"
29 
30 #include "Xnest.h"
31 
32 #include "Display.h"
33 #include "Screen.h"
34 #include "XNCursor.h"
35 #include "Visual.h"
36 #include "Keyboard.h"
37 #include "Args.h"
38 
39 xnestCursorFuncRec xnestCursorFuncs = { NULL };
40 
41 Bool
xnestRealizeCursor(DeviceIntPtr pDev,ScreenPtr pScreen,CursorPtr pCursor)42 xnestRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
43 {
44     XImage *ximage;
45     Pixmap source, mask;
46     XColor fg_color, bg_color;
47     unsigned long valuemask;
48     XGCValues values;
49 
50     valuemask = GCFunction |
51         GCPlaneMask | GCForeground | GCBackground | GCClipMask;
52 
53     values.function = GXcopy;
54     values.plane_mask = AllPlanes;
55     values.foreground = 1L;
56     values.background = 0L;
57     values.clip_mask = None;
58 
59     XChangeGC(xnestDisplay, xnestBitmapGC, valuemask, &values);
60 
61     source = XCreatePixmap(xnestDisplay,
62                            xnestDefaultWindows[pScreen->myNum],
63                            pCursor->bits->width, pCursor->bits->height, 1);
64 
65     mask = XCreatePixmap(xnestDisplay,
66                          xnestDefaultWindows[pScreen->myNum],
67                          pCursor->bits->width, pCursor->bits->height, 1);
68 
69     ximage = XCreateImage(xnestDisplay,
70                           xnestDefaultVisual(pScreen),
71                           1, XYBitmap, 0,
72                           (char *) pCursor->bits->source,
73                           pCursor->bits->width,
74                           pCursor->bits->height, BitmapPad(xnestDisplay), 0);
75 
76     XPutImage(xnestDisplay, source, xnestBitmapGC, ximage,
77               0, 0, 0, 0, pCursor->bits->width, pCursor->bits->height);
78 
79     XFree(ximage);
80 
81     ximage = XCreateImage(xnestDisplay,
82                           xnestDefaultVisual(pScreen),
83                           1, XYBitmap, 0,
84                           (char *) pCursor->bits->mask,
85                           pCursor->bits->width,
86                           pCursor->bits->height, BitmapPad(xnestDisplay), 0);
87 
88     XPutImage(xnestDisplay, mask, xnestBitmapGC, ximage,
89               0, 0, 0, 0, pCursor->bits->width, pCursor->bits->height);
90 
91     XFree(ximage);
92 
93     fg_color.red = pCursor->foreRed;
94     fg_color.green = pCursor->foreGreen;
95     fg_color.blue = pCursor->foreBlue;
96 
97     bg_color.red = pCursor->backRed;
98     bg_color.green = pCursor->backGreen;
99     bg_color.blue = pCursor->backBlue;
100 
101     xnestSetCursorPriv(pCursor, pScreen, malloc(sizeof(xnestPrivCursor)));
102     xnestCursor(pCursor, pScreen) =
103         XCreatePixmapCursor(xnestDisplay, source, mask, &fg_color, &bg_color,
104                             pCursor->bits->xhot, pCursor->bits->yhot);
105 
106     XFreePixmap(xnestDisplay, source);
107     XFreePixmap(xnestDisplay, mask);
108 
109     return True;
110 }
111 
112 Bool
xnestUnrealizeCursor(DeviceIntPtr pDev,ScreenPtr pScreen,CursorPtr pCursor)113 xnestUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
114 {
115     XFreeCursor(xnestDisplay, xnestCursor(pCursor, pScreen));
116     free(xnestGetCursorPriv(pCursor, pScreen));
117     return True;
118 }
119 
120 void
xnestRecolorCursor(ScreenPtr pScreen,CursorPtr pCursor,Bool displayed)121 xnestRecolorCursor(ScreenPtr pScreen, CursorPtr pCursor, Bool displayed)
122 {
123     XColor fg_color, bg_color;
124 
125     fg_color.red = pCursor->foreRed;
126     fg_color.green = pCursor->foreGreen;
127     fg_color.blue = pCursor->foreBlue;
128 
129     bg_color.red = pCursor->backRed;
130     bg_color.green = pCursor->backGreen;
131     bg_color.blue = pCursor->backBlue;
132 
133     XRecolorCursor(xnestDisplay,
134                    xnestCursor(pCursor, pScreen), &fg_color, &bg_color);
135 }
136 
137 void
xnestSetCursor(DeviceIntPtr pDev,ScreenPtr pScreen,CursorPtr pCursor,int x,int y)138 xnestSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x,
139                int y)
140 {
141     if (pCursor) {
142         XDefineCursor(xnestDisplay,
143                       xnestDefaultWindows[pScreen->myNum],
144                       xnestCursor(pCursor, pScreen));
145     }
146 }
147 
148 void
xnestMoveCursor(DeviceIntPtr pDev,ScreenPtr pScreen,int x,int y)149 xnestMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
150 {
151 }
152 
153 Bool
xnestDeviceCursorInitialize(DeviceIntPtr pDev,ScreenPtr pScreen)154 xnestDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
155 {
156     xnestCursorFuncPtr pScreenPriv;
157 
158     pScreenPriv = (xnestCursorFuncPtr)
159         dixLookupPrivate(&pScreen->devPrivates, xnestCursorScreenKey);
160 
161     return pScreenPriv->spriteFuncs->DeviceCursorInitialize(pDev, pScreen);
162 }
163 
164 void
xnestDeviceCursorCleanup(DeviceIntPtr pDev,ScreenPtr pScreen)165 xnestDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
166 {
167     xnestCursorFuncPtr pScreenPriv;
168 
169     pScreenPriv = (xnestCursorFuncPtr)
170         dixLookupPrivate(&pScreen->devPrivates, xnestCursorScreenKey);
171 
172     pScreenPriv->spriteFuncs->DeviceCursorCleanup(pDev, pScreen);
173 }
174