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

Reply via email to