]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/controls.m
macosx: Save current fullscreen state.
[vlc] / modules / gui / macosx / controls.m
index 5df82479a4cbe4ebf0ffad839d506920d0222fb4..75536d4673548f23fdbb47ae53ceba91ba75ee04 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * controls.m: MacOS X interface module
  *****************************************************************************
- * Copyright (C) 2002-2006 the VideoLAN team
+ * Copyright (C) 2002-2007 the VideoLAN team
  * $Id$
  *
  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
     [o_specificTime_ok_btn setTitle: _NS("OK")];
     [o_specificTime_sec_lbl setStringValue: _NS("sec.")];
     [o_specificTime_goTo_lbl setStringValue: _NS("Jump to time")];
+
+    o_repeat_off = [NSImage imageNamed:@"repeat_embedded"];
+
+    [self controlTintChanged];
+
+    [[NSNotificationCenter defaultCenter] addObserver: self
+                                             selector: @selector( controlTintChanged )
+                                                 name: NSControlTintDidChangeNotification
+                                               object: nil];
+}
+
+- (void)controlTintChanged
+{
+    int i_repeat = 0;
+    if( [o_btn_repeat image] == o_repeat_single )
+        i_repeat = 1;
+    else if( [o_btn_repeat image] == o_repeat_all )
+        i_repeat = 2;
+
+    if( [NSColor currentControlTint] == NSGraphiteControlTint )
+    {
+        o_repeat_single = [NSImage imageNamed:@"repeat_single_embedded_graphite"];
+        o_repeat_all = [NSImage imageNamed:@"repeat_embedded_graphite"];
+        
+        [o_btn_shuffle setAlternateImage: [NSImage imageNamed: @"shuffle_embedded_graphite"]];
+        [o_btn_addNode setAlternateImage: [NSImage imageNamed: @"add_embedded_graphite"]];
+    }
+    else
+    {
+        o_repeat_single = [NSImage imageNamed:@"repeat_single_embedded_blue"];
+        o_repeat_all = [NSImage imageNamed:@"repeat_embedded_blue"];
+        
+        [o_btn_shuffle setAlternateImage: [NSImage imageNamed: @"shuffle_embedded_blue"]];
+        [o_btn_addNode setAlternateImage: [NSImage imageNamed: @"add_embedded_blue"]];
+    }
+    
+    /* update the repeat button, but keep its state */
+    if( i_repeat == 1 )
+        [self repeatOne];
+    else if( i_repeat == 2 )
+        [self repeatAll];
+    else
+        [self repeatOff];
+}
+
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver: self];
+    
+    [o_repeat_single release];
+    [o_repeat_all release];
+    [o_repeat_off release];
+    
+    [super dealloc];
 }
 
 - (IBAction)play:(id)sender
     intf_thread_t * p_intf = VLCIntf;
     playlist_t * p_playlist = pl_Yield( p_intf );
 
-    vlc_mutex_lock( &p_playlist->object_lock );
+    vlc_object_lock( p_playlist );
     if( playlist_IsEmpty( p_playlist ) )
     {
-        vlc_mutex_unlock( &p_playlist->object_lock );
+        vlc_object_unlock( p_playlist );
         vlc_object_release( p_playlist );
         [o_main intfOpenFileGeneric: (id)sender];
     }
     else
     {
-        vlc_mutex_unlock( &p_playlist->object_lock );
+        vlc_object_unlock( p_playlist );
         vlc_object_release( p_playlist );
     }
 
     return o_vout_view;
 }
 
-
 - (IBAction)stop:(id)sender
 {
     vlc_value_t val;
     intf_thread_t * p_intf = VLCIntf;
     val.i_int = config_GetInt( p_intf, "key-stop" );
     var_Set( p_intf->p_libvlc, "key-pressed", val );
+    /* Close the window directly, because we do know that there
+     * won't be anymore video. It's currently waiting a bit. */
+    [[[self getVoutView] window] orderOut:self];
 }
 
 - (IBAction)faster:(id)sender
         config_PutInt( p_playlist, "random", 0 );
     }
 
-    p_intf->p_sys->b_playmode_update = VLC_TRUE;
-    p_intf->p_sys->b_intf_update = VLC_TRUE;
+    p_intf->p_sys->b_playmode_update = true;
+    p_intf->p_sys->b_intf_update = true;
     vlc_object_release( p_playlist );
 }
 
 /* three little ugly helpers */
 - (void)repeatOne
 {
-    [o_btn_repeat setImage: [NSImage imageNamed:@"repeat_single_embedded_blue"]];
-    [o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat_embedded_blue"]];
+    [o_btn_repeat setImage: o_repeat_single];
+    [o_btn_repeat setAlternateImage: o_repeat_all];
 }
 - (void)repeatAll
 {
-    [o_btn_repeat setImage: [NSImage imageNamed:@"repeat_embedded_blue"]];
-    [o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat_embedded"]];
+    [o_btn_repeat setImage: o_repeat_all];
+    [o_btn_repeat setAlternateImage: o_repeat_off];
 }
 - (void)repeatOff
 {
-    [o_btn_repeat setImage: [NSImage imageNamed:@"repeat_embedded"]];
-    [o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat_single_embedded_blue"]];
+    [o_btn_repeat setImage: o_repeat_off];
+    [o_btn_repeat setAlternateImage: o_repeat_single];
 }
 - (void)shuffle
 {
         [self repeatOne];
  
         /* prepare core communication */
-        repeating.b_bool = VLC_TRUE;
-        looping.b_bool = VLC_FALSE;
+        repeating.b_bool = true;
+        looping.b_bool = false;
         config_PutInt( p_playlist, "repeat", 1 );
         config_PutInt( p_playlist, "loop", 0 );
  
         [self repeatAll];
  
         /* prepare core communication */
-        repeating.b_bool = VLC_FALSE;
-        looping.b_bool = VLC_TRUE;
+        repeating.b_bool = false;
+        looping.b_bool = true;
         config_PutInt( p_playlist, "repeat", 0 );
         config_PutInt( p_playlist, "loop", 1 );
  
         [self repeatOff];
  
         /* prepare core communication */
-        repeating.b_bool = VLC_FALSE;
-        looping.b_bool = VLC_FALSE;
+        repeating.b_bool = false;
+        looping.b_bool = false;
         config_PutInt( p_playlist, "repeat", 0 );
         config_PutInt( p_playlist, "loop", 0 );
  
     /* communicate with core and the main intf loop */
     var_Set( p_playlist, "repeat", repeating );
     var_Set( p_playlist, "loop", looping );
-    p_intf->p_sys->b_playmode_update = VLC_TRUE;
-    p_intf->p_sys->b_intf_update = VLC_TRUE;
+    p_intf->p_sys->b_playmode_update = true;
+    p_intf->p_sys->b_intf_update = true;
 
     vlc_object_release( p_playlist );
 }
         config_PutInt( p_playlist, "repeat", 0 );
     }
  
-    p_intf->p_sys->b_playmode_update = VLC_TRUE;
-    p_intf->p_sys->b_intf_update = VLC_TRUE;
+    p_intf->p_sys->b_playmode_update = true;
+    p_intf->p_sys->b_intf_update = true;
     vlc_object_release( p_playlist );
 }
 
         config_PutInt( p_playlist, "loop", 0 );
     }
 
-    p_intf->p_sys->b_playmode_update = VLC_TRUE;
-    p_intf->p_sys->b_intf_update = VLC_TRUE;
+    p_intf->p_sys->b_playmode_update = true;
+    p_intf->p_sys->b_intf_update = true;
     vlc_object_release( p_playlist );
 }
 
             }
             else
             {
+                playlist_t * p_playlist = pl_Yield( VLCIntf );
+                /* Fullscreen state for next time will be saved here too */
                 [o_vout_view toggleFullscreen];
             }
         }
             var_Set( p_playlist, "fullscreen", (vlc_value_t)!val.b_bool );
         }
 
-        vlc_object_release( p_playlist );
+        pl_Release( VLCIntf );
     }
 
 }
         [self setupVarMenu: o_menu forMenuItem: o_mi target:p_object
                         var:psz_variable selector:pf_callback];
  
-        if( text.psz_string ) free( text.psz_string );
+        free( text.psz_string );
         return;
     }
 
         break;
 
     default:
-        if( text.psz_string ) free( text.psz_string );
+        free( text.psz_string );
         return;
     }
 
     if( ( i_type & VLC_VAR_TYPE ) == VLC_VAR_STRING ) free( val.psz_string );
-    if( text.psz_string ) free( text.psz_string );
+    free( text.psz_string );
 }
 
 
 
     vlc_thread_set_priority( VLCIntf , VLC_THREAD_PRIORITY_LOW );
 
-    p_object = (vlc_object_t *)vlc_object_get( VLCIntf,
-                                    [o_data objectID] );
+    p_object = (vlc_object_t *)vlc_object_get( [o_data objectID] );
 
     if( p_object != NULL )
     {
         var_Set( p_object, strdup([o_data name]), [o_data value] );
         vlc_object_release( p_object );
         [o_pool release];
-        return VLC_TRUE;
+        return true;
     }
     [o_pool release];
     return VLC_EGENERIC;
     vlc_value_t val;
     intf_thread_t * p_intf = VLCIntf;
     playlist_t * p_playlist = pl_Yield( p_intf );
-
-    vlc_mutex_lock( &p_playlist->object_lock );
-
-#define p_input p_playlist->p_input
+    input_thread_t * p_input = playlist_CurrentInput( p_playlist );
 
     if( [[o_mi title] isEqualToString: _NS("Faster")] ||
         [[o_mi title] isEqualToString: _NS("Slower")] )
              [[o_mi title] isEqualToString: _NS("Next")] )
     {
         /** \todo fix i_size use */
+        PL_LOCK;
         bEnabled = p_playlist->items.i_size > 1;
+        PL_UNLOCK;
     }
     else if( [[o_mi title] isEqualToString: _NS("Random")] )
     {
                     break;
                 }
             }
+
             vlc_object_release( (vlc_object_t *)p_vout );
         }
-        else if( [[o_mi title] isEqualToString: _NS("Fullscreen")] )
+        if( [[o_mi title] isEqualToString: _NS("Fullscreen")] )
         {
             var_Get( p_playlist, "fullscreen", &val );
             [o_mi setState: val.b_bool];
         [o_main setupMenus]; /* Make sure video menu is up to date */
     }
 
-    vlc_mutex_unlock( &p_playlist->object_lock );
+    if( p_input ) vlc_object_release( p_input );
     vlc_object_release( p_playlist );
 
     return( bEnabled );