simple_prefs.m
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:55k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2. * simple_prefs.m: Simple Preferences for Mac OS X
  3. *****************************************************************************
  4. * Copyright (C) 2008-2009 the VideoLAN team
  5. * $Id: 785541932e71546287e5e71df29be7b218ba85d1 $
  6. *
  7. * Authors: Felix Paul Kühne <fkuehne at videolan dot org>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22. *****************************************************************************/
  23. #import "simple_prefs.h"
  24. #import "prefs.h"
  25. #import <vlc_keys.h>
  26. #import <vlc_interface.h>
  27. #import <vlc_dialog.h>
  28. #import "misc.h"
  29. #import "AppleRemote.h"
  30. static NSString* VLCSPrefsToolbarIdentifier = @"Our Simple Preferences Toolbar Identifier";
  31. static NSString* VLCIntfSettingToolbarIdentifier = @"Intf Settings Item Identifier";
  32. static NSString* VLCAudioSettingToolbarIdentifier = @"Audio Settings Item Identifier";
  33. static NSString* VLCVideoSettingToolbarIdentifier = @"Video Settings Item Identifier";
  34. static NSString* VLCOSDSettingToolbarIdentifier = @"Subtitles Settings Item Identifier";
  35. static NSString* VLCInputSettingToolbarIdentifier = @"Input Settings Item Identifier";
  36. static NSString* VLCHotkeysSettingToolbarIdentifier = @"Hotkeys Settings Item Identifier";
  37. @implementation VLCSimplePrefs
  38. static VLCSimplePrefs *_o_sharedInstance = nil;
  39. + (VLCSimplePrefs *)sharedInstance
  40. {
  41.     return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
  42. }
  43. - (id)init
  44. {
  45.     if (_o_sharedInstance) {
  46.         [self dealloc];
  47.     } else {
  48.         _o_sharedInstance = [super init];
  49.         p_intf = VLCIntf;
  50.     }
  51.     return _o_sharedInstance;
  52. }
  53. - (void)dealloc
  54. {
  55.     [o_currentlyShownCategoryView release];
  56.     [o_hotkeySettings release];
  57.     [o_hotkeyDescriptions release];
  58.     [o_hotkeysNonUseableKeys release];
  59.     [o_keyInTransition release];
  60.     [super dealloc];
  61. }
  62. - (NSString *)OSXKeyToString:(int)val
  63. {
  64.     NSMutableString *o_temp_str = [[[NSMutableString alloc] init] autorelease];
  65.     if( val & KEY_MODIFIER_CTRL )
  66.         [o_temp_str appendString: [NSString stringWithUTF8String: "xE2x8Cx83"]];
  67.     if( val & KEY_MODIFIER_ALT )
  68.         [o_temp_str appendString: [NSString stringWithUTF8String: "xE2x8CxA5"]];
  69.     if( val & KEY_MODIFIER_SHIFT )
  70.         [o_temp_str appendString: [NSString stringWithUTF8String: "xE2x87xA7"]];
  71.     if( val & KEY_MODIFIER_COMMAND )
  72.         [o_temp_str appendString: [NSString stringWithUTF8String: "xE2x8Cx98"]];
  73.     const char *base = KeyToString( val & ~KEY_MODIFIER );
  74.     if( base )
  75.         [o_temp_str appendString: [NSString stringWithUTF8String: base]];
  76.     else
  77.         o_temp_str = [NSMutableString stringWithString:_NS("Not Set")];
  78.     return o_temp_str;
  79. }
  80. - (void)awakeFromNib
  81. {
  82.     [self initStrings];
  83.     
  84.     /* setup the toolbar */
  85.     NSToolbar * o_sprefs_toolbar = [[[NSToolbar alloc] initWithIdentifier: VLCSPrefsToolbarIdentifier] autorelease];
  86.     [o_sprefs_toolbar setAllowsUserCustomization: NO];
  87.     [o_sprefs_toolbar setAutosavesConfiguration: NO];
  88.     [o_sprefs_toolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel];
  89.     [o_sprefs_toolbar setSizeMode: NSToolbarSizeModeRegular];
  90.     [o_sprefs_toolbar setDelegate: self];
  91.     [o_sprefs_win setToolbar: o_sprefs_toolbar];
  92.     
  93.     /* setup useful stuff */
  94.     o_hotkeysNonUseableKeys = [[NSArray arrayWithObjects:
  95.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'c'],
  96.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'x'],
  97.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'v'],
  98.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'a'],
  99.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|','],
  100.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'h'],
  101.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_ALT|'h'],
  102.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'o'],
  103.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'o'],
  104.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'d'],
  105.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'n'],
  106.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'s'],
  107.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'z'],
  108.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'l'],
  109.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'r'],
  110.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'0'],
  111.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'1'],
  112.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'2'],
  113.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'3'],
  114.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'m'],
  115.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'w'],
  116.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'w'],
  117.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'c'],
  118.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'p'],
  119.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'i'],
  120.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'e'],
  121.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'e'],
  122.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'b'],
  123.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|'m'],
  124.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_CTRL|'m'],
  125.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|'?'],
  126.                                 [NSNumber numberWithInt: KEY_MODIFIER_COMMAND|KEY_MODIFIER_ALT|'?'],
  127.                                 nil] retain];
  128. }
  129. #define CreateToolbarItem( o_name, o_desc, o_img, sel ) 
  130.     o_toolbarItem = create_toolbar_item(o_itemIdent, o_name, o_desc, o_img, self, @selector(sel));
  131. static inline NSToolbarItem *
  132. create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_desc, NSString * o_img, id target, SEL selector )
  133. {
  134.     NSToolbarItem *o_toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: o_itemIdent] autorelease]; 
  135.     [o_toolbarItem setLabel: o_name];
  136.     [o_toolbarItem setPaletteLabel: o_desc];
  137.     [o_toolbarItem setToolTip: o_desc];
  138.     [o_toolbarItem setImage: [NSImage imageNamed: o_img]];
  139.     [o_toolbarItem setTarget: target];
  140.     [o_toolbarItem setAction: selector];
  141.     [o_toolbarItem setEnabled: YES];
  142.     [o_toolbarItem setAutovalidates: YES];
  143.     return o_toolbarItem;
  144. }
  145. - (NSToolbarItem *) toolbar: (NSToolbar *)o_sprefs_toolbar 
  146.       itemForItemIdentifier: (NSString *)o_itemIdent 
  147.   willBeInsertedIntoToolbar: (BOOL)b_willBeInserted
  148. {
  149.     NSToolbarItem *o_toolbarItem = nil;
  150.     if( [o_itemIdent isEqual: VLCIntfSettingToolbarIdentifier] )
  151.     {
  152.         CreateToolbarItem( _NS("Interface"), _NS("Interface Settings"), @"spref_cone_Interface_64", showInterfaceSettings );
  153.     }
  154.     else if( [o_itemIdent isEqual: VLCAudioSettingToolbarIdentifier] )
  155.     {
  156.         CreateToolbarItem( _NS("Audio"), _NS("General Audio Settings"), @"spref_cone_Audio_64", showAudioSettings );
  157.     }
  158.     else if( [o_itemIdent isEqual: VLCVideoSettingToolbarIdentifier] )
  159.     {
  160.         CreateToolbarItem( _NS("Video"), _NS("General Video Settings"), @"spref_cone_Video_64", showVideoSettings );
  161.     }
  162.     else if( [o_itemIdent isEqual: VLCOSDSettingToolbarIdentifier] )
  163.     {
  164.         CreateToolbarItem( _NS("Subtitles & OSD"), _NS("Subtitles & On Screen Display Settings"), @"spref_cone_Subtitles_64", showOSDSettings );
  165.     }
  166.     else if( [o_itemIdent isEqual: VLCInputSettingToolbarIdentifier] )
  167.     {
  168.         CreateToolbarItem( _NS("Input & Codecs"), _NS("Input & Codec settings"), @"spref_cone_Input_64", showInputSettings );
  169.     }
  170.     else if( [o_itemIdent isEqual: VLCHotkeysSettingToolbarIdentifier] )
  171.     {
  172.         CreateToolbarItem( _NS("Hotkeys"), _NS("Hotkeys settings"), @"spref_cone_Hotkeys_64", showHotkeySettings );
  173.     }
  174.     return o_toolbarItem;
  175. }
  176. - (NSArray *)toolbarDefaultItemIdentifiers: (NSToolbar *)toolbar
  177. {
  178.     return [NSArray arrayWithObjects: VLCIntfSettingToolbarIdentifier, VLCAudioSettingToolbarIdentifier, VLCVideoSettingToolbarIdentifier, 
  179.         VLCOSDSettingToolbarIdentifier, VLCInputSettingToolbarIdentifier, VLCHotkeysSettingToolbarIdentifier, NSToolbarFlexibleSpaceItemIdentifier, nil];
  180. }
  181. - (NSArray *)toolbarAllowedItemIdentifiers: (NSToolbar *)toolbar
  182. {
  183.     return [NSArray arrayWithObjects: VLCIntfSettingToolbarIdentifier, VLCAudioSettingToolbarIdentifier, VLCVideoSettingToolbarIdentifier, 
  184.         VLCOSDSettingToolbarIdentifier, VLCInputSettingToolbarIdentifier, VLCHotkeysSettingToolbarIdentifier, NSToolbarFlexibleSpaceItemIdentifier, nil];
  185. }
  186. - (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar
  187. {
  188.     return [NSArray arrayWithObjects: VLCIntfSettingToolbarIdentifier, VLCAudioSettingToolbarIdentifier, VLCVideoSettingToolbarIdentifier, 
  189.         VLCOSDSettingToolbarIdentifier, VLCInputSettingToolbarIdentifier, VLCHotkeysSettingToolbarIdentifier, nil];
  190. }
  191. - (void)initStrings
  192. {
  193.     /* audio */
  194.     [o_audio_dolby_txt setStringValue: _NS("Force detection of Dolby Surround")];
  195.     [o_audio_effects_box setTitle: _NS("Effects")];
  196.     [o_audio_enable_ckb setTitle: _NS("Enable Audio")];
  197.     [o_audio_general_box setTitle: _NS("General Audio")];
  198.     [o_audio_headphone_ckb setTitle: _NS("Headphone surround effect")];
  199.     [o_audio_lang_txt setStringValue: _NS("Preferred Audio language")];
  200.     [o_audio_last_ckb setTitle: _NS("Enable Last.fm submissions")];
  201.     [o_audio_lastpwd_txt setStringValue: _NS("Password")];
  202.     [o_audio_lastuser_txt setStringValue: _NS("User name")];
  203.     [o_audio_norm_ckb setTitle: _NS("Volume normalizer")];
  204.     [o_audio_spdif_ckb setTitle: _NS("Use S/PDIF when available")];
  205.     [o_audio_visual_txt setStringValue: _NS("Visualization")];
  206.     [o_audio_vol_txt setStringValue: _NS("Default Volume")];
  207.     /* hotkeys */
  208.     [o_hotkeys_change_btn setTitle: _NS("Change")];
  209.     [o_hotkeys_change_win setTitle: _NS("Change Hotkey")];
  210.     [o_hotkeys_change_cancel_btn setTitle: _NS("Cancel")];
  211.     [o_hotkeys_change_ok_btn setTitle: _NS("OK")];
  212.     [o_hotkeys_clear_btn setTitle: _NS("Clear")];
  213.     [o_hotkeys_lbl setStringValue: _NS("Select an action to change the associated hotkey:")];
  214.     [[[o_hotkeys_listbox tableColumnWithIdentifier: @"action"] headerCell] setStringValue: _NS("Action")];
  215.     [[[o_hotkeys_listbox tableColumnWithIdentifier: @"shortcut"] headerCell] setStringValue: _NS("Shortcut")];
  216.     /* input */
  217.     [o_input_avi_txt setStringValue: _NS("Repair AVI Files")];
  218.     [o_input_cachelevel_txt setStringValue: _NS("Default Caching Level")];
  219.     [o_input_caching_box setTitle: _NS("Caching")];
  220.     [o_input_cachelevel_custom_txt setStringValue: _NS("Use the complete preferences to configure custom caching values for each access module.")];
  221.     [o_input_httpproxy_txt setStringValue: _NS("HTTP Proxy")];
  222.     [o_input_httpproxypwd_txt setStringValue: _NS("Password for HTTP Proxy")];
  223.     [o_input_mux_box setTitle: _NS("Codecs / Muxers")];
  224.     [o_input_net_box setTitle: _NS("Network")];
  225.     [o_input_postproc_txt setStringValue: _NS("Post-Processing Quality")];
  226.     [o_input_rtsp_ckb setTitle: _NS("Use RTP over RTSP (TCP)")];
  227.     [o_input_skipLoop_txt setStringValue: _NS("Skip the loop filter for H.264 decoding")];
  228.     [o_input_serverport_txt setStringValue: _NS("Default Server Port")];
  229.     /* interface */
  230.     [o_intf_art_txt setStringValue: _NS("Album art download policy")];
  231.     [o_intf_embedded_ckb setTitle: _NS("Add controls to the video window")];
  232.     [o_intf_fspanel_ckb setTitle: _NS("Show Fullscreen Controller")];
  233.     [o_intf_lang_txt setStringValue: _NS("Language")];
  234.     [o_intf_network_box setTitle: _NS("Privacy / Network Interaction")];
  235. [o_intf_appleremote_ckb setTitle: _NS("Control playback with the Apple Remote")];
  236. [o_intf_mediakeys_ckb setTitle: _NS("Control playback with media keys")];
  237.     [o_intf_mediakeys_bg_ckb setTitle: _NS("...when VLC is in background")];
  238.     /* Subtitles and OSD */
  239.     [o_osd_encoding_txt setStringValue: _NS("Default Encoding")];
  240.     [o_osd_font_box setTitle: _NS("Display Settings")];
  241.     [o_osd_font_btn setTitle: _NS("Choose...")];
  242.     [o_osd_font_color_txt setStringValue: _NS("Font Color")];
  243.     [o_osd_font_size_txt setStringValue: _NS("Font Size")];
  244.     [o_osd_font_txt setStringValue: _NS("Font")];
  245.     [o_osd_lang_box setTitle: _NS("Subtitle Languages")];
  246.     [o_osd_lang_txt setStringValue: _NS("Preferred Subtitle Language")];
  247.     [o_osd_osd_box setTitle: _NS("On Screen Display")];
  248.     [o_osd_osd_ckb setTitle: _NS("Enable OSD")];
  249.     /* video */
  250.     [o_video_black_ckb setTitle: _NS("Black screens in Fullscreen mode")];
  251.     [o_video_device_txt setStringValue: _NS("Fullscreen Video Device")];
  252.     [o_video_display_box setTitle: _NS("Display")];
  253.     [o_video_enable_ckb setTitle: _NS("Enable Video")];
  254.     [o_video_fullscreen_ckb setTitle: _NS("Fullscreen")];
  255.     [o_video_onTop_ckb setTitle: _NS("Always on top")];
  256.     [o_video_output_txt setStringValue: _NS("Output module")];
  257.     [o_video_skipFrames_ckb setTitle: _NS("Skip frames")];
  258.     [o_video_snap_box setTitle: _NS("Video snapshots")];
  259.     [o_video_snap_folder_btn setTitle: _NS("Browse...")];
  260.     [o_video_snap_folder_txt setStringValue: _NS("Folder")];
  261.     [o_video_snap_format_txt setStringValue: _NS("Format")];
  262.     [o_video_snap_prefix_txt setStringValue: _NS("Prefix")];
  263.     [o_video_snap_seqnum_ckb setTitle: _NS("Sequential numbering")];
  264.     
  265.     /* generic stuff */
  266.     [[o_sprefs_basicFull_matrix cellAtRow: 0 column: 0] setStringValue: _NS("Basic")];
  267.     [[o_sprefs_basicFull_matrix cellAtRow: 0 column: 1] setStringValue: _NS("All")];
  268.     [o_sprefs_cancel_btn setTitle: _NS("Cancel")];
  269.     [o_sprefs_reset_btn setTitle: _NS("Reset All")];
  270.     [o_sprefs_save_btn setTitle: _NS("Save")];
  271.     [o_sprefs_win setTitle: _NS("Preferences")];
  272. }
  273. /* TODO: move this part to core */
  274. #define config_GetLabel(a,b) __config_GetLabel(VLC_OBJECT(a),b)
  275. static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_name )
  276. {
  277.     module_config_t *p_config;
  278.     p_config = config_FindConfig( p_this, psz_name );
  279.     /* sanity checks */
  280.     if( !p_config )
  281.     {
  282.         msg_Err( p_this, "option %s does not exist", psz_name );
  283.         return NULL;
  284.     }
  285.     if ( p_config->psz_longtext )
  286.         return p_config->psz_longtext;
  287.     else if( p_config->psz_text )
  288.         return p_config->psz_text;
  289.     else
  290.         msg_Warn( p_this, "option %s does not include any help", psz_name );
  291.     return NULL;
  292. }
  293. - (void)setupButton: (NSPopUpButton *)object forStringList: (const char *)name
  294. {
  295.     module_config_t *p_item;
  296.     [object removeAllItems];
  297.     p_item = config_FindConfig( VLC_OBJECT(p_intf), name );
  298.     /* serious problem, if no item found */
  299.     assert( p_item );
  300.     for( int i = 0; i < p_item->i_list; i++ )
  301.     {
  302.         NSMenuItem *mi;
  303.         if( p_item->ppsz_list_text != NULL )
  304.             mi = [[NSMenuItem alloc] initWithTitle: _NS( p_item->ppsz_list_text[i] ) action:NULL keyEquivalent: @""];
  305.         else if( p_item->ppsz_list[i] && strcmp(p_item->ppsz_list[i],"") == 0 )
  306.         {
  307.             [[object menu] addItem: [NSMenuItem separatorItem]];
  308.             continue;
  309.         }
  310.         else if( p_item->ppsz_list[i] )
  311.             mi = [[NSMenuItem alloc] initWithTitle: [NSString stringWithUTF8String: p_item->ppsz_list[i]] action:NULL keyEquivalent: @""];
  312.         else 
  313.             msg_Err( VLCIntf, "item %d of pref %s failed to be created", i, name);
  314.         [mi setRepresentedObject:[NSString stringWithUTF8String: p_item->ppsz_list[i]]];
  315.         [[object menu] addItem: mi];
  316.         if( p_item->value.psz && !strcmp( p_item->value.psz, p_item->ppsz_list[i] ) )
  317.             [object selectItem:[object lastItem]];
  318.     }
  319.     [object setToolTip: _NS( p_item->psz_longtext )];
  320. }
  321. - (void)setupButton: (NSPopUpButton *)object forIntList: (const char *)name
  322. {
  323.     module_config_t *p_item;
  324.     [object removeAllItems];
  325.     p_item = config_FindConfig( VLC_OBJECT(p_intf), name );
  326.     /* serious problem, if no item found */
  327.     assert( p_item );
  328.     for( int i = 0; i < p_item->i_list; i++ )
  329.     {
  330.         NSMenuItem *mi;
  331.         if( p_item->ppsz_list_text != NULL)
  332.             mi = [[NSMenuItem alloc] initWithTitle: _NS( p_item->ppsz_list_text[i] ) action:NULL keyEquivalent: @""];
  333.         else if( p_item->pi_list[i] )
  334.             mi = [[NSMenuItem alloc] initWithTitle: [NSString stringWithFormat: @"%d", p_item->pi_list[i]] action:NULL keyEquivalent: @""];
  335.         else NSLog( @"item %d of pref %s failed to be created", i, name);
  336.         [mi setRepresentedObject:[NSNumber numberWithInt: p_item->pi_list[i]]];
  337.         [[object menu] addItem: [mi autorelease]];
  338.         if( p_item->value.i == p_item->pi_list[i] )
  339.             [object selectItem:[object lastItem]];
  340.     }
  341.     [object setToolTip: _NS( p_item->psz_longtext )];
  342. }
  343. - (void)setupButton: (NSPopUpButton *)object forModuleList: (const char *)name
  344. {
  345.     module_config_t *p_item;
  346.     module_t *p_parser, **p_list;
  347.     int y = 0;
  348.     
  349.     [object removeAllItems];
  350.     
  351.     p_item = config_FindConfig( VLC_OBJECT(p_intf), name );
  352.     p_list = module_list_get( NULL );
  353.     if( !p_item ||!p_list )
  354.     {
  355.         if( p_list ) module_list_free(p_list);
  356.         NSLog( @"serious problem, item or list not found" );
  357.         return;
  358.     }
  359.     [object addItemWithTitle: _NS("Default")];
  360.     for( size_t i_index = 0; p_list[i_index]; i_index++ )
  361.     {
  362.         p_parser = p_list[i_index];
  363.         if( module_provides( p_parser, p_item->psz_type ) )
  364.         {
  365.             [object addItemWithTitle: [NSString stringWithUTF8String: module_GetLongName( p_parser ) ?: ""]];
  366.             if( p_item->value.psz && !strcmp( p_item->value.psz, module_get_object( p_parser ) ) )
  367.                 [object selectItem: [object lastItem]];
  368.         }
  369.     }
  370.     module_list_free( p_list );
  371.     [object setToolTip: _NS(p_item->psz_longtext)];
  372. }
  373. - (void)setupButton: (NSButton *)object forBoolValue: (const char *)name
  374. {
  375.     [object setState: config_GetInt( p_intf, name )];
  376.     [object setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, name )]];
  377. }
  378. - (void)setupField:(NSTextField *)o_object forOption:(const char *)psz_option
  379. {
  380.     char *psz_tmp = config_GetPsz( p_intf, psz_option );
  381.     [o_object setStringValue: [NSString stringWithUTF8String: psz_tmp ?: ""]];
  382.     [o_object setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, psz_option )]];
  383.     free( psz_tmp );
  384. }
  385. - (void)resetControls
  386. {
  387.     module_config_t *p_item;
  388.     int i, y = 0;
  389.     char *psz_tmp;
  390.     [[o_sprefs_basicFull_matrix cellAtRow:0 column:0] setState: NSOnState];
  391.     [[o_sprefs_basicFull_matrix cellAtRow:0 column:1] setState: NSOffState];
  392.     
  393.     /**********************
  394.      * interface settings *
  395.      **********************/
  396.     [self setupButton: o_intf_lang_pop forStringList: "language"];
  397.     [self setupButton: o_intf_art_pop forIntList: "album-art"];
  398.     [self setupButton: o_intf_fspanel_ckb forBoolValue: "macosx-fspanel"];
  399.     [self setupButton: o_intf_embedded_ckb forBoolValue: "embedded-video"];
  400. [self setupButton: o_intf_appleremote_ckb forBoolValue: "macosx-appleremote"];
  401. [self setupButton: o_intf_mediakeys_ckb forBoolValue: "macosx-mediakeys"];
  402.     [self setupButton: o_intf_mediakeys_bg_ckb forBoolValue: "macosx-mediakeys-background"];
  403.     [o_intf_mediakeys_bg_ckb setEnabled: [o_intf_mediakeys_ckb state]];
  404.     /******************
  405.      * audio settings *
  406.      ******************/
  407.     [self setupButton: o_audio_enable_ckb forBoolValue: "audio"];
  408.     i = (config_GetInt( p_intf, "volume" ) * 0.390625);
  409.     [o_audio_vol_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "volume")]];
  410.     [o_audio_vol_fld setIntValue: i];
  411.     [o_audio_vol_sld setToolTip: [o_audio_vol_fld toolTip]];
  412.     [o_audio_vol_sld setIntValue: i];
  413.     [self setupButton: o_audio_spdif_ckb forBoolValue: "spdif"];
  414.     [self setupButton: o_audio_dolby_pop forIntList: "force-dolby-surround"];
  415.     [self setupField: o_audio_lang_fld forOption: "audio-language"];
  416.     [self setupButton: o_audio_headphone_ckb forBoolValue: "headphone-dolby"];
  417.     psz_tmp = config_GetPsz( p_intf, "audio-filter" );
  418.     if( psz_tmp )
  419.     {
  420.         [o_audio_norm_ckb setState: (NSInteger)strstr( psz_tmp, "volnorm" )];
  421.         [o_audio_norm_fld setEnabled: [o_audio_norm_ckb state]];
  422.         [o_audio_norm_stepper setEnabled: [o_audio_norm_ckb state]];
  423.         free( psz_tmp );
  424.     }
  425.     [o_audio_norm_fld setFloatValue: config_GetFloat( p_intf, "norm-max-level" )];
  426.     [o_audio_norm_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "norm-max-level")]];
  427.     [self setupButton: o_audio_visual_pop forModuleList: "audio-visual"];
  428.     /* Last.FM is optional */
  429.     if( module_exists( "audioscrobbler" ) )
  430.     {
  431.         [self setupField: o_audio_lastuser_fld forOption:"lastfm-username"];
  432.         [self setupField: o_audio_lastpwd_sfld forOption:"lastfm-password"];
  433.         if( config_ExistIntf( VLC_OBJECT( p_intf ), "audioscrobbler" ) )
  434.         {
  435.             [o_audio_last_ckb setState: NSOnState];
  436.             [o_audio_lastuser_fld setEnabled: YES];
  437.             [o_audio_lastpwd_sfld setEnabled: YES];
  438.         }
  439.         else
  440.         {
  441.             [o_audio_last_ckb setState: NSOffState];
  442.             [o_audio_lastuser_fld setEnabled: NO];
  443.             [o_audio_lastpwd_sfld setEnabled: NO];
  444.         }
  445.     }
  446.     else
  447.         [o_audio_last_ckb setEnabled: NO];
  448.     /******************
  449.      * video settings *
  450.      ******************/
  451.     [self setupButton: o_video_enable_ckb forBoolValue: "video"];
  452.     [self setupButton: o_video_fullscreen_ckb forBoolValue: "fullscreen"];
  453.     [self setupButton: o_video_onTop_ckb forBoolValue: "video-on-top"];
  454.     [self setupButton: o_video_skipFrames_ckb forBoolValue: "skip-frames"];
  455.     [self setupButton: o_video_black_ckb forBoolValue: "macosx-black"];
  456.     [self setupButton: o_video_output_pop forModuleList: "vout"];
  457.     [o_video_device_pop removeAllItems];
  458.     i = 0;
  459.     y = [[NSScreen screens] count];
  460.     [o_video_device_pop addItemWithTitle: _NS("Default")];
  461.     [[o_video_device_pop lastItem] setTag: 0];
  462.     while( i < y )
  463.     {
  464.         NSRect s_rect = [[[NSScreen screens] objectAtIndex: i] frame];
  465.         [o_video_device_pop addItemWithTitle: 
  466.          [NSString stringWithFormat: @"%@ %i (%ix%i)", _NS("Screen"), i+1,
  467.                    (int)s_rect.size.width, (int)s_rect.size.height]];
  468.         [[o_video_device_pop lastItem] setTag: (int)[[[NSScreen screens] objectAtIndex: i] displayID]];
  469.         i++;
  470.     }
  471.     [o_video_device_pop selectItemAtIndex: 0];
  472.     [o_video_device_pop selectItemWithTag: config_GetInt( p_intf, "macosx-vdev" )];
  473.     [self setupField: o_video_snap_folder_fld forOption:"snapshot-path"];
  474.     [self setupField: o_video_snap_prefix_fld forOption:"snapshot-prefix"];
  475.     [self setupButton: o_video_snap_seqnum_ckb forBoolValue: "snapshot-sequential"];
  476.     [self setupButton: o_video_snap_format_pop forStringList: "snapshot-format"];
  477.     /***************************
  478.      * input & codecs settings *
  479.      ***************************/
  480.     [o_input_serverport_fld setIntValue: config_GetInt( p_intf, "server-port")];
  481.     [o_input_serverport_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "server-port")]];
  482.     [self setupField: o_input_httpproxy_fld forOption:"http-proxy"];
  483.     [self setupField: o_input_httpproxypwd_sfld forOption:"http-proxy-pwd"];
  484.     [o_input_postproc_fld setIntValue: config_GetInt( p_intf, "postproc-q")];
  485.     [o_input_postproc_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "postproc-q")]];
  486.     [self setupButton: o_input_avi_pop forIntList: "avi-index"];
  487.     [self setupButton: o_input_rtsp_ckb forBoolValue: "rtsp-tcp"];
  488.     [self setupButton: o_input_skipLoop_pop forIntList: "ffmpeg-skiploopfilter"];
  489.     [o_input_cachelevel_pop removeAllItems];
  490.     [o_input_cachelevel_pop addItemsWithTitles: 
  491.         [NSArray arrayWithObjects: _NS("Custom"), _NS("Lowest latency"), _NS("Low latency"), _NS("Normal"),
  492.             _NS("High latency"), _NS("Higher latency"), nil]];
  493.     [[o_input_cachelevel_pop itemAtIndex: 0] setTag: 0];
  494.     [[o_input_cachelevel_pop itemAtIndex: 1] setTag: 100];
  495.     [[o_input_cachelevel_pop itemAtIndex: 2] setTag: 200];
  496.     [[o_input_cachelevel_pop itemAtIndex: 3] setTag: 300];
  497.     [[o_input_cachelevel_pop itemAtIndex: 4] setTag: 400];
  498.     [[o_input_cachelevel_pop itemAtIndex: 5] setTag: 500];
  499.     
  500. #define TestCaC( name ) 
  501.     b_cache_equal =  b_cache_equal && 
  502.         ( i_cache == config_GetInt( p_intf, name ) )
  503. #define TestCaCi( name, int ) 
  504.         b_cache_equal = b_cache_equal &&  
  505.         ( ( i_cache * int ) == config_GetInt( p_intf, name ) )
  506.     /* Select the accurate value of the PopupButton */
  507.     bool b_cache_equal = true;
  508.     int i_cache = config_GetInt( p_intf, "file-caching");
  509.     
  510.     TestCaC( "udp-caching" );
  511.     if( module_exists ("dvdread") )
  512.         TestCaC( "dvdread-caching" );
  513.     if( module_exists ("dvdnav") )
  514.         TestCaC( "dvdnav-caching" );
  515.     TestCaC( "tcp-caching" );
  516.     TestCaC( "fake-caching" );
  517.     TestCaC( "cdda-caching" );
  518.     TestCaC( "screen-caching" );
  519.     TestCaC( "vcd-caching" );
  520.     TestCaCi( "rtsp-caching", 4 );
  521.     TestCaCi( "ftp-caching", 2 );
  522.     TestCaCi( "http-caching", 4 );
  523.     if(module_exists ("access_realrtsp"))
  524.         TestCaCi( "realrtsp-caching", 10 );
  525.     TestCaCi( "mms-caching", 19 );
  526.     if( b_cache_equal )
  527.     {
  528.         [o_input_cachelevel_pop selectItemWithTag: i_cache];
  529.         [o_input_cachelevel_custom_txt setHidden: YES];
  530.     }
  531.     else
  532.     {
  533.         [o_input_cachelevel_pop selectItemWithTitle: _NS("Custom")];
  534.         [o_input_cachelevel_custom_txt setHidden: NO];
  535.     }
  536.     /*********************
  537.      * subtitle settings *
  538.      *********************/
  539.     [self setupButton: o_osd_osd_ckb forBoolValue: "osd"];
  540.     
  541.     [self setupButton: o_osd_encoding_pop forStringList: "subsdec-encoding"];
  542.     [self setupField: o_osd_lang_fld forOption: "sub-language" ];
  543. if( module_exists( "quartztext" ) )
  544. {
  545. [self setupField: o_osd_font_fld forOption: "quartztext-font"];
  546. [self setupButton: o_osd_font_color_pop forIntList: "quartztext-color"];
  547. [self setupButton: o_osd_font_size_pop forIntList: "quartztext-rel-fontsize"];
  548. }
  549. else 
  550. {
  551.         /* fallback on freetype */
  552.         [o_osd_font_fld setEditable: YES];
  553. [self setupField: o_osd_font_fld forOption: "freetype-font"];
  554. [self setupButton: o_osd_font_color_pop forIntList: "freetype-color"];
  555. [self setupButton: o_osd_font_size_pop forIntList: "freetype-rel-fontsize"];
  556. }
  557.     /********************
  558.      * hotkeys settings *
  559.      ********************/
  560.     const struct hotkey *p_hotkeys = p_intf->p_libvlc->p_hotkeys;
  561.     [o_hotkeySettings release];
  562.     o_hotkeySettings = [[NSMutableArray alloc] init];
  563.     NSMutableArray *o_tempArray_desc = [[NSMutableArray alloc] init];
  564.     i = 1;
  565.     while( i < 100 )
  566.     {
  567.         p_item = config_FindConfig( VLC_OBJECT(p_intf), p_hotkeys[i].psz_action );
  568.         if( !p_item )
  569.             break;
  570.         [o_tempArray_desc addObject: _NS( p_item->psz_text )];
  571.         [o_hotkeySettings addObject: [NSNumber numberWithInt: p_item->value.i]];
  572.         i++;
  573.     }
  574.     [o_hotkeyDescriptions release];
  575.     o_hotkeyDescriptions = [[NSArray alloc] initWithArray: o_tempArray_desc copyItems: YES];
  576.     [o_tempArray_desc release];
  577.     [o_hotkeys_listbox reloadData];
  578. }
  579. - (void)showSimplePrefs
  580. {
  581.     NSAutoreleasePool *o_pool = [[NSAutoreleasePool alloc] init];
  582.     /* we want to show the interface settings, if no category was chosen */
  583.     if( [[o_sprefs_win toolbar] selectedItemIdentifier] == nil )
  584.     {
  585.         [[o_sprefs_win toolbar] setSelectedItemIdentifier: VLCIntfSettingToolbarIdentifier];
  586.         [self showInterfaceSettings];
  587.     }
  588.     
  589.     [self resetControls];
  590.     [o_sprefs_win center];
  591.     [o_sprefs_win makeKeyAndOrderFront: self];
  592.     [o_pool release];
  593. }
  594. - (IBAction)buttonAction:(id)sender
  595. {
  596.     if( sender == o_sprefs_cancel_btn )
  597.         [o_sprefs_win orderOut: sender];
  598.     else if( sender == o_sprefs_save_btn )
  599.     {
  600.         [self saveChangedSettings];
  601.         [o_sprefs_win orderOut: sender];
  602.     }
  603.     else if( sender == o_sprefs_reset_btn )
  604.         NSBeginInformationalAlertSheet( _NS("Reset Preferences"), _NS("Cancel"),
  605.                                         _NS("Continue"), nil, o_sprefs_win, self,
  606.                                         @selector(sheetDidEnd: returnCode: contextInfo:), NULL, nil,
  607.                                         _NS("Beware this will reset the VLC media player preferences.n"
  608.                                             "Are you sure you want to continue?") );
  609.     else if( sender == o_sprefs_basicFull_matrix )
  610.     {
  611.         [o_sprefs_win orderOut: self];
  612.         [[o_sprefs_basicFull_matrix cellAtRow:0 column:0] setState: NSOffState];
  613.         [[o_sprefs_basicFull_matrix cellAtRow:0 column:1] setState: NSOnState];
  614.         [[[VLCMain sharedInstance] preferences] showPrefs];
  615.     }
  616.     else
  617.         msg_Warn( p_intf, "unknown buttonAction sender" );
  618. }
  619. - (void)sheetDidEnd:(NSWindow *)o_sheet 
  620.          returnCode:(int)i_return
  621.         contextInfo:(void *)o_context
  622. {
  623.     if( i_return == NSAlertAlternateReturn )
  624.     {
  625.         config_ResetAll( p_intf );
  626.         [self resetControls];
  627.         config_SaveConfigFile( p_intf, NULL );
  628.     }
  629. }
  630. static inline void save_int_list( intf_thread_t * p_intf, id object, const char * name )
  631. {
  632.     NSNumber *p_valueobject;
  633.     module_config_t *p_item;
  634.     p_item = config_FindConfig( VLC_OBJECT(p_intf), name );
  635.     p_valueobject = (NSNumber *)[[object selectedItem] representedObject];
  636.     assert([p_valueobject isKindOfClass:[NSNumber class]]);
  637.     if( p_valueobject) config_PutInt( p_intf, name, [p_valueobject intValue] );
  638. }
  639. static inline void save_string_list( intf_thread_t * p_intf, id object, const char * name )
  640. {
  641.     NSString *p_stringobject;
  642.     module_config_t *p_item;
  643.     p_item = config_FindConfig( VLC_OBJECT(p_intf), name );
  644.     p_stringobject = (NSString *)[[object selectedItem] representedObject];
  645.     assert([p_stringobject isKindOfClass:[NSString class]]);
  646.     if( p_stringobject )
  647.     {
  648.         config_PutPsz( p_intf, name, [p_stringobject UTF8String] );
  649.         [p_stringobject release];
  650.     }
  651. }
  652. static inline void save_module_list( intf_thread_t * p_intf, id object, const char * name )
  653. {
  654.     module_config_t *p_item;
  655.     module_t *p_parser, **p_list;
  656.     p_item = config_FindConfig( VLC_OBJECT(p_intf), name );
  657.     p_list = module_list_get( NULL );
  658.     for( size_t i_module_index = 0; p_list[i_module_index]; i_module_index++ )
  659.     {
  660.         p_parser = p_list[i_module_index];
  661.         if( p_item->i_type == CONFIG_ITEM_MODULE && module_provides( p_parser, p_item->psz_type ) )
  662.         {
  663.             if( [[[object selectedItem] title] isEqualToString: _NS( module_GetLongName( p_parser ) )] )
  664.             {
  665.                 config_PutPsz( p_intf, name, strdup( module_get_object( p_parser )));
  666.                 break;
  667.             }
  668.         }
  669.     }
  670.     module_list_free( p_list );
  671.     if( [[[object selectedItem] title] isEqualToString: _NS( "Default" )] )
  672.         config_PutPsz( p_intf, name, "" );
  673. }
  674. - (void)saveChangedSettings
  675. {
  676.     char *psz_tmp;
  677.     int i;
  678.     
  679. #define SaveIntList( object, name ) save_int_list( p_intf, object, name )
  680.                     
  681. #define SaveStringList( object, name ) save_string_list( p_intf, object, name )
  682. #define SaveModuleList( object, name ) save_module_list( p_intf, object, name )
  683.     /**********************
  684.      * interface settings *
  685.      **********************/
  686.     if( b_intfSettingChanged )
  687.     {
  688.         SaveStringList( o_intf_lang_pop, "language" );
  689.         SaveIntList( o_intf_art_pop, "album-art" );
  690.         config_PutInt( p_intf, "macosx-fspanel", [o_intf_fspanel_ckb state] );
  691.         config_PutInt( p_intf, "embedded-video", [o_intf_embedded_ckb state] );
  692.         config_PutInt( p_intf, "macosx-appleremote", [o_intf_appleremote_ckb state] );
  693. config_PutInt( p_intf, "macosx-mediakeys", [o_intf_mediakeys_ckb state] );
  694.         config_PutInt( p_intf, "macosx-mediakeys-background", [o_intf_mediakeys_bg_ckb state] );
  695. /* activate stuff without restart */
  696. if( [o_intf_appleremote_ckb state] == YES )
  697. [[[VLCMain sharedInstance] appleRemoteController] startListening: [VLCMain sharedInstance]];
  698. else
  699. [[[VLCMain sharedInstance] appleRemoteController] stopListening: [VLCMain sharedInstance]];
  700.         [[NSNotificationCenter defaultCenter] postNotificationName: @"VLCMediaKeySupportSettingChanged" 
  701.                                                             object: nil
  702.                                                           userInfo: nil];
  703.         /* okay, let's save our changes to vlcrc */
  704.         i = config_SaveConfigFile( p_intf, "main" );
  705.         i = i + config_SaveConfigFile( p_intf, "macosx" );
  706.         if( i != 0 )
  707.         {
  708.             msg_Err( p_intf, "An error occurred while saving the Interface settings using SimplePrefs (%i)", i );
  709.             dialog_Fatal( p_intf, _("Interface Settings not saved"),
  710.                         _("An error occured while saving your settings via SimplePrefs (%i)."), i );
  711.             i = 0;
  712.         }
  713.         b_intfSettingChanged = NO;
  714.     }
  715.     
  716.     /******************
  717.      * audio settings *
  718.      ******************/
  719.     if( b_audioSettingChanged )
  720.     {
  721.         config_PutInt( p_intf, "audio", [o_audio_enable_ckb state] );
  722.         config_PutInt( p_intf, "volume", ([o_audio_vol_sld intValue] * 2.56));
  723.         NSLog( @"slider=%i, pref=%i", [o_audio_vol_sld intValue], config_GetInt( p_intf, "volume" ));
  724.         config_PutInt( p_intf, "spdif", [o_audio_spdif_ckb state] );
  725.         SaveIntList( o_audio_dolby_pop, "force-dolby-surround" );
  726.         config_PutPsz( p_intf, "audio-language", [[o_audio_lang_fld stringValue] UTF8String] );
  727.         config_PutInt( p_intf, "headphone-dolby", [o_audio_headphone_ckb state] );
  728.         if( [o_audio_norm_ckb state] == NSOnState )
  729.         {
  730.             psz_tmp = config_GetPsz( p_intf, "audio-filter" );
  731.             if(! psz_tmp)
  732.                 config_PutPsz( p_intf, "audio-filter", "volnorm" );
  733.             else if( (NSInteger)strstr( psz_tmp, "normvol" ) == NO )
  734.             {
  735.                 /* work-around a GCC 4.0.1 bug */
  736.                 psz_tmp = (char *)[[NSString stringWithFormat: @"%s:volnorm", psz_tmp] UTF8String];
  737.                 config_PutPsz( p_intf, "audio-filter", psz_tmp );
  738.                 free( psz_tmp );
  739.             }
  740.         }
  741.         else
  742.         {
  743.             psz_tmp = config_GetPsz( p_intf, "audio-filter" );
  744.             if( psz_tmp )
  745.             {
  746.                 char *psz_tmp2 = (char *)[[[NSString stringWithUTF8String: psz_tmp] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@":volnorm"]] UTF8String];
  747.                 psz_tmp2 = (char *)[[[NSString stringWithUTF8String: psz_tmp2] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"volnorm:"]] UTF8String];
  748.                 psz_tmp2 = (char *)[[[NSString stringWithUTF8String: psz_tmp2] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"volnorm"]] UTF8String];
  749.                 config_PutPsz( p_intf, "audio-filter", psz_tmp );
  750.                 free( psz_tmp );
  751.             }
  752.         }
  753.         config_PutFloat( p_intf, "norm-max-level", [o_audio_norm_fld floatValue] );
  754.         SaveModuleList( o_audio_visual_pop, "audio-visual" );
  755.         /* Last.FM is optional */
  756.         if( module_exists( "audioscrobbler" ) )
  757.         {   
  758.             [o_audio_last_ckb setEnabled: YES];
  759.             if( [o_audio_last_ckb state] == NSOnState )
  760.                 config_AddIntf( p_intf, "audioscrobbler" );
  761.             else
  762.                 config_RemoveIntf( p_intf, "audioscrobbler" );
  763.             config_PutPsz( p_intf, "lastfm-username", [[o_audio_lastuser_fld stringValue] UTF8String] );
  764.             config_PutPsz( p_intf, "lastfm-password", [[o_audio_lastpwd_sfld stringValue] UTF8String] );
  765.         }
  766.         else
  767.             [o_audio_last_ckb setEnabled: NO];
  768.         /* okay, let's save our changes to vlcrc */
  769.         i = config_SaveConfigFile( p_intf, "main" );
  770.         i = i + config_SaveConfigFile( p_intf, "audioscrobbler" );
  771.         i = i + config_SaveConfigFile( p_intf, "volnorm" );
  772.         if( i != 0 )
  773.         {
  774.             msg_Err( p_intf, "An error occurred while saving the Audio settings using SimplePrefs (%i)", i );
  775.             dialog_Fatal( p_intf, _("Audio Settings not saved"),
  776.                         _("An error occured while saving your settings via SimplePrefs (%i)."), i );
  777.             
  778.             i = 0;
  779.         }
  780.         b_audioSettingChanged = NO;
  781.     }
  782.     
  783.     /******************
  784.      * video settings *
  785.      ******************/
  786.     if( b_videoSettingChanged )
  787.     {
  788.         config_PutInt( p_intf, "video", [o_video_enable_ckb state] );
  789.         config_PutInt( p_intf, "fullscreen", [o_video_fullscreen_ckb state] );
  790.         config_PutInt( p_intf, "video-on-top", [o_video_onTop_ckb state] );
  791.         config_PutInt( p_intf, "skip-frames", [o_video_skipFrames_ckb state] );
  792.         config_PutInt( p_intf, "macosx-black", [o_video_black_ckb state] );
  793.         SaveModuleList( o_video_output_pop, "vout" );
  794.         config_PutInt( p_intf, "macosx-vdev", [[o_video_device_pop selectedItem] tag] );
  795.         config_PutPsz( p_intf, "snapshot-path", [[o_video_snap_folder_fld stringValue] UTF8String] );
  796.         config_PutPsz( p_intf, "snapshot-prefix", [[o_video_snap_prefix_fld stringValue] UTF8String] );
  797.         config_PutInt( p_intf, "snapshot-sequential", [o_video_snap_seqnum_ckb state] );
  798.         SaveStringList( o_video_snap_format_pop, "snapshot-format" );
  799.         i = config_SaveConfigFile( p_intf, "main" );
  800.         i = i + config_SaveConfigFile( p_intf, "macosx" );
  801.         if( i != 0 )
  802.         {
  803.             msg_Err( p_intf, "An error occurred while saving the Video settings using SimplePrefs (%i)", i );
  804.             dialog_Fatal( p_intf, _("Video Settings not saved"),
  805.                         _("An error occured while saving your settings via SimplePrefs (%i)."), i );
  806.             i = 0;
  807.         }
  808.         b_videoSettingChanged = NO;
  809.     }
  810.     
  811.     /***************************
  812.      * input & codecs settings *
  813.      ***************************/
  814.     if( b_inputSettingChanged )
  815.     {
  816.         config_PutInt( p_intf, "server-port", [o_input_serverport_fld intValue] );
  817.         config_PutPsz( p_intf, "http-proxy", [[o_input_httpproxy_fld stringValue] UTF8String] );
  818.         config_PutPsz( p_intf, "http-proxy-pwd", [[o_input_httpproxypwd_sfld stringValue] UTF8String] );
  819.         config_PutInt( p_intf, "postproc-q", [o_input_postproc_fld intValue] );
  820.         SaveIntList( o_input_avi_pop, "avi-index" );
  821.         config_PutInt( p_intf, "rtsp-tcp", [o_input_rtsp_ckb state] );
  822.         SaveIntList( o_input_skipLoop_pop, "ffmpeg-skiploopfilter" );
  823.         #define CaCi( name, int ) config_PutInt( p_intf, name, int * [[o_input_cachelevel_pop selectedItem] tag] )
  824.         #define CaC( name ) CaCi( name, 1 )
  825.         msg_Dbg( p_intf, "Adjusting all cache values to: %i", (int)[[o_input_cachelevel_pop selectedItem] tag] );
  826.         CaC( "udp-caching" );
  827.         if( module_exists ( "dvdread" ) )
  828.         {
  829.             CaC( "dvdread-caching" );
  830.             i = i + config_SaveConfigFile( p_intf, "dvdread" );
  831.         }
  832.         if( module_exists ( "dvdnav" ) )
  833.         {
  834.             CaC( "dvdnav-caching" );
  835.             i = i + config_SaveConfigFile( p_intf, "dvdnav" );
  836.         }
  837.         CaC( "tcp-caching" ); CaC( "vcd-caching" );
  838.         CaC( "fake-caching" ); CaC( "cdda-caching" ); CaC( "file-caching" );
  839.         CaC( "screen-caching" );
  840.         CaCi( "rtsp-caching", 4 ); CaCi( "ftp-caching", 2 );
  841.         CaCi( "http-caching", 4 );
  842.         if( module_exists ( "access_realrtsp" ) )
  843.         {
  844.             CaCi( "realrtsp-caching", 10 );
  845.             i = i + config_SaveConfigFile( p_intf, "access_realrtsp" );
  846.         }
  847.         CaCi( "mms-caching", 19 );
  848.         i = config_SaveConfigFile( p_intf, "main" );
  849.         i = i + config_SaveConfigFile( p_intf, "avcodec" );
  850.         i = i + config_SaveConfigFile( p_intf, "postproc" );
  851.         i = i + config_SaveConfigFile( p_intf, "access_http" );
  852.         i = i + config_SaveConfigFile( p_intf, "access_file" );
  853.         i = i + config_SaveConfigFile( p_intf, "access_tcp" );
  854.         i = i + config_SaveConfigFile( p_intf, "access_fake" );
  855.         i = i + config_SaveConfigFile( p_intf, "cdda" );
  856.         i = i + config_SaveConfigFile( p_intf, "screen" );
  857.         i = i + config_SaveConfigFile( p_intf, "vcd" );
  858.         i = i + config_SaveConfigFile( p_intf, "access_ftp" );
  859.         i = i + config_SaveConfigFile( p_intf, "access_mms" );
  860.         i = i + config_SaveConfigFile( p_intf, "live555" );
  861.         i = i + config_SaveConfigFile( p_intf, "avi" );
  862.         if( i != 0 )
  863.         {
  864.             msg_Err( p_intf, "An error occurred while saving the Input settings using SimplePrefs (%i)", i );
  865.             dialog_Fatal( p_intf, _("Input Settings not saved"),
  866.                         _("An error occured while saving your settings via SimplePrefs (%i)."), i );
  867.             i = 0;
  868.         }
  869.         b_inputSettingChanged = NO;
  870.     }
  871.     
  872.     /**********************
  873.      * subtitles settings *
  874.      **********************/
  875.     if( b_osdSettingChanged )
  876.     {
  877.         config_PutInt( p_intf, "osd", [o_osd_osd_ckb state] );
  878.         if( [o_osd_encoding_pop indexOfSelectedItem] >= 0 )
  879.             SaveStringList( o_osd_encoding_pop, "subsdec-encoding" );
  880.         else
  881.             config_PutPsz( p_intf, "subsdec-encoding", "" );
  882.         config_PutPsz( p_intf, "sub-language", [[o_osd_lang_fld stringValue] UTF8String] );
  883.         
  884. if( module_exists( "quartztext" ) )
  885. {
  886. config_PutPsz( p_intf, "quartztext-font", [[o_osd_font_fld stringValue] UTF8String] );
  887. SaveIntList( o_osd_font_color_pop, "quartztext-color" );
  888. SaveIntList( o_osd_font_size_pop, "quartztext-rel-fontsize" );
  889. }
  890. else
  891. {
  892.             /* fallback on freetype */
  893. config_PutPsz( p_intf, "freetype-font", [[o_osd_font_fld stringValue] UTF8String] );
  894. SaveIntList( o_osd_font_color_pop, "freetype-color" );
  895. SaveIntList( o_osd_font_size_pop, "freetype-rel-fontsize" );                
  896. }
  897.         i = config_SaveConfigFile( p_intf, NULL );
  898.         if( i != 0 )
  899.         {
  900.             msg_Err( p_intf, "An error occurred while saving the OSD/Subtitle settings using SimplePrefs (%i)", i );
  901.             dialog_Fatal( p_intf, _("On Screen Display/Subtitle Settings not saved"),
  902.                         _("An error occured while saving your settings via SimplePrefs (%i)."), i );
  903.             i = 0;
  904.         }
  905.         b_osdSettingChanged = NO;
  906.     }
  907.     
  908.     /********************
  909.      * hotkeys settings *
  910.      ********************/
  911.     if( b_hotkeyChanged )
  912.     {
  913.         const struct hotkey *p_hotkeys = p_intf->p_libvlc->p_hotkeys;
  914.         i = 1;
  915.         while( i < [o_hotkeySettings count] )
  916.         {
  917.             config_PutInt( p_intf, p_hotkeys[i].psz_action, [[o_hotkeySettings objectAtIndex: i-1] intValue] );
  918.             i++;
  919.         }        
  920.         i = config_SaveConfigFile( p_intf, "main" );
  921.         if( i != 0 )
  922.         {
  923.             msg_Err( p_intf, "An error occurred while saving the Hotkey settings using SimplePrefs (%i)", i );
  924.             dialog_Fatal( p_intf, _("Hotkeys not saved"),
  925.                         _("An error occured while saving your settings via SimplePrefs (%i)."), i );
  926.             i = 0;
  927.         }
  928.         b_hotkeyChanged = NO;
  929.     }
  930. }
  931. - (void)showSettingsForCategory: (id)o_new_category_view
  932. {
  933.     NSRect o_win_rect, o_view_rect, o_old_view_rect;
  934.     o_win_rect = [o_sprefs_win frame];
  935.     o_view_rect = [o_new_category_view frame];
  936.     
  937.     if( o_currentlyShownCategoryView != nil )
  938.     {
  939.         /* restore our window's height, if we've shown another category previously */
  940.         o_old_view_rect = [o_currentlyShownCategoryView frame];
  941.         o_win_rect.size.height = o_win_rect.size.height - o_old_view_rect.size.height;
  942.         o_win_rect.origin.y = ( o_win_rect.origin.y + o_old_view_rect.size.height ) - o_view_rect.size.height;
  943.         /* remove our previous category view */
  944.         [o_currentlyShownCategoryView removeFromSuperviewWithoutNeedingDisplay];
  945.     }
  946.     
  947.     o_win_rect.size.height = o_win_rect.size.height + o_view_rect.size.height;
  948.     
  949.     [o_sprefs_win displayIfNeeded];
  950.     [o_sprefs_win setFrame: o_win_rect display:YES animate: YES];
  951.     
  952.     [o_new_category_view setFrame: NSMakeRect( 0, 
  953.                                                [o_sprefs_controls_box frame].size.height, 
  954.                                                o_view_rect.size.width, 
  955.                                                o_view_rect.size.height )];
  956.     [o_new_category_view setNeedsDisplay: YES];
  957.     [o_new_category_view setAutoresizesSubviews: YES];
  958.     [[o_sprefs_win contentView] addSubview: o_new_category_view];
  959.     
  960.     /* keep our current category for further reference */
  961.     [o_currentlyShownCategoryView release];
  962.     o_currentlyShownCategoryView = o_new_category_view;
  963.     [o_currentlyShownCategoryView retain];
  964. }
  965. - (IBAction)interfaceSettingChanged:(id)sender
  966. {
  967.     if( sender == o_intf_mediakeys_ckb )
  968.         [o_intf_mediakeys_bg_ckb setEnabled: [o_intf_mediakeys_ckb state]];
  969.     b_intfSettingChanged = YES;
  970. }
  971. - (void)showInterfaceSettings
  972. {
  973.     [self showSettingsForCategory: o_intf_view];
  974. }
  975. - (IBAction)audioSettingChanged:(id)sender
  976. {
  977.     if( sender == o_audio_vol_sld )
  978.         [o_audio_vol_fld setIntValue: [o_audio_vol_sld intValue]];
  979.     if( sender == o_audio_vol_fld )
  980.         [o_audio_vol_sld setIntValue: [o_audio_vol_fld intValue]];
  981.     if( sender == o_audio_norm_ckb )
  982.     {
  983.         [o_audio_norm_stepper setEnabled: [o_audio_norm_ckb state]];
  984.         [o_audio_norm_fld setEnabled: [o_audio_norm_ckb state]];
  985.     }    
  986.     
  987.     if( sender == o_audio_last_ckb )
  988.     {
  989.         if( [o_audio_last_ckb state] == NSOnState )
  990.         {
  991.             [o_audio_lastpwd_sfld setEnabled: YES];
  992.             [o_audio_lastuser_fld setEnabled: YES];
  993.         }
  994.         else
  995.         {
  996.             [o_audio_lastpwd_sfld setEnabled: NO];
  997.             [o_audio_lastuser_fld setEnabled: NO];
  998.         }
  999.     }
  1000.     b_audioSettingChanged = YES;
  1001. }
  1002. - (void)showAudioSettings
  1003. {
  1004.     [self showSettingsForCategory: o_audio_view];
  1005. }
  1006. - (IBAction)videoSettingChanged:(id)sender
  1007. {
  1008.     if( sender == o_video_snap_folder_btn )
  1009.     {
  1010.         o_selectFolderPanel = [[NSOpenPanel alloc] init];
  1011.         [o_selectFolderPanel setCanChooseDirectories: YES];
  1012.         [o_selectFolderPanel setCanChooseFiles: NO];
  1013.         [o_selectFolderPanel setResolvesAliases: YES];
  1014.         [o_selectFolderPanel setAllowsMultipleSelection: NO];
  1015.         [o_selectFolderPanel setMessage: _NS("Choose the folder to save your video snapshots to.")];
  1016.         [o_selectFolderPanel setCanCreateDirectories: YES];
  1017.         [o_selectFolderPanel setPrompt: _NS("Choose")];
  1018.         [o_selectFolderPanel beginSheetForDirectory: nil file: nil modalForWindow: o_sprefs_win 
  1019.                                       modalDelegate: self 
  1020.                                      didEndSelector: @selector(savePanelDidEnd:returnCode:contextInfo:)
  1021.                                         contextInfo: o_video_snap_folder_btn];
  1022.     }
  1023.     else
  1024.         b_videoSettingChanged = YES;
  1025. }
  1026. - (void)savePanelDidEnd:(NSOpenPanel * )panel returnCode: (int)returnCode contextInfo: (void *)contextInfo
  1027. {
  1028.     if( returnCode == NSOKButton )
  1029.     {
  1030.         if( contextInfo == o_video_snap_folder_btn )
  1031.         {
  1032.             [o_video_snap_folder_fld setStringValue: [o_selectFolderPanel filename]];
  1033.             b_videoSettingChanged = YES;
  1034.         }
  1035.     }
  1036.     [o_selectFolderPanel release];
  1037. }
  1038. - (void)showVideoSettings
  1039. {
  1040.     [self showSettingsForCategory: o_video_view];
  1041. }
  1042. - (IBAction)osdSettingChanged:(id)sender
  1043. {
  1044.     b_osdSettingChanged = YES;
  1045. }
  1046. - (void)showOSDSettings
  1047. {
  1048.     [self showSettingsForCategory: o_osd_view];
  1049. }
  1050. - (IBAction)showFontPicker:(id)sender
  1051. {
  1052. if( module_exists( "quartztext" ) )
  1053. {
  1054. char * font = config_GetPsz( p_intf, "quartztext-font" );
  1055. NSString * fontFamilyName = font ? [NSString stringWithUTF8String: font] : nil;
  1056. free(font);
  1057. if( fontFamilyName )
  1058. {
  1059. NSFontDescriptor * fd = [NSFontDescriptor fontDescriptorWithFontAttributes:nil];
  1060. NSFont * font = [NSFont fontWithDescriptor:[fd fontDescriptorWithFamily:fontFamilyName] textTransform:nil];
  1061. [[NSFontManager sharedFontManager] setSelectedFont:font isMultiple:NO];
  1062. }
  1063. [[NSFontManager sharedFontManager] setTarget: self];
  1064. [[NSFontPanel sharedFontPanel] orderFront:self];
  1065. }
  1066. else 
  1067. {
  1068. [sender setEnabled: NO];
  1069. }
  1070. }
  1071. - (void)changeFont:(id)sender
  1072. {
  1073.     NSFont * font = [sender convertFont:[[NSFontManager sharedFontManager] selectedFont]];
  1074.     [o_osd_font_fld setStringValue:[font familyName]];
  1075.     [self osdSettingChanged:self];
  1076. }
  1077. - (IBAction)inputSettingChanged:(id)sender
  1078. {
  1079.     if( sender == o_input_cachelevel_pop )
  1080.     {
  1081.         if( [[[o_input_cachelevel_pop selectedItem] title] isEqualToString: _NS("Custom")] )
  1082.             [o_input_cachelevel_custom_txt setHidden: NO];
  1083.         else
  1084.             [o_input_cachelevel_custom_txt setHidden: YES];
  1085.     }
  1086.     b_inputSettingChanged = YES;
  1087. }
  1088. - (void)showInputSettings
  1089. {
  1090.     [self showSettingsForCategory: o_input_view];
  1091. }
  1092. - (IBAction)hotkeySettingChanged:(id)sender
  1093. {
  1094.     if( sender == o_hotkeys_change_btn || sender == o_hotkeys_listbox )
  1095.     {
  1096.         [o_hotkeys_change_lbl setStringValue: [NSString stringWithFormat: _NS("Press new keys forn"%@""), 
  1097.                                                [o_hotkeyDescriptions objectAtIndex: [o_hotkeys_listbox selectedRow]]]];
  1098.         [o_hotkeys_change_keys_lbl setStringValue: [self OSXKeyToString:[[o_hotkeySettings objectAtIndex: [o_hotkeys_listbox selectedRow]] intValue]]];
  1099.         [o_hotkeys_change_taken_lbl setStringValue: @""];
  1100.         [o_hotkeys_change_win setInitialFirstResponder: [o_hotkeys_change_win contentView]];
  1101.         [o_hotkeys_change_win makeFirstResponder: [o_hotkeys_change_win contentView]];
  1102.         [NSApp runModalForWindow: o_hotkeys_change_win];
  1103.     }
  1104.     else if( sender == o_hotkeys_change_cancel_btn )
  1105.     {
  1106.         [NSApp stopModal];
  1107.         [o_hotkeys_change_win close];
  1108.     }
  1109.     else if( sender == o_hotkeys_change_ok_btn )
  1110.     {
  1111.         NSInteger i_returnValue;
  1112.         if(! o_keyInTransition )
  1113.         {
  1114.             [NSApp stopModal];
  1115.             [o_hotkeys_change_win close];
  1116.             msg_Err( p_intf, "internal error prevented the hotkey switch" );
  1117.             return;
  1118.         }
  1119.         b_hotkeyChanged = YES;
  1120.         i_returnValue = [o_hotkeySettings indexOfObject: o_keyInTransition];
  1121.         if( i_returnValue != NSNotFound )
  1122.             [o_hotkeySettings replaceObjectAtIndex: i_returnValue withObject: [[NSNumber numberWithInt: 0] retain]];
  1123.         [o_hotkeySettings replaceObjectAtIndex: [o_hotkeys_listbox selectedRow] withObject: [o_keyInTransition retain]];
  1124.         [NSApp stopModal];
  1125.         [o_hotkeys_change_win close];
  1126.         [o_hotkeys_listbox reloadData];
  1127.     }
  1128.     else if( sender == o_hotkeys_clear_btn )
  1129.     {
  1130.         [o_hotkeySettings replaceObjectAtIndex: [o_hotkeys_listbox selectedRow] withObject: [NSNumber numberWithInt: 0]];
  1131.         [o_hotkeys_listbox reloadData];
  1132.         b_hotkeyChanged = YES;
  1133.     }
  1134. }
  1135. - (void)showHotkeySettings
  1136. {
  1137.     [self showSettingsForCategory: o_hotkeys_view];
  1138. }
  1139. - (int)numberOfRowsInTableView:(NSTableView *)aTableView
  1140. {
  1141.     return [o_hotkeySettings count];
  1142. }
  1143. - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
  1144. {
  1145.     if( [[aTableColumn identifier] isEqualToString: @"action"] )
  1146.         return [o_hotkeyDescriptions objectAtIndex: rowIndex];
  1147.     else if( [[aTableColumn identifier] isEqualToString: @"shortcut"] )
  1148.         return [self OSXKeyToString: [[o_hotkeySettings objectAtIndex: rowIndex] intValue]];
  1149.     else
  1150.     {
  1151.         msg_Err( p_intf, "unknown TableColumn identifier (%s)!", [[aTableColumn identifier] UTF8String] );
  1152.         return NULL;
  1153.     }
  1154. }
  1155. - (BOOL)changeHotkeyTo: (int)i_theNewKey
  1156. {
  1157.     NSInteger i_returnValue;
  1158.     i_returnValue = [o_hotkeysNonUseableKeys indexOfObject: [NSNumber numberWithInt: i_theNewKey]];
  1159.     if( i_returnValue != NSNotFound || i_theNewKey == 0 )
  1160.     {
  1161.         [o_hotkeys_change_keys_lbl setStringValue: _NS("Invalid combination")];
  1162.         [o_hotkeys_change_taken_lbl setStringValue: _NS("Regrettably, these keys cannot be assigned as hotkey shortcuts.")];
  1163.         [o_hotkeys_change_ok_btn setEnabled: NO];
  1164.         return NO;
  1165.     }
  1166.     else
  1167.     {
  1168.         NSString *o_temp;
  1169.         if( o_keyInTransition )
  1170.             [o_keyInTransition release];
  1171.         o_keyInTransition = [[NSNumber numberWithInt: i_theNewKey] retain];
  1172.         o_temp = [self OSXKeyToString: i_theNewKey];
  1173.         [o_hotkeys_change_keys_lbl setStringValue: o_temp];
  1174.         i_returnValue = [o_hotkeySettings indexOfObject: o_keyInTransition];
  1175.         if( i_returnValue != NSNotFound )
  1176.             [o_hotkeys_change_taken_lbl setStringValue: [NSString stringWithFormat:
  1177.                                                          _NS("This combination is already taken by "%@"."),
  1178.                                                          [o_hotkeyDescriptions objectAtIndex: i_returnValue]]];
  1179.         else
  1180.             [o_hotkeys_change_taken_lbl setStringValue: @""];
  1181.         [o_hotkeys_change_ok_btn setEnabled: YES];
  1182.         return YES;
  1183.     }
  1184. }
  1185.     
  1186. @end
  1187. /********************
  1188.  * hotkeys settings *
  1189.  ********************/
  1190. @implementation VLCHotkeyChangeWindow
  1191. - (BOOL)acceptsFirstResponder
  1192. {
  1193.     return YES;
  1194. }
  1195. - (BOOL)becomeFirstResponder
  1196. {
  1197.     return YES;
  1198. }
  1199. - (BOOL)resignFirstResponder
  1200. {
  1201.     /* We need to stay the first responder or we'll miss the user's input */
  1202.     return NO;
  1203. }
  1204. - (BOOL)performKeyEquivalent:(NSEvent *)o_theEvent
  1205. {
  1206.     unichar key;
  1207.     int i_key = 0;
  1208.     if( [o_theEvent modifierFlags] & NSControlKeyMask )
  1209.         i_key |= KEY_MODIFIER_CTRL;
  1210.     if( [o_theEvent modifierFlags] & NSAlternateKeyMask  )
  1211.         i_key |= KEY_MODIFIER_ALT;
  1212.     if( [o_theEvent modifierFlags] & NSShiftKeyMask )
  1213.         i_key |= KEY_MODIFIER_SHIFT;
  1214.     if( [o_theEvent modifierFlags] & NSCommandKeyMask )
  1215.         i_key |= KEY_MODIFIER_COMMAND;
  1216.     key = [[[o_theEvent charactersIgnoringModifiers] lowercaseString] characterAtIndex: 0];
  1217.     if( key )
  1218.     {
  1219.         i_key |= CocoaKeyToVLC( key );
  1220.         return [[[VLCMain sharedInstance] simplePreferences] changeHotkeyTo: i_key];
  1221.     }
  1222.     return FALSE;
  1223. }
  1224. @end
  1225. @implementation VLCSimplePrefsWindow
  1226. - (BOOL)acceptsFirstResponder
  1227. {
  1228.     return YES;
  1229. }
  1230. - (void)changeFont:(id)sender
  1231. {
  1232.     [[[VLCMain sharedInstance] simplePreferences] changeFont: sender];
  1233. }
  1234. @end