[PATCH] winex11: Always call XInstallColormap after XCreateColormap

Alex Henrie alexhenrie24 at gmail.com
Mon Mar 28 00:41:33 CDT 2022


Unless XInstallColormap is called, Xephyr does not use the new color
map, even if it is associated to a window.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52742
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
This also helps with bug 46666, but there are still a lot of graphics
problems with that game and it's not clear to me whether or not they're
related to the color palette.
---
 dlls/winex11.drv/desktop.c     | 5 +++++
 dlls/winex11.drv/opengl.c      | 3 +++
 dlls/winex11.drv/palette.c     | 1 +
 dlls/winex11.drv/window.c      | 4 ++++
 dlls/winex11.drv/x11drv_main.c | 1 +
 5 files changed, 14 insertions(+)

diff --git a/dlls/winex11.drv/desktop.c b/dlls/winex11.drv/desktop.c
index 0ac538d06ed..b563487e801 100644
--- a/dlls/winex11.drv/desktop.c
+++ b/dlls/winex11.drv/desktop.c
@@ -349,10 +349,15 @@ BOOL CDECL X11DRV_create_desktop( UINT width, UINT height )
     win_attr.cursor = XCreateFontCursor( display, XC_top_left_arrow );
 
     if (default_visual.visual != DefaultVisual( display, DefaultScreen(display) ))
+    {
         win_attr.colormap = XCreateColormap( display, DefaultRootWindow(display),
                                              default_visual.visual, AllocNone );
+        XInstallColormap( display, win_attr.colormap );
+    }
     else
+    {
         win_attr.colormap = None;
+    }
 
     win = XCreateWindow( display, DefaultRootWindow(display),
                          0, 0, width, height, 0, default_visual.depth, InputOutput, default_visual.visual,
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 567205f742c..2756ed5fe92 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -458,7 +458,10 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void)
 
     root = RootWindow( gdi_display, vis->screen );
     if (vis->visual != DefaultVisual( gdi_display, vis->screen ))
+    {
         attr.colormap = XCreateColormap( gdi_display, root, vis->visual, AllocNone );
+        XInstallColormap( gdi_display, attr.colormap );
+    }
     if ((win = XCreateWindow( gdi_display, root, -1, -1, 1, 1, 0, vis->depth, InputOutput,
                               vis->visual, CWBorderPixel | CWOverrideRedirect | CWColormap, &attr )))
         XMapWindow( gdi_display, win );
diff --git a/dlls/winex11.drv/palette.c b/dlls/winex11.drv/palette.c
index 8fbd7820c95..845f01902fc 100644
--- a/dlls/winex11.drv/palette.c
+++ b/dlls/winex11.drv/palette.c
@@ -304,6 +304,7 @@ int X11DRV_PALETTE_Init(void)
             XFreeColormap( gdi_display, default_colormap );
 	    default_colormap = XCreateColormap( gdi_display, root_window,
                                                 default_visual.visual, AllocAll );
+	    XInstallColormap( gdi_display, default_colormap );
 	    if (default_colormap)
 	    {
 	        X11DRV_PALETTE_PaletteFlags |= X11DRV_PALETTE_PRIVATE;
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 36fb41ac710..818310d5461 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -1520,6 +1520,7 @@ Window create_client_window( HWND hwnd, const XVisualInfo *visual )
                                             (visual->class == PseudoColor ||
                                              visual->class == GrayScale ||
                                              visual->class == DirectColor) ? AllocAll : AllocNone );
+    XInstallColormap( gdi_display, data->client_colormap );
     attr.colormap = data->client_colormap;
     attr.bit_gravity = NorthWestGravity;
     attr.win_gravity = NorthWestGravity;
@@ -1579,7 +1580,10 @@ static void create_whole_window( struct x11drv_win_data *data )
     data->shaped = (win_rgn != 0);
 
     if (data->vis.visualid != default_visual.visualid)
+    {
         data->whole_colormap = XCreateColormap( data->display, root_window, data->vis.visual, AllocNone );
+        XInstallColormap( data->display, data->whole_colormap );
+    }
 
     mask = get_window_attributes( data, &attr );
 
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 32beb84a009..8de464aa8bd 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -558,6 +558,7 @@ static void init_visuals( Display *display, int screen )
         default_visual.bits_per_rgb  = default_visual.visual->bits_per_rgb;
     }
     default_colormap = XCreateColormap( display, root_window, default_visual.visual, AllocNone );
+    XInstallColormap( display, default_colormap );
 
     TRACE( "default visual %lx class %u argb %lx\n",
            default_visual.visualid, default_visual.class, argb_visual.visualid );
-- 
2.35.1




More information about the wine-devel mailing list