]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/CoreInteraction.m
macosx/CAS: add MKV to the black list for HTTP streaming
[vlc] / modules / gui / macosx / CoreInteraction.m
index b55009be270b6483641a2a0b4c8a336c3583002f..b3552a74f9c823ed70cbdd2347d0f4f622ba5ebd 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * CoreInteraction.m: MacOS X interface module
  *****************************************************************************
- * Copyright (C) 2011 Felix Paul Kühne
+ * Copyright (C) 2011-2012 Felix Paul Kühne
  * $Id$
  *
  * Authors: Felix Paul Kühne <fkuehne -at- videolan -dot- org>
 #import "CoreInteraction.h"
 #import "intf.h"
 #import "open.h"
+#import "playlist.h"
+#import <math.h>
 #import <vlc_playlist.h>
 #import <vlc_input.h>
 #import <vlc_keys.h>
 #import <vlc_osd.h>
-#import <vlc_aout_intf.h>
 #import <vlc/vlc.h>
 #import <vlc_strings.h>
+#import <vlc_url.h>
 
 @implementation VLCCoreInteraction
 static VLCCoreInteraction *_o_sharedInstance = nil;
@@ -45,17 +47,12 @@ static VLCCoreInteraction *_o_sharedInstance = nil;
 
 - (id)init
 {
-    if( _o_sharedInstance)
-    {
+    if (_o_sharedInstance) {
         [self dealloc];
         return _o_sharedInstance;
-    }
-    else
-    {
+    } else
         _o_sharedInstance = [super init];
-        b_lockAspectRatio = YES;
-    }
-    
+
     return _o_sharedInstance;
 }
 
@@ -67,7 +64,7 @@ static VLCCoreInteraction *_o_sharedInstance = nil;
 
 - (void)awakeFromNib
 {
-    [[NSNotificationCenter defaultCenter] addObserver: self 
+    [[NSNotificationCenter defaultCenter] addObserver: self
                                              selector: @selector(applicationWillFinishLaunching:)
                                                  name: NSApplicationWillFinishLaunchingNotification
                                                object: nil];
@@ -78,72 +75,102 @@ static VLCCoreInteraction *_o_sharedInstance = nil;
 
 - (void)play
 {
-    playlist_t * p_playlist = pl_Get( VLCIntf );
-    bool empty;
-    
-    PL_LOCK;
-    empty = playlist_IsEmpty( p_playlist );
-    PL_UNLOCK;
-    
-    if( empty )
-        [[[VLCMain sharedInstance] open] openFileGeneric];
-    
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE );
+    input_thread_t * p_input;
+    p_input = pl_CurrentInput(VLCIntf);
+    if (p_input) {
+        var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE);
+        vlc_object_release(p_input);
+    } else {
+        playlist_t * p_playlist = pl_Get(VLCIntf);
+        bool empty;
+
+        PL_LOCK;
+        empty = playlist_IsEmpty(p_playlist);
+        PL_UNLOCK;
+
+        if ([[[VLCMain sharedInstance] playlist] isSelectionEmpty] && ([[[VLCMain sharedInstance] playlist] currentPlaylistRoot] == p_playlist->p_local_category || [[[VLCMain sharedInstance] playlist] currentPlaylistRoot] == p_playlist->p_ml_category))
+            [[[VLCMain sharedInstance] open] openFileGeneric];
+        else
+            [[[VLCMain sharedInstance] playlist] playItem:nil];
+    }
+}
+
+- (void)pause
+{
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_PAUSE);
 }
 
 - (void)stop
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_STOP );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_STOP);
 }
 
 - (void)faster
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_FASTER );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_FASTER);
 }
 
 - (void)slower
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_SLOWER );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_SLOWER);
 }
 
 - (void)normalSpeed
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_RATE_NORMAL );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_RATE_NORMAL);
 }
 
 - (void)toggleRecord
 {
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
     input_thread_t * p_input;
-    p_input = pl_CurrentInput( VLCIntf );
-    if( p_input )
-    {
-        var_ToggleBool( p_input, "record" );
-        vlc_object_release( p_input );
+    p_input = pl_CurrentInput(p_intf);
+    if (p_input) {
+        var_ToggleBool(p_input, "record");
+        vlc_object_release(p_input);
     }
 }
 
 - (void)setPlaybackRate:(int)i_value
 {
-    playlist_t * p_playlist = pl_Get( VLCIntf );
+    playlist_t * p_playlist = pl_Get(VLCIntf);
 
-    double speed = pow( 2, (double)i_value / 17 );
+    double speed = pow(2, (double)i_value / 17);
     int rate = INPUT_RATE_DEFAULT / speed;
-    if( i_currentPlaybackRate != rate )
-        var_SetFloat( p_playlist, "rate", (float)INPUT_RATE_DEFAULT / (float)rate );
+    if (i_currentPlaybackRate != rate)
+        var_SetFloat(p_playlist, "rate", (float)INPUT_RATE_DEFAULT / (float)rate);
     i_currentPlaybackRate = rate;
 }
 
 - (int)playbackRate
 {
-    playlist_t * p_playlist = pl_Get( VLCIntf );
+    float f_rate;
 
-    float rate = var_GetFloat( p_playlist, "rate" );
-    double value = 17 * log( rate ) / log( 2. );
-    int returnValue = (int) ( ( value > 0 ) ? value + .5 : value - .5 );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return 0;
 
-    if( returnValue < -34 )
+    input_thread_t * p_input;
+    p_input = pl_CurrentInput(p_intf);
+    if (p_input) {
+        f_rate = var_GetFloat(p_input, "rate");
+        vlc_object_release(p_input);
+    }
+    else
+    {
+        playlist_t * p_playlist = pl_Get(VLCIntf);
+        f_rate = var_GetFloat(p_playlist, "rate");
+    }
+
+    double value = 17 * log(f_rate) / log(2.);
+    int returnValue = (int) ((value > 0) ? value + .5 : value - .5);
+
+    if (returnValue < -34)
         returnValue = -34;
-    else if( returnValue > 34 )
+    else if (returnValue > 34)
         returnValue = 34;
 
     i_currentPlaybackRate = returnValue;
@@ -152,109 +179,99 @@ static VLCCoreInteraction *_o_sharedInstance = nil;
 
 - (void)previous
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PREV );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_PREV);
 }
 
 - (void)next
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_NEXT );
-}
-
-- (BOOL)isPlaying
-{
-    input_thread_t * p_input = pl_CurrentInput( VLCIntf );
-
-    if (!p_input) return NO;
-
-    input_state_e i_state = ERROR_S;
-    input_Control( p_input, INPUT_GET_STATE, &i_state);
-    vlc_object_release( p_input );
-
-    return ((i_state == OPENING_S) || (i_state == PLAYING_S));
-}
-
-- (int)currentTime
-{
-    input_thread_t * p_input = pl_CurrentInput( VLCIntf );
-    int64_t i_currentTime = -1;
-
-    if (!p_input) return i_currentTime;
-
-    input_Control( p_input, INPUT_GET_TIME, &i_currentTime);
-    vlc_object_release( p_input );
-
-    return (int)( i_currentTime / 1000000 );
-}
-
-- (void)setCurrentTime:(int)i_value
-{
-    int64_t i64_value = (int64_t)i_value;
-    input_thread_t * p_input = pl_CurrentInput( VLCIntf );
-
-    if (!p_input) return;
-
-    input_Control( p_input, INPUT_SET_TIME, (int64_t)(i64_value * 1000000));
-    vlc_object_release( p_input );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_NEXT);
 }
 
 - (int)durationOfCurrentPlaylistItem
 {
-    input_thread_t * p_input = pl_CurrentInput( VLCIntf );
-    int64_t i_duration = -1;
-    if (!p_input) return i_duration;
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return 0;
 
+    input_thread_t * p_input = pl_CurrentInput(p_intf);
+    int64_t i_duration = -1;
+    if (!p_input)
+        return i_duration;
 
-    input_Control( p_input, INPUT_GET_LENGTH, &i_duration);
-    vlc_object_release( p_input );
+    input_Control(p_input, INPUT_GET_LENGTH, &i_duration);
+    vlc_object_release(p_input);
 
     return (int)(i_duration / 1000000);
 }
 
 - (NSURL*)URLOfCurrentPlaylistItem
 {
-    input_thread_t *p_input = pl_CurrentInput( VLCIntf );
-    if (!p_input) return nil;
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return nil;
 
-    input_item_t *p_item = input_GetItem( p_input );
-    if (!p_item) return nil;
+    input_thread_t *p_input = pl_CurrentInput(p_intf);
+    if (!p_input)
+        return nil;
 
-    char *psz_uri = input_item_GetURI( p_item );
-    if (!psz_uri) return nil;
+    input_item_t *p_item = input_GetItem(p_input);
+    if (!p_item) {
+        vlc_object_release(p_input);
+        return nil;
+    }
+
+    char *psz_uri = input_item_GetURI(p_item);
+    if (!psz_uri) {
+        vlc_object_release(p_input);
+        return nil;
+    }
 
     NSURL *o_url;
     o_url = [NSURL URLWithString:[NSString stringWithUTF8String:psz_uri]];
+    vlc_object_release(p_input);
 
     return o_url;
 }
 
 - (NSString*)nameOfCurrentPlaylistItem
 {
-    input_thread_t *p_input = pl_CurrentInput( VLCIntf );
-    if (!p_input) return nil;
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return nil;
 
-    input_item_t *p_item = input_GetItem( p_input );
-    if (!p_item) return nil;
+    input_thread_t *p_input = pl_CurrentInput(p_intf);
+    if (!p_input)
+        return nil;
 
-    char *psz_uri = input_item_GetURI( p_item );
-    if (!psz_uri) return nil;
+    input_item_t *p_item = input_GetItem(p_input);
+    if (!p_item) {
+        vlc_object_release(p_input);
+        return nil;
+    }
+
+    char *psz_uri = input_item_GetURI(p_item);
+    if (!psz_uri) {
+        vlc_object_release(p_input);
+        return nil;
+    }
 
     NSString *o_name;
-    char *format = var_InheritString( VLCIntf, "input-title-format" );
-    char *formated = str_format_meta( p_input, format );
-    free( format );
+    char *format = var_InheritString(VLCIntf, "input-title-format");
+    char *formated = str_format_meta(pl_Get(VLCIntf), format);
+    free(format);
     o_name = [NSString stringWithUTF8String:formated];
-    free( formated );
+    free(formated);
 
     NSURL * o_url = [NSURL URLWithString: [NSString stringWithUTF8String: psz_uri]];
-    free( psz_uri );
+    free(psz_uri);
 
-    if ([o_name isEqualToString:@""])
-    {
-        if ([o_url isFileURL]) 
+    if ([o_name isEqualToString:@""]) {
+        if ([o_url isFileURL])
             o_name = [[NSFileManager defaultManager] displayNameAtPath: [o_url path]];
         else
             o_name = [o_url absoluteString];
     }
+    vlc_object_release(p_input);
     return o_name;
 }
 
@@ -272,184 +289,356 @@ static VLCCoreInteraction *_o_sharedInstance = nil;
 
 - (void)forwardExtraShort
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_EXTRASHORT );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_EXTRASHORT);
 }
 
 - (void)backwardExtraShort
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_EXTRASHORT );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_EXTRASHORT);
 }
 
 - (void)forwardShort
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT);
 }
 
 - (void)backwardShort
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT);
 }
 
 - (void)forwardMedium
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_MEDIUM );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_MEDIUM);
 }
 
 - (void)backwardMedium
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_MEDIUM );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_MEDIUM);
 }
 
 - (void)forwardLong
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_LONG );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_LONG);
 }
 
 - (void)backwardLong
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_LONG );
+    var_SetInteger(VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_LONG);
 }
 
 - (void)shuffle
 {
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
     vlc_value_t val;
-    playlist_t * p_playlist = pl_Get( VLCIntf );
+    playlist_t * p_playlist = pl_Get(p_intf);
     vout_thread_t *p_vout = getVout();
 
-    var_Get( p_playlist, "random", &val );
+    var_Get(p_playlist, "random", &val);
     val.b_bool = !val.b_bool;
-    var_Set( p_playlist, "random", val );
-    if( val.b_bool )
-    {
-        if (p_vout)
-        {
-            vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Random On" ) );
-            vlc_object_release( p_vout );
+    var_Set(p_playlist, "random", val);
+    if (val.b_bool) {
+        if (p_vout) {
+            vout_OSDMessage(p_vout, SPU_DEFAULT_CHANNEL, "%s", _("Random On"));
+            vlc_object_release(p_vout);
         }
-        config_PutInt( p_playlist, "random", 1 );
+        config_PutInt(p_playlist, "random", 1);
     }
     else
     {
-        if (p_vout)
-        {
-            vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Random Off" ) );
-            vlc_object_release( p_vout );
+        if (p_vout) {
+            vout_OSDMessage(p_vout, SPU_DEFAULT_CHANNEL, "%s", _("Random Off"));
+            vlc_object_release(p_vout);
         }
-        config_PutInt( p_playlist, "random", 0 );
+        config_PutInt(p_playlist, "random", 0);
     }
 }
 
 - (void)repeatAll
 {
-    playlist_t * p_playlist = pl_Get( VLCIntf );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
 
-    var_SetBool( p_playlist, "repeat", NO );
-    var_SetBool( p_playlist, "loop", YES );
-    config_PutInt( p_playlist, "repeat", NO );
-    config_PutInt( p_playlist, "loop", YES );
+    playlist_t * p_playlist = pl_Get(p_intf);
+
+    var_SetBool(p_playlist, "repeat", NO);
+    var_SetBool(p_playlist, "loop", YES);
+    config_PutInt(p_playlist, "repeat", NO);
+    config_PutInt(p_playlist, "loop", YES);
 
     vout_thread_t *p_vout = getVout();
-    if (p_vout)
-    {
-        vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat All" ) );
-        vlc_object_release( p_vout );
+    if (p_vout) {
+        vout_OSDMessage(p_vout, SPU_DEFAULT_CHANNEL, "%s", _("Repeat All"));
+        vlc_object_release(p_vout);
     }
 }
 
 - (void)repeatOne
 {
-    playlist_t * p_playlist = pl_Get( VLCIntf );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
+    playlist_t * p_playlist = pl_Get(p_intf);
 
-    var_SetBool( p_playlist, "repeat", YES );
-    var_SetBool( p_playlist, "loop", NO );
-    config_PutInt( p_playlist, "repeat", YES );
-    config_PutInt( p_playlist, "loop", NO );
+    var_SetBool(p_playlist, "repeat", YES);
+    var_SetBool(p_playlist, "loop", NO);
+    config_PutInt(p_playlist, "repeat", YES);
+    config_PutInt(p_playlist, "loop", NO);
 
     vout_thread_t *p_vout = getVout();
-    if (p_vout)
-    {
-        vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat One" ) );
-        vlc_object_release( p_vout );
+    if (p_vout) {
+        vout_OSDMessage(p_vout, SPU_DEFAULT_CHANNEL, "%s", _("Repeat One"));
+        vlc_object_release(p_vout);
     }
 }
 
 - (void)repeatOff
 {
-    playlist_t * p_playlist = pl_Get( VLCIntf );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
+    playlist_t * p_playlist = pl_Get(p_intf);
 
-    var_SetBool( p_playlist, "repeat", NO );
-    var_SetBool( p_playlist, "loop", NO );
-    config_PutInt( p_playlist, "repeat", NO );
-    config_PutInt( p_playlist, "loop", NO );
+    var_SetBool(p_playlist, "repeat", NO);
+    var_SetBool(p_playlist, "loop", NO);
+    config_PutInt(p_playlist, "repeat", NO);
+    config_PutInt(p_playlist, "loop", NO);
 
     vout_thread_t *p_vout = getVout();
-    if (p_vout)
-    {
-        vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat Off" ) );
-        vlc_object_release( p_vout );
+    if (p_vout) {
+        vout_OSDMessage(p_vout, SPU_DEFAULT_CHANNEL, "%s", _("Repeat Off"));
+        vlc_object_release(p_vout);
+    }
+}
+
+- (void)setAtoB
+{
+    if (!timeA) {
+        input_thread_t * p_input = pl_CurrentInput(VLCIntf);
+        if (p_input) {
+            timeA = var_GetTime(p_input, "time");
+            vlc_object_release(p_input);
+        }
+    } else if (!timeB) {
+        input_thread_t * p_input = pl_CurrentInput(VLCIntf);
+        if (p_input) {
+            timeB = var_GetTime(p_input, "time");
+            vlc_object_release(p_input);
+        }
+    } else
+        [self resetAtoB];
+}
+
+- (void)resetAtoB
+{
+    timeA = 0;
+    timeB = 0;
+}
+
+- (void)updateAtoB
+{
+    if (timeB) {
+        input_thread_t * p_input = pl_CurrentInput(VLCIntf);
+        if (p_input) {
+            mtime_t currentTime = var_GetTime(p_input, "time");
+            if ( currentTime >= timeB || currentTime < timeA)
+                var_SetTime(p_input, "time", timeA);
+            vlc_object_release(p_input);
+        }
     }
 }
 
 - (void)volumeUp
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_VOL_UP );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
+    playlist_VolumeUp(pl_Get(p_intf), 1, NULL);
 }
 
 - (void)volumeDown
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_VOL_DOWN );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
+    playlist_VolumeDown(pl_Get(p_intf), 1, NULL);
+}
+
+- (void)toggleMute
+{
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
+    playlist_MuteToggle(pl_Get(p_intf));
 }
 
-- (void)mute
+- (void)setMute:(BOOL)b_value
 {
-    var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_VOL_MUTE );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
+    playlist_MuteSet(pl_Get(p_intf), b_value);
 }
 
-- (BOOL)isMuted
-{       
-    playlist_t * p_playlist = pl_Get( VLCIntf );
+- (BOOL)mute
+{
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return NO;
+
     BOOL b_is_muted = NO;
-    b_is_muted = aout_IsMuted( VLC_OBJECT(p_playlist) );
+    b_is_muted = playlist_MuteGet(pl_Get(p_intf)) > 0;
 
     return b_is_muted;
 }
 
 - (int)volume
 {
-    intf_thread_t * p_intf = VLCIntf;
-    playlist_t * p_playlist = pl_Get( VLCIntf );
-    audio_volume_t i_volume = aout_VolumeGet( p_playlist );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return 0;
+
+    float volume = playlist_VolumeGet(pl_Get(p_intf));
 
-    return (int)i_volume;
+    return lroundf(volume * AOUT_VOLUME_DEFAULT);
 }
 
 - (void)setVolume: (int)i_value
 {
-    intf_thread_t * p_intf = VLCIntf;
-    playlist_t * p_playlist = pl_Get( VLCIntf );
-    audio_volume_t i_volume = (audio_volume_t)i_value;
-    int i_volume_step;
-    i_volume_step = config_GetInt( VLCIntf->p_libvlc, "volume-step" );
-    aout_VolumeSet( p_playlist, i_volume * i_volume_step );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
+    float f_value = i_value / (float)AOUT_VOLUME_DEFAULT;
+
+    playlist_VolumeSet(pl_Get(p_intf), f_value);
+}
+
+#pragma mark -
+#pragma mark drag and drop support for VLCVoutView, VLBrushedMetalImageView and VLCThreePartDropView
+- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
+{
+    NSPasteboard *o_paste = [sender draggingPasteboard];
+    NSArray *o_types = [NSArray arrayWithObject: NSFilenamesPboardType];
+    NSString *o_desired_type = [o_paste availableTypeFromArray:o_types];
+    NSData *o_carried_data = [o_paste dataForType:o_desired_type];
+    BOOL b_autoplay = config_GetInt(VLCIntf, "macosx-autoplay");
+
+    if (o_carried_data) {
+        if ([o_desired_type isEqualToString:NSFilenamesPboardType]) {
+            NSArray *o_array = [NSArray array];
+            NSArray *o_values = [[o_paste propertyListForType: NSFilenamesPboardType] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
+            NSUInteger count = [o_values count];
+
+            input_thread_t * p_input = pl_CurrentInput(VLCIntf);
+            BOOL b_returned = NO;
+
+            if (count == 1 && p_input) {
+                b_returned = input_AddSubtitle(p_input, vlc_path2uri([[o_values objectAtIndex:0] UTF8String], NULL), true);
+                vlc_object_release(p_input);
+                if (!b_returned)
+                    return YES;
+            }
+            else if (p_input)
+                vlc_object_release(p_input);
+
+            for (NSUInteger i = 0; i < count; i++) {
+                NSDictionary *o_dic;
+                char *psz_uri = vlc_path2uri([[o_values objectAtIndex:i] UTF8String], NULL);
+                if (!psz_uri)
+                    continue;
+
+                o_dic = [NSDictionary dictionaryWithObject:[NSString stringWithCString:psz_uri encoding:NSUTF8StringEncoding] forKey:@"ITEM_URL"];
+                free(psz_uri);
+
+                o_array = [o_array arrayByAddingObject: o_dic];
+            }
+            if (b_autoplay)
+                [[[VLCMain sharedInstance] playlist] appendArray: o_array atPos: -1 enqueue:NO];
+            else
+                [[[VLCMain sharedInstance] playlist] appendArray: o_array atPos: -1 enqueue:YES];
+
+            return YES;
+        }
+    }
+    return NO;
 }
 
 #pragma mark -
 #pragma mark video output stuff
 
-- (void)setAspectRatioLocked:(BOOL)b_value
+- (void)setAspectRatioIsLocked:(BOOL)b_value
 {
-    b_lockAspectRatio = b_value;
+    config_PutInt(VLCIntf, "macosx-lock-aspect-ratio", b_value);
 }
 
 - (BOOL)aspectRatioIsLocked
 {
-    return b_lockAspectRatio;
+    return config_GetInt(VLCIntf, "macosx-lock-aspect-ratio");
 }
 
 - (void)toggleFullscreen
 {
-    playlist_t * p_playlist = pl_Get( VLCIntf );
-    var_ToggleBool( p_playlist, "fullscreen" );
+    intf_thread_t *p_intf = VLCIntf;
+    if (!p_intf)
+        return;
+
+    BOOL b_fs = var_ToggleBool(pl_Get(p_intf), "fullscreen");
+
+    vout_thread_t *p_vout = getVoutForActiveWindow();
+    if (p_vout) {
+        var_SetBool(p_vout, "fullscreen", b_fs);
+        vlc_object_release(p_vout);
+    } else { // e.g. lion fullscreen toggle
+        [[VLCMain sharedInstance] setFullscreen:b_fs forWindow:nil];
+    }
+}
+
+#pragma mark -
+#pragma mark uncommon stuff
+
+- (BOOL)fixPreferences
+{
+    NSMutableString * o_workString;
+    NSRange returnedRange;
+    NSRange fullRange;
+    BOOL b_needsRestart = NO;
+
+    #define fixpref(pref) \
+    o_workString = [[NSMutableString alloc] initWithFormat:@"%s", config_GetPsz(VLCIntf, pref)]; \
+    if ([o_workString length] > 0) \
+    { \
+        returnedRange = [o_workString rangeOfString:@"macosx" options: NSCaseInsensitiveSearch]; \
+        if (returnedRange.location != NSNotFound) \
+        { \
+            if ([o_workString isEqualToString:@"macosx"]) \
+                [o_workString setString:@""]; \
+            fullRange = NSMakeRange(0, [o_workString length]); \
+            [o_workString replaceOccurrencesOfString:@":macosx" withString:@"" options: NSCaseInsensitiveSearch range: fullRange]; \
+            fullRange = NSMakeRange(0, [o_workString length]); \
+            [o_workString replaceOccurrencesOfString:@"macosx:" withString:@"" options: NSCaseInsensitiveSearch range: fullRange]; \
+            \
+            config_PutPsz(VLCIntf, pref, [o_workString UTF8String]); \
+            b_needsRestart = YES; \
+        } \
+    } \
+    [o_workString release]
+
+    fixpref("control");
+    fixpref("extraintf");
+    #undef fixpref
+
+    return b_needsRestart;
 }
 
 @end