Cursor.c (5002B)
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 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 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 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 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 149 xnestMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y) 150 { 151 } 152 153 Bool 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 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 }