Draw an additional white bit for each invert bit of a cursor.
diff --git a/windows/x11drv/mouse.c b/windows/x11drv/mouse.c
index 4464b3b..4198a5a 100644
--- a/windows/x11drv/mouse.c
+++ b/windows/x11drv/mouse.c
@@ -30,7 +30,7 @@
*/
static BOOL X11DRV_MOUSE_DoSetCursor( CURSORICONINFO *ptr )
{
- Pixmap pixmapBits, pixmapMask, pixmapAll;
+ Pixmap pixmapBits, pixmapMask, pixmapMaskInv, pixmapAll;
XColor fg, bg;
Cursor cursor = None;
@@ -88,6 +88,8 @@
ptr->nWidth, ptr->nHeight, 1 );
pixmapMask = XCreatePixmap( display, X11DRV_GetXRootWindow(),
ptr->nWidth, ptr->nHeight, 1 );
+ pixmapMaskInv = XCreatePixmap( display, X11DRV_GetXRootWindow(),
+ ptr->nWidth, ptr->nHeight, 1 );
/* Make sure everything went OK so far */
@@ -97,34 +99,46 @@
* compatible between Windows and X11. Under X11, there
* are only 3 possible color cursor: black, white and
* masked. So we map the 4th Windows color (invert the
- * bits on the screen) to black. This require some boolean
- * arithmetic:
+ * bits on the screen) to black and an additional white bit on
+ * an other place (+1,+1). This require some boolean arithmetic:
*
* Windows | X11
- * Xor And Result | Bits Mask Result
+ * And Xor Result | Bits Mask Result
* 0 0 black | 0 1 background
- * 0 1 no change | X 0 no change
- * 1 0 white | 1 1 foreground
+ * 0 1 white | 1 1 foreground
+ * 1 0 no change | X 0 no change
* 1 1 inverted | 0 1 background
*
* which gives:
- * Bits = 'Xor' and not 'And'
- * Mask = 'Xor' or not 'And'
+ * Bits = not 'And' and 'Xor' or 'And2' and 'Xor2'
+ * Mask = not 'And' or 'Xor' or 'And2' and 'Xor2'
*
* FIXME: apparently some servers do support 'inverted' color.
* I don't know if it's correct per the X spec, but maybe
* we ought to take advantage of it. -- AJ
*/
+ XSetFunction( display, BITMAP_monoGC, GXcopy );
XCopyArea( display, pixmapAll, pixmapBits, BITMAP_monoGC,
0, 0, ptr->nWidth, ptr->nHeight, 0, 0 );
XCopyArea( display, pixmapAll, pixmapMask, BITMAP_monoGC,
0, 0, ptr->nWidth, ptr->nHeight, 0, 0 );
+ XCopyArea( display, pixmapAll, pixmapMaskInv, BITMAP_monoGC,
+ 0, 0, ptr->nWidth, ptr->nHeight, 0, 0 );
+ XSetFunction( display, BITMAP_monoGC, GXand );
+ XCopyArea( display, pixmapAll, pixmapMaskInv, BITMAP_monoGC,
+ 0, ptr->nHeight, ptr->nWidth, ptr->nHeight, 0, 0 );
XSetFunction( display, BITMAP_monoGC, GXandReverse );
XCopyArea( display, pixmapAll, pixmapBits, BITMAP_monoGC,
0, ptr->nHeight, ptr->nWidth, ptr->nHeight, 0, 0 );
XSetFunction( display, BITMAP_monoGC, GXorReverse );
XCopyArea( display, pixmapAll, pixmapMask, BITMAP_monoGC,
0, ptr->nHeight, ptr->nWidth, ptr->nHeight, 0, 0 );
+ /* Additional white */
+ XSetFunction( display, BITMAP_monoGC, GXor );
+ XCopyArea( display, pixmapMaskInv, pixmapMask, BITMAP_monoGC,
+ 0, 0, ptr->nWidth, ptr->nHeight, 1, 1 );
+ XCopyArea( display, pixmapMaskInv, pixmapBits, BITMAP_monoGC,
+ 0, 0, ptr->nWidth, ptr->nHeight, 1, 1 );
XSetFunction( display, BITMAP_monoGC, GXcopy );
fg.red = fg.green = fg.blue = 0xffff;
bg.red = bg.green = bg.blue = 0x0000;
@@ -137,6 +151,7 @@
if (pixmapAll) XFreePixmap( display, pixmapAll );
if (pixmapBits) XFreePixmap( display, pixmapBits );
if (pixmapMask) XFreePixmap( display, pixmapMask );
+ if (pixmapMaskInv) XFreePixmap( display, pixmapMaskInv );
}
if (cursor == None) return FALSE;