Fix missing restoring of the mouse cursor position, the border color and the

blank state after a screen switch.
This commit is contained in:
bde 2019-04-21 10:33:09 +00:00
parent 1205340c36
commit 2b63616933
4 changed files with 38 additions and 0 deletions

View File

@ -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:

View File

@ -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)
{

View File

@ -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];
@ -636,6 +638,12 @@ VGLSetPaletteIndex(byte color, byte red, byte green, byte blue)
outb(0x3C0, 0x20);
}
void
VGLRestoreBorder(void)
{
VGLSetBorder(VGLBorderColor);
}
void
VGLSetBorder(byte color)
{
@ -646,10 +654,17 @@ 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)
{
@ -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);
}

View File

@ -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, int x2, int y2, u_long colo
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);