Ken Thomases : winemac: On click, don' t reorder Cocoa child window after siblings of higher level.
Alexandre Julliard
julliard at winehq.org
Fri Aug 30 11:00:37 CDT 2013
Module: wine
Branch: master
Commit: b550ee8d59d5568ab04e86ea80ebd39af8452683
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b550ee8d59d5568ab04e86ea80ebd39af8452683
Author: Ken Thomases <ken at codeweavers.com>
Date: Fri Aug 30 00:00:38 2013 -0500
winemac: On click, don't reorder Cocoa child window after siblings of higher level.
It may be necessary to reorder to some extent because the clicked window is
behind a sibling at the same level, but that shouldn't move it later in the
list than higher-level siblings.
Cocoa gets buggy if the list of child windows isn't in z-order.
---
dlls/winemac.drv/cocoa_app.m | 24 ++++++++++++++++++++++++
1 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m
index 4cb09e7..615a9ab 100644
--- a/dlls/winemac.drv/cocoa_app.m
+++ b/dlls/winemac.drv/cocoa_app.m
@@ -1482,6 +1482,7 @@ int macdrv_err_on;
NSWindow* parent = [window parentWindow];
NSInteger level = [window level];
__block BOOL needReorder = FALSE;
+ NSMutableArray* higherLevelSiblings = [NSMutableArray array];
// If the window is already the last child or if it's only below
// children with higher window level, then no need to reorder it.
@@ -1495,12 +1496,35 @@ int macdrv_err_on;
needReorder = TRUE;
*stop = TRUE;
}
+ else
+ [higherLevelSiblings insertObject:child atIndex:0];
}];
if (needReorder)
{
+ WineWindow* sibling;
+
+ NSDisableScreenUpdates();
+
[parent removeChildWindow:window];
+ for (sibling in higherLevelSiblings)
+ [parent removeChildWindow:sibling];
+
[parent addChildWindow:window ordered:NSWindowAbove];
+ for (sibling in higherLevelSiblings)
+ {
+ // Setting a window as a child can reset its level to be
+ // the same as the parent, so save it and restore it.
+ // The call to -setLevel: puts the window at the front
+ // of its level but testing shows that that's what Cocoa
+ // does when you click on any window in an ownership
+ // hierarchy, anyway.
+ level = [sibling level];
+ [parent addChildWindow:sibling ordered:NSWindowAbove];
+ [sibling setLevel:level];
+ }
+
+ NSEnableScreenUpdates();
}
}
}
More information about the wine-cvs
mailing list