X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fsimple_prefs.m;h=414815e34655bc08703372853e7990f2914376ee;hb=9288133f5fe69b685dbda98a08dff8b0d59c6793;hp=1e6df8b16485c80091258e1da2b96ce58f3ce6ad;hpb=c0e7149a72565b9a6a0b44624a4c72c7111dce40;p=vlc diff --git a/modules/gui/macosx/simple_prefs.m b/modules/gui/macosx/simple_prefs.m index 1e6df8b164..414815e346 100644 --- a/modules/gui/macosx/simple_prefs.m +++ b/modules/gui/macosx/simple_prefs.m @@ -1,7 +1,7 @@ /***************************************************************************** * simple_prefs.m: Simple Preferences for Mac OS X ***************************************************************************** -* Copyright (C) 2008-2009 the VideoLAN team +* Copyright (C) 2008-2012 VLC authors and VideoLAN * $Id$ * * Authors: Felix Paul Kühne @@ -20,16 +20,25 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#import "CompatibilityFixes.h" #import "simple_prefs.h" #import "prefs.h" #import #import +#import #import #import +#import +#import #import "misc.h" #import "intf.h" #import "AppleRemote.h" +#import "CoreInteraction.h" + #import //for o_intf_last_update_lbl static NSString* VLCSPrefsToolbarIdentifier = @"Our Simple Preferences Toolbar Identifier"; @@ -44,6 +53,8 @@ static NSString* VLCHotkeysSettingToolbarIdentifier = @"Hotkeys Settings Item Id static VLCSimplePrefs *_o_sharedInstance = nil; +#pragma mark Initialisation + + (VLCSimplePrefs *)sharedInstance { return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init]; @@ -78,12 +89,35 @@ static VLCSimplePrefs *_o_sharedInstance = nil; - (NSString *)OSXStringKeyToString:(NSString *)theString { if (![theString isEqualToString:@""]) { + /* remove cruft */ + if ([theString characterAtIndex:([theString length] - 1)] != 0x2b) + theString = [theString stringByReplacingOccurrencesOfString:@"+" withString:@""]; + else + { + theString = [theString stringByReplacingOccurrencesOfString:@"+" withString:@""]; + theString = [NSString stringWithFormat:@"%@+", theString]; + } + if ([theString characterAtIndex:([theString length] - 1)] != 0x2d) + theString = [theString stringByReplacingOccurrencesOfString:@"-" withString:@""]; + else + { + theString = [theString stringByReplacingOccurrencesOfString:@"-" withString:@""]; + theString = [NSString stringWithFormat:@"%@-", theString]; + } + /* modifiers */ theString = [theString stringByReplacingOccurrencesOfString:@"Command" withString: [NSString stringWithUTF8String: "\xE2\x8C\x98"]]; theString = [theString stringByReplacingOccurrencesOfString:@"Alt" withString: [NSString stringWithUTF8String: "\xE2\x8C\xA5"]]; theString = [theString stringByReplacingOccurrencesOfString:@"Shift" withString: [NSString stringWithUTF8String: "\xE2\x87\xA7"]]; theString = [theString stringByReplacingOccurrencesOfString:@"Ctrl" withString: [NSString stringWithUTF8String: "\xE2\x8C\x83"]]; - theString = [theString stringByReplacingOccurrencesOfString:@"+" withString:@""]; - theString = [theString stringByReplacingOccurrencesOfString:@"-" withString:@""]; + /* show non-character keys correctly */ + theString = [theString stringByReplacingOccurrencesOfString:@"Right" withString:[NSString stringWithUTF8String:"\xE2\x86\x92"]]; + theString = [theString stringByReplacingOccurrencesOfString:@"Left" withString:[NSString stringWithUTF8String:"\xE2\x86\x90"]]; + theString = [theString stringByReplacingOccurrencesOfString:@"Up" withString:[NSString stringWithUTF8String:"\xE2\x86\x91"]]; + theString = [theString stringByReplacingOccurrencesOfString:@"Down" withString:[NSString stringWithUTF8String:"\xE2\x86\x93"]]; + theString = [theString stringByReplacingOccurrencesOfString:@"Enter" withString:[NSString stringWithUTF8String:"\xe2\x86\xb5"]]; + theString = [theString stringByReplacingOccurrencesOfString:@"Tab" withString:[NSString stringWithUTF8String:"\xe2\x87\xa5"]]; + theString = [theString stringByReplacingOccurrencesOfString:@"Delete" withString:[NSString stringWithUTF8String:"\xe2\x8c\xab"]]; /* capitalize plain characters to suit the menubar's look */ + theString = [theString capitalizedString]; } else theString = [NSString stringWithString:_NS("Not Set")]; @@ -103,8 +137,14 @@ static VLCSimplePrefs *_o_sharedInstance = nil; [o_sprefs_toolbar setDelegate: self]; [o_sprefs_win setToolbar: o_sprefs_toolbar]; + if (OSX_LION) + [o_sprefs_win setCollectionBehavior: NSWindowCollectionBehaviorFullScreenAuxiliary]; + + [o_hotkeys_listbox setTarget:self]; + [o_hotkeys_listbox setDoubleAction:@selector(hotkeyTableDoubleClick:)]; + /* setup useful stuff */ - o_hotkeysNonUseableKeys = [[NSArray arrayWithObjects: @"Command-c", @"Command-x", @"Command-v", @"Command-a", @"Command-," , @"Command-h", @"Command-Alt-h", @"Command-Shift-o", @"Command-o", @"Command-d", @"Command-n", @"Command-s", @"Command-z", @"Command-l", @"Command-r", @"Command-0", @"Command-1", @"Command-2", @"Command-3", @"Command-m", @"Command-w", @"Command-Shift-w", @"Command-Shift-c", @"Command-Shift-p", @"Command-i", @"Command-e", @"Command-Shift-e", @"Command-b", @"Command-Shift-m", @"Command-Ctrl-m", @"Command-?", @"Command-Alt-?", nil] retain]; + o_hotkeysNonUseableKeys = [[NSArray arrayWithObjects: @"Command-c", @"Command-x", @"Command-v", @"Command-a", @"Command-," , @"Command-h", @"Command-Alt-h", @"Command-Shift-o", @"Command-o", @"Command-d", @"Command-n", @"Command-s", @"Command-z", @"Command-l", @"Command-r", @"Command-3", @"Command-m", @"Command-w", @"Command-Shift-w", @"Command-Shift-c", @"Command-Shift-p", @"Command-i", @"Command-e", @"Command-Shift-e", @"Command-b", @"Command-Shift-m", @"Command-Ctrl-m", @"Command-?", @"Command-Alt-?", nil] retain]; } #define CreateToolbarItem( o_name, o_desc, o_img, sel ) \ @@ -149,11 +189,11 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des } else if( [o_itemIdent isEqual: VLCOSDSettingToolbarIdentifier] ) { - CreateToolbarItem( _NS("Subtitles & OSD"), _NS("Subtitles & On Screen Display Settings"), @"spref_cone_Subtitles_64", showOSDSettings ); + CreateToolbarItem( _NS(SUBPIC_TITLE), _NS("Subtitles & On Screen Display Settings"), @"spref_cone_Subtitles_64", showOSDSettings ); } else if( [o_itemIdent isEqual: VLCInputSettingToolbarIdentifier] ) { - CreateToolbarItem( _NS("Input & Codecs"), _NS("Input & Codec settings"), @"spref_cone_Input_64", showInputSettings ); + CreateToolbarItem( _NS(INPUT_TITLE), _NS("Input & Codec settings"), @"spref_cone_Input_64", showInputSettings ); } else if( [o_itemIdent isEqual: VLCHotkeysSettingToolbarIdentifier] ) { @@ -188,15 +228,14 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [o_audio_effects_box setTitle: _NS("Effects")]; [o_audio_enable_ckb setTitle: _NS("Enable Audio")]; [o_audio_general_box setTitle: _NS("General Audio")]; - [o_audio_headphone_ckb setTitle: _NS("Headphone surround effect")]; [o_audio_lang_txt setStringValue: _NS("Preferred Audio language")]; [o_audio_last_ckb setTitle: _NS("Enable Last.fm submissions")]; [o_audio_lastpwd_txt setStringValue: _NS("Password")]; [o_audio_lastuser_txt setStringValue: _NS("User name")]; - [o_audio_norm_ckb setTitle: _NS("Volume normalizer")]; [o_audio_spdif_ckb setTitle: _NS("Use S/PDIF when available")]; [o_audio_visual_txt setStringValue: _NS("Visualization")]; - [o_audio_vol_txt setStringValue: _NS("Default Volume")]; + [o_audio_autosavevol_yes_bcell setTitle: _NS("Keep audio level between sessions")]; + [o_audio_autosavevol_no_bcell setTitle: _NS("Always reset audio start level to:")]; /* hotkeys */ [o_hotkeys_change_btn setTitle: _NS("Change")]; @@ -209,6 +248,9 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [[[o_hotkeys_listbox tableColumnWithIdentifier: @"shortcut"] headerCell] setStringValue: _NS("Shortcut")]; /* input */ + [o_input_record_box setTitle: _NS("Record directory or filename")]; + [o_input_record_btn setTitle: _NS("Browse...")]; + [o_input_record_btn setToolTip: _NS("Directory or filename where the records will be stored")]; [o_input_avi_txt setStringValue: _NS("Repair AVI Files")]; [o_input_cachelevel_txt setStringValue: _NS("Default Caching Level")]; [o_input_caching_box setTitle: _NS("Caching")]; @@ -220,19 +262,27 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [o_input_postproc_txt setStringValue: _NS("Post-Processing Quality")]; [o_input_rtsp_ckb setTitle: _NS("Use RTP over RTSP (TCP)")]; [o_input_skipLoop_txt setStringValue: _NS("Skip the loop filter for H.264 decoding")]; - [o_input_serverport_txt setStringValue: _NS("Default Server Port")]; + [o_input_mkv_preload_dir_ckb setTitle: _NS("Preload MKV files in the same directory")]; /* interface */ + [o_intf_style_txt setStringValue: _NS("Interface style")]; + [o_intf_style_dark_bcell setTitle: _NS("Dark")]; + [o_intf_style_bright_bcell setTitle: _NS("Bright")]; [o_intf_art_txt setStringValue: _NS("Album art download policy")]; - [o_intf_embedded_ckb setTitle: _NS("Add controls to the video window")]; + [o_intf_embedded_ckb setTitle: _NS("Show video within the main window")]; + [o_intf_nativefullscreen_ckb setTitle: _NS("Use the native fullscreen mode on OS X Lion")]; [o_intf_fspanel_ckb setTitle: _NS("Show Fullscreen Controller")]; [o_intf_lang_txt setStringValue: _NS("Language")]; [o_intf_network_box setTitle: _NS("Privacy / Network Interaction")]; - [o_intf_appleremote_ckb setTitle: _NS("Control playback with the Apple Remote")]; - [o_intf_mediakeys_ckb setTitle: _NS("Control playback with media keys")]; - [o_intf_mediakeys_bg_ckb setTitle: _NS("...when VLC is in background")]; + + [o_intf_appleremote_ckb setTitle: _NS("Control playback with the Apple Remote")]; + + [o_intf_mediakeys_ckb setTitle: _NS("Control playback with media keys")]; [o_intf_update_ckb setTitle: _NS("Automatically check for updates")]; [o_intf_last_update_lbl setStringValue: @""]; + [o_intf_enableGrowl_ckb setTitle: _NS("Enable Growl notifications (on playlist item change)")]; + [o_intf_autoresize_ckb setTitle: _NS("Resize interface to the native video size")]; + [o_intf_pauseminimized_ckb setTitle: _NS("Pause the video playback when minimized")]; /* Subtitles and OSD */ [o_osd_encoding_txt setStringValue: _NS("Default Encoding")]; @@ -245,6 +295,10 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [o_osd_lang_txt setStringValue: _NS("Preferred Subtitle Language")]; [o_osd_osd_box setTitle: _NS("On Screen Display")]; [o_osd_osd_ckb setTitle: _NS("Enable OSD")]; + [o_osd_opacity_txt setStringValue: _NS("Opacity")]; + [o_osd_forcebold_ckb setTitle: _NS("Force Bold")]; + [o_osd_outline_color_txt setStringValue: _NS("Outline Color")]; + [o_osd_outline_thickness_txt setStringValue: _NS("Outline Thickness")]; /* video */ [o_video_black_ckb setTitle: _NS("Black screens in Fullscreen mode")]; @@ -252,6 +306,7 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [o_video_display_box setTitle: _NS("Display")]; [o_video_enable_ckb setTitle: _NS("Enable Video")]; [o_video_fullscreen_ckb setTitle: _NS("Fullscreen")]; + [o_video_videodeco_ckb setTitle: _NS("Window decorations")]; [o_video_onTop_ckb setTitle: _NS("Always on top")]; [o_video_output_txt setStringValue: _NS("Output module")]; [o_video_skipFrames_ckb setTitle: _NS("Skip frames")]; @@ -261,10 +316,12 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [o_video_snap_format_txt setStringValue: _NS("Format")]; [o_video_snap_prefix_txt setStringValue: _NS("Prefix")]; [o_video_snap_seqnum_ckb setTitle: _NS("Sequential numbering")]; + [o_video_deinterlace_txt setStringValue: _NS("Deinterlace")]; + [o_video_deinterlace_mode_txt setStringValue: _NS("Deinterlace mode")]; + [o_video_video_box setTitle: _NS("Video")]; /* generic stuff */ - [[o_sprefs_basicFull_matrix cellAtRow: 0 column: 0] setStringValue: _NS("Basic")]; - [[o_sprefs_basicFull_matrix cellAtRow: 0 column: 1] setStringValue: _NS("All")]; + [o_sprefs_showAll_btn setTitle: _NS("Show All")]; [o_sprefs_cancel_btn setTitle: _NS("Cancel")]; [o_sprefs_reset_btn setTitle: _NS("Reset All")]; [o_sprefs_save_btn setTitle: _NS("Save")]; @@ -296,6 +353,9 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na return NULL; } +#pragma mark - +#pragma mark Setup controls + - (void)setupButton: (NSPopUpButton *)object forStringList: (const char *)name { module_config_t *p_item; @@ -378,7 +438,7 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na p_parser = p_list[i_index]; if( module_provides( p_parser, p_item->psz_type ) ) { - [object addItemWithTitle: [NSString stringWithUTF8String: module_GetLongName( p_parser ) ?: ""]]; + [object addItemWithTitle: [NSString stringWithUTF8String: _(module_GetLongName( p_parser )) ?: ""]]; if( p_item->value.psz && !strcmp( p_item->value.psz, module_get_object( p_parser ) ) ) [object selectItem: [object lastItem]]; } @@ -390,14 +450,14 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na - (void)setupButton: (NSButton *)object forBoolValue: (const char *)name { [object setState: config_GetInt( p_intf, name )]; - [object setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, name )]]; + [object setToolTip: _NS(config_GetLabel( p_intf, name ) ?: "")]; } - (void)setupField:(NSTextField *)o_object forOption:(const char *)psz_option { char *psz_tmp = config_GetPsz( p_intf, psz_option ); [o_object setStringValue: [NSString stringWithUTF8String: psz_tmp ?: ""]]; - [o_object setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, psz_option )]]; + [o_object setToolTip: _NS(config_GetLabel( p_intf, psz_option ))]; free( psz_tmp ); } @@ -407,9 +467,6 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na int i, y = 0; char *psz_tmp; - [[o_sprefs_basicFull_matrix cellAtRow:0 column:0] setState: NSOnState]; - [[o_sprefs_basicFull_matrix cellAtRow:0 column:1] setState: NSOffState]; - /********************** * interface settings * **********************/ @@ -417,44 +474,80 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na [self setupButton: o_intf_art_pop forIntList: "album-art"]; [self setupButton: o_intf_fspanel_ckb forBoolValue: "macosx-fspanel"]; + + [self setupButton: o_intf_nativefullscreen_ckb forBoolValue: "macosx-nativefullscreenmode"]; + BOOL b_correct_sdk = NO; +#ifdef MAC_OS_X_VERSION_10_7 + b_correct_sdk = YES; +#endif + if( !( b_correct_sdk && OSX_LION )) + { + [o_intf_nativefullscreen_ckb setState: NSOffState]; + [o_intf_nativefullscreen_ckb setEnabled: NO]; + } + [self setupButton: o_intf_embedded_ckb forBoolValue: "embedded-video"]; - [self setupButton: o_intf_appleremote_ckb forBoolValue: "macosx-appleremote"]; - [self setupButton: o_intf_mediakeys_ckb forBoolValue: "macosx-mediakeys"]; - [self setupButton: o_intf_mediakeys_bg_ckb forBoolValue: "macosx-mediakeys-background"]; - [o_intf_mediakeys_bg_ckb setEnabled: [o_intf_mediakeys_ckb state]]; + + [self setupButton: o_intf_appleremote_ckb forBoolValue: "macosx-appleremote"]; + + [self setupButton: o_intf_mediakeys_ckb forBoolValue: "macosx-mediakeys"]; if( [[SUUpdater sharedUpdater] lastUpdateCheckDate] != NULL ) [o_intf_last_update_lbl setStringValue: [NSString stringWithFormat: _NS("Last check on: %@"), [[[SUUpdater sharedUpdater] lastUpdateCheckDate] descriptionWithLocale: [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]]]]; else [o_intf_last_update_lbl setStringValue: _NS("No check was performed yet.")]; + psz_tmp = config_GetPsz( p_intf, "control" ); + if (psz_tmp) { + [o_intf_enableGrowl_ckb setState: (NSInteger)strstr( psz_tmp, "growl")]; + free( psz_tmp ); + } + else + [o_intf_enableGrowl_ckb setState: NSOffState]; + if (config_GetInt( p_intf, "macosx-interfacestyle" )) + { + [o_intf_style_dark_bcell setState: YES]; + [o_intf_style_bright_bcell setState: NO]; + } + else + { + [o_intf_style_dark_bcell setState: NO]; + [o_intf_style_bright_bcell setState: YES]; + } + [self setupButton: o_intf_autoresize_ckb forBoolValue: "macosx-video-autoresize"]; + [self setupButton: o_intf_pauseminimized_ckb forBoolValue: "macosx-pause-minimized"]; /****************** * audio settings * ******************/ [self setupButton: o_audio_enable_ckb forBoolValue: "audio"]; - i = (config_GetInt( p_intf, "volume" ) * 0.390625); - [o_audio_vol_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "volume")]]; - [o_audio_vol_fld setIntValue: i]; - [o_audio_vol_sld setToolTip: [o_audio_vol_fld toolTip]]; - [o_audio_vol_sld setIntValue: i]; + + if ( config_GetInt( p_intf, "volume-save" )) + { + [o_audio_autosavevol_yes_bcell setState: NSOnState]; + [o_audio_autosavevol_no_bcell setState: NSOffState]; + [o_audio_vol_fld setEnabled: NO]; + [o_audio_vol_sld setEnabled: NO]; + + [o_audio_vol_sld setIntValue: 100]; + [o_audio_vol_fld setIntValue: 100]; + } + else + { + [o_audio_autosavevol_yes_bcell setState: NSOffState]; + [o_audio_autosavevol_no_bcell setState: NSOnState]; + [o_audio_vol_fld setEnabled: YES]; + [o_audio_vol_sld setEnabled: YES]; + + i = config_GetInt( p_intf, "volume" ); + i = i * 200.0 / AOUT_VOLUME_MAX + 0.5; + [o_audio_vol_sld setIntValue: i]; + [o_audio_vol_fld setIntValue: i]; + } [self setupButton: o_audio_spdif_ckb forBoolValue: "spdif"]; [self setupButton: o_audio_dolby_pop forIntList: "force-dolby-surround"]; [self setupField: o_audio_lang_fld forOption: "audio-language"]; - [self setupButton: o_audio_headphone_ckb forBoolValue: "headphone-dolby"]; - - psz_tmp = config_GetPsz( p_intf, "audio-filter" ); - if( psz_tmp ) - { - [o_audio_norm_ckb setState: (NSInteger)strstr( psz_tmp, "volnorm" )]; - [o_audio_norm_fld setEnabled: [o_audio_norm_ckb state]]; - [o_audio_norm_stepper setEnabled: [o_audio_norm_ckb state]]; - free( psz_tmp ); - } - [o_audio_norm_fld setFloatValue: config_GetFloat( p_intf, "norm-max-level" )]; - [o_audio_norm_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "norm-max-level")]]; - [self setupButton: o_audio_visual_pop forModuleList: "audio-visual"]; /* Last.FM is optional */ @@ -487,6 +580,7 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na [self setupButton: o_video_onTop_ckb forBoolValue: "video-on-top"]; [self setupButton: o_video_skipFrames_ckb forBoolValue: "skip-frames"]; [self setupButton: o_video_black_ckb forBoolValue: "macosx-black"]; + [self setupButton: o_video_videodeco_ckb forBoolValue: "video-deco"]; [self setupButton: o_video_output_pop forModuleList: "vout"]; @@ -511,21 +605,24 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na [self setupField: o_video_snap_prefix_fld forOption:"snapshot-prefix"]; [self setupButton: o_video_snap_seqnum_ckb forBoolValue: "snapshot-sequential"]; [self setupButton: o_video_snap_format_pop forStringList: "snapshot-format"]; + [self setupButton: o_video_deinterlace_pop forIntList: "deinterlace"]; + [self setupButton: o_video_deinterlace_mode_pop forStringList: "deinterlace-mode"]; /*************************** * input & codecs settings * ***************************/ - [o_input_serverport_fld setIntValue: config_GetInt( p_intf, "server-port")]; - [o_input_serverport_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "server-port")]]; + [self setupField: o_input_record_fld forOption:"input-record-path"]; [self setupField: o_input_httpproxy_fld forOption:"http-proxy"]; [self setupField: o_input_httpproxypwd_sfld forOption:"http-proxy-pwd"]; [o_input_postproc_fld setIntValue: config_GetInt( p_intf, "postproc-q")]; - [o_input_postproc_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "postproc-q")]]; + [o_input_postproc_fld setToolTip: _NS(config_GetLabel( p_intf, "postproc-q"))]; [self setupButton: o_input_avi_pop forIntList: "avi-index"]; [self setupButton: o_input_rtsp_ckb forBoolValue: "rtsp-tcp"]; - [self setupButton: o_input_skipLoop_pop forIntList: "ffmpeg-skiploopfilter"]; + [self setupButton: o_input_skipLoop_pop forIntList: "avcodec-skiploopfilter"]; + + [self setupButton: o_input_mkv_preload_dir_ckb forBoolValue: "mkv-preload-local-dir"]; [o_input_cachelevel_pop removeAllItems]; [o_input_cachelevel_pop addItemsWithTitles: @@ -535,36 +632,20 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na [[o_input_cachelevel_pop itemAtIndex: 1] setTag: 100]; [[o_input_cachelevel_pop itemAtIndex: 2] setTag: 200]; [[o_input_cachelevel_pop itemAtIndex: 3] setTag: 300]; - [[o_input_cachelevel_pop itemAtIndex: 4] setTag: 400]; - [[o_input_cachelevel_pop itemAtIndex: 5] setTag: 500]; + [[o_input_cachelevel_pop itemAtIndex: 4] setTag: 500]; + [[o_input_cachelevel_pop itemAtIndex: 5] setTag: 1000]; -#define TestCaC( name ) \ + #define TestCaC( name, factor ) \ b_cache_equal = b_cache_equal && \ - ( i_cache == config_GetInt( p_intf, name ) ) - -#define TestCaCi( name, int ) \ - b_cache_equal = b_cache_equal && \ - ( ( i_cache * int ) == config_GetInt( p_intf, name ) ) + ( i_cache * factor == config_GetInt( p_intf, name ) ); /* Select the accurate value of the PopupButton */ bool b_cache_equal = true; int i_cache = config_GetInt( p_intf, "file-caching"); - TestCaC( "udp-caching" ); - if( module_exists ("dvdread") ) - TestCaC( "dvdread-caching" ); - if( module_exists ("dvdnav") ) - TestCaC( "dvdnav-caching" ); - TestCaC( "tcp-caching" ); - TestCaC( "cdda-caching" ); - TestCaC( "screen-caching" ); - TestCaC( "vcd-caching" ); - TestCaCi( "rtsp-caching", 4 ); - TestCaCi( "ftp-caching", 2 ); - TestCaCi( "http-caching", 4 ); - if(module_exists ("access_realrtsp")) - TestCaCi( "realrtsp-caching", 10 ); - TestCaCi( "mms-caching", 19 ); + TestCaC( "network-caching", 10/3 ); + TestCaC( "disc-caching", 1 ); + TestCaC( "live-caching", 1 ); if( b_cache_equal ) { [o_input_cachelevel_pop selectItemWithTag: i_cache]; @@ -575,6 +656,7 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na [o_input_cachelevel_pop selectItemWithTitle: _NS("Custom")]; [o_input_cachelevel_custom_txt setHidden: NO]; } + #undef TestCaC /********************* * subtitle settings * @@ -584,22 +666,17 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na [self setupButton: o_osd_encoding_pop forStringList: "subsdec-encoding"]; [self setupField: o_osd_lang_fld forOption: "sub-language" ]; - if( module_exists( "quartztext" ) ) - { - [self setupField: o_osd_font_fld forOption: "quartztext-font"]; - [self setupButton: o_osd_font_color_pop forIntList: "quartztext-color"]; - [self setupButton: o_osd_font_size_pop forIntList: "quartztext-rel-fontsize"]; - } - else - { - /* fallback on freetype */ - [self setupField: o_osd_font_fld forOption: "freetype-font"]; - [self setupButton: o_osd_font_color_pop forIntList: "freetype-color"]; - [self setupButton: o_osd_font_size_pop forIntList: "freetype-rel-fontsize"]; - /* selector button is useless in this case */ - [o_osd_font_btn setEnabled: NO]; - } - + [self setupField: o_osd_font_fld forOption: "freetype-font"]; + [self setupButton: o_osd_font_color_pop forIntList: "freetype-color"]; + [self setupButton: o_osd_font_size_pop forIntList: "freetype-rel-fontsize"]; + i = config_GetInt( p_intf, "freetype-opacity" ) * 100.0 / 255.0 + 0.5; + [o_osd_opacity_fld setIntValue: i]; + [o_osd_opacity_sld setIntValue: i]; + [o_osd_opacity_sld setToolTip: _NS(config_GetLabel( p_intf, "freetype-opacity"))]; + [o_osd_opacity_fld setToolTip: [o_osd_opacity_sld toolTip]]; + [self setupButton: o_osd_forcebold_ckb forBoolValue: "freetype-bold"]; + [self setupButton: o_osd_outline_color_pop forIntList: "freetype-outline-color"]; + [self setupButton: o_osd_outline_thickness_pop forIntList: "freetype-outline-thickness"]; /******************** * hotkeys settings * @@ -615,14 +692,14 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na assert( p_main ); unsigned confsize; module_config_t *p_config; - + p_config = module_config_get (p_main, &confsize); - + for (size_t i = 0; i < confsize; i++) { module_config_t *p_item = p_config + i; - if( (p_item->i_type & CONFIG_ITEM) && p_item->psz_name != NULL + if( CONFIG_ITEM(p_item->i_type) && p_item->psz_name != NULL && !strncmp( p_item->psz_name , "key-", 4 ) && !EMPTY_STR( p_item->psz_text ) ) { @@ -635,8 +712,7 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na } } module_config_free (p_config); - module_release (p_main); - + [o_hotkeyDescriptions release]; o_hotkeyDescriptions = [[NSArray alloc] initWithArray: o_tempArray_desc copyItems: YES]; [o_tempArray_desc release]; @@ -646,6 +722,9 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na [o_hotkeys_listbox reloadData]; } +#pragma mark - +#pragma mark General actions + - (void)showSimplePrefs { /* we want to show the interface settings, if no category was chosen */ @@ -664,10 +743,14 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na - (IBAction)buttonAction:(id)sender { if( sender == o_sprefs_cancel_btn ) + { + [[NSFontPanel sharedFontPanel] close]; [o_sprefs_win orderOut: sender]; + } else if( sender == o_sprefs_save_btn ) { [self saveChangedSettings]; + [[NSFontPanel sharedFontPanel] close]; [o_sprefs_win orderOut: sender]; } else if( sender == o_sprefs_reset_btn ) @@ -676,11 +759,9 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na @selector(sheetDidEnd: returnCode: contextInfo:), NULL, nil, _NS("Beware this will reset the VLC media player preferences.\n" "Are you sure you want to continue?") ); - else if( sender == o_sprefs_basicFull_matrix ) + else if( sender == o_sprefs_showAll_btn ) { [o_sprefs_win orderOut: self]; - [[o_sprefs_basicFull_matrix cellAtRow:0 column:0] setState: NSOffState]; - [[o_sprefs_basicFull_matrix cellAtRow:0 column:1] setState: NSOnState]; [[[VLCMain sharedInstance] preferences] showPrefs]; } else @@ -695,7 +776,7 @@ static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_na { config_ResetAll( p_intf ); [self resetControls]; - config_SaveConfigFile( p_intf, NULL ); + config_SaveConfigFile( p_intf ); } } @@ -726,6 +807,7 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch { module_config_t *p_item; module_t *p_parser, **p_list; + NSString * objectTitle = [[object selectedItem] title]; p_item = config_FindConfig( VLC_OBJECT(p_intf), name ); @@ -736,7 +818,7 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch if( p_item->i_type == CONFIG_ITEM_MODULE && module_provides( p_parser, p_item->psz_type ) ) { - if( [[[object selectedItem] title] isEqualToString: _NS( module_GetLongName( p_parser ) )] ) + if( [objectTitle isEqualToString: _NS( module_GetLongName( p_parser ) )] ) { config_PutPsz( p_intf, name, strdup( module_get_object( p_parser ))); break; @@ -744,14 +826,14 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch } } module_list_free( p_list ); - if( [[[object selectedItem] title] isEqualToString: _NS( "Default" )] ) + if( [objectTitle isEqualToString: _NS( "Default" )] ) config_PutPsz( p_intf, name, "" ); } - (void)saveChangedSettings { - char *psz_tmp; - int i; + NSString *tmpString; + NSRange tmpRange; #define SaveIntList( object, name ) save_int_list( p_intf, object, name ) @@ -759,6 +841,8 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch #define SaveModuleList( object, name ) save_module_list( p_intf, object, name ) +#define getString( name ) [NSString stringWithFormat:@"%s", config_GetPsz( p_intf, name )] + /********************** * interface settings * **********************/ @@ -769,31 +853,42 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch config_PutInt( p_intf, "macosx-fspanel", [o_intf_fspanel_ckb state] ); config_PutInt( p_intf, "embedded-video", [o_intf_embedded_ckb state] ); - config_PutInt( p_intf, "macosx-appleremote", [o_intf_appleremote_ckb state] ); - config_PutInt( p_intf, "macosx-mediakeys", [o_intf_mediakeys_ckb state] ); - config_PutInt( p_intf, "macosx-mediakeys-background", [o_intf_mediakeys_bg_ckb state] ); - - /* activate stuff without restart */ - if( [o_intf_appleremote_ckb state] == YES ) - [[[VLCMain sharedInstance] appleRemoteController] startListening: [VLCMain sharedInstance]]; - else - [[[VLCMain sharedInstance] appleRemoteController] stopListening: [VLCMain sharedInstance]]; - [[NSNotificationCenter defaultCenter] postNotificationName: @"VLCMediaKeySupportSettingChanged" - object: nil - userInfo: nil]; - /* okay, let's save our changes to vlcrc */ - i = config_SaveConfigFile( p_intf, "main" ); - i = i + config_SaveConfigFile( p_intf, "macosx" ); - - if( i != 0 ) + config_PutInt( p_intf, "macosx-appleremote", [o_intf_appleremote_ckb state] ); + config_PutInt( p_intf, "macosx-mediakeys", [o_intf_mediakeys_ckb state] ); + config_PutInt( p_intf, "macosx-interfacestyle", [o_intf_style_dark_bcell state] ); + config_PutInt( p_intf, "macosx-nativefullscreenmode", [o_intf_nativefullscreen_ckb state] ); + config_PutInt( p_intf, "macosx-pause-minimized", [o_intf_pauseminimized_ckb state] ); + config_PutInt( p_intf, "macosx-video-autoresize", [o_intf_autoresize_ckb state] ); + if( [o_intf_enableGrowl_ckb state] == NSOnState ) + { + tmpString = getString( "control" ); + tmpRange = [tmpString rangeOfString:@"growl"]; + if( [tmpString length] > 0 && tmpRange.location == NSNotFound ) + { + tmpString = [tmpString stringByAppendingString: @":growl"]; + config_PutPsz( p_intf, "control", [tmpString UTF8String] ); + } + else + config_PutPsz( p_intf, "control", "growl" ); + } + else { - msg_Err( p_intf, "An error occurred while saving the Interface settings using SimplePrefs (%i)", i ); - dialog_Fatal( p_intf, _("Interface Settings not saved"), - _("An error occured while saving your settings via SimplePrefs (%i)."), i ); - i = 0; + tmpString = getString( "control" ); + if(! [tmpString isEqualToString:@""] ) + { + tmpString = [tmpString stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":growl"]]; + tmpString = [tmpString stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"growl:"]]; + tmpString = [tmpString stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"growl"]]; + config_PutPsz( p_intf, "control", [tmpString UTF8String] ); + } } + /* activate stuff without restart */ + if( [o_intf_appleremote_ckb state] == YES ) + [[[VLCMain sharedInstance] appleRemoteController] startListening: [VLCMain sharedInstance]]; + else + [[[VLCMain sharedInstance] appleRemoteController] stopListening: [VLCMain sharedInstance]]; b_intfSettingChanged = NO; } @@ -803,40 +898,14 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch if( b_audioSettingChanged ) { config_PutInt( p_intf, "audio", [o_audio_enable_ckb state] ); - config_PutInt( p_intf, "volume", ([o_audio_vol_sld intValue] * 2.56)); + if( [o_audio_vol_fld isEnabled] ) + config_PutInt( p_intf, "volume", [o_audio_vol_fld intValue] * AOUT_VOLUME_MAX / 200.0 + 0.5 ); + config_PutInt( p_intf, "volume-save", [o_audio_autosavevol_yes_bcell state] ); config_PutInt( p_intf, "spdif", [o_audio_spdif_ckb state] ); SaveIntList( o_audio_dolby_pop, "force-dolby-surround" ); config_PutPsz( p_intf, "audio-language", [[o_audio_lang_fld stringValue] UTF8String] ); - config_PutInt( p_intf, "headphone-dolby", [o_audio_headphone_ckb state] ); - - if( [o_audio_norm_ckb state] == NSOnState ) - { - psz_tmp = config_GetPsz( p_intf, "audio-filter" ); - if(! psz_tmp) - config_PutPsz( p_intf, "audio-filter", "volnorm" ); - else if( (NSInteger)strstr( psz_tmp, "normvol" ) == NO ) - { - /* work-around a GCC 4.0.1 bug */ - psz_tmp = (char *)[[NSString stringWithFormat: @"%s:volnorm", psz_tmp] UTF8String]; - config_PutPsz( p_intf, "audio-filter", psz_tmp ); - free( psz_tmp ); - } - } - else - { - psz_tmp = config_GetPsz( p_intf, "audio-filter" ); - if( psz_tmp ) - { - char *psz_tmp2 = (char *)[[[NSString stringWithUTF8String: psz_tmp] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":volnorm"]] UTF8String]; - psz_tmp2 = (char *)[[[NSString stringWithUTF8String: psz_tmp2] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"volnorm:"]] UTF8String]; - psz_tmp2 = (char *)[[[NSString stringWithUTF8String: psz_tmp2] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"volnorm"]] UTF8String]; - config_PutPsz( p_intf, "audio-filter", psz_tmp ); - free( psz_tmp ); - } - } - config_PutFloat( p_intf, "norm-max-level", [o_audio_norm_fld floatValue] ); SaveModuleList( o_audio_visual_pop, "audio-visual" ); @@ -854,20 +923,6 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch } else [o_audio_last_ckb setEnabled: NO]; - - /* okay, let's save our changes to vlcrc */ - i = config_SaveConfigFile( p_intf, "main" ); - i = i + config_SaveConfigFile( p_intf, "audioscrobbler" ); - i = i + config_SaveConfigFile( p_intf, "volnorm" ); - - if( i != 0 ) - { - msg_Err( p_intf, "An error occurred while saving the Audio settings using SimplePrefs (%i)", i ); - dialog_Fatal( p_intf, _("Audio Settings not saved"), - _("An error occured while saving your settings via SimplePrefs (%i)."), i ); - - i = 0; - } b_audioSettingChanged = NO; } @@ -878,6 +933,7 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch { config_PutInt( p_intf, "video", [o_video_enable_ckb state] ); config_PutInt( p_intf, "fullscreen", [o_video_fullscreen_ckb state] ); + config_PutInt( p_intf, "video-deco", [o_video_videodeco_ckb state] ); config_PutInt( p_intf, "video-on-top", [o_video_onTop_ckb state] ); config_PutInt( p_intf, "skip-frames", [o_video_skipFrames_ckb state] ); config_PutInt( p_intf, "macosx-black", [o_video_black_ckb state] ); @@ -889,17 +945,8 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch config_PutPsz( p_intf, "snapshot-prefix", [[o_video_snap_prefix_fld stringValue] UTF8String] ); config_PutInt( p_intf, "snapshot-sequential", [o_video_snap_seqnum_ckb state] ); SaveStringList( o_video_snap_format_pop, "snapshot-format" ); - - i = config_SaveConfigFile( p_intf, "main" ); - i = i + config_SaveConfigFile( p_intf, "macosx" ); - - if( i != 0 ) - { - msg_Err( p_intf, "An error occurred while saving the Video settings using SimplePrefs (%i)", i ); - dialog_Fatal( p_intf, _("Video Settings not saved"), - _("An error occured while saving your settings via SimplePrefs (%i)."), i ); - i = 0; - } + SaveIntList( o_video_deinterlace_pop, "deinterlace" ); + SaveStringList( o_video_deinterlace_mode_pop, "deinterlace-mode" ); b_videoSettingChanged = NO; } @@ -908,7 +955,7 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch ***************************/ if( b_inputSettingChanged ) { - config_PutInt( p_intf, "server-port", [o_input_serverport_fld intValue] ); + config_PutPsz( p_intf, "input-record-path", [[o_input_record_fld stringValue] UTF8String] ); config_PutPsz( p_intf, "http-proxy", [[o_input_httpproxy_fld stringValue] UTF8String] ); config_PutPsz( p_intf, "http-proxy-pwd", [[o_input_httpproxypwd_sfld stringValue] UTF8String] ); config_PutInt( p_intf, "postproc-q", [o_input_postproc_fld intValue] ); @@ -916,55 +963,24 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch SaveIntList( o_input_avi_pop, "avi-index" ); config_PutInt( p_intf, "rtsp-tcp", [o_input_rtsp_ckb state] ); - SaveIntList( o_input_skipLoop_pop, "ffmpeg-skiploopfilter" ); + SaveIntList( o_input_skipLoop_pop, "avcodec-skiploopfilter" ); - #define CaCi( name, int ) config_PutInt( p_intf, name, int * [[o_input_cachelevel_pop selectedItem] tag] ) - #define CaC( name ) CaCi( name, 1 ) - msg_Dbg( p_intf, "Adjusting all cache values to: %i", (int)[[o_input_cachelevel_pop selectedItem] tag] ); - CaC( "udp-caching" ); - if( module_exists ( "dvdread" ) ) - { - CaC( "dvdread-caching" ); - i = i + config_SaveConfigFile( p_intf, "dvdread" ); - } - if( module_exists ( "dvdnav" ) ) - { - CaC( "dvdnav-caching" ); - i = i + config_SaveConfigFile( p_intf, "dvdnav" ); - } - CaC( "tcp-caching" ); CaC( "vcd-caching" ); - CaC( "cdda-caching" ); CaC( "file-caching" ); - CaC( "screen-caching" ); - CaCi( "rtsp-caching", 4 ); CaCi( "ftp-caching", 2 ); - CaCi( "http-caching", 4 ); - if( module_exists ( "access_realrtsp" ) ) + config_PutInt( p_intf, "mkv-preload-local-dir", [o_input_mkv_preload_dir_ckb state] ); + + #define CaC( name, factor ) config_PutInt( p_intf, name, [[o_input_cachelevel_pop selectedItem] tag] * factor ) + if ( [[o_input_cachelevel_pop selectedItem] tag] == 0 ) { - CaCi( "realrtsp-caching", 10 ); - i = i + config_SaveConfigFile( p_intf, "access_realrtsp" ); + msg_Dbg( p_intf, "Custom chosen, not adjusting cache values" ); } - CaCi( "mms-caching", 19 ); - - i = config_SaveConfigFile( p_intf, "main" ); - i = i + config_SaveConfigFile( p_intf, "avcodec" ); - i = i + config_SaveConfigFile( p_intf, "postproc" ); - i = i + config_SaveConfigFile( p_intf, "access_http" ); - i = i + config_SaveConfigFile( p_intf, "access_file" ); - i = i + config_SaveConfigFile( p_intf, "access_tcp" ); - i = i + config_SaveConfigFile( p_intf, "cdda" ); - i = i + config_SaveConfigFile( p_intf, "screen" ); - i = i + config_SaveConfigFile( p_intf, "vcd" ); - i = i + config_SaveConfigFile( p_intf, "access_ftp" ); - i = i + config_SaveConfigFile( p_intf, "access_mms" ); - i = i + config_SaveConfigFile( p_intf, "live555" ); - i = i + config_SaveConfigFile( p_intf, "avi" ); - - if( i != 0 ) + else { - msg_Err( p_intf, "An error occurred while saving the Input settings using SimplePrefs (%i)", i ); - dialog_Fatal( p_intf, _("Input Settings not saved"), - _("An error occured while saving your settings via SimplePrefs (%i)."), i ); - i = 0; + msg_Dbg( p_intf, "Adjusting all cache values to: %i", (int)[[o_input_cachelevel_pop selectedItem] tag] ); + CaC( "file-caching", 1 ); + CaC( "network-caching", 10/3 ); + CaC( "disc-caching", 1 ); + CaC( "live-caching", 1 ); } + #undef CaC b_inputSettingChanged = NO; } @@ -982,29 +998,13 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch config_PutPsz( p_intf, "sub-language", [[o_osd_lang_fld stringValue] UTF8String] ); - if( module_exists( "quartztext" ) ) - { - config_PutPsz( p_intf, "quartztext-font", [[o_osd_font_fld stringValue] UTF8String] ); - SaveIntList( o_osd_font_color_pop, "quartztext-color" ); - SaveIntList( o_osd_font_size_pop, "quartztext-rel-fontsize" ); - } - else - { - /* fallback on freetype */ - config_PutPsz( p_intf, "freetype-font", [[o_osd_font_fld stringValue] UTF8String] ); - SaveIntList( o_osd_font_color_pop, "freetype-color" ); - SaveIntList( o_osd_font_size_pop, "freetype-rel-fontsize" ); - } - - i = config_SaveConfigFile( p_intf, NULL ); - - if( i != 0 ) - { - msg_Err( p_intf, "An error occurred while saving the OSD/Subtitle settings using SimplePrefs (%i)", i ); - dialog_Fatal( p_intf, _("On Screen Display/Subtitle Settings not saved"), - _("An error occured while saving your settings via SimplePrefs (%i)."), i ); - i = 0; - } + config_PutPsz( p_intf, "freetype-font", [[o_osd_font_fld stringValue] UTF8String] ); + SaveIntList( o_osd_font_color_pop, "freetype-color" ); + SaveIntList( o_osd_font_size_pop, "freetype-rel-fontsize" ); + config_PutInt( p_intf, "freetype-opacity", [o_osd_opacity_fld intValue] * 255.0 / 100.0 + 0.5 ); + config_PutInt( p_intf, "freetype-bold", [o_osd_forcebold_ckb state] ); + SaveIntList( o_osd_outline_color_pop, "freetype-outline-color" ); + SaveIntList( o_osd_outline_thickness_pop, "freetype-outline-thickness" ); b_osdSettingChanged = NO; } @@ -1013,24 +1013,20 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch ********************/ if( b_hotkeyChanged ) { - i = 0; - while( i < [o_hotkeySettings count] ) - { + NSUInteger hotKeyCount = [o_hotkeySettings count]; + for( NSUInteger i = 0; i < hotKeyCount; i++ ) config_PutPsz( p_intf, [[o_hotkeyNames objectAtIndex:i] UTF8String], [[o_hotkeySettings objectAtIndex:i]UTF8String] ); - i++; - } - - i = config_SaveConfigFile( p_intf, "main" ); - - if( i != 0 ) - { - msg_Err( p_intf, "An error occurred while saving the Hotkey settings using SimplePrefs (%i)", i ); - dialog_Fatal( p_intf, _("Hotkeys not saved"), - _("An error occured while saving your settings via SimplePrefs (%i)."), i ); - i = 0; - } b_hotkeyChanged = NO; } + + [[VLCCoreInteraction sharedInstance] fixPreferences]; + + /* okay, let's save our changes to vlcrc */ + config_SaveConfigFile( p_intf ); + + [[NSNotificationCenter defaultCenter] postNotificationName: @"VLCMediaKeySupportSettingChanged" + object: nil + userInfo: nil]; } - (void)showSettingsForCategory: (id)o_new_category_view @@ -1045,34 +1041,46 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch o_old_view_rect = [o_currentlyShownCategoryView frame]; o_win_rect.size.height = o_win_rect.size.height - o_old_view_rect.size.height; o_win_rect.origin.y = ( o_win_rect.origin.y + o_old_view_rect.size.height ) - o_view_rect.size.height; - - /* remove our previous category view */ - [o_currentlyShownCategoryView removeFromSuperviewWithoutNeedingDisplay]; } o_win_rect.size.height = o_win_rect.size.height + o_view_rect.size.height; - [o_sprefs_win displayIfNeeded]; - [o_sprefs_win setFrame: o_win_rect display:YES animate: YES]; - [o_new_category_view setFrame: NSMakeRect( 0, [o_sprefs_controls_box frame].size.height, o_view_rect.size.width, o_view_rect.size.height )]; - [o_new_category_view setNeedsDisplay: YES]; [o_new_category_view setAutoresizesSubviews: YES]; - [[o_sprefs_win contentView] addSubview: o_new_category_view]; + if (o_currentlyShownCategoryView) + { + [[[o_sprefs_win contentView] animator] replaceSubview: o_currentlyShownCategoryView with: o_new_category_view]; + [o_currentlyShownCategoryView release]; + [[o_sprefs_win animator] setFrame: o_win_rect display:YES]; + } + else + { + [[o_sprefs_win contentView] addSubview: o_new_category_view]; + [o_sprefs_win setFrame: o_win_rect display:YES animate:NO]; + } /* keep our current category for further reference */ - [o_currentlyShownCategoryView release]; o_currentlyShownCategoryView = o_new_category_view; [o_currentlyShownCategoryView retain]; } +#pragma mark - +#pragma mark Specific actions + - (IBAction)interfaceSettingChanged:(id)sender { - if( sender == o_intf_mediakeys_ckb ) - [o_intf_mediakeys_bg_ckb setEnabled: [o_intf_mediakeys_ckb state]]; + if( sender == o_intf_embedded_ckb && [o_intf_embedded_ckb state] == NSOffState ) + [o_intf_nativefullscreen_ckb setState: NSOffState]; + + if( sender == o_intf_nativefullscreen_ckb && [o_intf_nativefullscreen_ckb state] == NSOnState ) + [o_intf_embedded_ckb setState: NSOnState]; + + if( sender == o_intf_embedded_ckb ) + [[VLCCoreInteraction sharedInstance] stop]; + b_intfSettingChanged = YES; } @@ -1089,12 +1097,6 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch if( sender == o_audio_vol_fld ) [o_audio_vol_sld setIntValue: [o_audio_vol_fld intValue]]; - if( sender == o_audio_norm_ckb ) - { - [o_audio_norm_stepper setEnabled: [o_audio_norm_ckb state]]; - [o_audio_norm_fld setEnabled: [o_audio_norm_ckb state]]; - } - if( sender == o_audio_last_ckb ) { if( [o_audio_last_ckb state] == NSOnState ) @@ -1109,6 +1111,13 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch } } + if( sender == o_audio_autosavevol_matrix ) + { + BOOL enableVolumeSlider = [o_audio_autosavevol_matrix selectedTag] == 1; + [o_audio_vol_fld setEnabled: enableVolumeSlider]; + [o_audio_vol_sld setEnabled: enableVolumeSlider]; + } + b_audioSettingChanged = YES; } @@ -1144,9 +1153,14 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch { if( contextInfo == o_video_snap_folder_btn ) { - [o_video_snap_folder_fld setStringValue: [o_selectFolderPanel filename]]; + [o_video_snap_folder_fld setStringValue: [[o_selectFolderPanel URL] path]]; b_videoSettingChanged = YES; } + else if( contextInfo == o_input_record_btn ) + { + [o_input_record_fld setStringValue: [[o_selectFolderPanel URL] path]]; + b_inputSettingChanged = YES; + } } [o_selectFolderPanel release]; @@ -1159,6 +1173,12 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch - (IBAction)osdSettingChanged:(id)sender { + if( sender == o_osd_opacity_fld ) + [o_osd_opacity_sld setIntValue: [o_osd_opacity_fld intValue]]; + + if( sender == o_osd_opacity_sld ) + [o_osd_opacity_fld setIntValue: [o_osd_opacity_sld intValue]]; + b_osdSettingChanged = YES; } @@ -1167,28 +1187,46 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch [self showSettingsForCategory: o_osd_view]; } +- (void)controlTextDidChange:(NSNotification *)o_notification +{ + id notificationObject = [o_notification object]; + if( notificationObject == o_audio_lang_fld || + notificationObject == o_audio_lastpwd_sfld || + notificationObject == o_audio_lastuser_fld || + notificationObject == o_audio_vol_fld ) + b_audioSettingChanged = YES; + else if( notificationObject == o_input_record_fld || + notificationObject == o_input_httpproxy_fld || + notificationObject == o_input_httpproxypwd_sfld || + notificationObject == o_input_postproc_fld ) + b_inputSettingChanged = YES; + else if( notificationObject == o_osd_font_fld || + notificationObject == o_osd_lang_fld || + notificationObject == o_osd_opacity_fld) + b_osdSettingChanged = YES; + else if( notificationObject == o_video_snap_folder_fld || + notificationObject == o_video_snap_prefix_fld ) + b_videoSettingChanged = YES; +} + - (IBAction)showFontPicker:(id)sender { - if( module_exists( "quartztext" ) ) - { - char * font = config_GetPsz( p_intf, "quartztext-font" ); - NSString * fontFamilyName = font ? [NSString stringWithUTF8String: font] : nil; - free(font); - if( fontFamilyName ) - { - NSFontDescriptor * fd = [NSFontDescriptor fontDescriptorWithFontAttributes:nil]; - NSFont * font = [NSFont fontWithDescriptor:[fd fontDescriptorWithFamily:fontFamilyName] textTransform:nil]; - [[NSFontManager sharedFontManager] setSelectedFont:font isMultiple:NO]; - } - [[NSFontManager sharedFontManager] setTarget: self]; - [[NSFontPanel sharedFontPanel] orderFront:self]; - } + char * font = config_GetPsz( p_intf, "freetype-font" ); + NSString * fontName = font ? [NSString stringWithUTF8String: font] : nil; + free(font); + if( fontName ) + { + NSFont * font = [NSFont fontWithName:fontName size:0.0]; + [[NSFontManager sharedFontManager] setSelectedFont:font isMultiple:NO]; + } + [[NSFontManager sharedFontManager] setTarget: self]; + [[NSFontPanel sharedFontPanel] orderFront:self]; } - (void)changeFont:(id)sender { NSFont * font = [sender convertFont:[[NSFontManager sharedFontManager] selectedFont]]; - [o_osd_font_fld setStringValue:[font familyName]]; + [o_osd_font_fld setStringValue:[font fontName]]; [self osdSettingChanged:self]; } @@ -1201,6 +1239,22 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch else [o_input_cachelevel_custom_txt setHidden: YES]; } + else if( sender == o_input_record_btn ) + { + o_selectFolderPanel = [[NSOpenPanel alloc] init]; + [o_selectFolderPanel setCanChooseDirectories: YES]; + [o_selectFolderPanel setCanChooseFiles: YES]; + [o_selectFolderPanel setResolvesAliases: YES]; + [o_selectFolderPanel setAllowsMultipleSelection: NO]; + [o_selectFolderPanel setMessage: _NS("Choose the directory or filename where the records will be stored.")]; + [o_selectFolderPanel setCanCreateDirectories: YES]; + [o_selectFolderPanel setPrompt: _NS("Choose")]; + [o_selectFolderPanel beginSheetForDirectory: nil file: nil modalForWindow: o_sprefs_win + modalDelegate: self + didEndSelector: @selector(savePanelDidEnd:returnCode:contextInfo:) + contextInfo: o_input_record_btn]; + return; + } b_inputSettingChanged = YES; } @@ -1210,6 +1264,16 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch [self showSettingsForCategory: o_input_view]; } +#pragma mark - +#pragma mark Hotkey actions + +- (void)hotkeyTableDoubleClick:(id)object +{ + // -1 is header + if( [o_hotkeys_listbox clickedRow] >= 0 ) + [self hotkeySettingChanged:o_hotkeys_listbox]; +} + - (IBAction)hotkeySettingChanged:(id)sender { if( sender == o_hotkeys_change_btn || sender == o_hotkeys_listbox ) @@ -1241,6 +1305,11 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch b_hotkeyChanged = YES; i_returnValue = [o_hotkeySettings indexOfObject: o_keyInTransition]; + if( i_returnValue != NSNotFound ) + [o_hotkeySettings replaceObjectAtIndex: i_returnValue withObject: [NSString string]]; + NSString *tempString; + tempString = [o_keyInTransition stringByReplacingOccurrencesOfString:@"-" withString:@"+"]; + i_returnValue = [o_hotkeySettings indexOfObject: tempString]; if( i_returnValue != NSNotFound ) [o_hotkeySettings replaceObjectAtIndex: i_returnValue withObject: [NSString string]]; @@ -1257,6 +1326,10 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch [o_hotkeys_listbox reloadData]; b_hotkeyChanged = YES; } + + [[NSNotificationCenter defaultCenter] postNotificationName: @"VLCMediaKeySupportSettingChanged" + object: nil + userInfo: nil]; } - (void)showHotkeySettings @@ -1271,21 +1344,24 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { - if( [[aTableColumn identifier] isEqualToString: @"action"] ) + NSString * identifier = [aTableColumn identifier]; + + if( [identifier isEqualToString: @"action"] ) return [o_hotkeyDescriptions objectAtIndex: rowIndex]; - else if( [[aTableColumn identifier] isEqualToString: @"shortcut"] ) + else if( [identifier isEqualToString: @"shortcut"] ) return [self OSXStringKeyToString:[o_hotkeySettings objectAtIndex: rowIndex]]; else { - msg_Err( p_intf, "unknown TableColumn identifier (%s)!", [[aTableColumn identifier] UTF8String] ); + msg_Err( p_intf, "unknown TableColumn identifier (%s)!", [identifier UTF8String] ); return NULL; } } - (BOOL)changeHotkeyTo: (NSString *)theKey { - NSInteger i_returnValue; + NSInteger i_returnValue, i_returnValue2; i_returnValue = [o_hotkeysNonUseableKeys indexOfObject: theKey]; + if( i_returnValue != NSNotFound || [theKey isEqualToString:@""] ) { [o_hotkeys_change_keys_lbl setStringValue: _NS("Invalid combination")]; @@ -1298,10 +1374,15 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch [o_hotkeys_change_keys_lbl setStringValue: [self OSXStringKeyToString:theKey]]; i_returnValue = [o_hotkeySettings indexOfObject: theKey]; + i_returnValue2 = [o_hotkeySettings indexOfObject: [theKey stringByReplacingOccurrencesOfString:@"-" withString:@"+"]]; if( i_returnValue != NSNotFound ) [o_hotkeys_change_taken_lbl setStringValue: [NSString stringWithFormat: _NS("This combination is already taken by \"%@\"."), [o_hotkeyDescriptions objectAtIndex: i_returnValue]]]; + else if( i_returnValue2 != NSNotFound ) + [o_hotkeys_change_taken_lbl setStringValue: [NSString stringWithFormat: + _NS("This combination is already taken by \"%@\"."), + [o_hotkeyDescriptions objectAtIndex: i_returnValue2]]]; else [o_hotkeys_change_taken_lbl setStringValue: @""]; @@ -1340,23 +1421,82 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch - (BOOL)performKeyEquivalent:(NSEvent *)o_theEvent { NSMutableString *tempString = [[[NSMutableString alloc] init] autorelease]; - if( [o_theEvent modifierFlags] & NSControlKeyMask ) + NSString *keyString = [o_theEvent characters]; + + unichar key = [keyString characterAtIndex:0]; + NSUInteger i_modifiers = [o_theEvent modifierFlags]; + + /* modifiers */ + if( i_modifiers & NSControlKeyMask ) [tempString appendString:@"Ctrl-"]; - - if( [o_theEvent modifierFlags] & NSAlternateKeyMask ) + if( i_modifiers & NSAlternateKeyMask ) [tempString appendString:@"Alt-"]; - - if( [o_theEvent modifierFlags] & NSShiftKeyMask ) + if( i_modifiers & NSShiftKeyMask ) [tempString appendString:@"Shift-"]; - - if( [o_theEvent modifierFlags] & NSCommandKeyMask ) + if( i_modifiers & NSCommandKeyMask ) [tempString appendString:@"Command-"]; - if (![[[o_theEvent charactersIgnoringModifiers] lowercaseString] isEqualToString:@""]) { + /* non character keys */ + if( key == NSUpArrowFunctionKey ) + [tempString appendString:@"Up"]; + else if( key == NSDownArrowFunctionKey ) + [tempString appendString:@"Down"]; + else if( key == NSLeftArrowFunctionKey ) + [tempString appendString:@"Left"]; + else if( key == NSRightArrowFunctionKey ) + [tempString appendString:@"Right"]; + else if( key == NSF1FunctionKey ) + [tempString appendString:@"F1"]; + else if( key == NSF2FunctionKey ) + [tempString appendString:@"F2"]; + else if( key == NSF3FunctionKey ) + [tempString appendString:@"F3"]; + else if( key == NSF4FunctionKey ) + [tempString appendString:@"F4"]; + else if( key == NSF5FunctionKey ) + [tempString appendString:@"F5"]; + else if( key == NSF6FunctionKey ) + [tempString appendString:@"F6"]; + else if( key == NSF7FunctionKey ) + [tempString appendString:@"F7"]; + else if( key == NSF8FunctionKey ) + [tempString appendString:@"F8"]; + else if( key == NSF9FunctionKey ) + [tempString appendString:@"F9"]; + else if( key == NSF10FunctionKey ) + [tempString appendString:@"F10"]; + else if( key == NSF11FunctionKey ) + [tempString appendString:@"F11"]; + else if( key == NSF12FunctionKey ) + [tempString appendString:@"F12"]; + else if( key == NSInsertFunctionKey ) + [tempString appendString:@"Insert"]; + else if( key == NSHomeFunctionKey ) + [tempString appendString:@"Home"]; + else if( key == NSEndFunctionKey ) + [tempString appendString:@"End"]; + else if( key == NSPageUpFunctionKey ) + [tempString appendString:@"Pageup"]; + else if( key == NSPageDownFunctionKey ) + [tempString appendString:@"Pagedown"]; + else if( key == NSMenuFunctionKey ) + [tempString appendString:@"Menu"]; + else if( key == NSTabCharacter ) + [tempString appendString:@"Tab"]; + else if( key == NSCarriageReturnCharacter ) + [tempString appendString:@"Enter"]; + else if( key == NSEnterCharacter ) + [tempString appendString:@"Enter"]; + else if( key == NSDeleteCharacter ) + [tempString appendString:@"Delete"]; + else if( key == NSBackspaceCharacter ) + [tempString appendString:@"Backspace"]; + else if (![[[o_theEvent charactersIgnoringModifiers] lowercaseString] isEqualToString:@""]) //plain characters [tempString appendString:[[o_theEvent charactersIgnoringModifiers] lowercaseString]]; - return [[[VLCMain sharedInstance] simplePreferences] changeHotkeyTo: tempString]; - } - return NO; + else + return NO; + + return [[[VLCMain sharedInstance] simplePreferences] changeHotkeyTo: tempString]; } @end