Alexandre Julliard : user32: Invalidate the DCEs while still holding the window lock in SetWindowPos.
Alexandre Julliard
julliard at winehq.org
Wed Aug 29 15:01:38 CDT 2012
Module: wine
Branch: master
Commit: 85fed5b1949473df5ec9f14648bf134e30b2af94
URL: http://source.winehq.org/git/wine.git/?a=commit;h=85fed5b1949473df5ec9f14648bf134e30b2af94
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Aug 29 18:13:57 2012 +0200
user32: Invalidate the DCEs while still holding the window lock in SetWindowPos.
---
dlls/user32/painting.c | 19 ++++++++-----------
dlls/user32/user_private.h | 3 ++-
dlls/user32/winpos.c | 16 +++++++---------
3 files changed, 17 insertions(+), 21 deletions(-)
diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c
index 98dfc54..64f4318 100644
--- a/dlls/user32/painting.c
+++ b/dlls/user32/painting.c
@@ -399,40 +399,38 @@ static void make_dc_dirty( struct dce *dce )
* rectangle. In addition, pWnd->parent DCEs may need to be updated if
* DCX_CLIPCHILDREN flag is set.
*/
-void invalidate_dce( HWND hwnd, const RECT *extra_rect )
+void invalidate_dce( WND *win, const RECT *extra_rect )
{
RECT window_rect;
struct dce *dce;
- HWND hwndScope = GetAncestor( hwnd, GA_PARENT );
- if (!hwndScope) return;
+ if (!win->parent) return;
- GetWindowRect( hwnd, &window_rect );
+ GetWindowRect( win->obj.handle, &window_rect );
- TRACE("%p scope hwnd = %p %s (%s)\n",
- hwnd, hwndScope, wine_dbgstr_rect(&window_rect), wine_dbgstr_rect(extra_rect) );
+ TRACE("%p parent %p %s (%s)\n",
+ win->obj.handle, win->parent, wine_dbgstr_rect(&window_rect), wine_dbgstr_rect(extra_rect) );
/* walk all DCEs and fixup non-empty entries */
- USER_Lock();
LIST_FOR_EACH_ENTRY( dce, &dce_list, struct dce, entry )
{
TRACE( "%p: hwnd %p dcx %08x %s %s\n", dce, dce->hwnd, dce->flags,
(dce->flags & DCX_CACHE) ? "Cache" : "Owned", dce->count ? "InUse" : "" );
if (!dce->hwnd) continue;
- if ((dce->hwnd == hwndScope) && !(dce->flags & DCX_CLIPCHILDREN))
+ if ((dce->hwnd == win->parent) && !(dce->flags & DCX_CLIPCHILDREN))
continue; /* child window positions don't bother us */
/* if DCE window is a child of hwnd, it has to be invalidated */
- if (dce->hwnd == hwnd || IsChild( hwnd, dce->hwnd ))
+ if (dce->hwnd == win->obj.handle || IsChild( win->obj.handle, dce->hwnd ))
{
make_dc_dirty( dce );
continue;
}
/* otherwise check if the window rectangle intersects this DCE window */
- if (hwndScope == dce->hwnd || IsChild( hwndScope, dce->hwnd ))
+ if (win->parent == dce->hwnd || IsChild( win->parent, dce->hwnd ))
{
RECT dce_rect, tmp;
GetWindowRect( dce->hwnd, &dce_rect );
@@ -441,7 +439,6 @@ void invalidate_dce( HWND hwnd, const RECT *extra_rect )
make_dc_dirty( dce );
}
}
- USER_Unlock();
}
/***********************************************************************
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 1a63bad..2bd8ad8 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -205,12 +205,13 @@ extern HMODULE user32_module DECLSPEC_HIDDEN;
extern HBRUSH SYSCOLOR_55AABrush DECLSPEC_HIDDEN;
struct dce;
+struct tagWND;
extern BOOL CLIPBOARD_ReleaseOwner(void) DECLSPEC_HIDDEN;
extern BOOL FOCUS_MouseActivate( HWND hwnd ) DECLSPEC_HIDDEN;
extern BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret ) DECLSPEC_HIDDEN;
extern void free_dce( struct dce *dce, HWND hwnd ) DECLSPEC_HIDDEN;
-extern void invalidate_dce( HWND hwnd, const RECT *rect ) DECLSPEC_HIDDEN;
+extern void invalidate_dce( struct tagWND *win, const RECT *rect ) DECLSPEC_HIDDEN;
extern void erase_now( HWND hwnd, UINT rdw_flags ) DECLSPEC_HIDDEN;
extern void *get_hook_proc( void *proc, const WCHAR *module ) DECLSPEC_HIDDEN;
extern LRESULT call_current_hook( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam ) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c
index 0ff4762..23b0b7f 100644
--- a/dlls/user32/winpos.c
+++ b/dlls/user32/winpos.c
@@ -1997,17 +1997,15 @@ BOOL set_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags,
}
}
SERVER_END_REQ;
- WIN_ReleasePtr( win );
- if (ret)
- {
- if (((swp_flags & SWP_AGG_NOPOSCHANGE) != SWP_AGG_NOPOSCHANGE) ||
- (swp_flags & (SWP_HIDEWINDOW | SWP_SHOWWINDOW | SWP_STATECHANGED | SWP_FRAMECHANGED)))
- invalidate_dce( hwnd, &old_window_rect );
+ if (ret && (((swp_flags & SWP_AGG_NOPOSCHANGE) != SWP_AGG_NOPOSCHANGE) ||
+ (swp_flags & (SWP_HIDEWINDOW | SWP_SHOWWINDOW | SWP_STATECHANGED | SWP_FRAMECHANGED))))
+ invalidate_dce( win, &old_window_rect );
- USER_Driver->pWindowPosChanged( hwnd, insert_after, swp_flags, window_rect,
- client_rect, &visible_rect, valid_rects );
- }
+ WIN_ReleasePtr( win );
+
+ if (ret) USER_Driver->pWindowPosChanged( hwnd, insert_after, swp_flags, window_rect,
+ client_rect, &visible_rect, valid_rects );
return ret;
}
More information about the wine-cvs
mailing list