xref: /freebsd/lib/libvgl/mouse.c (revision aa1ce985e47237be3b4843ac946011c4b43c52af)
19a57b7d2SSøren Schmidt /*-
25e53a4f9SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
35e53a4f9SPedro F. Giffuni  *
4bf3f9db6SUlrich Spörlein  * Copyright (c) 1991-1997 Søren Schmidt
59a57b7d2SSøren Schmidt  * All rights reserved.
69a57b7d2SSøren Schmidt  *
79a57b7d2SSøren Schmidt  * Redistribution and use in source and binary forms, with or without
89a57b7d2SSøren Schmidt  * modification, are permitted provided that the following conditions
99a57b7d2SSøren Schmidt  * are met:
109a57b7d2SSøren Schmidt  * 1. Redistributions of source code must retain the above copyright
119a57b7d2SSøren Schmidt  *    notice, this list of conditions and the following disclaimer
129a57b7d2SSøren Schmidt  *    in this position and unchanged.
139a57b7d2SSøren Schmidt  * 2. Redistributions in binary form must reproduce the above copyright
149a57b7d2SSøren Schmidt  *    notice, this list of conditions and the following disclaimer in the
159a57b7d2SSøren Schmidt  *    documentation and/or other materials provided with the distribution.
169a57b7d2SSøren Schmidt  * 3. The name of the author may not be used to endorse or promote products
1721dc7d4fSJens Schweikhardt  *    derived from this software without specific prior written permission
189a57b7d2SSøren Schmidt  *
199a57b7d2SSøren Schmidt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
209a57b7d2SSøren Schmidt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
219a57b7d2SSøren Schmidt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
229a57b7d2SSøren Schmidt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
239a57b7d2SSøren Schmidt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
249a57b7d2SSøren Schmidt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
259a57b7d2SSøren Schmidt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
269a57b7d2SSøren Schmidt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
279a57b7d2SSøren Schmidt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
289a57b7d2SSøren Schmidt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
299a57b7d2SSøren Schmidt  */
309a57b7d2SSøren Schmidt 
31e67f5b9fSMatthew Dillon #include <sys/cdefs.h>
32e67f5b9fSMatthew Dillon __FBSDID("$FreeBSD$");
33e67f5b9fSMatthew Dillon 
349a57b7d2SSøren Schmidt #include <stdio.h>
359a57b7d2SSøren Schmidt #include <sys/types.h>
369a57b7d2SSøren Schmidt #include <sys/ioctl.h>
379a57b7d2SSøren Schmidt #include <sys/signal.h>
3800d25f51SPoul-Henning Kamp #include <sys/consio.h>
3900d25f51SPoul-Henning Kamp #include <sys/fbio.h>
409a57b7d2SSøren Schmidt #include "vgl.h"
419a57b7d2SSøren Schmidt 
429a57b7d2SSøren Schmidt #define X 0xff
439a57b7d2SSøren Schmidt static byte StdAndMask[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE] = {
449a57b7d2SSøren Schmidt 	X,X,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
459a57b7d2SSøren Schmidt 	X,X,X,0,0,0,0,0,0,0,0,0,0,0,0,0,
469a57b7d2SSøren Schmidt 	X,X,X,X,0,0,0,0,0,0,0,0,0,0,0,0,
479a57b7d2SSøren Schmidt 	X,X,X,X,X,0,0,0,0,0,0,0,0,0,0,0,
489a57b7d2SSøren Schmidt 	X,X,X,X,X,X,0,0,0,0,0,0,0,0,0,0,
499a57b7d2SSøren Schmidt 	X,X,X,X,X,X,X,0,0,0,0,0,0,0,0,0,
509a57b7d2SSøren Schmidt 	X,X,X,X,X,X,X,X,0,0,0,0,0,0,0,0,
519a57b7d2SSøren Schmidt 	X,X,X,X,X,X,X,X,X,0,0,0,0,0,0,0,
529a57b7d2SSøren Schmidt 	X,X,X,X,X,X,X,0,0,0,0,0,0,0,0,0,
539a57b7d2SSøren Schmidt 	0,0,0,X,X,X,X,0,0,0,0,0,0,0,0,0,
549a57b7d2SSøren Schmidt 	0,0,0,X,X,X,X,X,0,0,0,0,0,0,0,0,
559a57b7d2SSøren Schmidt 	0,0,0,0,X,X,X,X,0,0,0,0,0,0,0,0,
569a57b7d2SSøren Schmidt 	0,0,0,0,X,X,X,X,0,0,0,0,0,0,0,0,
579a57b7d2SSøren Schmidt 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
589a57b7d2SSøren Schmidt 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
599a57b7d2SSøren Schmidt 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
609a57b7d2SSøren Schmidt };
619a57b7d2SSøren Schmidt static byte StdOrMask[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE] = {
629a57b7d2SSøren Schmidt 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
639a57b7d2SSøren Schmidt 	0,X,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
649a57b7d2SSøren Schmidt 	0,X,X,0,0,0,0,0,0,0,0,0,0,0,0,0,
659a57b7d2SSøren Schmidt 	0,X,X,X,0,0,0,0,0,0,0,0,0,0,0,0,
669a57b7d2SSøren Schmidt 	0,X,X,X,X,0,0,0,0,0,0,0,0,0,0,0,
679a57b7d2SSøren Schmidt 	0,X,X,X,X,X,0,0,0,0,0,0,0,0,0,0,
689a57b7d2SSøren Schmidt 	0,X,X,X,X,X,X,0,0,0,0,0,0,0,0,0,
699a57b7d2SSøren Schmidt 	0,X,X,0,X,0,0,0,0,0,0,0,0,0,0,0,
709a57b7d2SSøren Schmidt 	0,0,0,0,X,X,0,0,0,0,0,0,0,0,0,0,
719a57b7d2SSøren Schmidt 	0,0,0,0,X,X,0,0,0,0,0,0,0,0,0,0,
729a57b7d2SSøren Schmidt 	0,0,0,0,0,X,X,0,0,0,0,0,0,0,0,0,
739a57b7d2SSøren Schmidt 	0,0,0,0,0,X,X,0,0,0,0,0,0,0,0,0,
749a57b7d2SSøren Schmidt 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
759a57b7d2SSøren Schmidt 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
769a57b7d2SSøren Schmidt 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
779a57b7d2SSøren Schmidt 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
789a57b7d2SSøren Schmidt };
799a57b7d2SSøren Schmidt #undef X
809a57b7d2SSøren Schmidt static VGLBitmap VGLMouseStdAndMask =
815acf51eaSKazutaka YOKOTA     VGLBITMAP_INITIALIZER(MEMBUF, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE, StdAndMask);
829a57b7d2SSøren Schmidt static VGLBitmap VGLMouseStdOrMask =
835acf51eaSKazutaka YOKOTA     VGLBITMAP_INITIALIZER(MEMBUF, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE, StdOrMask);
849a57b7d2SSøren Schmidt static VGLBitmap *VGLMouseAndMask, *VGLMouseOrMask;
85fbc6daa1SBruce Evans static byte map[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE*4];
865acf51eaSKazutaka YOKOTA static VGLBitmap VGLMouseSave =
875acf51eaSKazutaka YOKOTA     VGLBITMAP_INITIALIZER(MEMBUF, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE, map);
889a57b7d2SSøren Schmidt static int VGLMouseVisible = 0;
899a57b7d2SSøren Schmidt static int VGLMouseFrozen = 0;
909a57b7d2SSøren Schmidt static int VGLMouseShown = 0;
919a57b7d2SSøren Schmidt static int VGLMouseXpos = 0;
929a57b7d2SSøren Schmidt static int VGLMouseYpos = 0;
939a57b7d2SSøren Schmidt static int VGLMouseButtons = 0;
949a57b7d2SSøren Schmidt 
959a57b7d2SSøren Schmidt void
969a57b7d2SSøren Schmidt VGLMousePointerShow()
979a57b7d2SSøren Schmidt {
98fbc6daa1SBruce Evans   byte buf[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE*4];
995acf51eaSKazutaka YOKOTA   VGLBitmap buffer =
1005acf51eaSKazutaka YOKOTA     VGLBITMAP_INITIALIZER(MEMBUF, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE, buf);
1019a57b7d2SSøren Schmidt   byte crtcidx, crtcval, gdcidx, gdcval;
102*aa1ce985SBruce Evans   int i, pos, pos1;
1039a57b7d2SSøren Schmidt 
1049a57b7d2SSøren Schmidt   if (!VGLMouseVisible) {
1059a57b7d2SSøren Schmidt     VGLMouseVisible = 1;
1069a57b7d2SSøren Schmidt     crtcidx = inb(0x3c4);
1079a57b7d2SSøren Schmidt     crtcval = inb(0x3c5);
1089a57b7d2SSøren Schmidt     gdcidx = inb(0x3ce);
1099a57b7d2SSøren Schmidt     gdcval = inb(0x3cf);
1109a57b7d2SSøren Schmidt     __VGLBitmapCopy(VGLDisplay, VGLMouseXpos, VGLMouseYpos,
1119a57b7d2SSøren Schmidt 		  &VGLMouseSave, 0, 0, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE);
112*aa1ce985SBruce Evans     bcopy(VGLMouseSave.Bitmap, buffer.Bitmap,
113*aa1ce985SBruce Evans           MOUSE_IMG_SIZE*MOUSE_IMG_SIZE*VGLDisplay->PixelBytes);
1149a57b7d2SSøren Schmidt     for (pos = 0; pos <  MOUSE_IMG_SIZE*MOUSE_IMG_SIZE; pos++)
115*aa1ce985SBruce Evans       for (i = 0; i < VGLDisplay->PixelBytes; i++) {
116*aa1ce985SBruce Evans         pos1 = pos * VGLDisplay->PixelBytes + i;
117*aa1ce985SBruce Evans         buffer.Bitmap[pos1] = (buffer.Bitmap[pos1] &
118*aa1ce985SBruce Evans                                ~VGLMouseAndMask->Bitmap[pos]) |
1199a57b7d2SSøren Schmidt                               VGLMouseOrMask->Bitmap[pos];
120*aa1ce985SBruce Evans       }
1219a57b7d2SSøren Schmidt     __VGLBitmapCopy(&buffer, 0, 0, VGLDisplay,
1229a57b7d2SSøren Schmidt 		  VGLMouseXpos, VGLMouseYpos, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE);
1239a57b7d2SSøren Schmidt     outb(0x3c4, crtcidx);
1249a57b7d2SSøren Schmidt     outb(0x3c5, crtcval);
1259a57b7d2SSøren Schmidt     outb(0x3ce, gdcidx);
1269a57b7d2SSøren Schmidt     outb(0x3cf, gdcval);
1279a57b7d2SSøren Schmidt   }
1289a57b7d2SSøren Schmidt }
1299a57b7d2SSøren Schmidt 
1309a57b7d2SSøren Schmidt void
1319a57b7d2SSøren Schmidt VGLMousePointerHide()
1329a57b7d2SSøren Schmidt {
1339a57b7d2SSøren Schmidt   byte crtcidx, crtcval, gdcidx, gdcval;
1349a57b7d2SSøren Schmidt 
1359a57b7d2SSøren Schmidt   if (VGLMouseVisible) {
1369a57b7d2SSøren Schmidt     VGLMouseVisible = 0;
1379a57b7d2SSøren Schmidt     crtcidx = inb(0x3c4);
1389a57b7d2SSøren Schmidt     crtcval = inb(0x3c5);
1399a57b7d2SSøren Schmidt     gdcidx = inb(0x3ce);
1409a57b7d2SSøren Schmidt     gdcval = inb(0x3cf);
1419a57b7d2SSøren Schmidt     __VGLBitmapCopy(&VGLMouseSave, 0, 0, VGLDisplay,
1429a57b7d2SSøren Schmidt 		  VGLMouseXpos, VGLMouseYpos, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE);
1439a57b7d2SSøren Schmidt     outb(0x3c4, crtcidx);
1449a57b7d2SSøren Schmidt     outb(0x3c5, crtcval);
1459a57b7d2SSøren Schmidt     outb(0x3ce, gdcidx);
1469a57b7d2SSøren Schmidt     outb(0x3cf, gdcval);
1479a57b7d2SSøren Schmidt   }
1489a57b7d2SSøren Schmidt }
1499a57b7d2SSøren Schmidt 
1509a57b7d2SSøren Schmidt void
1519a57b7d2SSøren Schmidt VGLMouseMode(int mode)
1529a57b7d2SSøren Schmidt {
1539a57b7d2SSøren Schmidt   if (mode == VGL_MOUSESHOW) {
1549a57b7d2SSøren Schmidt     if (VGLMouseShown == VGL_MOUSEHIDE) {
1559a57b7d2SSøren Schmidt       VGLMousePointerShow();
1569a57b7d2SSøren Schmidt       VGLMouseShown = VGL_MOUSESHOW;
1579a57b7d2SSøren Schmidt     }
1589a57b7d2SSøren Schmidt   }
1599a57b7d2SSøren Schmidt   else {
1609a57b7d2SSøren Schmidt     if (VGLMouseShown == VGL_MOUSESHOW) {
1619a57b7d2SSøren Schmidt       VGLMousePointerHide();
1629a57b7d2SSøren Schmidt       VGLMouseShown = VGL_MOUSEHIDE;
1639a57b7d2SSøren Schmidt     }
1649a57b7d2SSøren Schmidt   }
1659a57b7d2SSøren Schmidt }
1669a57b7d2SSøren Schmidt 
1679a57b7d2SSøren Schmidt void
1689a57b7d2SSøren Schmidt VGLMouseAction(int dummy)
1699a57b7d2SSøren Schmidt {
1709a57b7d2SSøren Schmidt   struct mouse_info mouseinfo;
1719a57b7d2SSøren Schmidt 
1729a57b7d2SSøren Schmidt   if (VGLMouseFrozen) {
1739a57b7d2SSøren Schmidt     VGLMouseFrozen++;
1749a57b7d2SSøren Schmidt     return;
1759a57b7d2SSøren Schmidt   }
1769a57b7d2SSøren Schmidt   mouseinfo.operation = MOUSE_GETINFO;
1779a57b7d2SSøren Schmidt   ioctl(0, CONS_MOUSECTL, &mouseinfo);
1789a57b7d2SSøren Schmidt   if (VGLMouseShown == VGL_MOUSESHOW)
1799a57b7d2SSøren Schmidt     VGLMousePointerHide();
1809a57b7d2SSøren Schmidt   VGLMouseXpos = mouseinfo.u.data.x;
1819a57b7d2SSøren Schmidt   VGLMouseYpos = mouseinfo.u.data.y;
1829a57b7d2SSøren Schmidt   VGLMouseButtons = mouseinfo.u.data.buttons;
1839a57b7d2SSøren Schmidt   if (VGLMouseShown == VGL_MOUSESHOW)
1849a57b7d2SSøren Schmidt     VGLMousePointerShow();
1859a57b7d2SSøren Schmidt }
1869a57b7d2SSøren Schmidt 
1879a57b7d2SSøren Schmidt void
1889a57b7d2SSøren Schmidt VGLMouseSetImage(VGLBitmap *AndMask, VGLBitmap *OrMask)
1899a57b7d2SSøren Schmidt {
1909a57b7d2SSøren Schmidt   if (VGLMouseShown == VGL_MOUSESHOW)
1919a57b7d2SSøren Schmidt     VGLMousePointerHide();
1929a57b7d2SSøren Schmidt   VGLMouseAndMask = AndMask;
1939a57b7d2SSøren Schmidt   VGLMouseOrMask = OrMask;
1949a57b7d2SSøren Schmidt   if (VGLMouseShown == VGL_MOUSESHOW)
1959a57b7d2SSøren Schmidt     VGLMousePointerShow();
1969a57b7d2SSøren Schmidt }
1979a57b7d2SSøren Schmidt 
1989a57b7d2SSøren Schmidt void
1999a57b7d2SSøren Schmidt VGLMouseSetStdImage()
2009a57b7d2SSøren Schmidt {
2019a57b7d2SSøren Schmidt   if (VGLMouseShown == VGL_MOUSESHOW)
2029a57b7d2SSøren Schmidt     VGLMousePointerHide();
2039a57b7d2SSøren Schmidt   VGLMouseAndMask = &VGLMouseStdAndMask;
2049a57b7d2SSøren Schmidt   VGLMouseOrMask = &VGLMouseStdOrMask;
2059a57b7d2SSøren Schmidt   if (VGLMouseShown == VGL_MOUSESHOW)
2069a57b7d2SSøren Schmidt     VGLMousePointerShow();
2079a57b7d2SSøren Schmidt }
2089a57b7d2SSøren Schmidt 
2099a57b7d2SSøren Schmidt int
2109a57b7d2SSøren Schmidt VGLMouseInit(int mode)
2119a57b7d2SSøren Schmidt {
2129a57b7d2SSøren Schmidt   struct mouse_info mouseinfo;
213*aa1ce985SBruce Evans   int error, i, mask;
2149a57b7d2SSøren Schmidt 
215*aa1ce985SBruce Evans   switch (VGLModeInfo.vi_mem_model) {
216*aa1ce985SBruce Evans   case V_INFO_MM_PACKED:
217*aa1ce985SBruce Evans   case V_INFO_MM_PLANAR:
218*aa1ce985SBruce Evans     mask = 0x0f;
219*aa1ce985SBruce Evans     break;
220*aa1ce985SBruce Evans   case V_INFO_MM_VGAX:
221*aa1ce985SBruce Evans     mask = 0x3f;
222*aa1ce985SBruce Evans     break;
223*aa1ce985SBruce Evans   default:
224*aa1ce985SBruce Evans     mask = 0xff;
225*aa1ce985SBruce Evans     break;
226*aa1ce985SBruce Evans   }
227*aa1ce985SBruce Evans   for (i = 0; i < 256; i++)
228*aa1ce985SBruce Evans     VGLMouseStdOrMask.Bitmap[i] &= mask;
2299a57b7d2SSøren Schmidt   VGLMouseSetStdImage();
2309a57b7d2SSøren Schmidt   mouseinfo.operation = MOUSE_MODE;
2319a57b7d2SSøren Schmidt   mouseinfo.u.mode.signal = SIGUSR2;
2329a57b7d2SSøren Schmidt   if ((error = ioctl(0, CONS_MOUSECTL, &mouseinfo)))
2339a57b7d2SSøren Schmidt     return error;
2349a57b7d2SSøren Schmidt   signal(SIGUSR2, VGLMouseAction);
2359a57b7d2SSøren Schmidt   mouseinfo.operation = MOUSE_GETINFO;
2369a57b7d2SSøren Schmidt   ioctl(0, CONS_MOUSECTL, &mouseinfo);
2379a57b7d2SSøren Schmidt   VGLMouseXpos = mouseinfo.u.data.x;
2389a57b7d2SSøren Schmidt   VGLMouseYpos = mouseinfo.u.data.y;
2399a57b7d2SSøren Schmidt   VGLMouseButtons = mouseinfo.u.data.buttons;
2409a57b7d2SSøren Schmidt   VGLMouseMode(mode);
2419a57b7d2SSøren Schmidt   return 0;
2429a57b7d2SSøren Schmidt }
2439a57b7d2SSøren Schmidt 
2449a57b7d2SSøren Schmidt int
2459a57b7d2SSøren Schmidt VGLMouseStatus(int *x, int *y, char *buttons)
2469a57b7d2SSøren Schmidt {
2479a57b7d2SSøren Schmidt   signal(SIGUSR2, SIG_IGN);
2489a57b7d2SSøren Schmidt   *x =  VGLMouseXpos;
2499a57b7d2SSøren Schmidt   *y =  VGLMouseYpos;
2509a57b7d2SSøren Schmidt   *buttons =  VGLMouseButtons;
2519a57b7d2SSøren Schmidt   signal(SIGUSR2, VGLMouseAction);
2529a57b7d2SSøren Schmidt   return VGLMouseShown;
2539a57b7d2SSøren Schmidt }
2549a57b7d2SSøren Schmidt 
2559a57b7d2SSøren Schmidt int
256dd31deb8SBruce Evans VGLMouseFreeze(int x, int y, int width, int hight, u_long color)
2579a57b7d2SSøren Schmidt {
258*aa1ce985SBruce Evans   int i, xstride, ystride;
259*aa1ce985SBruce Evans 
2609a57b7d2SSøren Schmidt   if (!VGLMouseFrozen) {
2619a57b7d2SSøren Schmidt     VGLMouseFrozen = 1;
2629a57b7d2SSøren Schmidt     if (width > 1 || hight > 1) {		/* bitmap */
2639a57b7d2SSøren Schmidt       if (VGLMouseShown == 1) {
2649a57b7d2SSøren Schmidt         int overlap;
2659a57b7d2SSøren Schmidt 
2669a57b7d2SSøren Schmidt         if (x > VGLMouseXpos)
2679a57b7d2SSøren Schmidt           overlap = (VGLMouseXpos + MOUSE_IMG_SIZE) - x;
2689a57b7d2SSøren Schmidt         else
2699a57b7d2SSøren Schmidt           overlap = (x + width) - VGLMouseXpos;
2709a57b7d2SSøren Schmidt         if (overlap > 0) {
2719a57b7d2SSøren Schmidt           if (y > VGLMouseYpos)
2729a57b7d2SSøren Schmidt             overlap = (VGLMouseYpos + MOUSE_IMG_SIZE) - y;
2739a57b7d2SSøren Schmidt           else
2749a57b7d2SSøren Schmidt             overlap = (y + hight) - VGLMouseYpos;
2759a57b7d2SSøren Schmidt           if (overlap > 0)
2769a57b7d2SSøren Schmidt             VGLMousePointerHide();
2779a57b7d2SSøren Schmidt         }
2789a57b7d2SSøren Schmidt       }
2799a57b7d2SSøren Schmidt     }
2809a57b7d2SSøren Schmidt     else {				/* bit */
2819a57b7d2SSøren Schmidt       if (VGLMouseShown &&
2829a57b7d2SSøren Schmidt           x >= VGLMouseXpos && x < VGLMouseXpos + MOUSE_IMG_SIZE &&
2839a57b7d2SSøren Schmidt           y >= VGLMouseYpos && y < VGLMouseYpos + MOUSE_IMG_SIZE) {
284*aa1ce985SBruce Evans         xstride = VGLDisplay->PixelBytes;
285*aa1ce985SBruce Evans         ystride = MOUSE_IMG_SIZE * xstride;
286*aa1ce985SBruce Evans         for (i = 0; i < xstride; i++, color >>= 8)
287*aa1ce985SBruce Evans           VGLMouseSave.Bitmap[(y-VGLMouseYpos)*ystride+
288*aa1ce985SBruce Evans                               (x-VGLMouseXpos)*xstride+i] = color;
2899a57b7d2SSøren Schmidt         if (VGLMouseAndMask->Bitmap
2909a57b7d2SSøren Schmidt           [(y-VGLMouseYpos)*MOUSE_IMG_SIZE+(x-VGLMouseXpos)]) {
2919a57b7d2SSøren Schmidt           return 1;
2929a57b7d2SSøren Schmidt         }
2939a57b7d2SSøren Schmidt       }
2949a57b7d2SSøren Schmidt     }
2959a57b7d2SSøren Schmidt   }
2969a57b7d2SSøren Schmidt   return 0;
2979a57b7d2SSøren Schmidt }
2989a57b7d2SSøren Schmidt 
2999a57b7d2SSøren Schmidt void
3009a57b7d2SSøren Schmidt VGLMouseUnFreeze()
3019a57b7d2SSøren Schmidt {
3029a57b7d2SSøren Schmidt   if (VGLMouseFrozen > 1) {
3039a57b7d2SSøren Schmidt     VGLMouseFrozen = 0;
3049a57b7d2SSøren Schmidt     VGLMouseAction(0);
3059a57b7d2SSøren Schmidt   }
3069a57b7d2SSøren Schmidt   else {
3079a57b7d2SSøren Schmidt     VGLMouseFrozen = 0;
3089a57b7d2SSøren Schmidt     if (VGLMouseShown == VGL_MOUSESHOW && !VGLMouseVisible)
3099a57b7d2SSøren Schmidt       VGLMousePointerShow();
3109a57b7d2SSøren Schmidt   }
3119a57b7d2SSøren Schmidt }
312