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