Ken Thomases : winemac: Consolidate the code for managing the Cocoa parent/ child window relationship.
Alexandre Julliard
julliard at winehq.org
Fri Aug 30 11:00:37 CDT 2013
Module: wine
Branch: master
Commit: 512237ebe6b17f459daa7397f614d2607ccb9f6f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=512237ebe6b17f459daa7397f614d2607ccb9f6f
Author: Ken Thomases <ken at codeweavers.com>
Date: Fri Aug 30 00:00:49 2013 -0500
winemac: Consolidate the code for managing the Cocoa parent/child window relationship.
---
dlls/winemac.drv/cocoa_window.m | 75 +++++++++++++++++++++++++++++----------
1 files changed, 56 insertions(+), 19 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index 141fc61..1762c5b 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -670,6 +670,55 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
forWindow:self];
}
+ - (BOOL) addChildWineWindow:(WineWindow*)child assumeVisible:(BOOL)assumeVisible
+ {
+ BOOL reordered = FALSE;
+
+ if ([self isVisible] && (assumeVisible || [child isVisible]))
+ {
+ if ([self level] > [child level])
+ [child setLevel:[self level]];
+ [self addChildWindow:child ordered:NSWindowAbove];
+ child.latentParentWindow = nil;
+ reordered = TRUE;
+ }
+ else
+ child.latentParentWindow = self;
+
+ return reordered;
+ }
+
+ - (BOOL) addChildWineWindow:(WineWindow*)child
+ {
+ return [self addChildWineWindow:child assumeVisible:FALSE];
+ }
+
+ - (void) removeChildWineWindow:(WineWindow*)child
+ {
+ [self removeChildWindow:child];
+ if (child.latentParentWindow == self)
+ child.latentParentWindow = nil;
+ }
+
+ - (BOOL) becameEligibleParentOrChild
+ {
+ // If we aren't visible currently, we assume that we should be and soon
+ // will be. So, if the latent parent is visible that's enough to assume
+ // we can establish the parent-child relationship in Cocoa. That will
+ // actually make us visible, which is fine.
+ return [latentParentWindow addChildWineWindow:self assumeVisible:TRUE];
+ }
+
+ - (void) becameIneligibleParentOrChild
+ {
+ WineWindow* parent = (WineWindow*)[self parentWindow];
+ if (parent)
+ {
+ self.latentParentWindow = parent;
+ [parent removeChildWindow: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.
@@ -786,14 +835,9 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
NSDisableScreenUpdates();
- if (latentParentWindow)
- {
- if ([latentParentWindow level] > [self level])
- [self setLevel:[latentParentWindow level]];
- [latentParentWindow addChildWindow:self ordered:NSWindowAbove];
- self.latentParentWindow = nil;
+ if ([self becameEligibleParentOrChild])
needAdjustWindowLevels = TRUE;
- }
+
if (prev || next)
{
WineWindow* other = [prev isVisible] ? prev : next;
@@ -867,8 +911,8 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
if ([self isMiniaturized])
pendingMinimize = TRUE;
- self.latentParentWindow = [self parentWindow];
- [latentParentWindow removeChildWindow:self];
+
+ [self becameIneligibleParentOrChild];
[self orderOut:nil];
if (wasVisible && wasOnActiveSpace && fullscreen)
[controller updateFullscreenWindows];
@@ -952,17 +996,10 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
WineWindow* oldParent = (WineWindow*)[self parentWindow];
if ((oldParent && oldParent != parent) || (!oldParent && latentParentWindow != parent))
{
- [[self parentWindow] removeChildWindow:self];
- self.latentParentWindow = nil;
- if ([self isVisible] && parent)
- {
- if ([parent level] > [self level])
- [self setLevel:[parent level]];
- [parent addChildWindow:self ordered:NSWindowAbove];
+ [oldParent removeChildWineWindow:self];
+ [latentParentWindow removeChildWineWindow:self];
+ if ([parent addChildWineWindow:self])
[[WineApplicationController sharedController] adjustWindowLevels];
- }
- else
- self.latentParentWindow = parent;
}
}
More information about the wine-cvs
mailing list