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