Alexandre Julliard : winex11: Move the window bits according to the valid rects instead of invalidating.
Alexandre Julliard
julliard at winehq.org
Wed Jan 23 05:25:01 CST 2008
Module: wine
Branch: master
Commit: 235dd63fdc96ca22234d584fead6464290fd56fd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=235dd63fdc96ca22234d584fead6464290fd56fd
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jan 22 20:34:11 2008 +0100
winex11: Move the window bits according to the valid rects instead of invalidating.
---
dlls/winex11.drv/winpos.c | 69 +++++++++++++++++++++++++++++++++------------
1 files changed, 51 insertions(+), 18 deletions(-)
diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c
index 86ad445..94dca2b 100644
--- a/dlls/winex11.drv/winpos.c
+++ b/dlls/winex11.drv/winpos.c
@@ -237,20 +237,59 @@ static void update_wm_states( Display *display, struct x11drv_win_data *data, BO
* move_window_bits
*
* Move the window bits when a window is moved.
- * FIXME: currently we don't move anything, we just invalidate the new position.
*/
static void move_window_bits( struct x11drv_win_data *data, const RECT *old_rect, const RECT *new_rect,
const RECT *window_rect, const RECT *whole_rect, const RECT *client_rect )
{
- RECT invalid_rect = *new_rect;
- UINT flags = RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN;
-
- /* make it relative to the client area */
- OffsetRect( &invalid_rect, -client_rect->left, -client_rect->top );
- if (invalid_rect.left < 0 || invalid_rect.top < 0 ||
- invalid_rect.right > client_rect->right - client_rect->left ||
- invalid_rect.bottom > client_rect->bottom - client_rect->top) flags |= RDW_FRAME;
- RedrawWindow( data->hwnd, &invalid_rect, NULL, flags );
+ RECT src_rect = *old_rect;
+ RECT dst_rect = *new_rect;
+ HDC hdc_src, hdc_dst;
+ INT code;
+ HRGN rgn = 0;
+ HWND parent = 0;
+
+ if (!data->whole_window)
+ {
+ OffsetRect( &dst_rect, -window_rect->left, -window_rect->top );
+ parent = GetAncestor( data->hwnd, GA_PARENT );
+ hdc_src = GetDCEx( parent, 0, DCX_CACHE );
+ hdc_dst = GetDCEx( data->hwnd, 0, DCX_CACHE | DCX_WINDOW );
+ }
+ else
+ {
+ OffsetRect( &dst_rect, -whole_rect->left, -whole_rect->top );
+ /* make src rect relative to the old position of the window */
+ OffsetRect( &src_rect, -data->whole_rect.left, -data->whole_rect.top );
+ if (dst_rect.left == src_rect.left && dst_rect.top == src_rect.top) return;
+ /* now make them relative to window rect for DCX_WINDOW */
+ OffsetRect( &dst_rect, whole_rect->left - window_rect->left,
+ whole_rect->top - window_rect->top );
+ OffsetRect( &src_rect, whole_rect->left - window_rect->left,
+ whole_rect->top - window_rect->top );
+ hdc_src = hdc_dst = GetDCEx( data->hwnd, 0, DCX_CACHE | DCX_WINDOW );
+ }
+
+ code = X11DRV_START_EXPOSURES;
+ ExtEscape( hdc_dst, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL );
+
+ TRACE( "copying bits for win %p/%lx %s -> %s\n",
+ data->hwnd, data->whole_window, wine_dbgstr_rect(&src_rect), wine_dbgstr_rect(&dst_rect) );
+ BitBlt( hdc_dst, dst_rect.left, dst_rect.top,
+ dst_rect.right - dst_rect.left, dst_rect.bottom - dst_rect.top,
+ hdc_src, src_rect.left, src_rect.top, SRCCOPY );
+
+ code = X11DRV_END_EXPOSURES;
+ ExtEscape( hdc_dst, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, sizeof(rgn), (LPSTR)&rgn );
+
+ ReleaseDC( data->hwnd, hdc_dst );
+ if (hdc_src != hdc_dst) ReleaseDC( parent, hdc_src );
+
+ if (rgn)
+ {
+ OffsetRgn( rgn, window_rect->left - client_rect->left, window_rect->top - client_rect->top );
+ RedrawWindow( data->hwnd, NULL, rgn, RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | RDW_ALLCHILDREN );
+ DeleteObject( rgn );
+ }
}
/***********************************************************************
@@ -403,14 +442,8 @@ BOOL X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, const RECT *rectWindow,
rectWindow, &new_whole_rect, rectClient );
}
else
- {
- /* check if the offset corresponds to what the X server will move */
- if (!data->whole_window ||
- x_offset != valid_rects[1].left - valid_rects[0].left ||
- y_offset != valid_rects[1].top - valid_rects[0].top)
- move_window_bits( data, &valid_rects[1], &valid_rects[0],
- rectWindow, &new_whole_rect, rectClient );
- }
+ move_window_bits( data, &valid_rects[1], &valid_rects[0],
+ rectWindow, &new_whole_rect, rectClient );
}
More information about the wine-cvs
mailing list