winemac: Track whether a view has ever had an OpenGL context attached.

... rather than whether it currently has one.

This is for OpenGLSurfaceMode=behind.  In that mode, we need to make the window
transparent wherever a GL-rendered view should not be clipped by GDI-rendered
children or sibling views.

Some apps attach a GL context to the view only temporarily, do some rendering,
and then detach it.  But the GL surface remains, with the rendered graphics.
In order for those to show, the window needs to remain transparent even though
none of its views has a GL context currently attached.

Signed-off-by: Ken Thomases <ken@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Ken Thomases 2017-05-08 15:31:48 -05:00 committed by Alexandre Julliard
parent 24d3795285
commit b6a4b2f593
1 changed files with 9 additions and 11 deletions

View File

@ -296,6 +296,7 @@ @interface WineContentView : NSView <NSTextInputClient>
{
NSMutableArray* glContexts;
NSMutableArray* pendingGlContexts;
BOOL _everHadGLContext;
BOOL _cachedHasGLDescendant;
BOOL _cachedHasGLDescendantValid;
BOOL clearedGlSurface;
@ -306,6 +307,8 @@ @interface WineContentView : NSView <NSTextInputClient>
int backingSize[2];
}
@property (readonly, nonatomic) BOOL everHadGLContext;
- (void) addGLContext:(WineOpenGLContext*)context;
- (void) removeGLContext:(WineOpenGLContext*)context;
- (void) updateGLContexts;
@ -358,6 +361,8 @@ - (void) windowDidDrawContent;
@implementation WineContentView
@synthesize everHadGLContext = _everHadGLContext;
- (void) dealloc
{
[markedText release];
@ -467,7 +472,7 @@ - (void) drawRect:(NSRect)rect
- (void) addGLContext:(WineOpenGLContext*)context
{
BOOL hadContext = [self hasGLContext];
BOOL hadContext = _everHadGLContext;
if (!glContexts)
glContexts = [[NSMutableArray alloc] init];
if (!pendingGlContexts)
@ -489,6 +494,7 @@ - (void) addGLContext:(WineOpenGLContext*)context
[self setNeedsDisplay:YES];
}
_everHadGLContext = YES;
if (!hadContext)
[self invalidateHasGLDescendant];
[(WineWindow*)[self window] updateForGLSubviews];
@ -496,11 +502,8 @@ - (void) addGLContext:(WineOpenGLContext*)context
- (void) removeGLContext:(WineOpenGLContext*)context
{
BOOL hadContext = [self hasGLContext];
[glContexts removeObjectIdenticalTo:context];
[pendingGlContexts removeObjectIdenticalTo:context];
if (hadContext && ![self hasGLContext])
[self invalidateHasGLDescendant];
[(WineWindow*)[self window] updateForGLSubviews];
}
@ -519,16 +522,11 @@ - (void) updateGLContexts
[self updateGLContexts:NO];
}
- (BOOL) hasGLContext
{
return [glContexts count] || [pendingGlContexts count];
}
- (BOOL) _hasGLDescendant
{
if ([self isHidden])
return NO;
if ([self hasGLContext])
if (_everHadGLContext)
return YES;
for (WineContentView* view in [self subviews])
{
@ -2485,7 +2483,7 @@ - (void) updateColorSpace
NSRect contentRect = [[self contentView] frame];
BOOL coveredByGLView = FALSE;
WineContentView* view = (WineContentView*)[[self contentView] hitTest:NSMakePoint(NSMidX(contentRect), NSMidY(contentRect))];
if ([view isKindOfClass:[WineContentView class]] && [view hasGLContext])
if ([view isKindOfClass:[WineContentView class]] && view.everHadGLContext)
{
NSRect frame = [view convertRect:[view bounds] toView:nil];
if (NSContainsRect(frame, contentRect))