Jacek Caban : user32: Don't use window' s parent as an owner if WS_CHILD style is not set.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Feb 24 11:01:43 CST 2016
Module: wine
Branch: master
Commit: d13a44e4aa12fa5ad3498c39934e88a7dcd30916
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d13a44e4aa12fa5ad3498c39934e88a7dcd30916
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Feb 22 12:54:59 2016 +0100
user32: Don't use window's parent as an owner if WS_CHILD style is not set.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/tests/win.c | 25 +++++++++++++++++++++++++
server/window.c | 3 ++-
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 71459e1..988aa6c 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -652,6 +652,31 @@ static void test_parent_owner(void)
DestroyWindow( child );
DestroyWindow( test );
DestroyWindow( owner );
+
+ /* Test that owner window takes into account WS_CHILD flag even if parent is set by SetParent. */
+ owner = create_tool_window( WS_VISIBLE | WS_OVERLAPPEDWINDOW, desktop );
+ SetParent(owner, hwndMain);
+ check_parents( owner, hwndMain, hwndMain, NULL, NULL, hwndMain, owner );
+ test = create_tool_window( WS_VISIBLE | WS_OVERLAPPEDWINDOW, owner );
+ check_parents( test, desktop, owner, NULL, owner, test, test );
+ DestroyWindow( owner );
+ DestroyWindow( test );
+
+ owner = create_tool_window( WS_VISIBLE | WS_CHILD, desktop );
+ SetParent(owner, hwndMain);
+ check_parents( owner, hwndMain, hwndMain, hwndMain, NULL, hwndMain, hwndMain );
+ test = create_tool_window( WS_VISIBLE | WS_OVERLAPPEDWINDOW, owner );
+ check_parents( test, desktop, hwndMain, NULL, hwndMain, test, test );
+ DestroyWindow( owner );
+ DestroyWindow( test );
+
+ owner = create_tool_window( WS_VISIBLE | WS_POPUP | WS_CHILD, desktop );
+ SetParent(owner, hwndMain);
+ check_parents( owner, hwndMain, hwndMain, NULL, NULL, hwndMain, owner );
+ test = create_tool_window( WS_VISIBLE | WS_OVERLAPPEDWINDOW, owner );
+ check_parents( test, desktop, owner, NULL, owner, test, test );
+ DestroyWindow( owner );
+ DestroyWindow( test );
}
static BOOL CALLBACK enum_proc( HWND hwnd, LPARAM lParam)
diff --git a/server/window.c b/server/window.c
index 9328211..143b60c 100644
--- a/server/window.c
+++ b/server/window.c
@@ -1901,7 +1901,8 @@ DECL_HANDLER(create_window)
return;
}
else /* owner must be a top-level window */
- while (!is_desktop_window(owner->parent)) owner = owner->parent;
+ while ((owner->style & (WS_POPUP|WS_CHILD)) == WS_CHILD && !is_desktop_window(owner->parent))
+ owner = owner->parent;
}
atom = cls_name.len ? find_global_atom( NULL, &cls_name ) : req->atom;
More information about the wine-cvs
mailing list