X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fgui%2Fmacosx%2Fvoutgl.m;h=41ebd2b549334628d92c4ba3722b00801903227f;hb=1cd238173cdde8be8123093a76ea79f64d48a0c6;hp=13d88175808f711a3730b8c53743e4ae96828b5b;hpb=b24328a62e388dfc1e6b772b0794e0e07dc2a02c;p=vlc diff --git a/modules/gui/macosx/voutgl.m b/modules/gui/macosx/voutgl.m index 13d8817580..41ebd2b549 100644 --- a/modules/gui/macosx/voutgl.m +++ b/modules/gui/macosx/voutgl.m @@ -1,7 +1,7 @@ /***************************************************************************** * voutgl.m: MacOS X OpenGL provider ***************************************************************************** - * Copyright (C) 2001-2004, 2007 the VideoLAN team + * Copyright (C) 2001-2004, 2007-2009 the VideoLAN team * $Id$ * * Authors: Colin Delacroix @@ -58,21 +58,20 @@ struct vout_sys_t { - NSAutoreleasePool * o_pool; VLCGLView * o_glview; VLCVoutView * o_vout_view; - bool b_saved_frame; + bool b_saved_frame; NSRect s_frame; - bool b_got_frame; + bool b_got_frame; /* Mozilla plugin-related variables */ - bool b_embedded; + bool b_embedded; AGLContext agl_ctx; AGLDrawable agl_drawable; int i_offx, i_offy; int i_width, i_height; WindowRef theWindow; WindowGroupRef winGroup; - bool b_clipped_out; + bool b_clipped_out; Rect clipBounds, viewBounds; }; @@ -104,21 +103,17 @@ int OpenVideoGL ( vlc_object_t * p_this ) if( !CGDisplayUsesOpenGLAcceleration( kCGDirectMainDisplay ) ) { msg_Warn( p_vout, "no OpenGL hardware acceleration found. " - "Video display will be slow" ); - return( 1 ); + "Video display might be slow" ); } msg_Dbg( p_vout, "display is Quartz Extreme accelerated" ); p_vout->p_sys = malloc( sizeof( vout_sys_t ) ); if( p_vout->p_sys == NULL ) - { - msg_Err( p_vout, "out of memory" ); - return( 1 ); - } + return VLC_ENOMEM; memset( p_vout->p_sys, 0, sizeof( vout_sys_t ) ); - var_Get( p_vout->p_libvlc, "drawable", &value_drawable ); + var_Get( p_vout->p_libvlc, "drawable-agl", &value_drawable ); if( value_drawable.i_int != 0 ) { static const GLint ATTRIBUTES[] = { @@ -142,6 +137,7 @@ int OpenVideoGL ( vlc_object_t * p_this ) if( NULL == pixFormat ) { msg_Err( p_vout, "no screen renderer available for required attributes." ); + free( p_vout->p_sys ); return VLC_EGENERIC; } @@ -150,9 +146,11 @@ int OpenVideoGL ( vlc_object_t * p_this ) if( NULL == p_vout->p_sys->agl_ctx ) { msg_Err( p_vout, "cannot create AGL context." ); + free( p_vout->p_sys ); return VLC_EGENERIC; } - else { + else + { // tell opengl not to sync buffer swap with vertical retrace (too inefficient) GLint param = 0; aglSetInteger(p_vout->p_sys->agl_ctx, AGL_SWAP_INTERVAL, ¶m); @@ -178,9 +176,9 @@ int OpenVideoGL ( vlc_object_t * p_this ) [o_pool release]; /* Check to see if initVout: was successfull */ - if( !p_vout->p_sys->o_vout_view ) { + free( p_vout->p_sys ); return VLC_EGENERIC; } @@ -205,7 +203,11 @@ void CloseVideoGL ( vlc_object_t * p_this ) if( p_vout->p_sys->b_embedded ) { - aglDestroyContext(p_vout->p_sys->agl_ctx); + if( p_vout->p_sys->agl_ctx ) + { + aglEnd( p_vout ); + aglDestroyContext(p_vout->p_sys->agl_ctx); + } } else if(VLCIntf && vlc_object_alive (VLCIntf)) { @@ -260,7 +262,8 @@ static int Manage( vout_thread_t * p_vout ) p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE; } - [p_vout->p_sys->o_vout_view manage]; + if( p_vout->p_sys->o_vout_view ) + [p_vout->p_sys->o_vout_view manage]; return VLC_SUCCESS; } @@ -278,10 +281,8 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) [p_vout->p_sys->o_vout_view setOnTop: b_arg]; return VLC_SUCCESS; - case VOUT_CLOSE: - case VOUT_REPARENT: default: - return vout_vaControlDefault( p_vout, i_query, args ); + return VLC_EGENERIC; } } @@ -319,8 +320,10 @@ static void Unlock( vout_thread_t * p_vout ) [p_vout->p_sys->o_glview autorelease]; /* Spawn the window */ - p_vout->p_sys->o_vout_view = [VLCVoutView getVoutView: p_vout - subView: p_vout->p_sys->o_glview frame: nil]; + id old_vout = p_vout->p_sys->o_vout_view; + p_vout->p_sys->o_vout_view = [[VLCVoutView voutView: p_vout + subView: p_vout->p_sys->o_glview frame: nil] retain]; + [old_vout release]; } /* This function will reset the o_vout_view. It's useful to go fullscreen. */ @@ -345,15 +348,18 @@ static void Unlock( vout_thread_t * p_vout ) if( p_vout->p_sys->b_saved_frame ) { - p_vout->p_sys->o_vout_view = [VLCVoutView getVoutView: p_vout - subView: o_glview - frame: &p_vout->p_sys->s_frame]; + id old_vout = p_vout->p_sys->o_vout_view; + p_vout->p_sys->o_vout_view = [[VLCVoutView voutView: p_vout + subView: o_glview + frame: &p_vout->p_sys->s_frame] retain]; + [old_vout release]; } else { - p_vout->p_sys->o_vout_view = [VLCVoutView getVoutView: p_vout - subView: o_glview frame: nil]; - + id old_vout = p_vout->p_sys->o_vout_view; + p_vout->p_sys->o_vout_view = [[VLCVoutView voutView: p_vout + subView: o_glview frame: nil] retain]; + [old_vout release]; } #undef o_glview } @@ -404,16 +410,19 @@ static void Unlock( vout_thread_t * p_vout ) return self; } +- (BOOL)mouseDownCanMoveWindow +{ + return YES; +} + - (void) reshape { int x, y; - vlc_value_t val; Lock( p_vout ); NSRect bounds = [self bounds]; - var_Get( p_vout, "macosx-stretch", &val ); - if( val.b_bool ) + if( var_GetBool( p_vout, "macosx-stretch" ) ) { x = bounds.size.width; y = bounds.size.height; @@ -487,31 +496,21 @@ static OSStatus WindowEventHandler(EventHandlerCallRef nextHandler, EventRef eve static int aglInit( vout_thread_t * p_vout ) { - vlc_value_t val; - Rect viewBounds; Rect clipBounds; - var_Get( p_vout->p_libvlc, "drawable", &val ); - p_vout->p_sys->agl_drawable = (AGLDrawable)val.i_int; + p_vout->p_sys->agl_drawable = (AGLDrawable) + var_GetInteger( p_vout->p_libvlc, "drawable-agl" ); aglSetDrawable(p_vout->p_sys->agl_ctx, p_vout->p_sys->agl_drawable); - var_Get( p_vout->p_libvlc, "drawable-view-top", &val ); - viewBounds.top = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-view-left", &val ); - viewBounds.left = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-view-bottom", &val ); - viewBounds.bottom = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-view-right", &val ); - viewBounds.right = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-clip-top", &val ); - clipBounds.top = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-clip-left", &val ); - clipBounds.left = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-clip-bottom", &val ); - clipBounds.bottom = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-clip-right", &val ); - clipBounds.right = val.i_int; + viewBounds.top = var_GetInteger( p_vout->p_libvlc, "drawable-view-top" ); + viewBounds.left = var_GetInteger( p_vout->p_libvlc, "drawable-view-left" ); + viewBounds.bottom = var_GetInteger( p_vout->p_libvlc, "drawable-view-bottom" ); + viewBounds.right = var_GetInteger( p_vout->p_libvlc, "drawable-view-right" ); + clipBounds.top = var_GetInteger( p_vout->p_libvlc, "drawable-clip-top" ); + clipBounds.left = var_GetInteger( p_vout->p_libvlc, "drawable-clip-left" ); + clipBounds.bottom = var_GetInteger( p_vout->p_libvlc, "drawable-clip-bottom" ); + clipBounds.right = var_GetInteger( p_vout->p_libvlc, "drawable-clip-right" ); p_vout->p_sys->b_clipped_out = (clipBounds.top == clipBounds.bottom) || (clipBounds.left == clipBounds.right); @@ -531,7 +530,11 @@ static int aglInit( vout_thread_t * p_vout ) static void aglEnd( vout_thread_t * p_vout ) { aglSetCurrentContext(NULL); - if( p_vout->p_sys->theWindow ) DisposeWindow( p_vout->p_sys->theWindow ); + if( p_vout->p_sys->theWindow ) + { + DisposeWindow( p_vout->p_sys->theWindow ); + p_vout->p_sys->theWindow = NULL; + } } static void aglReshape( vout_thread_t * p_vout ) @@ -608,39 +611,37 @@ static int aglManage( vout_thread_t * p_vout ) if( p_vout->b_fullscreen ) { /* Close the fullscreen window and resume normal drawing */ - vlc_value_t val; Rect viewBounds; Rect clipBounds; - var_Get( p_vout->p_libvlc, "drawable", &val ); - p_vout->p_sys->agl_drawable = (AGLDrawable)val.i_int; + p_vout->p_sys->agl_drawable = (AGLDrawable) + var_GetInteger( p_vout->p_libvlc, "drawable-agl" ); + aglSetDrawable(p_vout->p_sys->agl_ctx, p_vout->p_sys->agl_drawable); - var_Get( p_vout->p_libvlc, "drawable-view-top", &val ); - viewBounds.top = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-view-left", &val ); - viewBounds.left = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-view-bottom", &val ); - viewBounds.bottom = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-view-right", &val ); - viewBounds.right = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-clip-top", &val ); - clipBounds.top = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-clip-left", &val ); - clipBounds.left = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-clip-bottom", &val ); - clipBounds.bottom = val.i_int; - var_Get( p_vout->p_libvlc, "drawable-clip-right", &val ); - clipBounds.right = val.i_int; + viewBounds.top = var_GetInteger( p_vout->p_libvlc, "drawable-view-top" ); + viewBounds.left = var_GetInteger( p_vout->p_libvlc, "drawable-view-left" ); + viewBounds.bottom = var_GetInteger( p_vout->p_libvlc, "drawable-view-bottom" ); + viewBounds.right = var_GetInteger( p_vout->p_libvlc, "drawable-view-right" ); + clipBounds.top = var_GetInteger( p_vout->p_libvlc, "drawable-clip-top" ); + clipBounds.left = var_GetInteger( p_vout->p_libvlc, "drawable-clip-left" ); + clipBounds.bottom = var_GetInteger( p_vout->p_libvlc, "drawable-clip-bottom" ); + clipBounds.right = var_GetInteger( p_vout->p_libvlc, "drawable-clip-right" ); aglSetCurrentContext(p_vout->p_sys->agl_ctx); aglSetViewport(p_vout, viewBounds, clipBounds); - /* Most Carbon APIs are not thread-safe, therefore delagate some GUI visibilty update to the main thread */ - sendEventToMainThread(GetWindowEventTarget(p_vout->p_sys->theWindow), kEventClassVLCPlugin, kEventVLCPluginHideFullscreen); + if( p_vout->p_sys->theWindow ) + { + /* Most Carbon APIs are not thread-safe, therefore delagate some GUI visibilty + * update to the main thread */ + sendEventToMainThread(GetWindowEventTarget(p_vout->p_sys->theWindow), + kEventClassVLCPlugin, kEventVLCPluginHideFullscreen); + } } else { + /* Go into fullscreen */ Rect deviceRect; GDHandle deviceHdl = GetMainDevice(); @@ -698,8 +699,13 @@ static int aglManage( vout_thread_t * p_vout ) aglSetViewport(p_vout, deviceRect, deviceRect); //aglSetFullScreen(p_vout->p_sys->agl_ctx, device_width, device_height, 0, 0); - /* Most Carbon APIs are not thread-safe, therefore delagate some GUI visibilty update to the main thread */ - sendEventToMainThread(GetWindowEventTarget(p_vout->p_sys->theWindow), kEventClassVLCPlugin, kEventVLCPluginShowFullscreen); + if( p_vout->p_sys->theWindow ) + { + /* Most Carbon APIs are not thread-safe, therefore delagate some GUI visibilty + * update to the main thread */ + sendEventToMainThread(GetWindowEventTarget(p_vout->p_sys->theWindow), + kEventClassVLCPlugin, kEventVLCPluginShowFullscreen); + } } aglReshape(p_vout); aglUnlock( p_vout ); @@ -774,19 +780,8 @@ static int aglControl( vout_thread_t *p_vout, int i_query, va_list args ) return VLC_SUCCESS; } - case VOUT_REPARENT: - { - AGLDrawable drawable = (AGLDrawable)va_arg( args, int); - if( !p_vout->b_fullscreen && drawable != p_vout->p_sys->agl_drawable ) - { - p_vout->p_sys->agl_drawable = drawable; - aglSetDrawable(p_vout->p_sys->agl_ctx, drawable); - } - return VLC_SUCCESS; - } - default: - return vout_vaControlDefault( p_vout, i_query, args ); + return VLC_EGENERIC; } } @@ -827,6 +822,7 @@ static void aglSetViewport( vout_thread_t *p_vout, Rect viewBounds, Rect clipBou - clipBounds.bottom; // from window bottom edge rect[2] = clipBounds.right-clipBounds.left; // width rect[3] = clipBounds.bottom-clipBounds.top; // height + aglSetInteger(p_vout->p_sys->agl_ctx, AGL_BUFFER_RECT, rect); aglEnable(p_vout->p_sys->agl_ctx, AGL_BUFFER_RECT); @@ -949,8 +945,7 @@ static pascal OSStatus WindowEventHandler(EventHandlerCallRef nextHandler, Event { vlc_value_t val; - val.b_bool = true; - var_Set( p_vout, "mouse-clicked", val ); + var_SetBool( p_vout, "mouse-clicked", true ); var_Get( p_vout, "mouse-button-down", &val ); val.i_int &= ~1; @@ -1073,4 +1068,3 @@ static void aglUnlock( vout_thread_t * p_vout ) } } -