Cursor.c revision 35c4bbdf
1/*
2
3Copyright 1993 by Davor Matic
4
5Permission to use, copy, modify, distribute, and sell this software
6and its documentation for any purpose is hereby granted without fee,
7provided that the above copyright notice appear in all copies and that
8both that copyright notice and this permission notice appear in
9supporting documentation.  Davor Matic makes no representations about
10the suitability of this software for any purpose.  It is provided "as
11is" 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
39xnestCursorFuncRec xnestCursorFuncs = { NULL };
40
41Bool
42xnestRealizeCursor(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
112Bool
113xnestUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
114{
115    XFreeCursor(xnestDisplay, xnestCursor(pCursor, pScreen));
116    free(xnestGetCursorPriv(pCursor, pScreen));
117    return True;
118}
119
120void
121xnestRecolorCursor(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
137void
138xnestSetCursor(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
148void
149xnestMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
150{
151}
152
153Bool
154xnestDeviceCursorInitialize(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
164void
165xnestDeviceCursorCleanup(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