Module Name: xsrc
Committed By: tsutsui
Date: Sun Jul 26 07:20:50 UTC 2020
Modified Files:
xsrc/external/mit/xorg-server/dist/hw/sun: sun.h sunCfb.c sunFbs.c
Log Message:
Implement functions to restore palette settings on exiting Xserver.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 xsrc/external/mit/xorg-server/dist/hw/sun/sun.h \
xsrc/external/mit/xorg-server/dist/hw/sun/sunFbs.c
cvs rdiff -u -r1.4 -r1.5 xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: xsrc/external/mit/xorg-server/dist/hw/sun/sun.h
diff -u xsrc/external/mit/xorg-server/dist/hw/sun/sun.h:1.1 xsrc/external/mit/xorg-server/dist/hw/sun/sun.h:1.2
--- xsrc/external/mit/xorg-server/dist/hw/sun/sun.h:1.1 Wed Jul 22 20:38:29 2020
+++ xsrc/external/mit/xorg-server/dist/hw/sun/sun.h Sun Jul 26 07:20:50 2020
@@ -247,11 +247,21 @@ typedef struct {
CursorPtr pCursor; /* current cursor */
} sunCursorRec, *sunCursorPtr;
+#define NCMAP 256
+typedef struct {
+ u_char origRed[NCMAP];
+ u_char origGreen[NCMAP];
+ u_char origBlue[NCMAP];
+} sunCmapRec, *sunCmapPtr;
+
typedef struct {
ColormapPtr installedMap;
CloseScreenProcPtr CloseScreen;
void (*UpdateColormap)(ScreenPtr, int, int, u_char *, u_char *, u_char *);
void (*GetColormap)(ScreenPtr, int, int, u_char *, u_char *, u_char *);
+ Bool origColormapValid;
+ sunCmapRec origColormap;
+ void (*RestoreColormap)(ScreenPtr);
sunCursorRec hardwareCursor;
Bool hasHardwareCursor;
} sunScreenRec, *sunScreenPtr;
Index: xsrc/external/mit/xorg-server/dist/hw/sun/sunFbs.c
diff -u xsrc/external/mit/xorg-server/dist/hw/sun/sunFbs.c:1.1 xsrc/external/mit/xorg-server/dist/hw/sun/sunFbs.c:1.2
--- xsrc/external/mit/xorg-server/dist/hw/sun/sunFbs.c:1.1 Wed Jul 22 20:38:29 2020
+++ xsrc/external/mit/xorg-server/dist/hw/sun/sunFbs.c Sun Jul 26 07:20:50 2020
@@ -137,7 +137,7 @@ sunScreenAllocate(ScreenPtr pScreen)
ErrorF("dixRegisterPrivateKey failed");
return FALSE;
}
- pPrivate = malloc (sizeof (sunScreenRec));
+ pPrivate = calloc(1, sizeof (sunScreenRec));
if (!pPrivate)
return FALSE;
@@ -171,6 +171,8 @@ closeScreen(ScreenPtr pScreen)
#if 0 /* XXX GX is disabled for now */
sunDisableCursor (pScreen);
#endif
+ if (pPrivate->origColormapValid)
+ (*pPrivate->RestoreColormap)(pScreen);
pScreen->CloseScreen = pPrivate->CloseScreen;
ret = (*pScreen->CloseScreen) (pScreen);
(void) (*pScreen->SaveScreen) (pScreen, SCREEN_SAVER_OFF);
Index: xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb.c
diff -u xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb.c:1.4 xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb.c:1.5
--- xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb.c:1.4 Sun Jul 26 07:19:09 2020
+++ xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb.c Sun Jul 26 07:20:50 2020
@@ -94,11 +94,15 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
static void CGUpdateColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
static void CGGetColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
static void CGStoreColors(ColormapPtr, int, xColorItem *);
+static void CGSaveColormap(ScreenPtr);
+static void CGRestoreColormap(ScreenPtr);
+static void CGScreenInitCommon(ScreenPtr);
static void CGScreenInit(ScreenPtr);
static void checkMono(int, char **);
#ifdef INCLUDE_CG2_HEADER
static void CG2UpdateColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
static void CG2GetColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
+static void CG2RestoreColormap(ScreenPtr);
static Bool CG2SaveScreen(ScreenPtr, int);
static void CG2ScreenInit(ScreenPtr pScreen);
#endif
@@ -246,22 +250,61 @@ CGStoreColors(ColormapPtr pmap, int ndef
}
static void
-CGScreenInit(ScreenPtr pScreen)
+CGSaveColormap(ScreenPtr pScreen)
{
-#ifndef STATIC_COLOR /* { */
sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
+ sunCmapPtr origColormap;
+ u_char *rmap, *gmap, *bmap;
+
+ origColormap = &pPrivate->origColormap;
+ rmap = origColormap->origRed;
+ gmap = origColormap->origGreen;
+ bmap = origColormap->origBlue;
+ (*pPrivate->GetColormap)(pScreen, 0, NCMAP, rmap, gmap, bmap);
+}
+
+static void
+CGRestoreColormap(ScreenPtr pScreen)
+{
+ sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
+ sunCmapPtr origColormap;
+ u_char *rmap, *gmap, *bmap;
+
+ if (pPrivate->origColormapValid) {
+ origColormap = &pPrivate->origColormap;
+ rmap = origColormap->origRed;
+ gmap = origColormap->origGreen;
+ bmap = origColormap->origBlue;
+ (*pPrivate->UpdateColormap)(pScreen, 0, NCMAP, rmap, gmap, bmap);
+ }
+}
+
+static void
+CGScreenInitCommon(ScreenPtr pScreen)
+{
pScreen->InstallColormap = sunInstallColormap;
pScreen->UninstallColormap = sunUninstallColormap;
pScreen->ListInstalledColormaps = sunListInstalledColormaps;
pScreen->StoreColors = CGStoreColors;
- pPrivate->UpdateColormap = CGUpdateColormap;
- pPrivate->GetColormap = CGGetColormap;
if (sunFlipPixels) {
Pixel pixel = pScreen->whitePixel;
pScreen->whitePixel = pScreen->blackPixel;
pScreen->blackPixel = pixel;
}
-#endif /* } */
+}
+
+static void
+CGScreenInit(ScreenPtr pScreen)
+{
+ sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
+
+ CGScreenInitCommon(pScreen);
+ pPrivate->UpdateColormap = CGUpdateColormap;
+ pPrivate->GetColormap = CGGetColormap;
+ pPrivate->RestoreColormap = CGRestoreColormap;
+
+ CGSaveColormap(pScreen);
+ pPrivate->origColormapValid = TRUE;
}
static void
@@ -372,6 +415,15 @@ CG2GetColormap(ScreenPtr pScreen, int in
}
}
+static void
+CG2RestoreColormap(ScreenPtr pScreen)
+{
+ int screen = pScreen->myNum;
+
+ CGRestoreColormap(pScreen);
+ ((CG2Ptr)sunFbs[screen].fb)->regs.ppmask.reg = 1;
+}
+
static Bool
CG2SaveScreen(ScreenPtr pScreen, int on)
{
@@ -387,9 +439,14 @@ static void
CG2ScreenInit(ScreenPtr pScreen)
{
sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
- CGScreenInit (pScreen);
+
+ CGScreenInitCommon(pScreen);
pPrivate->UpdateColormap = CG2UpdateColormap;
pPrivate->GetColormap = CG2GetColormap;
+ pPrivate->RestoreColormap = CG2RestoreColormap;
+
+ CGSaveColormap(pScreen);
+ pPrivate->origColormapValid = TRUE;
}
Bool