From ac98e0c07535af4a373c0af343498903e2ff42a6 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 20 Aug 2007 22:06:33 +0200 Subject: [PATCH] winex11: Switch windows to managed mode in SetWindowPos instead of at creation time. --- dlls/winex11.drv/window.c | 31 ++++++++----------------------- dlls/winex11.drv/winpos.c | 29 ++++++++++++++++++++++++++--- dlls/winex11.drv/x11drv.h | 1 + 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index a16d0cd8efd..ecc4c0994f7 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -66,11 +66,10 @@ static const char visual_id_prop[] = "__wine_x11_visual_id"; * * Check if a given window should be managed */ -static inline BOOL is_window_managed( HWND hwnd ) +BOOL is_window_managed( HWND hwnd, const RECT *window_rect ) { DWORD style, ex_style; - if (!managed_mode) return FALSE; /* tray window is always managed */ ex_style = GetWindowLongW( hwnd, GWL_EXSTYLE ); if (ex_style & WS_EX_TRAYWINDOW) return TRUE; @@ -87,13 +86,11 @@ static inline BOOL is_window_managed( HWND hwnd ) if (ex_style & WS_EX_APPWINDOW) return TRUE; if (style & WS_POPUP) { - RECT rect; - /* popup with sysmenu == caption are managed */ if (style & WS_SYSMENU) return TRUE; /* full-screen popup windows are managed */ - GetWindowRect( hwnd, &rect ); - if ((rect.right - rect.left) == screen_width && (rect.bottom - rect.top) == screen_height) + if ((window_rect->right - window_rect->left) == screen_width && + (window_rect->bottom - window_rect->top) == screen_height) return TRUE; } /* default: not managed */ @@ -130,14 +127,6 @@ BOOL X11DRV_is_window_rect_mapped( const RECT *rect ) static int get_window_attributes( Display *display, struct x11drv_win_data *data, XSetWindowAttributes *attr ) { - if (!data->managed && - root_window == DefaultRootWindow( display ) && - data->whole_window != root_window && - is_window_managed( data->hwnd )) - { - data->managed = TRUE; - SetPropA( data->hwnd, managed_prop, (HANDLE)1 ); - } attr->override_redirect = !data->managed; attr->colormap = X11DRV_PALETTE_PaletteXColormap; attr->save_under = ((GetClassLongW( data->hwnd, GCL_STYLE ) & CS_SAVEBITS) != 0); @@ -774,22 +763,18 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat int cx, cy, mask; XSetWindowAttributes attr; XIM xim; - RECT rect; - - rect = data->window_rect; - X11DRV_window_to_X_rect( data, &rect ); - if (!(cx = rect.right - rect.left)) cx = 1; - if (!(cy = rect.bottom - rect.top)) cy = 1; + if (!(cx = data->window_rect.right - data->window_rect.left)) cx = 1; + if (!(cy = data->window_rect.bottom - data->window_rect.top)) cy = 1; mask = get_window_attributes( display, data, &attr ); wine_tsx11_lock(); - data->whole_rect = rect; + data->whole_rect = data->window_rect; data->whole_window = XCreateWindow( display, root_window, - rect.left - virtual_screen_rect.left, - rect.top - virtual_screen_rect.top, + data->window_rect.left - virtual_screen_rect.left, + data->window_rect.top - virtual_screen_rect.top, cx, cy, 0, screen_depth, InputOutput, visual, mask, &attr ); diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c index baee12295f1..25dabbb0dfb 100644 --- a/dlls/winex11.drv/winpos.c +++ b/dlls/winex11.drv/winpos.c @@ -79,6 +79,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv); #define _NET_WM_STATE_ADD 1 #define _NET_WM_STATE_TOGGLE 2 +static const char managed_prop[] = "__wine_x11_managed"; + /*********************************************************************** * X11DRV_Expose */ @@ -236,14 +238,29 @@ static BOOL fullscreen_state_changed( const struct x11drv_win_data *data, BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow, const RECT *rectClient, UINT swp_flags, const RECT *valid_rects ) { + Display *display = thread_display(); struct x11drv_win_data *data; RECT new_whole_rect, old_client_rect, old_screen_rect; WND *win; DWORD old_style, new_style; - BOOL ret; + BOOL ret, make_managed = FALSE; if (!(data = X11DRV_get_win_data( hwnd ))) return FALSE; + /* check if we need to switch the window to managed */ + if (!data->managed && data->whole_window && managed_mode && + root_window == DefaultRootWindow( display ) && + data->whole_window != root_window) + { + if (is_window_managed( hwnd, rectWindow )) + { + TRACE( "making win %p/%lx managed\n", hwnd, data->whole_window ); + make_managed = TRUE; + data->managed = TRUE; + SetPropA( hwnd, managed_prop, (HANDLE)1 ); + } + } + new_whole_rect = *rectWindow; X11DRV_window_to_X_rect( data, &new_whole_rect ); @@ -294,8 +311,6 @@ BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow, if (ret) { - Display *display = thread_display(); - /* invalidate DCEs */ if ((((swp_flags & SWP_AGG_NOPOSCHANGE) != SWP_AGG_NOPOSCHANGE) && (new_style & WS_VISIBLE)) || @@ -315,6 +330,14 @@ BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow, TRACE( "win %p window %s client %s style %08x\n", hwnd, wine_dbgstr_rect(rectWindow), wine_dbgstr_rect(rectClient), new_style ); + if (make_managed && (old_style & WS_VISIBLE)) + { + wine_tsx11_lock(); + XUnmapWindow( display, data->whole_window ); + wine_tsx11_unlock(); + old_style &= ~WS_VISIBLE; /* force it to be mapped again below */ + } + if (!IsRectEmpty( &valid_rects[0] )) { int x_offset = 0, y_offset = 0; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 1fca9904208..8594e20696b 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -684,6 +684,7 @@ typedef int (*x11drv_error_callback)( Display *display, XErrorEvent *event, void extern void X11DRV_expect_error( Display *display, x11drv_error_callback callback, void *arg ); extern int X11DRV_check_error(void); +extern BOOL is_window_managed( HWND hwnd, const RECT *window_rect ); extern void X11DRV_set_iconic_state( HWND hwnd ); extern void X11DRV_window_to_X_rect( struct x11drv_win_data *data, RECT *rect ); extern void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect ); -- 2.11.4.GIT