Alexandre Julliard : winex11: Add support for per-window visuals.

Alexandre Julliard julliard at winehq.org
Tue Oct 2 14:09:39 CDT 2012


Module: wine
Branch: master
Commit: 8dcbeff760115834656f3f1fc85922e3a9af14d0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8dcbeff760115834656f3f1fc85922e3a9af14d0

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Sep 26 12:19:37 2012 +0200

winex11: Add support for per-window visuals.

---

 dlls/winex11.drv/desktop.c |    3 +--
 dlls/winex11.drv/window.c  |   24 +++++++++++++++---------
 dlls/winex11.drv/x11drv.h  |    2 ++
 3 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/dlls/winex11.drv/desktop.c b/dlls/winex11.drv/desktop.c
index 3448afd..8d9de20 100644
--- a/dlls/winex11.drv/desktop.c
+++ b/dlls/winex11.drv/desktop.c
@@ -190,8 +190,7 @@ static BOOL CALLBACK update_windows_on_desktop_resize( HWND hwnd, LPARAM lparam
 
         changes.x = data->whole_rect.left - virtual_screen_rect.left;
         changes.y = data->whole_rect.top - virtual_screen_rect.top;
-        XReconfigureWMWindow( data->display, data->whole_window,
-                              DefaultScreen(data->display), mask, &changes );
+        XReconfigureWMWindow( data->display, data->whole_window, data->vis.screen, mask, &changes );
     }
     release_win_data( data );
     if (hwnd == GetForegroundWindow()) clip_fullscreen_window( hwnd, TRUE );
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 344fe44..b3d7279 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -312,7 +312,7 @@ static void get_x11_rect_offset( struct x11drv_win_data *data, RECT *rect )
 static int get_window_attributes( struct x11drv_win_data *data, XSetWindowAttributes *attr )
 {
     attr->override_redirect = !data->managed;
-    attr->colormap          = default_colormap;
+    attr->colormap          = data->colormap ? data->colormap : default_colormap;
     attr->save_under        = ((GetClassLongW( data->hwnd, GCL_STYLE ) & CS_SAVEBITS) != 0);
     attr->bit_gravity       = NorthWestGravity;
     attr->win_gravity       = StaticGravity;
@@ -1110,7 +1110,7 @@ static void unmap_window( HWND hwnd )
 
         if (data->embedded) set_xembed_flags( data, 0 );
         else if (!data->managed) XUnmapWindow( data->display, data->whole_window );
-        else XWithdrawWindow( data->display, data->whole_window, DefaultScreen(data->display) );
+        else XWithdrawWindow( data->display, data->whole_window, data->vis.screen );
 
         data->mapped = FALSE;
         data->net_wm_state = 0;
@@ -1132,7 +1132,7 @@ void make_window_embedded( HWND hwnd )
     if (data->mapped)
     {
         if (data->managed) XUnmapWindow( data->display, data->whole_window );
-        else XWithdrawWindow( data->display, data->whole_window, DefaultScreen(data->display) );
+        else XWithdrawWindow( data->display, data->whole_window, data->vis.screen );
         data->net_wm_state = 0;
     }
     data->embedded = TRUE;
@@ -1244,8 +1244,7 @@ static void sync_window_position( struct x11drv_win_data *data,
     set_size_hints( data, style );
     set_mwm_hints( data, style, ex_style );
     data->configure_serial = NextRequest( data->display );
-    XReconfigureWMWindow( data->display, data->whole_window,
-                          DefaultScreen(data->display), mask, &changes );
+    XReconfigureWMWindow( data->display, data->whole_window, data->vis.screen, mask, &changes );
 #ifdef HAVE_LIBXSHAPE
     if (IsRectEmpty( old_window_rect ) != IsRectEmpty( &data->window_rect ))
         sync_window_region( data, (HRGN)1 );
@@ -1367,6 +1366,9 @@ static void create_whole_window( struct x11drv_win_data *data )
     }
     data->shaped = (win_rgn != 0);
 
+    if (data->vis.visualid != default_visual.visualid)
+        data->colormap = XCreateColormap( data->display, root_window, data->vis.visual, AllocNone );
+
     mask = get_window_attributes( data, &attr );
 
     data->whole_rect = data->window_rect;
@@ -1379,8 +1381,8 @@ static void create_whole_window( struct x11drv_win_data *data )
     data->whole_window = XCreateWindow( data->display, root_window,
                                         data->whole_rect.left - virtual_screen_rect.left,
                                         data->whole_rect.top - virtual_screen_rect.top,
-                                        cx, cy, 0, default_visual.depth, InputOutput,
-                                        default_visual.visual, mask, &attr );
+                                        cx, cy, 0, data->vis.depth, InputOutput,
+                                        data->vis.visual, mask, &attr );
     if (!data->whole_window) goto done;
 
     set_initial_wm_hints( data->display, data->whole_window );
@@ -1435,7 +1437,9 @@ static void destroy_whole_window( struct x11drv_win_data *data, BOOL already_des
     TRACE( "win %p xwin %lx\n", data->hwnd, data->whole_window );
     XDeleteContext( data->display, data->whole_window, winContext );
     if (!already_destroyed) XDestroyWindow( data->display, data->whole_window );
+    if (data->colormap) XFreeColormap( data->display, data->colormap );
     data->whole_window = 0;
+    data->colormap = 0;
     data->wm_state = WithdrawnState;
     data->net_wm_state = 0;
     data->mapped = FALSE;
@@ -1542,6 +1546,7 @@ static struct x11drv_win_data *alloc_win_data( Display *display, HWND hwnd )
     if ((data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data))))
     {
         data->display = display;
+        data->vis = default_visual;
         data->hwnd = hwnd;
         EnterCriticalSection( &win_data_section );
         XSaveContext( gdi_display, (XID)hwnd, win_data_context, (char *)data );
@@ -2034,6 +2039,7 @@ void CDECL X11DRV_WindowPosChanging( HWND hwnd, HWND insert_after, UINT swp_flag
 
     if (!data->whole_window) goto done;
     if (swp_flags & SWP_HIDEWINDOW) goto done;
+    if (data->vis.visualid != default_visual.visualid) goto done;
 
     if (*surface) window_surface_release( *surface );
     *surface = NULL;  /* indicate that we want to draw directly to the window */
@@ -2059,7 +2065,7 @@ void CDECL X11DRV_WindowPosChanging( HWND hwnd, HWND insert_after, UINT swp_flag
     if (!layered || !GetLayeredWindowAttributes( hwnd, &key, NULL, &flags ) || !(flags & LWA_COLORKEY))
         key = CLR_INVALID;
 
-    *surface = create_surface( data->whole_window, &default_visual, &surface_rect, key );
+    *surface = create_surface( data->whole_window, &data->vis, &surface_rect, key );
 
 done:
     release_win_data( data );
@@ -2185,7 +2191,7 @@ void CDECL X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags
             data->iconic = (new_style & WS_MINIMIZE) != 0;
             TRACE( "changing win %p iconic state to %u\n", data->hwnd, data->iconic );
             if (data->iconic)
-                XIconifyWindow( data->display, data->whole_window, DefaultScreen(data->display) );
+                XIconifyWindow( data->display, data->whole_window, data->vis.screen );
             else if (is_window_rect_mapped( rectWindow ))
                 XMapWindow( data->display, data->whole_window );
             update_net_wm_states( data );
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 7a7cfd3..5557f7c 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -530,6 +530,8 @@ enum x11drv_net_wm_state
 struct x11drv_win_data
 {
     Display    *display;        /* display connection for the thread owning the window */
+    XVisualInfo vis;            /* X visual used by this window */
+    Colormap    colormap;       /* colormap if non-default visual */
     HWND        hwnd;           /* hwnd that this private data belongs to */
     Window      whole_window;   /* X window for the complete window */
     RECT        window_rect;    /* USER window rectangle relative to parent */




More information about the wine-cvs mailing list