]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/voutgl.m
safari: fix crash on exit after going fullscreen in webbrowser plugin.
[vlc] / modules / gui / macosx / voutgl.m
index 0704953281073fb07461192b4e5db53618b0bc5c..41ebd2b549334628d92c4ba3722b00801903227f 100644 (file)
@@ -58,7 +58,6 @@
 
 struct vout_sys_t
 {
-    NSAutoreleasePool * o_pool;
     VLCGLView         * o_glview;
     VLCVoutView       * o_vout_view;
     bool                b_saved_frame;
@@ -114,7 +113,7 @@ int OpenVideoGL  ( vlc_object_t * p_this )
 
     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[] = {
@@ -138,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;
         }
  
@@ -146,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, &param);
@@ -176,6 +178,7 @@ int OpenVideoGL  ( vlc_object_t * p_this )
         /* Check to see if initVout: was successfull */
         if( !p_vout->p_sys->o_vout_view )
         {
+            free( p_vout->p_sys );
             return VLC_EGENERIC;
         }
 
@@ -200,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))
     {
@@ -411,13 +418,11 @@ static void Unlock( vout_thread_t * p_vout )
 - (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;
@@ -491,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);
@@ -535,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 )
@@ -612,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();
@@ -702,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 );
@@ -820,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);
 
@@ -1065,4 +1068,3 @@ static void aglUnlock( vout_thread_t * p_vout )
     }
 }
 
-