X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fsimple_prefs.m;h=4ba3abc3db1b528dad10b925fb25de5502ea7ece;hb=c57446ee13bdaa1188b92ac8fc33740b3516cb2a;hp=30379244dd276328baafd06353d79b4df0cb2814;hpb=c5c06b64c806052086e5772d64e540a8db7e4a9b;p=vlc diff --git a/modules/gui/macosx/simple_prefs.m b/modules/gui/macosx/simple_prefs.m index 30379244dd..4ba3abc3db 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 the VideoLAN team +* Copyright (C) 2008-2012 VLC authors and VideoLAN * $Id$ * * Authors: Felix Paul Kühne @@ -20,13 +20,26 @@ * 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"; static NSString* VLCIntfSettingToolbarIdentifier = @"Intf Settings Item Identifier"; @@ -40,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]; @@ -63,6 +78,7 @@ static VLCSimplePrefs *_o_sharedInstance = nil; [o_hotkeySettings release]; [o_hotkeyDescriptions release]; + [o_hotkeyNames release]; [o_hotkeysNonUseableKeys release]; [o_keyInTransition release]; @@ -70,31 +86,48 @@ static VLCSimplePrefs *_o_sharedInstance = nil; [super dealloc]; } - -- (NSString *)OSXKeyToString:(int)val +- (NSString *)OSXStringKeyToString:(NSString *)theString { - NSMutableString *o_temp_str = [[[NSMutableString alloc] init] autorelease]; - if( val & KEY_MODIFIER_CTRL ) - [o_temp_str appendString: [NSString stringWithUTF8String: "\xE2\x8C\x83"]]; - if( val & KEY_MODIFIER_ALT ) - [o_temp_str appendString: [NSString stringWithUTF8String: "\xE2\x8C\xA5"]]; - if( val & KEY_MODIFIER_SHIFT ) - [o_temp_str appendString: [NSString stringWithUTF8String: "\xE2\x87\xA7"]]; - if( val & KEY_MODIFIER_COMMAND ) - [o_temp_str appendString: [NSString stringWithUTF8String: "\xE2\x8C\x98"]]; - - const char *base = KeyToString( val & ~KEY_MODIFIER ); - if( base ) - [o_temp_str appendString: [NSString stringWithUTF8String: base]]; + 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"]]; + /* 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 - o_temp_str = [NSMutableString stringWithString:_NS("Not Set")]; - return o_temp_str; + theString = [NSString stringWithString:_NS("Not Set")]; + return theString; } - (void)awakeFromNib { [self initStrings]; - + /* setup the toolbar */ NSToolbar * o_sprefs_toolbar = [[[NSToolbar alloc] initWithIdentifier: VLCSPrefsToolbarIdentifier] autorelease]; [o_sprefs_toolbar setAllowsUserCustomization: NO]; @@ -103,42 +136,15 @@ static VLCSimplePrefs *_o_sharedInstance = nil; [o_sprefs_toolbar setSizeMode: NSToolbarSizeModeRegular]; [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: - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'c'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'x'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'v'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'a'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|','], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'h'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_ALT|'h'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'o'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'o'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'d'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'n'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'s'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'z'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'l'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'r'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'0'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'1'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'2'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'3'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'m'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'w'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'w'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'c'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'p'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'i'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'e'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'e'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'b'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'m'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_CTRL|'m'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'?'], - [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_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 ) \ @@ -163,8 +169,8 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des return o_toolbarItem; } -- (NSToolbarItem *) toolbar: (NSToolbar *)o_sprefs_toolbar - itemForItemIdentifier: (NSString *)o_itemIdent +- (NSToolbarItem *) toolbar: (NSToolbar *)o_sprefs_toolbar + itemForItemIdentifier: (NSString *)o_itemIdent willBeInsertedIntoToolbar: (BOOL)b_willBeInserted { NSToolbarItem *o_toolbarItem = nil; @@ -183,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] ) { @@ -199,19 +205,19 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des - (NSArray *)toolbarDefaultItemIdentifiers: (NSToolbar *)toolbar { - return [NSArray arrayWithObjects: VLCIntfSettingToolbarIdentifier, VLCAudioSettingToolbarIdentifier, VLCVideoSettingToolbarIdentifier, + return [NSArray arrayWithObjects: VLCIntfSettingToolbarIdentifier, VLCAudioSettingToolbarIdentifier, VLCVideoSettingToolbarIdentifier, VLCOSDSettingToolbarIdentifier, VLCInputSettingToolbarIdentifier, VLCHotkeysSettingToolbarIdentifier, NSToolbarFlexibleSpaceItemIdentifier, nil]; } - (NSArray *)toolbarAllowedItemIdentifiers: (NSToolbar *)toolbar { - return [NSArray arrayWithObjects: VLCIntfSettingToolbarIdentifier, VLCAudioSettingToolbarIdentifier, VLCVideoSettingToolbarIdentifier, + return [NSArray arrayWithObjects: VLCIntfSettingToolbarIdentifier, VLCAudioSettingToolbarIdentifier, VLCVideoSettingToolbarIdentifier, VLCOSDSettingToolbarIdentifier, VLCInputSettingToolbarIdentifier, VLCHotkeysSettingToolbarIdentifier, NSToolbarFlexibleSpaceItemIdentifier, nil]; } - (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar { - return [NSArray arrayWithObjects: VLCIntfSettingToolbarIdentifier, VLCAudioSettingToolbarIdentifier, VLCVideoSettingToolbarIdentifier, + return [NSArray arrayWithObjects: VLCIntfSettingToolbarIdentifier, VLCAudioSettingToolbarIdentifier, VLCVideoSettingToolbarIdentifier, VLCOSDSettingToolbarIdentifier, VLCInputSettingToolbarIdentifier, VLCHotkeysSettingToolbarIdentifier, nil]; } @@ -222,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")]; @@ -243,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")]; @@ -251,18 +259,29 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [o_input_httpproxypwd_txt setStringValue: _NS("Password for HTTP Proxy")]; [o_input_mux_box setTitle: _NS("Codecs / Muxers")]; [o_input_net_box setTitle: _NS("Network")]; + [o_input_avcodec_hw_ckb setTitle: _NS("Hardware Acceleration")]; [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_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")]; [o_osd_font_box setTitle: _NS("Display Settings")]; @@ -274,6 +293,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")]; @@ -281,6 +304,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")]; @@ -290,16 +314,46 @@ 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")]; [o_sprefs_win setTitle: _NS("Preferences")]; } +/* TODO: move this part to core */ +#define config_GetLabel(a,b) __config_GetLabel(VLC_OBJECT(a),b) +static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_name ) +{ + module_config_t *p_config; + + p_config = config_FindConfig( p_this, psz_name ); + + /* sanity checks */ + if( !p_config ) + { + msg_Err( p_this, "option %s does not exist", psz_name ); + return NULL; + } + + if ( p_config->psz_longtext ) + return p_config->psz_longtext; + else if( p_config->psz_text ) + return p_config->psz_text; + else + msg_Warn( p_this, "option %s does not include any help", psz_name ); + + return NULL; +} + +#pragma mark - +#pragma mark Setup controls + - (void)setupButton: (NSPopUpButton *)object forStringList: (const char *)name { module_config_t *p_item; @@ -310,22 +364,23 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des /* serious problem, if no item found */ assert( p_item ); - for( int i = 0; i < p_item->i_list; i++ ) + for( int i = 0; i < p_item->list_count; i++ ) { NSMenuItem *mi; - if( p_item->ppsz_list_text != NULL ) - mi = [[NSMenuItem alloc] initWithTitle: _NS( p_item->ppsz_list_text[i] ) action:NULL keyEquivalent: @""]; - else if( p_item->ppsz_list[i] && strcmp(p_item->ppsz_list[i],"") == 0 ) + if( p_item->list_text != NULL ) + mi = [[NSMenuItem alloc] initWithTitle: _NS( p_item->list_text[i] ) action:NULL keyEquivalent: @""]; + else if( p_item->list.psz[i] && strcmp(p_item->list.psz[i],"") == 0 ) { [[object menu] addItem: [NSMenuItem separatorItem]]; continue; } - else if( p_item->ppsz_list[i] ) - mi = [[NSMenuItem alloc] initWithTitle: [NSString stringWithUTF8String: p_item->ppsz_list[i]] action:NULL keyEquivalent: @""]; - else NSLog( @"item %d of pref %s failed to be created", i, name); - [mi setRepresentedObject:[NSString stringWithUTF8String: p_item->ppsz_list[i]]]; + else if( p_item->list.psz[i] ) + mi = [[NSMenuItem alloc] initWithTitle: [NSString stringWithUTF8String: p_item->list.psz[i]] action:NULL keyEquivalent: @""]; + else + msg_Err( p_intf, "item %d of pref %s failed to be created", i, name ); + [mi setRepresentedObject:[NSString stringWithUTF8String: p_item->list.psz[i]]]; [[object menu] addItem: [mi autorelease]]; - if( p_item->value.psz && !strcmp( p_item->value.psz, p_item->ppsz_list[i] ) ) + if( p_item->value.psz && !strcmp( p_item->value.psz, p_item->list.psz[i] ) ) [object selectItem:[object lastItem]]; } [object setToolTip: _NS( p_item->psz_longtext )]; @@ -341,17 +396,18 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des /* serious problem, if no item found */ assert( p_item ); - for( int i = 0; i < p_item->i_list; i++ ) + for( int i = 0; i < p_item->list_count; i++ ) { NSMenuItem *mi; - if( p_item->ppsz_list_text != NULL) - mi = [[NSMenuItem alloc] initWithTitle: _NS( p_item->ppsz_list_text[i] ) action:NULL keyEquivalent: @""]; - else if( p_item->pi_list[i] ) - mi = [[NSMenuItem alloc] initWithTitle: [NSString stringWithFormat: @"%d", p_item->pi_list[i]] action:NULL keyEquivalent: @""]; - else NSLog( @"item %d of pref %s failed to be created", i, name); - [mi setRepresentedObject:[NSNumber numberWithInt: p_item->pi_list[i]]]; + if( p_item->list_text != NULL) + mi = [[NSMenuItem alloc] initWithTitle: _NS( p_item->list_text[i] ) action:NULL keyEquivalent: @""]; + else if( p_item->list.i[i] ) + mi = [[NSMenuItem alloc] initWithTitle: [NSString stringWithFormat: @"%d", p_item->list.i[i]] action:NULL keyEquivalent: @""]; + else + msg_Err( p_intf, "item %d of pref %s failed to be created", i, name); + [mi setRepresentedObject:[NSNumber numberWithInt: p_item->list.i[i]]]; [[object menu] addItem: [mi autorelease]]; - if( p_item->value.i == p_item->pi_list[i] ) + if( p_item->value.i == p_item->list.i[i] ) [object selectItem:[object lastItem]]; } [object setToolTip: _NS( p_item->psz_longtext )]; @@ -362,15 +418,15 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des module_config_t *p_item; module_t *p_parser, **p_list; int y = 0; - + [object removeAllItems]; - + p_item = config_FindConfig( VLC_OBJECT(p_intf), name ); p_list = module_list_get( NULL ); if( !p_item ||!p_list ) { if( p_list ) module_list_free(p_list); - NSLog( @"serious problem, item or list not found" ); + msg_Err( p_intf, "serious problem, item or list not found" ); return; } @@ -380,7 +436,7 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des 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]]; } @@ -389,55 +445,113 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [object setToolTip: _NS(p_item->psz_longtext)]; } +- (void)setupButton: (NSButton *)object forBoolValue: (const char *)name +{ + [object setState: config_GetInt( 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: _NS(config_GetLabel( p_intf, psz_option ))]; + free( psz_tmp ); +} + - (void)resetControls { module_config_t *p_item; 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 * **********************/ - [self setupButton: o_intf_lang_pop forStringList: "language"]; [self setupButton: o_intf_art_pop forIntList: "album-art"]; - [o_intf_fspanel_ckb setState: config_GetInt( p_intf, "macosx-fspanel" )]; - [o_intf_embedded_ckb setState: config_GetInt( p_intf, "embedded-video" )]; + [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"]; + 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 * ******************/ - [o_audio_enable_ckb setState: config_GetInt( p_intf, "audio" )]; - [o_audio_vol_fld setIntValue: config_GetInt( p_intf, "volume" )]; - [o_audio_vol_sld setIntValue: config_GetInt( p_intf, "volume" )]; - - [o_audio_spdif_ckb setState: config_GetInt( p_intf, "spdif" )]; - - [self setupButton: o_audio_dolby_pop forIntList: "force-dolby-surround"]; + [self setupButton: o_audio_enable_ckb forBoolValue: "audio"]; - [o_audio_lang_fld setStringValue: [NSString stringWithUTF8String: config_GetPsz( p_intf, "audio-language" ) ?: ""]]; + 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_headphone_ckb setState: config_GetInt( p_intf, "headphone-dolby" )]; - - psz_tmp = config_GetPsz( p_intf, "audio-filter" ); - if( psz_tmp ) + [o_audio_vol_sld setIntValue: 100]; + [o_audio_vol_fld setIntValue: 100]; + } + else { - [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]]; + [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]; } - [o_audio_norm_fld setFloatValue: config_GetFloat( p_intf, "norm-max-level" )]; + + [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_visual_pop forModuleList: "audio-visual"]; /* Last.FM is optional */ if( module_exists( "audioscrobbler" ) ) { - [o_audio_lastuser_fld setStringValue: [NSString stringWithUTF8String: config_GetPsz( p_intf, "lastfm-username" ) ?: ""]]; - [o_audio_lastpwd_sfld setStringValue: [NSString stringWithUTF8String: config_GetPsz( p_intf, "lastfm-password" ) ?: ""]]; + [self setupField: o_audio_lastuser_fld forOption:"lastfm-username"]; + [self setupField: o_audio_lastpwd_sfld forOption:"lastfm-password"]; if( config_ExistIntf( VLC_OBJECT( p_intf ), "audioscrobbler" ) ) { @@ -458,11 +572,12 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des /****************** * video settings * ******************/ - [o_video_enable_ckb setState: config_GetInt( p_intf, "video" )]; - [o_video_fullscreen_ckb setState: config_GetInt( p_intf, "fullscreen" )]; - [o_video_onTop_ckb setState: config_GetInt( p_intf, "video-on-top" )]; - [o_video_skipFrames_ckb setState: config_GetInt( p_intf, "skip-frames" )]; - [o_video_black_ckb setState: config_GetInt( p_intf, "macosx-black" )]; + [self setupButton: o_video_enable_ckb forBoolValue: "video"]; + [self setupButton: o_video_fullscreen_ckb forBoolValue: "fullscreen"]; + [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"]; @@ -474,7 +589,7 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des while( i < y ) { NSRect s_rect = [[[NSScreen screens] objectAtIndex: i] frame]; - [o_video_device_pop addItemWithTitle: + [o_video_device_pop addItemWithTitle: [NSString stringWithFormat: @"%@ %i (%ix%i)", _NS("Screen"), i+1, (int)s_rect.size.width, (int)s_rect.size.height]]; [[o_video_device_pop lastItem] setTag: (int)[[[NSScreen screens] objectAtIndex: i] displayID]]; @@ -483,65 +598,52 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [o_video_device_pop selectItemAtIndex: 0]; [o_video_device_pop selectItemWithTag: config_GetInt( p_intf, "macosx-vdev" )]; - [o_video_snap_folder_fld setStringValue: [NSString stringWithUTF8String: config_GetPsz( p_intf, "snapshot-path" ) ?: ""]]; - [o_video_snap_prefix_fld setStringValue: [NSString stringWithUTF8String: config_GetPsz( p_intf, "snapshot-prefix" ) ?: ""]]; - [o_video_snap_seqnum_ckb setState: config_GetInt( p_intf, "snapshot-sequential" )]; + [self setupField: o_video_snap_folder_fld forOption:"snapshot-path"]; + [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" )]; - if( config_GetPsz( p_intf, "http-proxy" ) != NULL ) - [o_input_httpproxy_fld setStringValue: [NSString stringWithUTF8String: config_GetPsz( p_intf, "http-proxy" ) ?: ""]]; - if( config_GetPsz( p_intf, "http-proxy" ) != NULL ) - [o_input_httpproxypwd_sfld setStringValue: [NSString stringWithUTF8String: config_GetPsz( p_intf, "http-proxy-pwd" ) ?: ""]]; - [o_input_postproc_fld setIntValue: config_GetInt( p_intf, "postproc-q" )]; + [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: _NS(config_GetLabel( p_intf, "postproc-q"))]; + [self setupButton: o_input_avcodec_hw_ckb forBoolValue:"avcodec-hw"]; [self setupButton: o_input_avi_pop forIntList: "avi-index"]; - [o_input_rtsp_ckb setState: config_GetInt( p_intf, "rtsp-tcp" )]; - [self setupButton: o_input_skipLoop_pop forIntList: "ffmpeg-skiploopfilter"]; + [self setupButton: o_input_rtsp_ckb forBoolValue: "rtsp-tcp"]; + [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: + [o_input_cachelevel_pop addItemsWithTitles: [NSArray arrayWithObjects: _NS("Custom"), _NS("Lowest latency"), _NS("Low latency"), _NS("Normal"), _NS("High latency"), _NS("Higher latency"), nil]]; [[o_input_cachelevel_pop itemAtIndex: 0] setTag: 0]; [[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]; - -#define TestCaC( name ) \ - b_cache_equal = b_cache_equal && \ - ( i_cache == config_GetInt( p_intf, name ) ) + [[o_input_cachelevel_pop itemAtIndex: 4] setTag: 500]; + [[o_input_cachelevel_pop itemAtIndex: 5] setTag: 1000]; -#define TestCaCi( name, int ) \ - b_cache_equal = b_cache_equal && \ - ( ( i_cache * int ) == config_GetInt( p_intf, name ) ) + #define TestCaC( name, factor ) \ + b_cache_equal = b_cache_equal && \ + ( 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( "fake-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]; @@ -552,45 +654,75 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [o_input_cachelevel_pop selectItemWithTitle: _NS("Custom")]; [o_input_cachelevel_custom_txt setHidden: NO]; } + #undef TestCaC /********************* * subtitle settings * *********************/ - [o_osd_osd_ckb setState: config_GetInt( p_intf, "osd" )]; - - [self setupButton: o_osd_encoding_pop forStringList: "subsdec-encoding"]; - - [o_osd_lang_fld setStringValue: [NSString stringWithUTF8String: config_GetPsz( p_intf, "sub-language" ) ?: ""]]; - if( config_GetPsz( p_intf, "quartztext-font" ) != NULL ) - [o_osd_font_fld setStringValue: [NSString stringWithUTF8String: config_GetPsz( p_intf, "quartztext-font" ) ?: ""]]; + [self setupButton: o_osd_osd_ckb forBoolValue: "osd"]; - [self setupButton: o_osd_font_color_pop forIntList: "quartztext-color"]; - [self setupButton: o_osd_font_size_pop forIntList: "quartztext-rel-fontsize"]; + [self setupButton: o_osd_encoding_pop forStringList: "subsdec-encoding"]; + [self setupField: o_osd_lang_fld forOption: "sub-language" ]; + + [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 * ********************/ const struct hotkey *p_hotkeys = p_intf->p_libvlc->p_hotkeys; + [o_hotkeySettings release]; o_hotkeySettings = [[NSMutableArray alloc] init]; NSMutableArray *o_tempArray_desc = [[NSMutableArray alloc] init]; - i = 1; + NSMutableArray *o_tempArray_names = [[NSMutableArray alloc] init]; - while( i < 100 ) - { - p_item = config_FindConfig( VLC_OBJECT(p_intf), p_hotkeys[i].psz_action ); - if( !p_item ) - break; + /* Get the main Module */ + module_t *p_main = module_get_main(); + assert( p_main ); + unsigned confsize; + module_config_t *p_config; - [o_tempArray_desc addObject: _NS( p_item->psz_text )]; - [o_hotkeySettings addObject: [NSNumber numberWithInt: p_item->value.i]]; + p_config = module_config_get (p_main, &confsize); - i++; + for (size_t i = 0; i < confsize; i++) + { + module_config_t *p_item = p_config + i; + + 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 ) ) + { + [o_tempArray_desc addObject: _NS( p_item->psz_text )]; + [o_tempArray_names addObject: [NSString stringWithUTF8String:p_item->psz_name]]; + if (p_item->value.psz) + [o_hotkeySettings addObject: [NSString stringWithUTF8String:p_item->value.psz]]; + else + [o_hotkeySettings addObject: [NSString string]]; + } } + module_config_free (p_config); + + [o_hotkeyDescriptions release]; o_hotkeyDescriptions = [[NSArray alloc] initWithArray: o_tempArray_desc copyItems: YES]; [o_tempArray_desc release]; + [o_hotkeyNames release]; + o_hotkeyNames = [[NSArray alloc] initWithArray: o_tempArray_names copyItems: YES]; + [o_tempArray_names release]; [o_hotkeys_listbox reloadData]; } +#pragma mark - +#pragma mark General actions + - (void)showSimplePrefs { /* we want to show the interface settings, if no category was chosen */ @@ -599,20 +731,30 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des [[o_sprefs_win toolbar] setSelectedItemIdentifier: VLCIntfSettingToolbarIdentifier]; [self showInterfaceSettings]; } - + [self resetControls]; [o_sprefs_win center]; [o_sprefs_win makeKeyAndOrderFront: self]; } +- (void)showSimplePrefsWithLevel:(NSInteger)i_window_level +{ + [o_sprefs_win setLevel: i_window_level]; + [self showSimplePrefs]; +} + - (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 ) @@ -621,18 +763,16 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des @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]; + [[[VLCMain sharedInstance] preferences] showPrefsWithLevel:[o_sprefs_win level]]; } else msg_Warn( p_intf, "unknown buttonAction sender" ); } -- (void)sheetDidEnd:(NSWindow *)o_sheet +- (void)sheetDidEnd:(NSWindow *)o_sheet returnCode:(int)i_return contextInfo:(void *)o_context { @@ -640,7 +780,7 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des { config_ResetAll( p_intf ); [self resetControls]; - config_SaveConfigFile( p_intf, NULL ); + config_SaveConfigFile( p_intf ); } } @@ -661,13 +801,17 @@ static inline void save_string_list( intf_thread_t * p_intf, id object, const ch p_item = config_FindConfig( VLC_OBJECT(p_intf), name ); p_stringobject = (NSString *)[[object selectedItem] representedObject]; assert([p_stringobject isKindOfClass:[NSString class]]); - if( p_stringobject ) config_PutPsz( p_intf, name, [p_stringobject UTF8String] ); + if( p_stringobject ) + { + config_PutPsz( p_intf, name, [p_stringobject UTF8String] ); + } } static inline void save_module_list( intf_thread_t * p_intf, id object, const char * name ) { 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 ); @@ -678,7 +822,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; @@ -686,92 +830,91 @@ 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 *p_stringobject; - + NSString *tmpString; + NSRange tmpRange; + #define SaveIntList( object, name ) save_int_list( p_intf, object, name ) - + #define SaveStringList( object, name ) save_string_list( p_intf, object, name ) #define SaveModuleList( object, name ) save_module_list( p_intf, object, name ) +#define getString( name ) [NSString stringWithFormat:@"%s", config_GetPsz( p_intf, name )] + /********************** * interface settings * **********************/ if( b_intfSettingChanged ) { - SaveStringList( o_intf_lang_pop, "language" ); SaveIntList( o_intf_art_pop, "album-art" ); config_PutInt( p_intf, "macosx-fspanel", [o_intf_fspanel_ckb state] ); config_PutInt( p_intf, "embedded-video", [o_intf_embedded_ckb state] ); - /* 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; } - + /****************** * audio settings * ******************/ if( b_audioSettingChanged ) { config_PutInt( p_intf, "audio", [o_audio_enable_ckb state] ); - config_PutInt( p_intf, "volume", [o_audio_vol_sld intValue] ); + 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 ); - } - } - else - { - psz_tmp = config_GetPsz( p_intf, "audio-filter" ); - if( psz_tmp ) - { - psz_tmp = (char *)[[[NSString stringWithUTF8String: psz_tmp] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":volnorm"]] UTF8String]; - psz_tmp = (char *)[[[NSString stringWithUTF8String: psz_tmp] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"volnorm:"]] UTF8String]; - psz_tmp = (char *)[[[NSString stringWithUTF8String: psz_tmp] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"volnorm"]] UTF8String]; - config_PutPsz( p_intf, "audio-filter", psz_tmp ); - } - } - config_PutFloat( p_intf, "norm-max-level", [o_audio_norm_fld floatValue] ); SaveModuleList( o_audio_visual_pop, "audio-visual" ); /* Last.FM is optional */ if( module_exists( "audioscrobbler" ) ) - { + { [o_audio_last_ckb setEnabled: YES]; if( [o_audio_last_ckb state] == NSOnState ) config_AddIntf( p_intf, "audioscrobbler" ); @@ -783,23 +926,9 @@ 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; } - + /****************** * video settings * ******************/ @@ -807,6 +936,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] ); @@ -818,26 +948,17 @@ 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; } - + /*************************** * input & codecs settings * ***************************/ 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] ); @@ -845,59 +966,28 @@ 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" ); + config_PutInt( p_intf, "avcodec-hw", [o_input_avcodec_hw_ckb state] ); + 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( "fake-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, "access_fake" ); - 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; } - + /********************** * subtitles settings * **********************/ @@ -906,50 +996,41 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch config_PutInt( p_intf, "osd", [o_osd_osd_ckb state] ); if( [o_osd_encoding_pop indexOfSelectedItem] >= 0 ) - config_PutPsz( p_intf, "subsdec-encoding", [[[o_osd_encoding_pop selectedItem] title] UTF8String] ); + SaveStringList( o_osd_encoding_pop, "subsdec-encoding" ); + else + config_PutPsz( p_intf, "subsdec-encoding", "" ); config_PutPsz( p_intf, "sub-language", [[o_osd_lang_fld stringValue] UTF8String] ); - 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" ); - 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; } - + /******************** * hotkeys settings * ********************/ if( b_hotkeyChanged ) { - const struct hotkey *p_hotkeys = p_intf->p_libvlc->p_hotkeys; - i = 1; - while( i < [o_hotkeySettings count] ) - { - config_PutInt( p_intf, p_hotkeys[i].psz_action, [[o_hotkeySettings objectAtIndex: i-1] intValue] ); - 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; - } + 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] ); 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 @@ -957,39 +1038,53 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch NSRect o_win_rect, o_view_rect, o_old_view_rect; o_win_rect = [o_sprefs_win frame]; o_view_rect = [o_new_category_view frame]; - + if( o_currentlyShownCategoryView != nil ) { /* restore our window's height, if we've shown another category previously */ 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_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_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; } @@ -1006,12 +1101,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 ) @@ -1026,6 +1115,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; } @@ -1046,8 +1142,8 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch [o_selectFolderPanel setMessage: _NS("Choose the folder to save your video snapshots to.")]; [o_selectFolderPanel setCanCreateDirectories: YES]; [o_selectFolderPanel setPrompt: _NS("Choose")]; - [o_selectFolderPanel beginSheetForDirectory: nil file: nil modalForWindow: o_sprefs_win - modalDelegate: self + [o_selectFolderPanel beginSheetForDirectory: nil file: nil modalForWindow: o_sprefs_win + modalDelegate: self didEndSelector: @selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo: o_video_snap_folder_btn]; } @@ -1061,9 +1157,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]; @@ -1076,6 +1177,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; } @@ -1084,15 +1191,36 @@ 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 { - char * font = config_GetPsz( p_intf, "quartztext-font" ); - NSString * fontFamilyName = font ? [NSString stringWithUTF8String: font] : nil; + char * font = config_GetPsz( p_intf, "freetype-font" ); + NSString * fontName = font ? [NSString stringWithUTF8String: font] : nil; free(font); - if( fontFamilyName ) + if( fontName ) { - NSFontDescriptor * fd = [NSFontDescriptor fontDescriptorWithFontAttributes:nil]; - NSFont * font = [NSFont fontWithDescriptor:[fd fontDescriptorWithFamily:fontFamilyName] textTransform:nil]; + NSFont * font = [NSFont fontWithName:fontName size:0.0]; [[NSFontManager sharedFontManager] setSelectedFont:font isMultiple:NO]; } [[NSFontManager sharedFontManager] setTarget: self]; @@ -1102,7 +1230,7 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch - (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]; } @@ -1115,6 +1243,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; } @@ -1124,13 +1268,23 @@ 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 ) { - [o_hotkeys_change_lbl setStringValue: [NSString stringWithFormat: _NS("Press new keys for\n\"%@\""), + [o_hotkeys_change_lbl setStringValue: [NSString stringWithFormat: _NS("Press new keys for\n\"%@\""), [o_hotkeyDescriptions objectAtIndex: [o_hotkeys_listbox selectedRow]]]]; - [o_hotkeys_change_keys_lbl setStringValue: [self OSXKeyToString:[[o_hotkeySettings objectAtIndex: [o_hotkeys_listbox selectedRow]] intValue]]]; + [o_hotkeys_change_keys_lbl setStringValue: [self OSXStringKeyToString:[o_hotkeySettings objectAtIndex: [o_hotkeys_listbox selectedRow]]]]; [o_hotkeys_change_taken_lbl setStringValue: @""]; [o_hotkeys_change_win setInitialFirstResponder: [o_hotkeys_change_win contentView]]; [o_hotkeys_change_win makeFirstResponder: [o_hotkeys_change_win contentView]]; @@ -1156,7 +1310,12 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch i_returnValue = [o_hotkeySettings indexOfObject: o_keyInTransition]; if( i_returnValue != NSNotFound ) - [o_hotkeySettings replaceObjectAtIndex: i_returnValue withObject: [[NSNumber numberWithInt: 0] retain]]; + [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]]; [o_hotkeySettings replaceObjectAtIndex: [o_hotkeys_listbox selectedRow] withObject: [o_keyInTransition retain]]; @@ -1167,10 +1326,14 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch } else if( sender == o_hotkeys_clear_btn ) { - [o_hotkeySettings replaceObjectAtIndex: [o_hotkeys_listbox selectedRow] withObject: [NSNumber numberWithInt: 0]]; + [o_hotkeySettings replaceObjectAtIndex: [o_hotkeys_listbox selectedRow] withObject: [NSString string]]; [o_hotkeys_listbox reloadData]; b_hotkeyChanged = YES; } + + [[NSNotificationCenter defaultCenter] postNotificationName: @"VLCMediaKeySupportSettingChanged" + object: nil + userInfo: nil]; } - (void)showHotkeySettings @@ -1185,22 +1348,25 @@ 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"] ) - return [self OSXKeyToString: [[o_hotkeySettings objectAtIndex: rowIndex] intValue]]; + 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: (int)i_theNewKey +- (BOOL)changeHotkeyTo: (NSString *)theKey { - NSInteger i_returnValue; - i_returnValue = [o_hotkeysNonUseableKeys indexOfObject: [NSNumber numberWithInt: i_theNewKey]]; - if( i_returnValue != NSNotFound || i_theNewKey == 0 ) + 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")]; [o_hotkeys_change_taken_lbl setStringValue: _NS("Regrettably, these keys cannot be assigned as hotkey shortcuts.")]; @@ -1209,28 +1375,29 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch } else { - NSString *o_temp; - if( o_keyInTransition ) - [o_keyInTransition release]; - o_keyInTransition = [[NSNumber numberWithInt: i_theNewKey] retain]; - - o_temp = [self OSXKeyToString: i_theNewKey]; - - [o_hotkeys_change_keys_lbl setStringValue: o_temp]; + [o_hotkeys_change_keys_lbl setStringValue: [self OSXStringKeyToString:theKey]]; - i_returnValue = [o_hotkeySettings indexOfObject: o_keyInTransition]; + 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: @""]; [o_hotkeys_change_ok_btn setEnabled: YES]; + [o_keyInTransition release]; + o_keyInTransition = theKey; + [o_keyInTransition retain]; return YES; } } - + @end /******************** @@ -1257,28 +1424,83 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch - (BOOL)performKeyEquivalent:(NSEvent *)o_theEvent { - unichar key; - int i_key = 0; - - if( [o_theEvent modifierFlags] & NSControlKeyMask ) - i_key |= KEY_MODIFIER_CTRL; - - if( [o_theEvent modifierFlags] & NSAlternateKeyMask ) - i_key |= KEY_MODIFIER_ALT; - - if( [o_theEvent modifierFlags] & NSShiftKeyMask ) - i_key |= KEY_MODIFIER_SHIFT; - - if( [o_theEvent modifierFlags] & NSCommandKeyMask ) - i_key |= KEY_MODIFIER_COMMAND; + NSMutableString *tempString = [[[NSMutableString alloc] init] autorelease]; + 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( i_modifiers & NSAlternateKeyMask ) + [tempString appendString:@"Alt-"]; + if( i_modifiers & NSShiftKeyMask ) + [tempString appendString:@"Shift-"]; + if( i_modifiers & NSCommandKeyMask ) + [tempString appendString:@"Command-"]; + + /* 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]]; + else + return NO; - key = [[[o_theEvent charactersIgnoringModifiers] lowercaseString] characterAtIndex: 0]; - if( key ) - { - i_key |= CocoaKeyToVLC( key ); - return [[[VLCMain sharedInstance] simplePreferences] changeHotkeyTo: i_key]; - } - return FALSE; + return [[[VLCMain sharedInstance] simplePreferences] changeHotkeyTo: tempString]; } @end