Alexandre Julliard : winex11:
Switch windows to managed mode in SetWindowPos instead of at creation
time .
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 20 16:08:42 CDT 2007
Module: wine
Branch: master
Commit: ac98e0c07535af4a373c0af343498903e2ff42a6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ac98e0c07535af4a373c0af343498903e2ff42a6
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Aug 20 22:06:33 2007 +0200
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 a16d0cd..ecc4c09 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 baee122..25dabbb 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 1fca990..8594e20 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 );
More information about the wine-cvs
mailing list