Ken Thomases : winemac: Ignore Cocoa child windows which aren' t instances of WineWindow.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Dec 17 16:32:34 CST 2014
Module: wine
Branch: master
Commit: b8da8fa4b1a9362f87ed671c9cb8ebfa440ba1d5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b8da8fa4b1a9362f87ed671c9cb8ebfa440ba1d5
Author: Ken Thomases <ken at codeweavers.com>
Date: Wed Dec 17 08:59:09 2014 -0600
winemac: Ignore Cocoa child windows which aren't instances of WineWindow.
On Yosemite, in full-screen mode, Cocoa adds child windows of its own to our
windows. These windows are, of course, not instances of WineWindow. So, when
we call WineWindow-specific methods on them, it throws exceptions.
---
dlls/winemac.drv/cocoa_window.m | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index b2238cb..57ae2b8 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -195,6 +195,8 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
@property (retain, nonatomic) NSTimer* liveResizeDisplayTimer;
+ at property (readonly, copy, nonatomic) NSArray* childWineWindows;
+
- (void) updateColorSpace;
- (BOOL) becameEligibleParentOrChild;
@@ -834,7 +836,7 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
// Became non-floating. If parent of floating children, make that
// relationship latent.
WineWindow* child;
- for (child in [[[self childWindows] copy] autorelease])
+ for (child in [self childWineWindows])
{
if (child.floating)
[child becameIneligibleChild];
@@ -1012,7 +1014,7 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
- (void) becameIneligibleParentOrChild
{
- NSArray* childWindows = [self childWindows];
+ NSArray* childWindows = [self childWineWindows];
[self becameIneligibleChild];
@@ -1020,7 +1022,6 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
{
WineWindow* child;
- childWindows = [[childWindows copy] autorelease];
for (child in childWindows)
{
child.latentParentWindow = self;
@@ -1101,7 +1102,7 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
// Get our child windows and sort them in the reverse of the desired
// z-order (back-to-front).
- origChildren = [self childWindows];
+ origChildren = [self childWineWindows];
children = [[origChildren mutableCopy] autorelease];
[children sortWithOptions:NSSortStable
usingComparator:^NSComparisonResult(id obj1, id obj2){
@@ -1315,7 +1316,7 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
[self setContentMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
}
- if (equalSizes && [[self childWindows] count])
+ if (equalSizes && [[self childWineWindows] count])
{
// If we change the window frame such that the origin moves
// but the size doesn't change, then Cocoa moves child
@@ -1611,6 +1612,15 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif
[super toggleFullScreen:sender];
}
+ - (NSArray*) childWineWindows
+ {
+ NSArray* childWindows = self.childWindows;
+ NSIndexSet* indexes = [childWindows indexesOfObjectsPassingTest:^BOOL(id child, NSUInteger idx, BOOL *stop){
+ return [child isKindOfClass:[WineWindow class]];
+ }];
+ return [childWindows objectsAtIndexes:indexes];
+ }
+
// We normally use the generic/calibrated RGB color space for the window,
// rather than the device color space, to avoid expensive color conversion
// which slows down drawing. However, for windows displaying OpenGL, having
More information about the wine-cvs
mailing list