Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 03 Sep 2019 14:07:37 -0000
From:      Bruce Evans <bde@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r346486 - head/lib/libvgl
Message-ID:  <201904211033.x3LAX9vF040274@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bde
Date: Sun Apr 21 10:33:09 2019
New Revision: 346486
URL: https://svnweb.freebsd.org/changeset/base/346486

Log:
  Fix missing restoring of the mouse cursor position, the border color and the
  blank state after a screen switch.

Modified:
  head/lib/libvgl/main.c
  head/lib/libvgl/mouse.c
  head/lib/libvgl/simple.c
  head/lib/libvgl/vgl.h

Modified: head/lib/libvgl/main.c
==============================================================================
--- head/lib/libvgl/main.c	Sun Apr 21 09:13:56 2019	(r346485)
+++ head/lib/libvgl/main.c	Sun Apr 21 10:33:09 2019	(r346486)
@@ -436,6 +436,9 @@ VGLCheckSwitch()
       VGLDisplay->Xsize = VGLModeInfo.vi_width;
       VGLDisplay->Ysize = VGLModeInfo.vi_height;
       VGLSetVScreenSize(VGLDisplay, VGLDisplay->VXsize, VGLDisplay->VYsize);
+      VGLRestoreBlank();
+      VGLRestoreBorder();
+      VGLMouseRestore();
       VGLPanScreen(VGLDisplay, VGLDisplay->Xorigin, VGLDisplay->Yorigin);
       switch (VGLDisplay->Type) {
       case VIDBUF4S:

Modified: head/lib/libvgl/mouse.c
==============================================================================
--- head/lib/libvgl/mouse.c	Sun Apr 21 09:13:56 2019	(r346485)
+++ head/lib/libvgl/mouse.c	Sun Apr 21 10:33:09 2019	(r346486)
@@ -272,6 +272,22 @@ VGLMouseInit(int mode)
   return 0;
 }
 
+void
+VGLMouseRestore(void)
+{
+  struct mouse_info mouseinfo;
+
+  INTOFF();
+  mouseinfo.operation = MOUSE_GETINFO;
+  if (ioctl(0, CONS_MOUSECTL, &mouseinfo) == 0) {
+    mouseinfo.operation = MOUSE_MOVEABS;
+    mouseinfo.u.data.x = VGLMouseXpos;
+    mouseinfo.u.data.y = VGLMouseYpos;
+    ioctl(0, CONS_MOUSECTL, &mouseinfo);
+  }
+  INTON();
+}
+
 int
 VGLMouseStatus(int *x, int *y, char *buttons)
 {

Modified: head/lib/libvgl/simple.c
==============================================================================
--- head/lib/libvgl/simple.c	Sun Apr 21 09:13:56 2019	(r346485)
+++ head/lib/libvgl/simple.c	Sun Apr 21 10:33:09 2019	(r346486)
@@ -37,6 +37,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/endian.h>
 #include "vgl.h"
 
+static int VGLBlank;
+static byte VGLBorderColor;
 static byte VGLSavePaletteRed[256];
 static byte VGLSavePaletteGreen[256];
 static byte VGLSavePaletteBlue[256];
@@ -637,6 +639,12 @@ VGLSetPaletteIndex(byte color, byte red, byte green, b
 }
 
 void
+VGLRestoreBorder(void)
+{
+  VGLSetBorder(VGLBorderColor);
+}
+
+void
 VGLSetBorder(byte color)
 {
   if (VGLModeInfo.vi_mem_model == V_INFO_MM_DIRECT && ioctl(0, KDENABIO, 0))
@@ -646,11 +654,18 @@ VGLSetBorder(byte color)
   outb(0x3C0,0x11); outb(0x3C0, color); 
   inb(0x3DA);
   outb(0x3C0, 0x20);
+  VGLBorderColor = color;
   if (VGLModeInfo.vi_mem_model == V_INFO_MM_DIRECT)
     ioctl(0, KDDISABIO, 0);
 }
 
 void
+VGLRestoreBlank(void)
+{
+  VGLBlankDisplay(VGLBlank);
+}
+
+void
 VGLBlankDisplay(int blank)
 {
   byte val;
@@ -660,6 +675,7 @@ VGLBlankDisplay(int blank)
   VGLCheckSwitch();
   outb(0x3C4, 0x01); val = inb(0x3C5); outb(0x3C4, 0x01);
   outb(0x3C5, ((blank) ? (val |= 0x20) : (val &= 0xDF)));
+  VGLBlank = blank;
   if (VGLModeInfo.vi_mem_model == V_INFO_MM_DIRECT)
     ioctl(0, KDDISABIO, 0);
 }

Modified: head/lib/libvgl/vgl.h
==============================================================================
--- head/lib/libvgl/vgl.h	Sun Apr 21 09:13:56 2019	(r346485)
+++ head/lib/libvgl/vgl.h	Sun Apr 21 10:33:09 2019	(r346486)
@@ -130,6 +130,7 @@ void VGLMouseAction(int dummy);
 void VGLMouseSetImage(VGLBitmap *AndMask, VGLBitmap *OrMask);
 void VGLMouseSetStdImage(void);
 int VGLMouseInit(int mode);
+void VGLMouseRestore(void);
 int VGLMouseStatus(int *x, int *y, char *buttons);
 int VGLMouseFreeze(int x, int y, int width, int hight, u_long color);
 void VGLMouseUnFreeze(void);
@@ -142,6 +143,8 @@ void VGLFilledBox(VGLBitmap *object, int x1, int y1, i
 void VGLEllipse(VGLBitmap *object, int xc, int yc, int a, int b, u_long color);
 void VGLFilledEllipse(VGLBitmap *object, int xc, int yc, int a, int b, u_long color);
 void VGLClear(VGLBitmap *object, u_long color);
+void VGLRestoreBlank(void);
+void VGLRestoreBorder(void);
 void VGLRestorePalette(void);
 void VGLSavePalette(void);
 void VGLSetPalette(byte *red, byte *green, byte *blue);





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201904211033.x3LAX9vF040274>