]> 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 33121bcd625252d7d98beeead75ea1f3f6f8b324..4069296a2d9405066f96fb61d1d6936cd419441f 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * intf.m: MacOS X interface module
  *****************************************************************************
- * Copyright (C) 2002-2007 the VideoLAN team
+ * Copyright (C) 2002-2008 the VideoLAN team
  * $Id$
  *
  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
 #include <string.h>
 #include <vlc_keys.h>
 
+#ifdef HAVE_CONFIG_H
+#   include "config.h"
+#endif
+
 #import "intf.h"
 #import "fspanel.h"
 #import "vout.h"
 #import "prefs.h"
 #import "playlist.h"
+#import "playlistinfo.h"
 #import "controls.h"
 #import "about.h"
 #import "open.h"
@@ -52,6 +57,7 @@
 #import "simple_prefs.h"
 
 #import <vlc_input.h>
+#import <vlc_interface.h>
 
 /*****************************************************************************
  * Local prototypes.
@@ -86,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;
 
@@ -101,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 );
 }
@@ -112,10 +117,12 @@ 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;
 
+    [[VLCMain sharedInstance] setIntf: nil];
+    
     msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub );
 
     [p_intf->p_sys->o_sendport release];
@@ -124,6 +131,28 @@ void E_(CloseIntf) ( vlc_object_t *p_this )
     free( p_intf->p_sys );
 }
 
+/*****************************************************************************
+ * KillerThread: Thread that kill the application
+ *****************************************************************************/
+static void * KillerThread( void *user_data )
+{
+    NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init];
+
+    intf_thread_t *p_intf = user_data;
+    
+    vlc_object_lock ( p_intf );
+    while( vlc_object_alive( p_intf ) )
+        vlc_object_wait( p_intf );
+    vlc_object_unlock( p_intf );
+
+    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
  *****************************************************************************/
@@ -157,11 +186,17 @@ static void Run( intf_thread_t *p_intf )
     [[VLCMain sharedInstance] setIntf: p_intf];
     [NSBundle loadNibNamed: @"MainMenu" owner: NSApp];
 
+    /* Setup a thread that will monitor the module killing */
+    pthread_t killer_thread;
+    pthread_create( &killer_thread, NULL, KillerThread, p_intf );
+
     /* Install a jmpbuffer to where we can go back before the NSApp exit
      * see applicationWillTerminate: */
     if(setjmp(jmpbuffer) == 0)
         [NSApp run];
 
+    pthread_join( killer_thread, NULL );
+
     [o_pool release];
 }
 
@@ -237,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;
 }
 
@@ -253,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;
 }
 
@@ -265,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;
 }
 
@@ -379,23 +414,26 @@ static VLCMain *_o_sharedMainInstance = nil;
 
 - (id)init
 {
-    if( _o_sharedMainInstance) {
+    if( _o_sharedMainInstance) 
+    {
         [self dealloc];
-    } else {
+        return _o_sharedMainInstance;
+    } 
+    else
         _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;
     o_bookmarks = [[VLCBookmarks alloc] init];
     o_embedded_list = [[VLCEmbeddedList alloc] init];
     o_interaction_list = [[VLCInteractionList alloc] init];
+    o_info = [[VLCInfo alloc] init];
     o_sfilters = nil;
 #ifdef UPDATE_CHECK
-    //FIXME o_update = [[VLCUpdate alloc] init];
+    o_update = [[VLCUpdate alloc] init];
 #endif
 
     i_lastShownVolume = -1;
@@ -521,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_AUTOPLAY, 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:)
@@ -640,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...")];
@@ -698,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")];
@@ -747,8 +781,6 @@ static VLCMain *_o_sharedMainInstance = nil;
     [o_vmi_mute setTitle: _NS("Mute")];
     [o_vmi_fullscreen setTitle: _NS("Fullscreen")];
     [o_vmi_snapshot setTitle: _NS("Snapshot")];
-
-    [o_info_window setTitle: _NS("Media Information")];
 }
 
 - (void)applicationWillFinishLaunching:(NSNotification *)o_notification
@@ -761,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:)];
@@ -840,9 +874,8 @@ static VLCMain *_o_sharedMainInstance = nil;
     if( !nib_update_loaded )
         nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner:self];
 
-    // FIXME
-    //if([o_update shouldCheckForUpdate])
-    //    [NSThread detachNewThreadSelector:@selector(checkForUpdate) toTarget:o_update withObject:NULL];
+    if([o_update shouldCheckForUpdate])
+        [NSThread detachNewThreadSelector:@selector(checkForUpdate) toTarget:o_update withObject:NULL];
 #endif
 
     /* Handle sleep notification */
@@ -1205,11 +1238,11 @@ static VLCMain *_o_sharedMainInstance = nil;
 
     vlc_object_release( p_playlist );
 
-    while( !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;
@@ -1218,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;
@@ -1234,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];
 }
 
@@ -1245,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;
     }
@@ -1254,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 */
@@ -1300,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 )
         {
@@ -1411,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];
@@ -1426,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
@@ -1733,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 );
@@ -1752,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 */
@@ -1760,81 +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_wizard_loaded && o_wizard )
+    if( nib_info_loaded )
+        [o_info release];
+    
+    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 */
 }
 
@@ -1898,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 )
@@ -1978,26 +2006,31 @@ 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
         [o_prefs showPrefs];
 }
 
-#ifdef UPDATE_CHECK
 - (IBAction)checkForUpdate:(id)sender
 {
+#ifdef UPDATE_CHECK
     if( !nib_update_loaded )
         nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner:self];
-
     [o_update showUpdateWindow];
-}
+#else
+    msg_Err( VLCIntf, "Update checker wasn't enabled in this build" );
+    intf_UserFatal( VLCIntf, false, _("Update check failed"), _("Checking for updates was not enabled in this build.") );
 #endif
+}
 
 - (IBAction)viewHelp:(id)sender
 {
@@ -2061,7 +2094,7 @@ static VLCMain *_o_sharedMainInstance = nil;
     }
     else
     {
-        NSBeginInformationalAlertSheet(_NS("No CrashLog found"), @"Continue", nil, nil, o_msgs_panel, self, NULL, NULL, nil, _NS("Couldn't find any trace of a previous crash.") );
+        NSBeginInformationalAlertSheet(_NS("No CrashLog found"), _NS("Continue"), nil, nil, o_msgs_panel, self, NULL, NULL, nil, _NS("Couldn't find any trace of a previous crash.") );
 
     }
 }
@@ -2076,6 +2109,14 @@ static VLCMain *_o_sharedMainInstance = nil;
     [o_msgs_panel makeKeyAndOrderFront: sender];
 }
 
+- (IBAction)showInformationPanel:(id)sender
+{
+    if(! nib_info_loaded )
+        nib_info_loaded = [NSBundle loadNibNamed:@"MediaInfo" owner: self];
+    
+    [o_info initPanel];
+}
+
 - (void)windowDidBecomeKey:(NSNotification *)o_notification
 {
     if( [o_notification object] == o_msgs_panel )