]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/intf.m
legacy OS X intf: removed nslog-based debug
[vlc] / modules / gui / macosx / intf.m
index 25494bd01dc6de85faceaeecb61a7b35161ba177..e29a6b20a0691fc15231028c9043728db41c7873 100644 (file)
@@ -34,7 +34,6 @@
 #include <vlc_keys.h>
 #include <vlc_dialog.h>
 #include <unistd.h> /* execl() */
-#import <vlc_dialog.h>
 
 #import "intf.h"
 #import "fspanel.h"
 #import "bookmarks.h"
 #import "coredialogs.h"
 #import "embeddedwindow.h"
-#import "update.h"
 #import "AppleRemote.h"
 #import "eyetv.h"
 #import "simple_prefs.h"
-#import "vlm.h"
 
 #import <AddressBook/AddressBook.h>         /* for crashlog send mechanism */
 #import <IOKit/hidsystem/ev_keymap.h>         /* for the media key support */
+#import <Sparkle/Sparkle.h>                 /* we're the update delegate */
 
 /*****************************************************************************
  * Local prototypes.
@@ -112,7 +110,8 @@ void CloseIntf ( vlc_object_t *p_this )
 /*****************************************************************************
  * Run: main loop
  *****************************************************************************/
-jmp_buf jmpbuffer;
+static NSLock * o_appLock = nil;    // controls access to f_appExit
+static int f_appExit = 0;           // set to 1 when application termination signaled
 
 static void Run( intf_thread_t *p_intf )
 {
@@ -133,18 +132,16 @@ static void Run( intf_thread_t *p_intf )
 
     NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init];
 
-    /* Install a jmpbuffer to where we can go back before the NSApp exit
-     * see applicationWillTerminate: */
+    o_appLock = [[NSLock alloc] init];
+
     [VLCApplication sharedApplication];
 
     [[VLCMain sharedInstance] setIntf: p_intf];
     [NSBundle loadNibNamed: @"MainMenu" owner: NSApp];
 
-    /* Install a jmpbuffer to where we can go back before the NSApp exit
-     * see applicationWillTerminate: */
-    if(setjmp(jmpbuffer) == 0)
-        [NSApp run];
-    
+    [NSApp run];
+    [[VLCMain sharedInstance] applicationWillTerminate:nil];
+
     [o_pool release];
 }
 
@@ -161,7 +158,7 @@ static void MsgCallback( msg_cb_data_t *data, msg_item_t *item, unsigned int i )
     int canc = vlc_savecancel();
     NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init];
 
-    /* this may happen from time to time, let's bail out as info would be useless anyway */ 
+    /* this may happen from time to time, let's bail out as info would be useless anyway */
     if( !item->psz_module || !item->psz_msg )
         return;
 
@@ -170,8 +167,8 @@ static void MsgCallback( msg_cb_data_t *data, msg_item_t *item, unsigned int i )
                                 [NSString stringWithUTF8String: item->psz_msg], @"Message",
                                 [NSNumber numberWithInt: item->i_type], @"Type", nil];
 
-    [[NSNotificationCenter defaultCenter] postNotificationName: @"VLCCoreMessageReceived" 
-                                                        object: nil 
+    [[NSNotificationCenter defaultCenter] postNotificationName: @"VLCCoreMessageReceived"
+                                                        object: nil
                                                       userInfo: o_dict];
 
     [o_pool release];
@@ -224,7 +221,7 @@ static int FullscreenChanged( vlc_object_t *p_this, const char *psz_variable,
 }
 
 /*****************************************************************************
- * DialogCallback: Callback triggered by the "dialog-*" variables 
+ * DialogCallback: Callback triggered by the "dialog-*" variables
  * to let the intf display error and interaction dialogs
  *****************************************************************************/
 static int DialogCallback( vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data )
@@ -279,6 +276,37 @@ bool checkProgressPanel (void *priv)
     [o_pool release];
 }
 
+#pragma mark -
+#pragma mark Helpers
+
+input_thread_t *getInput(void)
+{
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return NULL;
+    return pl_CurrentInput(p_intf);
+}
+
+vout_thread_t *getVout(void)
+{
+    input_thread_t *p_input = getInput();
+    if (!p_input)
+        return NULL;
+    vout_thread_t *p_vout = input_GetVout(p_input);
+    vlc_object_release(p_input);
+    return p_vout;
+}
+
+aout_instance_t *getAout(void)
+{
+    input_thread_t *p_input = getInput();
+    if (!p_input)
+        return NULL;
+    aout_instance_t *p_aout = input_GetAout(p_input);
+    vlc_object_release(p_input);
+    return p_aout;
+}
+
 #pragma mark -
 #pragma mark Private
 
@@ -303,41 +331,33 @@ static VLCMain *_o_sharedMainInstance = nil;
 
 - (id)init
 {
-    if( _o_sharedMainInstance) 
+    if( _o_sharedMainInstance)
     {
         [self dealloc];
         return _o_sharedMainInstance;
-    } 
+    }
     else
         _o_sharedMainInstance = [super init];
 
     p_intf = NULL;
 
     o_msg_lock = [[NSLock alloc] init];
-    o_msg_arr = [[NSMutableArray arrayWithCapacity: 200] retain];
+    o_msg_arr = [[NSMutableArray arrayWithCapacity: 600] retain];
     /* subscribe to LibVLC's debug messages as early as possible (for us) */
     [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(libvlcMessageReceived:) name: @"VLCCoreMessageReceived" object: nil];
-    
+
     o_about = [[VLAboutBox alloc] init];
     o_prefs = nil;
     o_open = [[VLCOpen alloc] init];
     o_wizard = [[VLCWizard alloc] init];
-    o_vlm = [[VLCVLMController alloc] init];
     o_extended = nil;
     o_bookmarks = [[VLCBookmarks alloc] init];
     o_embedded_list = [[VLCEmbeddedList alloc] init];
     o_coredialogs = [[VLCCoreDialogProvider alloc] init];
     o_info = [[VLCInfo alloc] init];
-#ifdef UPDATE_CHECK
-    o_update = [[VLCUpdate alloc] init];
-#endif
 
     i_lastShownVolume = -1;
 
-    o_remote = [[AppleRemote alloc] init];
-    [o_remote setClickCountEnabledButtons: kRemoteButtonPlay];
-    [o_remote setDelegate: _o_sharedMainInstance];
-
     o_eyetv = [[VLCEyeTVController alloc] init];
 
     /* announce our launch to a potential eyetv plugin */
@@ -369,30 +389,6 @@ static VLCMain *_o_sharedMainInstance = nil;
        because VLCMain is the owner */
     if( nib_main_loaded ) return;
 
-    /* check whether the user runs a valid version of OS X */
-    if( MACOS_VERSION < 10.5f )
-    {
-        NSAlert *ourAlert;
-        int i_returnValue;
-        NSString *o_blabla;
-        if( MACOS_VERSION == 10.4f )
-            o_blabla = _NS("VLC's last release for your OS is the 0.9 series." );
-        else if( MACOS_VERSION == 10.3f )
-            o_blabla = _NS("VLC's last release for your OS is VLC 0.8.6i, which is prone to known security issues." );
-        else // 10.2 and 10.1, still 3% of the OS X market share
-            o_blabla = _NS("VLC's last release for your OS is VLC 0.7.2, which is highly out of date and prone to " \
-                         "known security issues. We recommend you to update your Mac to a modern version of Mac OS X.");
-        ourAlert = [NSAlert alertWithMessageText: _NS("Your version of Mac OS X is no longer supported")
-                                   defaultButton: _NS("Quit")
-                                 alternateButton: NULL
-                                     otherButton: NULL
-                       informativeTextWithFormat: _NS("VLC media player %s requires Mac OS X 10.5 or higher.\n\n%@"), VLC_Version(), o_blabla];
-        [ourAlert setAlertStyle: NSCriticalAlertStyle];
-        i_returnValue = [ourAlert runModal];
-        [NSApp performSelectorOnMainThread: @selector(terminate:) withObject:nil waitUntilDone:NO];
-        return;
-    }
-
     [self initStrings];
 
     [o_window setExcludedFromWindowsMenu: YES];
@@ -423,6 +419,9 @@ static VLCMain *_o_sharedMainInstance = nil;
     i_key = config_GetInt( p_intf, "key-slower" );
     [o_mi_slower setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]];
     [o_mi_slower setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)];
+    i_key = config_GetInt( p_intf, "key-rate-normal" );
+    [o_mi_normalSpeed setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]];
+    [o_mi_normalSpeed setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)];
     i_key = config_GetInt( p_intf, "key-prev" );
     [o_mi_previous setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]];
     [o_mi_previous setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)];
@@ -456,7 +455,7 @@ static VLCMain *_o_sharedMainInstance = nil;
     i_key = config_GetInt( p_intf, "key-vol-mute" );
     [o_mi_mute setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]];
     [o_mi_mute setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)];
-    i_key = config_GetInt( p_intf, "key-fullscreen" );
+    i_key = config_GetInt( p_intf, "key-toggle-fullscreen" );
     [o_mi_fullscreen setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]];
     [o_mi_fullscreen setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)];
     i_key = config_GetInt( p_intf, "key-snapshot" );
@@ -481,7 +480,7 @@ static VLCMain *_o_sharedMainInstance = nil;
     [o_volumeslider setEnabled: YES];
     [self manageVolumeSlider];
     [o_window setDelegate: self];
+
     b_restore_size = false;
 
     // Set that here as IB seems to be buggy
@@ -509,19 +508,16 @@ static VLCMain *_o_sharedMainInstance = nil;
 
     o_size_with_playlist = [o_window contentRectForFrameRect:[o_window frame]].size;
 
-    p_playlist = pl_Hold( p_intf );
+    p_playlist = pl_Get( p_intf );
 
-    var_Create( p_playlist, "fullscreen", VLC_VAR_BOOL | VLC_VAR_DOINHERIT);
     val.b_bool = false;
 
     var_AddCallback( p_playlist, "fullscreen", FullscreenChanged, self);
     var_AddCallback( p_intf->p_libvlc, "intf-show", ShowController, self);
 
-    pl_Release( p_intf );
-
     /* load our Core Dialogs nib */
     nib_coredialogs_loaded = [NSBundle loadNibNamed:@"CoreDialogs" owner: NSApp];
-    
+
     /* subscribe to various interactive dialogues */
     var_Create( p_intf, "dialog-error", VLC_VAR_ADDRESS );
     var_AddCallback( p_intf, "dialog-error", DialogCallback, self );
@@ -545,13 +541,18 @@ static VLCMain *_o_sharedMainInstance = nil;
 
     /* take care of tint changes during runtime */
     o_img_play = [NSImage imageNamed: @"play"];
-    o_img_pause = [NSImage imageNamed: @"pause"];    
+    o_img_pause = [NSImage imageNamed: @"pause"];
     [self controlTintChanged];
     [[NSNotificationCenter defaultCenter] addObserver: self
                                              selector: @selector( controlTintChanged )
                                                  name: NSControlTintDidChangeNotification
                                                object: nil];
 
+    /* init Apple Remote support */
+    o_remote = [[AppleRemote alloc] init];
+    [o_remote setClickCountEnabledButtons: kRemoteButtonPlay];
+    [o_remote setDelegate: _o_sharedMainInstance];
+
     /* yeah, we are done */
     nib_main_loaded = TRUE;
 }
@@ -580,15 +581,6 @@ static VLCMain *_o_sharedMainInstance = nil;
 
     [self _removeOldPreferences];
 
-#ifdef UPDATE_CHECK
-    /* Check for update silently on startup */
-    if( !nib_update_loaded )
-        nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner: NSApp];
-
-    if([o_update shouldCheckForUpdate])
-        [NSThread detachNewThreadSelector:@selector(checkForUpdate) toTarget:o_update withObject:nil];
-#endif
-
     /* Handle sleep notification */
     [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(computerWillSleep:)
            name:NSWorkspaceWillSleepNotification object:nil];
@@ -655,11 +647,13 @@ static VLCMain *_o_sharedMainInstance = nil;
     [o_mi_stop setTitle: _NS("Stop")];
     [o_mi_faster setTitle: _NS("Faster")];
     [o_mi_slower setTitle: _NS("Slower")];
+    [o_mi_normalSpeed setTitle: _NS("Normal rate")];
     [o_mi_previous setTitle: _NS("Previous")];
     [o_mi_next setTitle: _NS("Next")];
     [o_mi_random setTitle: _NS("Random")];
     [o_mi_repeat setTitle: _NS("Repeat One")];
     [o_mi_loop setTitle: _NS("Repeat All")];
+    [o_mi_quitAfterPB setTitle: _NS("Quit after Playback")];
     [o_mi_fwd setTitle: _NS("Step Forward")];
     [o_mi_bwd setTitle: _NS("Step Backward")];
 
@@ -744,7 +738,7 @@ static VLCMain *_o_sharedMainInstance = nil;
     [o_dmi_next setTitle: _NS("Next")];
     [o_dmi_previous setTitle: _NS("Previous")];
     [o_dmi_mute setTitle: _NS("Mute")];
+
     /* vout menu */
     [o_vmi_play setTitle: _NS("Play")];
     [o_vmi_stop setTitle: _NS("Stop")];
@@ -789,20 +783,28 @@ static VLCMain *_o_sharedMainInstance = nil;
     playlist_t * p_playlist;
     vout_thread_t * p_vout;
     int returnedValue = 0;
-    if( !p_intf ) return;
+
+    if( !p_intf )
+        return;
+
+    // don't allow a double termination call. If the user has
+    // already invoked the quit then simply return this time.
+    int isTerminating = false;
+
+    [o_appLock lock];
+    isTerminating = (f_appExit++ > 0 ? 1 : 0);
+    [o_appLock unlock];
+
+    if (isTerminating)
+        return;
 
     msg_Dbg( p_intf, "Terminating" );
 
-    /* Make sure the manage_thread won't call -terminate: again */
-    pthread_cancel( manage_thread );
+    pthread_join( manage_thread, NULL );
 
     /* Make sure the intf object is getting killed */
     vlc_object_kill( p_intf );
 
-    /* Make sure our manage_thread ends */
-    pthread_join( manage_thread, NULL );
-
     /* Make sure the interfaceTimer is destroyed */
     [interfaceTimer invalidate];
     [interfaceTimer release];
@@ -828,10 +830,6 @@ static VLCMain *_o_sharedMainInstance = nil;
     /* remove global observer watching for vout device changes correctly */
     [[NSNotificationCenter defaultCenter] removeObserver: self];
 
-#ifdef UPDATE_CHECK
-    [o_update end];
-#endif
-
     /* release some other objects here, because it isn't sure whether dealloc
      * will be called later on */
     if( nib_about_loaded )
@@ -865,7 +863,7 @@ static VLCMain *_o_sharedMainInstance = nil;
 
     [crashLogURLConnection cancel];
     [crashLogURLConnection release];
+
     [o_embedded_list release];
     [o_coredialogs release];
     [o_eyetv release];
@@ -891,18 +889,24 @@ static VLCMain *_o_sharedMainInstance = nil;
 
     /* Kill the playlist, so that it doesn't accept new request
      * such as the play request from vlc.c (we are a blocking interface). */
-    p_playlist = pl_Hold( p_intf );
+    p_playlist = pl_Get( p_intf );
     vlc_object_kill( p_playlist );
-    pl_Release( p_intf );
-
     libvlc_Quit( p_intf->p_libvlc );
 
     [self setIntf:nil];
+}
 
-    /* Go back to Run() and make libvlc exit properly */
-    if( jmpbuffer )
-        longjmp( jmpbuffer, 1 );
-    /* not reached */
+#pragma mark -
+#pragma mark Sparkle delegate
+/* received directly before the update gets installed, so let's shut down a bit */
+- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update
+{
+    [o_remote stopListening: self];
+    var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_STOP );
+
+    /* Close the window directly, because we do know that there
+     * won't be anymore video. It's currently waiting a bit. */
+    [[[o_controls voutView] window] orderOut:self];
 }
 
 #pragma mark -
@@ -971,15 +975,15 @@ static NSString * VLCToolbarMediaControl     = @"VLCToolbarMediaControl";
 - (void)controlTintChanged
 {
     BOOL b_playing = NO;
-    
+
     if( [o_btn_play alternateImage] == o_img_play_pressed )
         b_playing = YES;
-    
+
     if( [NSColor currentControlTint] == NSGraphiteControlTint )
     {
         o_img_play_pressed = [NSImage imageNamed: @"play_graphite"];
         o_img_pause_pressed = [NSImage imageNamed: @"pause_graphite"];
-        
+
         [o_btn_prev setAlternateImage: [NSImage imageNamed: @"previous_graphite"]];
         [o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_graphite"]];
         [o_btn_stop setAlternateImage: [NSImage imageNamed: @"stop_graphite"]];
@@ -993,7 +997,7 @@ static NSString * VLCToolbarMediaControl     = @"VLCToolbarMediaControl";
     {
         o_img_play_pressed = [NSImage imageNamed: @"play_blue"];
         o_img_pause_pressed = [NSImage imageNamed: @"pause_blue"];
-        
+
         [o_btn_prev setAlternateImage: [NSImage imageNamed: @"previous_blue"]];
         [o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_blue"]];
         [o_btn_stop setAlternateImage: [NSImage imageNamed: @"stop_blue"]];
@@ -1003,7 +1007,7 @@ static NSString * VLCToolbarMediaControl     = @"VLCToolbarMediaControl";
         [o_btn_playlist setAlternateImage: [NSImage imageNamed: @"playlistdrawer_blue"]];
         [o_btn_equalizer setAlternateImage: [NSImage imageNamed: @"equalizerdrawer_blue"]];
     }
-    
+
     if( b_playing )
         [o_btn_play setAlternateImage: o_img_play_pressed];
     else
@@ -1051,7 +1055,7 @@ static NSString * VLCToolbarMediaControl     = @"VLCToolbarMediaControl";
 
 /* When user click in the Dock icon our double click in the finder */
 - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)hasVisibleWindows
-{    
+{
     if(!hasVisibleWindows)
         [o_window makeKeyAndOrderFront:self];
 
@@ -1274,8 +1278,6 @@ static struct
     { NSCarriageReturnCharacter, KEY_ENTER },
     { NSEnterCharacter, KEY_ENTER },
     { NSBackspaceCharacter, KEY_BACKSPACE },
-    { (unichar) ' ', KEY_SPACE },
-    { (unichar) 0x1b, KEY_ESC },
     {0,0}
 };
 
@@ -1441,11 +1443,6 @@ static unsigned int VLCModifiersToCocoa( unsigned int i_key )
     return nil;
 }
 
-- (id)vlm
-{
-    return o_vlm;
-}
-
 - (id)bookmarks
 {
     if( o_bookmarks )
@@ -1539,8 +1536,6 @@ static void manage_cleanup( void * args )
     var_DelCallback( p_playlist, "playlist-item-append", PlaylistChanged, self );
     var_DelCallback( p_playlist, "playlist-item-deleted", PlaylistChanged, self );
 
-    pl_Release( p_intf );
-
     if( p_input ) vlc_object_release( p_input );
 }
 
@@ -1553,7 +1548,7 @@ static void manage_cleanup( void * args )
 
     vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_LOW );
 
-    p_playlist = pl_Hold( p_intf );
+    p_playlist = pl_Get( p_intf );
 
     var_AddCallback( p_playlist, "item-current", PlaylistChanged, self );
     var_AddCallback( p_playlist, "intf-change", PlaylistChanged, self );
@@ -1564,7 +1559,8 @@ static void manage_cleanup( void * args )
     struct manage_cleanup_stack stack = { p_intf, &p_input, p_playlist, self };
     pthread_cleanup_push(manage_cleanup, &stack);
 
-    while( true )
+    bool exitLoop = false;
+    while( !exitLoop )
     {
         NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 
@@ -1599,23 +1595,21 @@ static void manage_cleanup( void * args )
         msleep( INTF_IDLE_SLEEP );
 
         [pool release];
+
+        [o_appLock lock];
+        exitLoop = (f_appExit != 0 ? true : false);
+        [o_appLock unlock];
     }
 
     pthread_cleanup_pop(1);
-
-    msg_Dbg( p_intf, "Killing the Mac OS X module" );
-
-    /* We are dead, terminate */
-    [NSApp performSelectorOnMainThread: @selector(terminate:) withObject:nil waitUntilDone:NO];
 }
 
 - (void)manageVolumeSlider
 {
     audio_volume_t i_volume;
-    playlist_t * p_playlist = pl_Hold( p_intf );
+    playlist_t * p_playlist = pl_Get( p_intf );
 
     aout_VolumeGet( p_playlist, &i_volume );
-    pl_Release( p_intf );
 
     if( i_volume != i_lastShownVolume )
     {
@@ -1642,13 +1636,12 @@ static void manage_cleanup( void * args )
          * the playlist or the selection is empty */
         if( [self isPlaylistCollapsed] == YES )
         {
-            playlist_t * p_playlist = pl_Hold( p_intf );
+            playlist_t * p_playlist = pl_Get( p_intf );
             PL_LOCK;
             playlist_item_t * p_item = playlist_CurrentPlayingItem( p_playlist );
             PL_UNLOCK;
             if( p_item )
                 [[self info] updatePanelWithItem: p_item->p_input];
-            pl_Release( p_intf );
         }
     }
     if( p_intf->p_sys->b_intf_update )
@@ -1659,7 +1652,7 @@ static void manage_cleanup( void * args )
         bool b_seekable = false;
         bool b_chapters = false;
 
-        playlist_t * p_playlist = pl_Hold( p_intf );
+        playlist_t * p_playlist = pl_Get( p_intf );
 
         PL_LOCK;
         b_plmul = playlist_CurrentSize( p_playlist ) > 1;
@@ -1668,7 +1661,7 @@ static void manage_cleanup( void * args )
         p_input = playlist_CurrentInput( p_playlist );
 
         bool b_buffering = NO;
-    
+
         if( ( b_input = ( p_input != NULL ) ) )
         {
             /* seekable streams */
@@ -1689,7 +1682,6 @@ static void manage_cleanup( void * args )
             //b_chapters = p_input->stream.i_area_nb > 1;
             vlc_object_release( p_input );
         }
-        pl_Release( p_intf );
 
         if( b_buffering )
         {
@@ -1722,7 +1714,7 @@ static void manage_cleanup( void * args )
         [o_embedded_window setTime:@"00:00" position:0.0];
 
         p_intf->p_sys->b_current_title_update = true;
-        
+
         p_intf->p_sys->b_intf_update = false;
     }
 
@@ -1774,7 +1766,7 @@ static void manage_cleanup( void * args )
             [[[self controls] fspanel] setStreamTitle: aString];
 
             [[o_controls voutView] updateTitle];
+
             [o_playlist updateRowSelection];
 
             p_intf->p_sys->b_current_title_update = FALSE;
@@ -1865,7 +1857,7 @@ end:
 
 - (void)setupMenus
 {
-    playlist_t * p_playlist = pl_Hold( p_intf );
+    playlist_t * p_playlist = pl_Get( p_intf );
     input_thread_t * p_input = playlist_CurrentInput( p_playlist );
     if( p_input != NULL )
     {
@@ -1921,7 +1913,7 @@ end:
                 var: "video-device" selector: @selector(toggleVar:)];
 
             [o_controls setupVarMenuItem: o_mi_deinterlace target: (vlc_object_t *)p_vout
-                var: "deinterlace" selector: @selector(toggleVar:)];
+                var: "deinterlace-mode" selector: @selector(toggleVar:)];
 
 #if 1
            [o_controls setupVarMenuItem: o_mi_ffmpeg_pp target:
@@ -1933,18 +1925,15 @@ end:
         }
         vlc_object_release( p_input );
     }
-    pl_Release( p_intf );
 }
 
 - (void)refreshVoutDeviceMenu:(NSNotification *)o_notification
 {
-    int x,y = 0;
-    vout_thread_t * p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT,
-                                              FIND_ANYWHERE );
-    if(! p_vout )
+    int x, y = 0;
+    vout_thread_t * p_vout = getVout();
+    if( !p_vout )
         return;
+
     /* clean the menu before adding new entries */
     if( [o_mi_screen hasSubmenu] )
     {
@@ -1975,7 +1964,7 @@ end:
 
 - (void)resetScrollField
 {
-    playlist_t * p_playlist = pl_Hold( p_intf );
+    playlist_t * p_playlist = pl_Get( p_intf );
     input_thread_t * p_input = playlist_CurrentInput( p_playlist );
 
     i_end_scroll = -1;
@@ -1992,10 +1981,8 @@ end:
         [self setScrollField: o_temp stopAfter:-1];
         [[[self controls] fspanel] setStreamTitle: o_temp];
         vlc_object_release( p_input );
-        pl_Release( p_intf );
         return;
     }
-    pl_Release( p_intf );
     [self setScrollField: _NS("VLC media player") stopAfter:-1];
 }
 
@@ -2059,7 +2046,7 @@ end:
         default:
             return;
     }
-    p_playlist = pl_Hold( p_intf );
+    p_playlist = pl_Get( p_intf );
     p_input = playlist_CurrentInput( p_playlist );
     if( p_input != NULL )
     {
@@ -2087,14 +2074,13 @@ end:
         [o_embedded_window setTime: o_time position: f_updated];
         vlc_object_release( p_input );
     }
-    pl_Release( p_intf );
 }
 
 - (IBAction)timeFieldWasClicked:(id)sender
 {
     b_time_remaining = !b_time_remaining;
 }
-    
+
 
 #pragma mark -
 #pragma mark Recent Items
@@ -2187,14 +2173,6 @@ end:
     }
 }
 
-- (IBAction)showVLM:(id)sender
-{
-    if( !nib_vlm_loaded )
-        nib_vlm_loaded = [NSBundle loadNibNamed:@"VLM" owner: NSApp];
-
-    [o_vlm showVLMWindow];
-}
-
 - (IBAction)showExtended:(id)sender
 {
     if( o_extended == nil )
@@ -2214,7 +2192,7 @@ end:
         nib_wizard_loaded = [NSBundle loadNibNamed:@"Wizard" owner: NSApp];
         [o_wizard initStrings];
     }
+
     if( !nib_bookmarks_loaded )
         nib_bookmarks_loaded = [NSBundle loadNibNamed:@"Bookmarks" owner: NSApp];
 
@@ -2233,21 +2211,6 @@ end:
     [o_sprefs showSimplePrefs];
 }
 
-#pragma mark -
-#pragma mark Update
-
-- (IBAction)checkForUpdate:(id)sender
-{
-#ifdef UPDATE_CHECK
-    if( !nib_update_loaded )
-        nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner: NSApp];
-    [o_update showUpdateWindow];
-#else
-    msg_Err( VLCIntf, "Update checker wasn't enabled in this build" );
-    dialog_FatalWait( VLCIntf, _("Update check failed"), _("Checking for updates was not enabled in this build.") );
-#endif
-}
-
 #pragma mark -
 #pragma mark Help and Docs
 
@@ -2266,7 +2229,7 @@ end:
 
     [o_about showGPL: sender];
 }
-    
+
 - (IBAction)viewHelp:(id)sender
 {
     if( !nib_about_loaded )
@@ -2351,9 +2314,6 @@ end:
 
 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
 {
-    NSRunInformationalAlertPanel(_NS("Crash Report successfully sent"),
-                _NS("Thanks for your report!"),
-                _NS("OK"), nil, nil, nil);
     [crashLogURLConnection release];
     crashLogURLConnection = nil;
 }
@@ -2388,7 +2348,7 @@ end:
 
             // Dooh. ugly.
             if( year < [[compo objectAtIndex:0] intValue] ||
-                (year ==[[compo objectAtIndex:0] intValue] && 
+                (year ==[[compo objectAtIndex:0] intValue] &&
                  (month < [[compo objectAtIndex:1] intValue] ||
                   (month ==[[compo objectAtIndex:1] intValue] &&
                    (day   < [[compo objectAtIndex:2] intValue] ||
@@ -2465,7 +2425,7 @@ end:
     int version = [[NSUserDefaults standardUserDefaults] integerForKey:kVLCPreferencesVersion];
     if( version >= kCurrentPreferencesVersion ) return;
 
-    NSArray *libraries = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, 
+    NSArray *libraries = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
         NSUserDomainMask, YES);
     if( !libraries || [libraries count] == 0) return;
     NSString * preferences = [[libraries objectAtIndex:0] stringByAppendingPathComponent:@"Preferences"];
@@ -2527,7 +2487,7 @@ end:
 {
     if(! nib_info_loaded )
         nib_info_loaded = [NSBundle loadNibNamed:@"MediaInfo" owner: NSApp];
-    
+
     [o_info initPanel];
 }
 
@@ -2608,7 +2568,7 @@ end:
 - (IBAction)saveDebugLog:(id)sender
 {
     NSOpenPanel * saveFolderPanel = [[NSSavePanel alloc] init];
-    
+
     [saveFolderPanel setCanChooseDirectories: NO];
     [saveFolderPanel setCanChooseFiles: YES];
     [saveFolderPanel setCanSelectHiddenExtension: NO];
@@ -2647,7 +2607,7 @@ end:
             o_rect.size.height = o_size_with_playlist.height;
         else
             o_rect.size.height = 500.;
+
         if( o_size_with_playlist.width >= [o_window contentMinSize].width )
             o_rect.size.width = o_size_with_playlist.width;
         else
@@ -2862,8 +2822,11 @@ end:
 
 - (void)awakeFromNib
 {
-       b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" );
+       b_active = b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" );
+    b_activeInBackground = config_GetInt( VLCIntf, "macosx-mediakeys-background" );
     [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(coreChangedMediaKeySupportSetting:) name: @"VLCMediaKeySupportSettingChanged" object: nil];
+    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appGotActiveOrInactive:) name: @"NSApplicationDidBecomeActiveNotification" object: nil];
+    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appGotActiveOrInactive:) name: @"NSApplicationWillResignActiveNotification" object: nil];
 }
 
 - (void)dealloc
@@ -2872,58 +2835,68 @@ end:
     [super dealloc];
 }
 
+- (void)appGotActiveOrInactive: (NSNotification *)o_notification
+{
+    if(( [[o_notification name] isEqualToString: @"NSApplicationWillResignActiveNotification"] && !b_activeInBackground ) || !b_mediaKeySupport)
+        b_active = NO;
+    else
+        b_active = YES;
+}
+
 - (void)coreChangedMediaKeySupportSetting: (NSNotification *)o_notification
 {
-       b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" );
+    b_active = b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" );
+    b_activeInBackground = config_GetInt( VLCIntf, "macosx-mediakeys-background" );
 }
 
+
 - (void)sendEvent: (NSEvent*)event
 {
-       if( b_mediaKeySupport )
+    if( b_active )
        {
-               if( [event type] == NSSystemDefined && [event subtype] == 8 )
-               {
-                       int keyCode = (([event data1] & 0xFFFF0000) >> 16);
-                       int keyFlags = ([event data1] & 0x0000FFFF);
-                       int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA;
-                       int keyRepeat = (keyFlags & 0x1);
-
-                       if( keyCode == NX_KEYTYPE_PLAY && keyState == 0 )
-                               var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE );
-
-                       if( keyCode == NX_KEYTYPE_FAST && !b_justJumped )
-                       {
-                               if( keyState == 0 && keyRepeat == 0 )
-                               {
-                                               var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_NEXT );
-                               }
-                               else if( keyRepeat == 1 )
-                               {
-                                       var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT );
-                                       b_justJumped = YES;
-                                       [self performSelector:@selector(resetJump)
-                                                          withObject: NULL
-                                                          afterDelay:0.25];
-                               }
-                       }
-
-                       if( keyCode == NX_KEYTYPE_REWIND && !b_justJumped )
-                       {
-                               if( keyState == 0 && keyRepeat == 0 )
-                               {
-                                       var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PREV );
-                               }
-                               else if( keyRepeat == 1 )
-                               {
-                                       var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT );
-                                       b_justJumped = YES;
-                                       [self performSelector:@selector(resetJump)
-                                                          withObject: NULL
-                                                          afterDelay:0.25];
-                               }
-                       }
-               }
-       }
+        if( [event type] == NSSystemDefined && [event subtype] == 8 )
+        {
+            int keyCode = (([event data1] & 0xFFFF0000) >> 16);
+            int keyFlags = ([event data1] & 0x0000FFFF);
+            int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA;
+            int keyRepeat = (keyFlags & 0x1);
+
+            if( keyCode == NX_KEYTYPE_PLAY && keyState == 0 )
+                var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE );
+
+            if( keyCode == NX_KEYTYPE_FAST && !b_justJumped )
+            {
+                if( keyState == 0 && keyRepeat == 0 )
+                {
+                    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_NEXT );
+                }
+                else if( keyRepeat == 1 )
+                {
+                    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT );
+                    b_justJumped = YES;
+                    [self performSelector:@selector(resetJump)
+                               withObject: NULL
+                               afterDelay:0.25];
+                }
+            }
+
+            if( keyCode == NX_KEYTYPE_REWIND && !b_justJumped )
+            {
+                if( keyState == 0 && keyRepeat == 0 )
+                {
+                    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PREV );
+                }
+                else if( keyRepeat == 1 )
+                {
+                    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT );
+                    b_justJumped = YES;
+                    [self performSelector:@selector(resetJump)
+                               withObject: NULL
+                               afterDelay:0.25];
+                }
+            }
+        }
+    }
        [super sendEvent: event];
 }