Alexandre Julliard : winex11: Abstract the server part of SetWindowPos into a separate function.
Alexandre Julliard
julliard at winehq.org
Wed Jan 23 05:25:00 CST 2008
Module: wine
Branch: master
Commit: 5df4e62312f3d9990b79dae36e4ef5758cd4ff16
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5df4e62312f3d9990b79dae36e4ef5758cd4ff16
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jan 22 20:07:50 2008 +0100
winex11: Abstract the server part of SetWindowPos into a separate function.
---
dlls/winex11.drv/winpos.c | 109 +++++++++++++++++++++++---------------------
1 files changed, 57 insertions(+), 52 deletions(-)
diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c
index 37c36ec..e975e5e 100644
--- a/dlls/winex11.drv/winpos.c
+++ b/dlls/winex11.drv/winpos.c
@@ -234,6 +234,55 @@ static void update_wm_states( Display *display, struct x11drv_win_data *data, BO
/***********************************************************************
+ * set_server_window_pos
+ *
+ * Set the window pos on the server side only. Helper for SetWindowPos.
+ */
+static BOOL set_server_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow,
+ const RECT *rectClient, UINT swp_flags, const RECT *valid_rects,
+ RECT *visible_rect )
+{
+ WND *win;
+ BOOL ret;
+
+ if (!(win = WIN_GetPtr( hwnd ))) return FALSE;
+ if (win == WND_DESKTOP || win == WND_OTHER_PROCESS) return FALSE;
+
+ SERVER_START_REQ( set_window_pos )
+ {
+ req->handle = hwnd;
+ req->previous = insert_after;
+ req->flags = swp_flags;
+ req->window.left = rectWindow->left;
+ req->window.top = rectWindow->top;
+ req->window.right = rectWindow->right;
+ req->window.bottom = rectWindow->bottom;
+ req->client.left = rectClient->left;
+ req->client.top = rectClient->top;
+ req->client.right = rectClient->right;
+ req->client.bottom = rectClient->bottom;
+ if (!IsRectEmpty( &valid_rects[0] ))
+ wine_server_add_data( req, valid_rects, 2 * sizeof(*valid_rects) );
+ if ((ret = !wine_server_call( req )))
+ {
+ win->dwStyle = reply->new_style;
+ win->dwExStyle = reply->new_ex_style;
+ win->rectWindow = *rectWindow;
+ win->rectClient = *rectClient;
+ visible_rect->left = reply->visible.left;
+ visible_rect->top = reply->visible.top;
+ visible_rect->right = reply->visible.right;
+ visible_rect->bottom = reply->visible.bottom;
+ }
+ }
+ SERVER_END_REQ;
+
+ WIN_ReleasePtr( win );
+ return ret;
+}
+
+
+/***********************************************************************
* SetWindowPos (X11DRV.@)
*/
BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow,
@@ -241,9 +290,8 @@ BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow,
{
Display *display = thread_display();
struct x11drv_win_data *data;
- RECT new_whole_rect, old_client_rect, visible_rect;
- WND *win;
- DWORD old_style, new_style, new_ex_style;
+ RECT new_whole_rect, visible_rect;
+ DWORD old_style, new_style;
BOOL ret, make_managed = FALSE;
if (!(data = X11DRV_get_win_data( hwnd ))) return FALSE;
@@ -262,56 +310,20 @@ BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow,
}
}
- old_client_rect = data->client_rect;
+ old_style = GetWindowLongW( hwnd, GWL_STYLE );
if (!data->whole_window) swp_flags |= SWP_NOCOPYBITS; /* we can't rely on X11 to move the bits */
- if (!(win = WIN_GetPtr( hwnd ))) return FALSE;
- if (win == WND_DESKTOP || win == WND_OTHER_PROCESS)
- {
- if (IsWindow( hwnd )) ERR( "cannot set rectangles of other process window %p\n", hwnd );
- return FALSE;
- }
- SERVER_START_REQ( set_window_pos )
- {
- req->handle = hwnd;
- req->previous = insert_after;
- req->flags = swp_flags;
- req->window.left = rectWindow->left;
- req->window.top = rectWindow->top;
- req->window.right = rectWindow->right;
- req->window.bottom = rectWindow->bottom;
- req->client.left = rectClient->left;
- req->client.top = rectClient->top;
- req->client.right = rectClient->right;
- req->client.bottom = rectClient->bottom;
- if (!IsRectEmpty( &valid_rects[0] ))
- wine_server_add_data( req, valid_rects, 2 * sizeof(*valid_rects) );
- if ((ret = !wine_server_call( req )))
- {
- new_style = reply->new_style;
- new_ex_style = reply->new_ex_style;
- visible_rect.left = reply->visible.left;
- visible_rect.top = reply->visible.top;
- visible_rect.right = reply->visible.right;
- visible_rect.bottom = reply->visible.bottom;
- }
- }
- SERVER_END_REQ;
-
- if (ret)
+ if ((ret = set_server_window_pos( hwnd, insert_after, rectWindow, rectClient, swp_flags,
+ valid_rects, &visible_rect )))
{
if (data->whole_window == DefaultRootWindow(gdi_display))
{
data->whole_rect = data->client_rect = data->window_rect = *rectWindow;
- win->rectWindow = *rectWindow;
- win->rectClient = *rectClient;
- win->dwStyle = new_style;
- win->dwExStyle = new_ex_style;
- WIN_ReleasePtr( win );
return TRUE;
}
+ new_style = GetWindowLongW( hwnd, GWL_STYLE );
new_whole_rect = *rectWindow;
X11DRV_window_to_X_rect( data, &new_whole_rect );
if (memcmp( &visible_rect, &new_whole_rect, sizeof(RECT) ))
@@ -337,17 +349,10 @@ BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow,
(swp_flags & (SWP_HIDEWINDOW | SWP_SHOWWINDOW)))
{
RECT rect;
- UnionRect( &rect, rectWindow, &win->rectWindow );
+ UnionRect( &rect, rectWindow, &data->window_rect );
invalidate_dce( hwnd, &rect );
}
- win->rectWindow = *rectWindow;
- win->rectClient = *rectClient;
- old_style = win->dwStyle;
- win->dwStyle = new_style;
- win->dwExStyle = new_ex_style;
- data->window_rect = *rectWindow;
-
TRACE( "win %p window %s client %s style %08x\n",
hwnd, wine_dbgstr_rect(rectWindow), wine_dbgstr_rect(rectClient), new_style );
@@ -403,6 +408,7 @@ BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow,
}
}
+ data->window_rect = *rectWindow;
X11DRV_sync_window_position( display, data, swp_flags, rectClient, &new_whole_rect );
if (data->whole_window && !data->lock_changes)
@@ -440,7 +446,6 @@ BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow,
}
}
}
- WIN_ReleasePtr( win );
return ret;
}
More information about the wine-cvs
mailing list