From bc381a6a3f904ed05ccb167f62b2b0433f758df9 Mon Sep 17 00:00:00 2001
From: Gavriel State <gav@transgaming.com>
Date: Mon, 16 Apr 2001 19:33:25 +0000
Subject: [PATCH] Copy the first 128 colors from the default colormap to Wine's
 private colormap when using 'shared' colors.

---
 graphics/x11drv/palette.c | 18 ++++++++++++++++--
 include/ts_xlib.h         |  1 +
 tsx11/X11_calls           |  1 +
 tsx11/ts_xlib.c           |  9 +++++++++
 4 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/graphics/x11drv/palette.c b/graphics/x11drv/palette.c
index 6e330202435..76f23cf4a4c 100644
--- a/graphics/x11drv/palette.c
+++ b/graphics/x11drv/palette.c
@@ -312,14 +312,28 @@ static BOOL X11DRV_PALETTE_BuildSharedMap(void)
    int			i, j, warn = 0;
    int			diff, r, g, b, max = 256, bp = 0, wp = 1;
    int			step = 1;
-
+   int			defaultCM_max_copy;
+   Colormap		defaultCM;
+   XColor		defaultColors[256];
+
+   /* Copy the first bunch of colors out of the default colormap to prevent 
+    * colormap flashing as much as possible.  We're likely to get the most
+    * important Window Manager colors, etc in the first 128 colors */
+   defaultCM = DefaultColormapOfScreen( X11DRV_GetXScreen() );
+   defaultCM_max_copy = PROFILE_GetWineIniInt( "x11drv", "CopyDefaultColors", 128);
+   for (i = 0; i < defaultCM_max_copy; i++)
+       defaultColors[i].pixel = (long) i;
+   TSXQueryColors(display, defaultCM, &defaultColors[0], defaultCM_max_copy);
+   for (i = 0; i < defaultCM_max_copy; i++)
+       TSXAllocColor( display, X11DRV_PALETTE_PaletteXColormap, &defaultColors[i] );
+              
    /* read "AllocSystemColors" from wine.conf */
 
    COLOR_max = PROFILE_GetWineIniInt( "x11drv", "AllocSystemColors", 256);
    if (COLOR_max > 256) COLOR_max = 256;
    else if (COLOR_max < 20) COLOR_max = 20;
    TRACE("%d colors configured.\n", COLOR_max);
-   
+
    TRACE("Building shared map - %i palette entries\n", X11DRV_DevCaps.sizePalette);
 
    /* Be nice and allocate system colors as read-only */
diff --git a/include/ts_xlib.h b/include/ts_xlib.h
index a479550bd28..8a91b56351f 100644
--- a/include/ts_xlib.h
+++ b/include/ts_xlib.h
@@ -106,6 +106,7 @@ extern int  TSXPending(Display*);
 extern int  TSXPutBackEvent(Display*, XEvent*);
 extern int  TSXPutImage(Display*, Drawable, GC, XImage*, int, int, int, int, unsigned int, unsigned int);
 extern int  TSXQueryColor(Display*, Colormap, XColor*);
+extern int  TSXQueryColors(Display*, Colormap, XColor*, int);
 extern int  TSXQueryKeymap(Display*, char*);
 extern int   TSXQueryPointer(Display*, Window, Window*, Window*, int*, int*, int*, int*, unsigned int*);
 extern int   TSXQueryTree(Display*, Window, Window*, Window*, Window**, unsigned int*);
diff --git a/tsx11/X11_calls b/tsx11/X11_calls
index fdafe70e6cf..6c5fbd75a41 100644
--- a/tsx11/X11_calls
+++ b/tsx11/X11_calls
@@ -109,6 +109,7 @@ XPolygonRegion
 XPutBackEvent
 XPutImage
 XQueryColor
+XQueryColors
 XQueryKeymap
 XQueryPointer
 XQueryTree
diff --git a/tsx11/ts_xlib.c b/tsx11/ts_xlib.c
index 8685180ac12..6fa8f3cb0b6 100644
--- a/tsx11/ts_xlib.c
+++ b/tsx11/ts_xlib.c
@@ -811,6 +811,15 @@ int  TSXQueryColor(Display* a0, Colormap a1, XColor* a2)
   return r;
 }
 
+int  TSXQueryColors(Display* a0, Colormap a1, XColor* a2, int a3)
+{
+  int  r;
+  wine_tsx11_lock();
+  r = XQueryColors(a0, a1, a2, a3);
+  wine_tsx11_unlock();
+  return r;
+}
+
 int  TSXQueryKeymap(Display* a0, char* a1)
 {
   int  r;
-- 
GitLab