Ken Thomases : winemac: Don't reorder windows if they' re already ordered as requested.

Alexandre Julliard julliard at winehq.org
Fri May 17 14:24:33 CDT 2013


Module: wine
Branch: master
Commit: ef874a8eaa7660a5bbbc762f2f396e0f831280d1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ef874a8eaa7660a5bbbc762f2f396e0f831280d1

Author: Ken Thomases <ken at codeweavers.com>
Date:   Thu May 16 18:43:44 2013 -0500

winemac: Don't reorder windows if they're already ordered as requested.

This avoids adjusting window levels.  It also avoid unnecessarily deinterleaving
the windows of this and other processes.

---

 dlls/winemac.drv/cocoa_window.m |   74 ++++++++++++++++++++++++++++++++++----
 1 files changed, 66 insertions(+), 8 deletions(-)

diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index 16244e8..cec86b5 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -657,6 +657,55 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
                                forWindow:self];
     }
 
+    // Determine if, among Wine windows, this window is directly above or below
+    // a given other Wine window with no other Wine window intervening.
+    // Intervening non-Wine windows are ignored.
+    - (BOOL) isOrdered:(NSWindowOrderingMode)orderingMode relativeTo:(WineWindow*)otherWindow
+    {
+        NSNumber* windowNumber;
+        NSNumber* otherWindowNumber;
+        NSArray* windowNumbers;
+        NSUInteger windowIndex, otherWindowIndex, lowIndex, highIndex, i;
+
+        if (![self isVisible] || ![otherWindow isVisible])
+            return FALSE;
+
+        windowNumber = [NSNumber numberWithInteger:[self windowNumber]];
+        otherWindowNumber = [NSNumber numberWithInteger:[otherWindow windowNumber]];
+        windowNumbers = [[self class] windowNumbersWithOptions:0];
+        windowIndex = [windowNumbers indexOfObject:windowNumber];
+        otherWindowIndex = [windowNumbers indexOfObject:otherWindowNumber];
+
+        if (windowIndex == NSNotFound || otherWindowIndex == NSNotFound)
+            return FALSE;
+
+        if (orderingMode == NSWindowAbove)
+        {
+            lowIndex = windowIndex;
+            highIndex = otherWindowIndex;
+        }
+        else if (orderingMode == NSWindowBelow)
+        {
+            lowIndex = otherWindowIndex;
+            highIndex = windowIndex;
+        }
+        else
+            return FALSE;
+
+        if (highIndex <= lowIndex)
+            return FALSE;
+
+        for (i = lowIndex + 1; i < highIndex; i++)
+        {
+            NSInteger interveningWindowNumber = [[windowNumbers objectAtIndex:i] integerValue];
+            NSWindow* interveningWindow = [NSApp windowWithWindowNumber:interveningWindowNumber];
+            if ([interveningWindow isKindOfClass:[WineWindow class]])
+                return FALSE;
+        }
+
+        return TRUE;
+    }
+
     /* Returns whether or not the window was ordered in, which depends on if
        its frame intersects any screen. */
     - (BOOL) orderBelow:(WineWindow*)prev orAbove:(WineWindow*)next
@@ -665,6 +714,8 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
         BOOL on_screen = frame_intersects_screens([self frame], [NSScreen screens]);
         if (on_screen)
         {
+            BOOL needAdjustWindowLevels = FALSE;
+
             [controller transformProcessToForeground];
 
             NSDisableScreenUpdates();
@@ -675,19 +726,24 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
                     [self setLevel:[latentParentWindow level]];
                 [latentParentWindow addChildWindow:self ordered:NSWindowAbove];
                 self.latentParentWindow = nil;
+                needAdjustWindowLevels = TRUE;
             }
             if (prev || next)
             {
                 WineWindow* other = [prev isVisible] ? prev : next;
                 NSWindowOrderingMode orderingMode = [prev isVisible] ? NSWindowBelow : NSWindowAbove;
 
-                // This window level may not be right for this window based
-                // on floating-ness, fullscreen-ness, etc.  But we set it
-                // temporarily to allow us to order the windows properly.
-                // Then the levels get fixed by -adjustWindowLevels.
-                if ([self level] != [other level])
-                    [self setLevel:[other level]];
-                [self orderWindow:orderingMode relativeTo:[other windowNumber]];
+                if (![self isOrdered:orderingMode relativeTo:other])
+                {
+                    // This window level may not be right for this window based
+                    // on floating-ness, fullscreen-ness, etc.  But we set it
+                    // temporarily to allow us to order the windows properly.
+                    // Then the levels get fixed by -adjustWindowLevels.
+                    if ([self level] != [other level])
+                        [self setLevel:[other level]];
+                    [self orderWindow:orderingMode relativeTo:[other windowNumber]];
+                    needAdjustWindowLevels = TRUE;
+                }
             }
             else
             {
@@ -697,8 +753,10 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
                 if (next && [self level] < [next level])
                     [self setLevel:[next level]];
                 [self orderFront:nil];
+                needAdjustWindowLevels = TRUE;
             }
-            [controller adjustWindowLevels];
+            if (needAdjustWindowLevels)
+                [controller adjustWindowLevels];
 
             NSEnableScreenUpdates();
 




More information about the wine-cvs mailing list