19a57b7d2SSøren Schmidt /*- 2*5e53a4f9SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 3*5e53a4f9SPedro 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; 859a57b7d2SSøren Schmidt static byte map[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE]; 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 { 989a57b7d2SSøren Schmidt byte buf[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE]; 995acf51eaSKazutaka YOKOTA VGLBitmap buffer = 1005acf51eaSKazutaka YOKOTA VGLBITMAP_INITIALIZER(MEMBUF, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE, buf); 1019a57b7d2SSøren Schmidt byte crtcidx, crtcval, gdcidx, gdcval; 1029a57b7d2SSøren Schmidt int pos; 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); 1129a57b7d2SSøren Schmidt bcopy(VGLMouseSave.Bitmap, buffer.Bitmap, MOUSE_IMG_SIZE*MOUSE_IMG_SIZE); 1139a57b7d2SSøren Schmidt for (pos = 0; pos < MOUSE_IMG_SIZE*MOUSE_IMG_SIZE; pos++) 1149a57b7d2SSøren Schmidt buffer.Bitmap[pos]=(buffer.Bitmap[pos]&~(VGLMouseAndMask->Bitmap[pos])) | 1159a57b7d2SSøren Schmidt VGLMouseOrMask->Bitmap[pos]; 1169a57b7d2SSøren Schmidt __VGLBitmapCopy(&buffer, 0, 0, VGLDisplay, 1179a57b7d2SSøren Schmidt VGLMouseXpos, VGLMouseYpos, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE); 1189a57b7d2SSøren Schmidt outb(0x3c4, crtcidx); 1199a57b7d2SSøren Schmidt outb(0x3c5, crtcval); 1209a57b7d2SSøren Schmidt outb(0x3ce, gdcidx); 1219a57b7d2SSøren Schmidt outb(0x3cf, gdcval); 1229a57b7d2SSøren Schmidt } 1239a57b7d2SSøren Schmidt } 1249a57b7d2SSøren Schmidt 1259a57b7d2SSøren Schmidt void 1269a57b7d2SSøren Schmidt VGLMousePointerHide() 1279a57b7d2SSøren Schmidt { 1289a57b7d2SSøren Schmidt byte crtcidx, crtcval, gdcidx, gdcval; 1299a57b7d2SSøren Schmidt 1309a57b7d2SSøren Schmidt if (VGLMouseVisible) { 1319a57b7d2SSøren Schmidt VGLMouseVisible = 0; 1329a57b7d2SSøren Schmidt crtcidx = inb(0x3c4); 1339a57b7d2SSøren Schmidt crtcval = inb(0x3c5); 1349a57b7d2SSøren Schmidt gdcidx = inb(0x3ce); 1359a57b7d2SSøren Schmidt gdcval = inb(0x3cf); 1369a57b7d2SSøren Schmidt __VGLBitmapCopy(&VGLMouseSave, 0, 0, VGLDisplay, 1379a57b7d2SSøren Schmidt VGLMouseXpos, VGLMouseYpos, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE); 1389a57b7d2SSøren Schmidt outb(0x3c4, crtcidx); 1399a57b7d2SSøren Schmidt outb(0x3c5, crtcval); 1409a57b7d2SSøren Schmidt outb(0x3ce, gdcidx); 1419a57b7d2SSøren Schmidt outb(0x3cf, gdcval); 1429a57b7d2SSøren Schmidt } 1439a57b7d2SSøren Schmidt } 1449a57b7d2SSøren Schmidt 1459a57b7d2SSøren Schmidt void 1469a57b7d2SSøren Schmidt VGLMouseMode(int mode) 1479a57b7d2SSøren Schmidt { 1489a57b7d2SSøren Schmidt if (mode == VGL_MOUSESHOW) { 1499a57b7d2SSøren Schmidt if (VGLMouseShown == VGL_MOUSEHIDE) { 1509a57b7d2SSøren Schmidt VGLMousePointerShow(); 1519a57b7d2SSøren Schmidt VGLMouseShown = VGL_MOUSESHOW; 1529a57b7d2SSøren Schmidt } 1539a57b7d2SSøren Schmidt } 1549a57b7d2SSøren Schmidt else { 1559a57b7d2SSøren Schmidt if (VGLMouseShown == VGL_MOUSESHOW) { 1569a57b7d2SSøren Schmidt VGLMousePointerHide(); 1579a57b7d2SSøren Schmidt VGLMouseShown = VGL_MOUSEHIDE; 1589a57b7d2SSøren Schmidt } 1599a57b7d2SSøren Schmidt } 1609a57b7d2SSøren Schmidt } 1619a57b7d2SSøren Schmidt 1629a57b7d2SSøren Schmidt void 1639a57b7d2SSøren Schmidt VGLMouseAction(int dummy) 1649a57b7d2SSøren Schmidt { 1659a57b7d2SSøren Schmidt struct mouse_info mouseinfo; 1669a57b7d2SSøren Schmidt 1679a57b7d2SSøren Schmidt if (VGLMouseFrozen) { 1689a57b7d2SSøren Schmidt VGLMouseFrozen++; 1699a57b7d2SSøren Schmidt return; 1709a57b7d2SSøren Schmidt } 1719a57b7d2SSøren Schmidt mouseinfo.operation = MOUSE_GETINFO; 1729a57b7d2SSøren Schmidt ioctl(0, CONS_MOUSECTL, &mouseinfo); 1739a57b7d2SSøren Schmidt if (VGLMouseShown == VGL_MOUSESHOW) 1749a57b7d2SSøren Schmidt VGLMousePointerHide(); 1759a57b7d2SSøren Schmidt VGLMouseXpos = mouseinfo.u.data.x; 1769a57b7d2SSøren Schmidt VGLMouseYpos = mouseinfo.u.data.y; 1779a57b7d2SSøren Schmidt VGLMouseButtons = mouseinfo.u.data.buttons; 1789a57b7d2SSøren Schmidt if (VGLMouseShown == VGL_MOUSESHOW) 1799a57b7d2SSøren Schmidt VGLMousePointerShow(); 1809a57b7d2SSøren Schmidt } 1819a57b7d2SSøren Schmidt 1829a57b7d2SSøren Schmidt void 1839a57b7d2SSøren Schmidt VGLMouseSetImage(VGLBitmap *AndMask, VGLBitmap *OrMask) 1849a57b7d2SSøren Schmidt { 1859a57b7d2SSøren Schmidt if (VGLMouseShown == VGL_MOUSESHOW) 1869a57b7d2SSøren Schmidt VGLMousePointerHide(); 1879a57b7d2SSøren Schmidt VGLMouseAndMask = AndMask; 1889a57b7d2SSøren Schmidt VGLMouseOrMask = OrMask; 1899a57b7d2SSøren Schmidt if (VGLMouseShown == VGL_MOUSESHOW) 1909a57b7d2SSøren Schmidt VGLMousePointerShow(); 1919a57b7d2SSøren Schmidt } 1929a57b7d2SSøren Schmidt 1939a57b7d2SSøren Schmidt void 1949a57b7d2SSøren Schmidt VGLMouseSetStdImage() 1959a57b7d2SSøren Schmidt { 1969a57b7d2SSøren Schmidt if (VGLMouseShown == VGL_MOUSESHOW) 1979a57b7d2SSøren Schmidt VGLMousePointerHide(); 1989a57b7d2SSøren Schmidt VGLMouseAndMask = &VGLMouseStdAndMask; 1999a57b7d2SSøren Schmidt VGLMouseOrMask = &VGLMouseStdOrMask; 2009a57b7d2SSøren Schmidt if (VGLMouseShown == VGL_MOUSESHOW) 2019a57b7d2SSøren Schmidt VGLMousePointerShow(); 2029a57b7d2SSøren Schmidt } 2039a57b7d2SSøren Schmidt 2049a57b7d2SSøren Schmidt int 2059a57b7d2SSøren Schmidt VGLMouseInit(int mode) 2069a57b7d2SSøren Schmidt { 2079a57b7d2SSøren Schmidt struct mouse_info mouseinfo; 2089a57b7d2SSøren Schmidt int error; 2099a57b7d2SSøren Schmidt 2109a57b7d2SSøren Schmidt VGLMouseSetStdImage(); 2119a57b7d2SSøren Schmidt mouseinfo.operation = MOUSE_MODE; 2129a57b7d2SSøren Schmidt mouseinfo.u.mode.signal = SIGUSR2; 2139a57b7d2SSøren Schmidt if ((error = ioctl(0, CONS_MOUSECTL, &mouseinfo))) 2149a57b7d2SSøren Schmidt return error; 2159a57b7d2SSøren Schmidt signal(SIGUSR2, VGLMouseAction); 2169a57b7d2SSøren Schmidt mouseinfo.operation = MOUSE_GETINFO; 2179a57b7d2SSøren Schmidt ioctl(0, CONS_MOUSECTL, &mouseinfo); 2189a57b7d2SSøren Schmidt VGLMouseXpos = mouseinfo.u.data.x; 2199a57b7d2SSøren Schmidt VGLMouseYpos = mouseinfo.u.data.y; 2209a57b7d2SSøren Schmidt VGLMouseButtons = mouseinfo.u.data.buttons; 2219a57b7d2SSøren Schmidt VGLMouseMode(mode); 2229a57b7d2SSøren Schmidt return 0; 2239a57b7d2SSøren Schmidt } 2249a57b7d2SSøren Schmidt 2259a57b7d2SSøren Schmidt int 2269a57b7d2SSøren Schmidt VGLMouseStatus(int *x, int *y, char *buttons) 2279a57b7d2SSøren Schmidt { 2289a57b7d2SSøren Schmidt signal(SIGUSR2, SIG_IGN); 2299a57b7d2SSøren Schmidt *x = VGLMouseXpos; 2309a57b7d2SSøren Schmidt *y = VGLMouseYpos; 2319a57b7d2SSøren Schmidt *buttons = VGLMouseButtons; 2329a57b7d2SSøren Schmidt signal(SIGUSR2, VGLMouseAction); 2339a57b7d2SSøren Schmidt return VGLMouseShown; 2349a57b7d2SSøren Schmidt } 2359a57b7d2SSøren Schmidt 2369a57b7d2SSøren Schmidt int 2379a57b7d2SSøren Schmidt VGLMouseFreeze(int x, int y, int width, int hight, byte color) 2389a57b7d2SSøren Schmidt { 2399a57b7d2SSøren Schmidt if (!VGLMouseFrozen) { 2409a57b7d2SSøren Schmidt VGLMouseFrozen = 1; 2419a57b7d2SSøren Schmidt if (width > 1 || hight > 1) { /* bitmap */ 2429a57b7d2SSøren Schmidt if (VGLMouseShown == 1) { 2439a57b7d2SSøren Schmidt int overlap; 2449a57b7d2SSøren Schmidt 2459a57b7d2SSøren Schmidt if (x > VGLMouseXpos) 2469a57b7d2SSøren Schmidt overlap = (VGLMouseXpos + MOUSE_IMG_SIZE) - x; 2479a57b7d2SSøren Schmidt else 2489a57b7d2SSøren Schmidt overlap = (x + width) - VGLMouseXpos; 2499a57b7d2SSøren Schmidt if (overlap > 0) { 2509a57b7d2SSøren Schmidt if (y > VGLMouseYpos) 2519a57b7d2SSøren Schmidt overlap = (VGLMouseYpos + MOUSE_IMG_SIZE) - y; 2529a57b7d2SSøren Schmidt else 2539a57b7d2SSøren Schmidt overlap = (y + hight) - VGLMouseYpos; 2549a57b7d2SSøren Schmidt if (overlap > 0) 2559a57b7d2SSøren Schmidt VGLMousePointerHide(); 2569a57b7d2SSøren Schmidt } 2579a57b7d2SSøren Schmidt } 2589a57b7d2SSøren Schmidt } 2599a57b7d2SSøren Schmidt else { /* bit */ 2609a57b7d2SSøren Schmidt if (VGLMouseShown && 2619a57b7d2SSøren Schmidt x >= VGLMouseXpos && x < VGLMouseXpos + MOUSE_IMG_SIZE && 2629a57b7d2SSøren Schmidt y >= VGLMouseYpos && y < VGLMouseYpos + MOUSE_IMG_SIZE) { 2639a57b7d2SSøren Schmidt VGLMouseSave.Bitmap[(y-VGLMouseYpos)*MOUSE_IMG_SIZE+(x-VGLMouseXpos)] = 2649a57b7d2SSøren Schmidt (color); 2659a57b7d2SSøren Schmidt if (VGLMouseAndMask->Bitmap 2669a57b7d2SSøren Schmidt [(y-VGLMouseYpos)*MOUSE_IMG_SIZE+(x-VGLMouseXpos)]) { 2679a57b7d2SSøren Schmidt return 1; 2689a57b7d2SSøren Schmidt } 2699a57b7d2SSøren Schmidt } 2709a57b7d2SSøren Schmidt } 2719a57b7d2SSøren Schmidt } 2729a57b7d2SSøren Schmidt return 0; 2739a57b7d2SSøren Schmidt } 2749a57b7d2SSøren Schmidt 2759a57b7d2SSøren Schmidt void 2769a57b7d2SSøren Schmidt VGLMouseUnFreeze() 2779a57b7d2SSøren Schmidt { 2789a57b7d2SSøren Schmidt if (VGLMouseFrozen > 1) { 2799a57b7d2SSøren Schmidt VGLMouseFrozen = 0; 2809a57b7d2SSøren Schmidt VGLMouseAction(0); 2819a57b7d2SSøren Schmidt } 2829a57b7d2SSøren Schmidt else { 2839a57b7d2SSøren Schmidt VGLMouseFrozen = 0; 2849a57b7d2SSøren Schmidt if (VGLMouseShown == VGL_MOUSESHOW && !VGLMouseVisible) 2859a57b7d2SSøren Schmidt VGLMousePointerShow(); 2869a57b7d2SSøren Schmidt } 2879a57b7d2SSøren Schmidt } 288