X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_output%2Fmacosx.m;h=29cde854b132d8022ed92f96ccbdf587c58ba8e5;hb=b68fb123875dbc0038bb551769f1ce1a1f68b8a7;hp=fe508fe9d5af84ab45546a791c81027653cd5e71;hpb=12a36253521fbd28b624c11681517009e49f346b;p=vlc diff --git a/modules/video_output/macosx.m b/modules/video_output/macosx.m index fe508fe9d5..29cde854b1 100644 --- a/modules/video_output/macosx.m +++ b/modules/video_output/macosx.m @@ -72,8 +72,7 @@ vlc_module_begin () set_capability("vout display", 300) set_callbacks(Open, Close) - add_shortcut("macosx") - add_shortcut("vout_macosx") + add_shortcut("macosx", "vout_macosx") vlc_module_end () /** @@ -127,6 +126,7 @@ static int Open(vlc_object_t *this) msg_Dbg(vd, "No drawable-nsobject, passing over."); goto error; } + vout_display_DeleteWindow(vd, NULL); /* This will be released in Close(), on * main thread, after we are done using it. */ @@ -144,7 +144,21 @@ static int Open(vlc_object_t *this) /* We don't wait, that means that we'll have to be careful about releasing * container. * That's why we'll release on main thread in Close(). */ - [(id)container performSelectorOnMainThread:@selector(addVoutSubview:) withObject:sys->glView waitUntilDone:NO]; + if ([(id)container respondsToSelector:@selector(addVoutSubview:)]) + [(id)container performSelectorOnMainThread:@selector(addVoutSubview:) withObject:sys->glView waitUntilDone:NO]; + else if ([container isKindOfClass:[NSView class]]) + { + NSView *parentView = container; + [parentView performSelectorOnMainThread:@selector(addSubview:) withObject:sys->glView waitUntilDone:NO]; + [sys->glView performSelectorOnMainThread:@selector(setFrame:) withObject:[NSValue valueWithRect:[parentView bounds]] waitUntilDone:NO]; + } + else + { + msg_Err(vd, "Invalid drawable-nsobject object. drawable-nsobject must either be an NSView or comply to the @protocol VLCOpenGLVideoViewEmbedding."); + goto error; + } + + [nsPool release]; nsPool = nil; @@ -192,8 +206,11 @@ void Close(vlc_object_t *this) [sys->glView setVoutDisplay:nil]; var_Destroy(vd, "drawable-nsobject"); - /* This will retain sys->glView */ - [(id)sys->container performSelectorOnMainThread:@selector(removeVoutSubview:) withObject:sys->glView waitUntilDone:NO]; + if ([(id)sys->container respondsToSelector:@selector(removeVoutSubview:)]) + { + /* This will retain sys->glView */ + [(id)sys->container performSelectorOnMainThread:@selector(removeVoutSubview:) withObject:sys->glView waitUntilDone:NO]; + } /* release on main thread as explained in Open() */ [(id)sys->container performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO]; [sys->glView performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO]; @@ -353,6 +370,7 @@ static void OpenglSwap(vout_opengl_t *gl) GLint params[] = { 1 }; CGLSetParameter([[self openGLContext] CGLContextObj], kCGLCPSwapInterval, params); + [self setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; return self; } @@ -401,7 +419,10 @@ static void OpenglSwap(vout_opengl_t *gl) - (BOOL)lockgl { VLCAssertMainThread(); - CGLError err = CGLLockContext([[self openGLContext] CGLContextObj]); + NSOpenGLContext *context = [self openGLContext]; + CGLError err = CGLLockContext([context CGLContextObj]); + if (err == kCGLNoError) + [context makeCurrentContext]; return err == kCGLNoError; } @@ -475,21 +496,21 @@ static void OpenglSwap(vout_opengl_t *gl) } } - [self lockgl]; + if ([self lockgl]) { + glViewport((width - x) / 2, (height - y) / 2, x, y); - glViewport((width - x) / 2, (height - y) / 2, x, y); - - @synchronized(self) { - // This may be cleared before -drawRect is being called, - // in this case we'll skip the rendering. - // This will save us for rendering two frames (or more) for nothing - // (one by the vout, one (or more) by drawRect) - _hasPendingReshape = YES; - } + @synchronized(self) { + // This may be cleared before -drawRect is being called, + // in this case we'll skip the rendering. + // This will save us for rendering two frames (or more) for nothing + // (one by the vout, one (or more) by drawRect) + _hasPendingReshape = YES; + } - [self unlockgl]; + [self unlockgl]; - [super reshape]; + [super reshape]; + } } /**