From bc381a6a3f904ed05ccb167f62b2b0433f758df9 Mon Sep 17 00:00:00 2001 From: Gavriel State 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; -- 2.11.4.GIT