]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/intf.m
Implement the full/basic switch correctly and completely. Additionally, fixed a rare...
[vlc] / modules / gui / macosx / intf.m
index e82aa20faea331abc2161cbc43501277a0234ccd..4069296a2d9405066f96fb61d1d6936cd419441f 100644 (file)
@@ -92,7 +92,7 @@ static void Run ( intf_thread_t *p_intf );
 /*****************************************************************************
  * OpenIntf: initialize interface
  *****************************************************************************/
-int E_(OpenIntf) ( vlc_object_t *p_this )
+int OpenIntf ( vlc_object_t *p_this )
 {
     intf_thread_t *p_intf = (intf_thread_t*) p_this;
 
@@ -107,10 +107,9 @@ int E_(OpenIntf) ( vlc_object_t *p_this )
     p_intf->p_sys->o_pool = [[NSAutoreleasePool alloc] init];
 
     p_intf->p_sys->o_sendport = [[NSPort port] retain];
-    p_intf->p_sys->p_sub = msg_Subscribe( p_intf, MSG_QUEUE_NORMAL );
-    p_intf->b_play = VLC_TRUE;
+    p_intf->p_sys->p_sub = msg_Subscribe( p_intf );
     p_intf->pf_run = Run;
-    p_intf->b_should_run_on_first_thread = VLC_TRUE;
+    p_intf->b_should_run_on_first_thread = true;
 
     return( 0 );
 }
@@ -118,7 +117,7 @@ int E_(OpenIntf) ( vlc_object_t *p_this )
 /*****************************************************************************
  * CloseIntf: destroy interface
  *****************************************************************************/
-void E_(CloseIntf) ( vlc_object_t *p_this )
+void CloseIntf ( vlc_object_t *p_this )
 {
     intf_thread_t *p_intf = (intf_thread_t*) p_this;
 
@@ -146,13 +145,14 @@ static void * KillerThread( void *user_data )
         vlc_object_wait( p_intf );
     vlc_object_unlock( p_intf );
 
-    msg_Dbg( p_intf, "Killing the Mac OS X module\n" );
+    msg_Dbg( p_intf, "Killing the Mac OS X module" );
 
     /* We are dead, terminate */
     [NSApp terminate: nil];
     [o_pool release];
     return NULL;
 }
+
 /*****************************************************************************
  * Run: main loop
  *****************************************************************************/
@@ -195,6 +195,8 @@ static void Run( intf_thread_t *p_intf )
     if(setjmp(jmpbuffer) == 0)
         [NSApp run];
 
+    pthread_join( killer_thread, NULL );
+
     [o_pool release];
 }
 
@@ -270,10 +272,10 @@ static int PlaylistChanged( vlc_object_t *p_this, const char *psz_variable,
                      vlc_value_t old_val, vlc_value_t new_val, void *param )
 {
     intf_thread_t * p_intf = VLCIntf;
-    p_intf->p_sys->b_playlist_update = VLC_TRUE;
-    p_intf->p_sys->b_intf_update = VLC_TRUE;
-    p_intf->p_sys->b_playmode_update = VLC_TRUE;
-    p_intf->p_sys->b_current_title_update = VLC_TRUE;
+    p_intf->p_sys->b_playlist_update = true;
+    p_intf->p_sys->b_intf_update = true;
+    p_intf->p_sys->b_playmode_update = true;
+    p_intf->p_sys->b_current_title_update = true;
     return VLC_SUCCESS;
 }
 
@@ -286,7 +288,7 @@ static int ShowController( vlc_object_t *p_this, const char *psz_variable,
                      vlc_value_t old_val, vlc_value_t new_val, void *param )
 {
     intf_thread_t * p_intf = VLCIntf;
-    p_intf->p_sys->b_intf_show = VLC_TRUE;
+    p_intf->p_sys->b_intf_show = true;
     return VLC_SUCCESS;
 }
 
@@ -298,7 +300,7 @@ static int FullscreenChanged( vlc_object_t *p_this, const char *psz_variable,
                      vlc_value_t old_val, vlc_value_t new_val, void *param )
 {
     intf_thread_t * p_intf = VLCIntf;
-    p_intf->p_sys->b_fullscreen_update = VLC_TRUE;
+    p_intf->p_sys->b_fullscreen_update = true;
     return VLC_SUCCESS;
 }
 
@@ -421,7 +423,7 @@ static VLCMain *_o_sharedMainInstance = nil;
         _o_sharedMainInstance = [super init];
 
     o_about = [[VLAboutBox alloc] init];
-    o_prefs = [[VLCPrefs alloc] init];
+    o_prefs = nil;
     o_open = [[VLCOpen alloc] init];
     o_wizard = [[VLCWizard alloc] init];
     o_extended = nil;
@@ -557,25 +559,20 @@ static VLCMain *_o_sharedMainInstance = nil;
 
     p_playlist = pl_Yield( p_intf );
 
-    /* Check if we need to start playing */
-    if( p_intf->b_play )
-    {
-        playlist_Control( p_playlist, PLAYLIST_PLAY, VLC_FALSE );
-    }
     var_Create( p_playlist, "fullscreen", VLC_VAR_BOOL | VLC_VAR_DOINHERIT);
-    val.b_bool = VLC_FALSE;
+    val.b_bool = false;
 
     var_AddCallback( p_playlist, "fullscreen", FullscreenChanged, self);
-    var_AddCallback( p_playlist, "intf-show", ShowController, self);
+    var_AddCallback( p_intf->p_libvlc, "intf-show", ShowController, self);
 
     vlc_object_release( p_playlist );
  
     var_Create( p_intf, "interaction", VLC_VAR_ADDRESS );
     var_AddCallback( p_intf, "interaction", InteractCallback, self );
-    p_intf->b_interaction = VLC_TRUE;
+    p_intf->b_interaction = true;
 
     /* update the playmode stuff */
-    p_intf->p_sys->b_playmode_update = VLC_TRUE;
+    p_intf->p_sys->b_playmode_update = true;
 
     [[NSNotificationCenter defaultCenter] addObserver: self
                                              selector: @selector(refreshVoutDeviceMenu:)
@@ -676,6 +673,7 @@ static VLCMain *_o_sharedMainInstance = nil;
     [o_mi_open_file setTitle: _NS("Quick Open File...")];
     [o_mi_open_disc setTitle: _NS("Open Disc...")];
     [o_mi_open_net setTitle: _NS("Open Network...")];
+    [o_mi_open_capture setTitle: _NS("Open Capture Device...")];
     [o_mi_open_recent setTitle: _NS("Open Recent")];
     [o_mi_open_recent_cm setTitle: _NS("Clear Menu")];
     [o_mi_open_wizard setTitle: _NS("Streaming/Exporting Wizard...")];
@@ -734,8 +732,8 @@ static VLCMain *_o_sharedMainInstance = nil;
     [o_mu_aspect_ratio setTitle: _NS("Aspect-ratio")];
     [o_mi_crop setTitle: _NS("Crop")];
     [o_mu_crop setTitle: _NS("Crop")];
-    [o_mi_screen setTitle: _NS("Video Device")];
-    [o_mu_screen setTitle: _NS("Video Device")];
+    [o_mi_screen setTitle: _NS("Fullscreen Video Device")];
+    [o_mu_screen setTitle: _NS("Fullscreen Video Device")];
     [o_mi_subtitle setTitle: _NS("Subtitles Track")];
     [o_mu_subtitle setTitle: _NS("Subtitles Track")];
     [o_mi_deinterlace setTitle: _NS("Deinterlace")];
@@ -795,12 +793,14 @@ static VLCMain *_o_sharedMainInstance = nil;
         addPort: p_intf->p_sys->o_sendport
         forMode: NSDefaultRunLoopMode];
 
+    /* FIXME: don't poll */
     [NSTimer scheduledTimerWithTimeInterval: 0.5
         target: self selector: @selector(manageIntf:)
         userInfo: nil repeats: FALSE];
 
-    [NSThread detachNewThreadSelector: @selector(manage)
-        toTarget: self withObject: nil];
+    /* FIXME: don't poll */
+    manageThread = [[NSThread alloc] initWithTarget:self selector:@selector(manage)
+                                     object: nil];
 
     [o_controls setupVarMenuItem: o_mi_add_intf target: (vlc_object_t *)p_intf
         var: "intf-add" selector: @selector(toggleVar:)];
@@ -1238,11 +1238,11 @@ static VLCMain *_o_sharedMainInstance = nil;
 
     vlc_object_release( p_playlist );
 
-    while( (p_intf = VLCIntf) && !intf_ShouldDie( p_intf ) )
+    vlc_object_lock( p_intf );
+    while( vlc_object_alive( p_intf ) )
     {
         vlc_mutex_lock( &p_intf->change_lock );
 
-
         if( p_intf->p_sys->p_input == NULL )
         {
             p_intf->p_sys->p_input = p_playlist->p_input;
@@ -1251,13 +1251,13 @@ static VLCMain *_o_sharedMainInstance = nil;
             if( p_intf->p_sys->p_input )
             {
                 msg_Dbg( p_intf, "input has changed, refreshing interface" );
-                p_intf->p_sys->b_input_update = VLC_TRUE;
+                p_intf->p_sys->b_input_update = true;
             }
         }
         else if( p_intf->p_sys->p_input->b_die || p_intf->p_sys->p_input->b_dead )
         {
             /* input stopped */
-            p_intf->p_sys->b_intf_update = VLC_TRUE;
+            p_intf->p_sys->b_intf_update = true;
             p_intf->p_sys->i_play_status = END_S;
             msg_Dbg( p_intf, "input has stopped, refreshing interface" );
             p_intf->p_sys->p_input = NULL;
@@ -1267,8 +1267,11 @@ static VLCMain *_o_sharedMainInstance = nil;
         [self manageVolumeSlider];
 
         vlc_mutex_unlock( &p_intf->change_lock );
+        vlc_object_unlock( p_intf );
         msleep( 100000 );
+        vlc_object_lock( p_intf );
     }
+    vlc_object_unlock( p_intf );
     [o_pool release];
 }
 
@@ -1278,8 +1281,11 @@ static VLCMain *_o_sharedMainInstance = nil;
     playlist_t * p_playlist;
     input_thread_t * p_input;
 
-    if( p_intf->p_libvlc->b_die == VLC_TRUE )
+    vlc_object_lock( p_intf );
+
+    if( !vlc_object_alive( p_intf ) )
     {
+        vlc_object_unlock( p_intf );
         [o_timer invalidate];
         return;
     }
@@ -1287,27 +1293,28 @@ static VLCMain *_o_sharedMainInstance = nil;
     if( p_intf->p_sys->b_input_update )
     {
         /* Called when new input is opened */
-        p_intf->p_sys->b_current_title_update = VLC_TRUE;
-        p_intf->p_sys->b_intf_update = VLC_TRUE;
-        p_intf->p_sys->b_input_update = VLC_FALSE;
+        p_intf->p_sys->b_current_title_update = true;
+        p_intf->p_sys->b_intf_update = true;
+        p_intf->p_sys->b_input_update = false;
     }
     if( p_intf->p_sys->b_intf_update )
     {
-        vlc_bool_t b_input = VLC_FALSE;
-        vlc_bool_t b_plmul = VLC_FALSE;
-        vlc_bool_t b_control = VLC_FALSE;
-        vlc_bool_t b_seekable = VLC_FALSE;
-        vlc_bool_t b_chapters = VLC_FALSE;
+        bool b_input = false;
+        bool b_plmul = false;
+        bool b_control = false;
+        bool b_seekable = false;
+        bool b_chapters = false;
 
         playlist_t * p_playlist = pl_Yield( p_intf );
     /* TODO: fix i_size use */
         b_plmul = p_playlist->items.i_size > 1;
-        p_input = p_playlist->p_input;
+
+        p_input = vlc_object_find( p_playlist, VLC_OBJECT_INPUT,
+                                   FIND_CHILD );
 
         if( ( b_input = ( p_input != NULL ) ) )
         {
             /* seekable streams */
-            vlc_object_yield( p_input );
             b_seekable = var_GetBool( p_input, "seekable" );
 
             /* check whether slow/fast motion is possible */
@@ -1333,41 +1340,41 @@ static VLCMain *_o_sharedMainInstance = nil;
 
         [o_embedded_window setSeekable: b_seekable];
 
-        p_intf->p_sys->b_current_title_update = VLC_TRUE;
+        p_intf->p_sys->b_current_title_update = true;
         
-        p_intf->p_sys->b_intf_update = VLC_FALSE;
+        p_intf->p_sys->b_intf_update = false;
     }
 
     if( p_intf->p_sys->b_playmode_update )
     {
         [o_playlist playModeUpdated];
-        p_intf->p_sys->b_playmode_update = VLC_FALSE;
+        p_intf->p_sys->b_playmode_update = false;
     }
     if( p_intf->p_sys->b_playlist_update )
     {
         [o_playlist playlistUpdated];
-        p_intf->p_sys->b_playlist_update = VLC_FALSE;
+        p_intf->p_sys->b_playlist_update = false;
     }
 
     if( p_intf->p_sys->b_fullscreen_update )
     {
-        p_intf->p_sys->b_fullscreen_update = VLC_FALSE;
+        p_intf->p_sys->b_fullscreen_update = false;
     }
 
     if( p_intf->p_sys->b_intf_show )
     {
         [o_window makeKeyAndOrderFront: self];
 
-        p_intf->p_sys->b_intf_show = VLC_FALSE;
+        p_intf->p_sys->b_intf_show = false;
     }
 
     p_playlist = pl_Yield( p_intf );
-    p_input = p_playlist->p_input;
+    p_input = vlc_object_find( p_playlist, VLC_OBJECT_INPUT,
+                               FIND_CHILD );
 
     if( p_input && !p_input->b_die )
     {
         vlc_value_t val;
-        vlc_object_yield( p_input );
 
         if( p_intf->p_sys->b_current_title_update )
         {
@@ -1444,7 +1451,7 @@ static VLCMain *_o_sharedMainInstance = nil;
     else
     {
         p_intf->p_sys->i_play_status = END_S;
-        p_intf->p_sys->b_intf_update = VLC_TRUE;
+        p_intf->p_sys->b_intf_update = true;
         [self playStatusUpdated: p_intf->p_sys->i_play_status];
         [o_embedded_window playStatusUpdated: p_intf->p_sys->i_play_status];
         [self setSubmenusEnabled: FALSE];
@@ -1459,6 +1466,7 @@ static VLCMain *_o_sharedMainInstance = nil;
     [NSTimer scheduledTimerWithTimeInterval: 0.3
         target: self selector: @selector(manageIntf:)
         userInfo: nil repeats: FALSE];
+    vlc_object_unlock( p_intf );
 }
 
 - (void)setupMenus
@@ -1766,10 +1774,10 @@ static VLCMain *_o_sharedMainInstance = nil;
     vout_thread_t * p_vout;
     int returnedValue = 0;
  
-    /* Stop playback */
-    p_playlist = pl_Yield( p_intf );
-    playlist_Stop( p_playlist );
-    vlc_object_release( p_playlist );
+    msg_Dbg( p_intf, "Terminating" );
+
+    [manageThread cancel];
+    [manageThread release];
 
     /* make sure that the current volume is saved */
     config_PutInt( p_intf->p_libvlc, "volume", i_lastShownVolume );
@@ -1785,7 +1793,7 @@ static VLCMain *_o_sharedMainInstance = nil;
         [o_extended savePrefs];
     }
  
-    p_intf->b_interaction = VLC_FALSE;
+    p_intf->b_interaction = false;
     var_DelCallback( p_intf, "interaction", InteractCallback, self );
 
     /* remove global observer watching for vout device changes correctly */
@@ -1793,84 +1801,56 @@ static VLCMain *_o_sharedMainInstance = nil;
 
     /* release some other objects here, because it isn't sure whether dealloc
      * will be called later on */
-    
-    if( nib_about_loaded && o_about )
+
+    if( nib_about_loaded )
         [o_about release];
-    
-    if( nib_prefs_loaded && o_prefs )
+
+    if( nib_prefs_loaded )
+    {
+        [o_sprefs release];
         [o_prefs release];
-    
-    if( nib_open_loaded && o_open )
+    }
+
+    if( nib_open_loaded )
         [o_open release];
-    if( nib_extended_loaded && o_extended )
+
+    if( nib_extended_loaded )
     {
         [o_extended collapsAll];
         [o_extended release];
     }
-    if( nib_bookmarks_loaded && o_bookmarks )
+
+    if( nib_bookmarks_loaded )
         [o_bookmarks release];
 
-    if( nib_info_loaded && o_info )
+    if( nib_info_loaded )
         [o_info release];
     
-    if( nib_wizard_loaded && o_wizard )
+    if( nib_wizard_loaded )
         [o_wizard release];
  
-    if( o_embedded_list != nil )
-        [o_embedded_list release];
+    [o_embedded_list release];
+    [o_interaction_list release];
+    [o_eyetv release];
 
-    if( o_interaction_list != nil )
-        [o_interaction_list release];
+    [o_img_pause_pressed release];
+    [o_img_play_pressed release];
+    [o_img_pause release];
+    [o_img_play release];
 
-    if( o_eyetv != nil )
-        [o_eyetv release];
+    [o_msg_arr removeAllObjects];
+    [o_msg_arr release];
 
-    if( o_img_pause_pressed != nil )
-    {
-        [o_img_pause_pressed release];
-        o_img_pause_pressed = nil;
-    }
-
-    if( o_img_play_pressed != nil )
-    {
-        [o_img_pause_pressed release];
-        o_img_pause_pressed = nil;
-    }
-
-    if( o_img_pause != nil )
-    {
-        [o_img_pause release];
-        o_img_pause = nil;
-    }
-
-    if( o_img_play != nil )
-    {
-        [o_img_play release];
-        o_img_play = nil;
-    }
-
-    if( o_msg_arr != nil )
-    {
-        [o_msg_arr removeAllObjects];
-        [o_msg_arr release];
-        o_msg_arr = nil;
-    }
-
-    if( o_msg_lock != nil )
-    {
-        [o_msg_lock release];
-        o_msg_lock = nil;
-    }
+    [o_msg_lock release];
 
     /* write cached user defaults to disk */
     [[NSUserDefaults standardUserDefaults] synchronize];
 
-    vlc_object_kill( p_intf );
+    vlc_object_kill( p_intf->p_libvlc );
 
     /* Go back to Run() and make libvlc exit properly */
-    longjmp( jmpbuffer, 1 );
+    if( jmpbuffer )
+        longjmp( jmpbuffer, 1 );
     /* not reached */
 }
 
@@ -1934,6 +1914,18 @@ static VLCMain *_o_sharedMainInstance = nil;
     }
 }
 
+- (IBAction)intfOpenCapture:(id)sender
+{
+    if( !nib_open_loaded )
+    {
+        nib_open_loaded = [NSBundle loadNibNamed:@"Open" owner:self];
+        [o_open awakeFromNib];
+        [o_open openCapture];
+    } else {
+        [o_open openCapture];
+    }
+}
+
 - (IBAction)showWizard:(id)sender
 {
     if( !nib_wizard_loaded )
@@ -2014,11 +2006,14 @@ static VLCMain *_o_sharedMainInstance = nil;
 - (IBAction)viewPreferences:(id)sender
 {
     if( !nib_prefs_loaded )
+    {
         nib_prefs_loaded = [NSBundle loadNibNamed:@"Preferences" owner: self];
+        o_sprefs = [[VLCSimplePrefs alloc] init];
+        o_prefs= [[VLCPrefs alloc] init];
+    }
 
     if( sender == o_mi_sprefs )
     {
-        o_sprefs = [[VLCSimplePrefs alloc] init];
         [o_sprefs showSimplePrefs];
     }
     else
@@ -2033,7 +2028,7 @@ static VLCMain *_o_sharedMainInstance = nil;
     [o_update showUpdateWindow];
 #else
     msg_Err( VLCIntf, "Update checker wasn't enabled in this build" );
-    intf_UserFatal( VLCIntf, VLC_FALSE, _("Update check failed"), _("Checking for updates was not enabled in this build.") );
+    intf_UserFatal( VLCIntf, false, _("Update check failed"), _("Checking for updates was not enabled in this build.") );
 #endif
 }