summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2010-10-07 18:35:23 +0200
committerHans de Goede <hdegoede@redhat.com>2010-10-15 20:22:04 +0200
commitb161637c5c842aa2559cbb38676f5afc98747de2 (patch)
tree2853d504557b9cf0f977c5ed5d97a13e8cada4c8
parentf41a6c2ba6f6204fda4094750cc71b0faa893b46 (diff)
Fix restoration of text mode font when leaving the vt (rhbz#633647)
-rw-r--r--src/qxl.h2
-rw-r--r--src/qxl_driver.c41
2 files changed, 32 insertions, 11 deletions
diff --git a/src/qxl.h b/src/qxl.h
index e0caffe..7ac8ec4 100644
--- a/src/qxl.h
+++ b/src/qxl.h
@@ -40,6 +40,7 @@
#endif
#include "fb.h"
#include "uxa/uxa.h"
+#include "vgaHW.h"
#define hidden _X_HIDDEN
@@ -664,6 +665,7 @@ struct _qxl_screen_t
pciVideoPtr pci;
PCITAG pci_tag;
#endif
+ vgaRegRec vgaRegs;
uxa_driver_t * uxa;
diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index 066794f..853d552 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -36,9 +36,6 @@
#include "qxl.h"
#include "assert.h"
-#define qxl_save_state(x) do { (void)x; } while (0)
-#define qxl_restore_state(x) do { (void)x; } while (0)
-
#if 0
#define CHECK_POINT() ErrorF ("%s: %d (%s)\n", __FILE__, __LINE__, __FUNCTION__);
#endif
@@ -292,6 +289,22 @@ qxl_map_memory(qxl_screen_t *qxl, int scrnIndex)
return TRUE;
}
+static void
+qxl_save_state(ScrnInfoPtr pScrn)
+{
+ qxl_screen_t *qxl = pScrn->driverPrivate;
+
+ vgaHWSaveFonts(pScrn, &qxl->vgaRegs);
+}
+
+static void
+qxl_restore_state(ScrnInfoPtr pScrn)
+{
+ qxl_screen_t *qxl = pScrn->driverPrivate;
+
+ vgaHWRestoreFonts(pScrn, &qxl->vgaRegs);
+}
+
static Bool
qxl_close_screen(int scrnIndex, ScreenPtr pScreen)
{
@@ -299,8 +312,10 @@ qxl_close_screen(int scrnIndex, ScreenPtr pScreen)
qxl_screen_t *qxl = pScrn->driverPrivate;
Bool result;
- if (pScrn->vtSema)
+ if (pScrn->vtSema) {
+ qxl_restore_state(pScrn);
qxl_unmap_memory(qxl, scrnIndex);
+ }
pScrn->vtSema = FALSE;
ErrorF ("Freeing %p\n", qxl->fb);
@@ -1191,7 +1206,7 @@ qxl_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
printf ("ram_header at %d\n", qxl->rom->ram_header_offset);
printf ("surf0 size: %d\n", qxl->rom->surface0_area_size);
- qxl_save_state(qxl);
+ qxl_save_state(pScrn);
qxl_blank_screen(pScreen, SCREEN_SAVER_ON);
miClearVisualTypes();
@@ -1309,20 +1324,19 @@ static Bool
qxl_enter_vt(int scrnIndex, int flags)
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- qxl_screen_t *qxl = pScrn->driverPrivate;
-
- qxl_save_state(qxl);
+ qxl_save_state(pScrn);
qxl_switch_mode(scrnIndex, pScrn->currentMode, 0);
+
return TRUE;
}
static void
qxl_leave_vt(int scrnIndex, int flags)
{
- qxl_screen_t *qxl = xf86Screens[scrnIndex]->driverPrivate;
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- qxl_restore_state(qxl);
+ qxl_restore_state(pScrn);
}
static Bool
@@ -1623,13 +1637,18 @@ qxl_pre_init(ScrnInfoPtr pScrn, int flags)
xf86SetDpi(pScrn, 0, 0);
if (!xf86LoadSubModule(pScrn, "fb") ||
- !xf86LoadSubModule(pScrn, "ramdac"))
+ !xf86LoadSubModule(pScrn, "ramdac") ||
+ !xf86LoadSubModule(pScrn, "vgahw"))
{
goto out;
}
print_modes (qxl, scrnIndex);
+ /* VGA hardware initialisation */
+ if (!vgaHWGetHWRec(pScrn))
+ return FALSE;
+
/* hate */
qxl_unmap_memory(qxl, scrnIndex);