X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2FMainMenu.m;h=2c57585ab8cef52ca3d2d420fe4246aab6047ec3;hb=bcfc1800b448162769d5d54a518e2e0898973c1d;hp=a417102f251724673c86396b02f90db63abe0e80;hpb=7b21794c9130a953d071acfaf9f0cb3469220733;p=vlc diff --git a/modules/gui/macosx/MainMenu.m b/modules/gui/macosx/MainMenu.m index a417102f25..2c57585ab8 100644 --- a/modules/gui/macosx/MainMenu.m +++ b/modules/gui/macosx/MainMenu.m @@ -1,7 +1,7 @@ /***************************************************************************** * MainMenu.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2011-2012 Felix Paul Kühne + * Copyright (C) 2011-2013 Felix Paul Kühne * $Id$ * * Authors: Felix Paul Kühne @@ -41,6 +41,7 @@ #import "VideoView.h" #import "CoreInteraction.h" #import "MainWindow.h" +#import "ControlsBar.h" #import "ExtensionsManager.h" #import "ConvertAndSave.h" @@ -57,13 +58,10 @@ static VLCMainMenu *_o_sharedInstance = nil; - (id)init { - if( _o_sharedInstance) - { + if (_o_sharedInstance) { [self dealloc]; return _o_sharedInstance; - } - else - { + } else { _o_sharedInstance = [super init]; o_ptc_translation_dict = [NSDictionary dictionaryWithObjectsAndKeys: @@ -107,9 +105,11 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_extMgr release]; - if( o_mu_playlistTableColumnsContextMenu ) + if (o_mu_playlistTableColumnsContextMenu) [o_mu_playlistTableColumnsContextMenu release]; + [self releaseRepresentedObjects:[NSApp mainMenu]]; + [super dealloc]; } @@ -119,6 +119,15 @@ static VLCMainMenu *_o_sharedInstance = nil; selector: @selector(applicationWillFinishLaunching:) name: NSApplicationWillFinishLaunchingNotification object: nil]; + + /* check whether the user runs OSX with a RTL language */ + NSArray* languages = [NSLocale preferredLanguages]; + NSString* preferredLanguage = [languages objectAtIndex:0]; + + if ([NSLocale characterDirectionForLanguage:preferredLanguage] == NSLocaleLanguageDirectionRightToLeft) { + msg_Dbg(VLCIntf, "adapting interface since '%s' is a RTL language", [preferredLanguage UTF8String]); + [o_mi_rate_fld setAlignment: NSLeftTextAlignment]; + } } - (void)applicationWillFinishLaunching:(NSNotification *)o_notification @@ -133,7 +142,8 @@ static VLCMainMenu *_o_sharedInstance = nil; /* Check if we already did this once. Opening the other nibs calls it too, because VLCMain is the owner */ - if( b_mainMenu_setup ) return; + if (b_mainMenu_setup) + return; /* Get ExtensionsManager */ o_extMgr = [ExtensionsManager getInstance:p_intf]; @@ -141,101 +151,97 @@ static VLCMainMenu *_o_sharedInstance = nil; [self initStrings]; - key = config_GetPsz( p_intf, "key-quit" ); + key = config_GetPsz(p_intf, "key-quit"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_quit setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_quit setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-play-pause" ); - o_key = [NSString stringWithFormat:@"%s", key]; - [o_mi_play setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; - [o_mi_play setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + // do not assign play/pause key - key = config_GetPsz( p_intf, "key-stop" ); + key = config_GetPsz(p_intf, "key-stop"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_stop setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_stop setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-prev" ); + key = config_GetPsz(p_intf, "key-prev"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_previous setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_previous setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-next" ); + key = config_GetPsz(p_intf, "key-next"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_next setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_next setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-jump+short" ); + key = config_GetPsz(p_intf, "key-jump+short"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_fwd setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_fwd setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-jump-short" ); + key = config_GetPsz(p_intf, "key-jump-short"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_bwd setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_bwd setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-vol-up" ); + key = config_GetPsz(p_intf, "key-vol-up"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_vol_up setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_vol_up setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-vol-down" ); + key = config_GetPsz(p_intf, "key-vol-down"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_vol_down setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_vol_down setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-vol-mute" ); + key = config_GetPsz(p_intf, "key-vol-mute"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_mute setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_mute setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-toggle-fullscreen" ); + key = config_GetPsz(p_intf, "key-toggle-fullscreen"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_fullscreen setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_fullscreen setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-snapshot" ); + key = config_GetPsz(p_intf, "key-snapshot"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_snapshot setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_snapshot setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-random" ); + key = config_GetPsz(p_intf, "key-random"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_random setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_random setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-zoom-half" ); + key = config_GetPsz(p_intf, "key-zoom-half"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_half_window setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_half_window setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-zoom-original" ); + key = config_GetPsz(p_intf, "key-zoom-original"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_normal_window setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_normal_window setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); - key = config_GetPsz( p_intf, "key-zoom-double" ); + key = config_GetPsz(p_intf, "key-zoom-double"); o_key = [NSString stringWithFormat:@"%s", key]; [o_mi_double_window setKeyEquivalent: [o_vlcstringutility VLCKeyToString: o_key]]; [o_mi_double_window setKeyEquivalentModifierMask: [o_vlcstringutility VLCModifiersToCocoa:o_key]]; - FREENULL( key ); + FREENULL(key); [self setSubmenusEnabled: FALSE]; @@ -251,6 +257,43 @@ static VLCMainMenu *_o_sharedInstance = nil; var: "intf-add" selector: @selector(toggleVar:)]; [self setupExtensionsMenu]; + + [self refreshAudioDeviceList]; + + /* setup subtitles menu */ + [self setupMenu: o_mu_subtitle_size withIntList:"freetype-rel-fontsize" andSelector:@selector(switchSubtitleOption:)]; + [self setupMenu: o_mu_subtitle_textcolor withIntList:"freetype-color" andSelector:@selector(switchSubtitleOption:)]; + [o_mi_subtitle_bgopacity_sld setIntValue: config_GetInt(VLC_OBJECT(p_intf), "freetype-background-opacity")]; + [self setupMenu: o_mu_subtitle_bgcolor withIntList:"freetype-background-color" andSelector:@selector(switchSubtitleOption:)]; + [self setupMenu: o_mu_subtitle_outlinethickness withIntList:"freetype-outline-thickness" andSelector:@selector(switchSubtitleOption:)]; +} + +- (void)setupMenu: (NSMenu*)menu withIntList: (char *)psz_name andSelector:(SEL)selector +{ + module_config_t *p_item; + + [menu removeAllItems]; + p_item = config_FindConfig(VLC_OBJECT(p_intf), psz_name); + + /* serious problem, if no item found */ + assert(p_item); + + for (int i = 0; i < p_item->list_count; i++) { + NSMenuItem *mi; + 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, psz_name); + [mi setTarget:self]; + [mi setAction:selector]; + [mi setTag:p_item->list.i[i]]; + [mi setRepresentedObject:[NSString stringWithUTF8String:psz_name]]; + [menu addItem: [mi autorelease]]; + if (p_item->value.i == p_item->list.i[i]) + [mi setState:NSOnState]; + } } - (void)initStrings @@ -278,7 +321,7 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_mi_open_capture setTitle: _NS("Open Capture Device...")]; [o_mi_open_recent setTitle: _NS("Open Recent")]; [o_mi_open_wizard setTitle: _NS("Streaming/Exporting Wizard...")]; - [o_mi_convertandsave setTitle: _NS("Convert / Save...")]; + [o_mi_convertandsave setTitle: _NS("Convert / Stream...")]; [o_mu_edit setTitle: _NS("Edit")]; [o_mi_cut setTitle: _NS("Cut")]; @@ -289,9 +332,13 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_mu_view setTitle: _NS("View")]; [o_mi_toggleJumpButtons setTitle: _NS("Show Previous & Next Buttons")]; - [o_mi_toggleJumpButtons setState: config_GetInt( VLCIntf, "macosx-show-playback-buttons")]; + [o_mi_toggleJumpButtons setState: config_GetInt(VLCIntf, "macosx-show-playback-buttons")]; [o_mi_togglePlaymodeButtons setTitle: _NS("Show Shuffle & Repeat Buttons")]; - [o_mi_togglePlaymodeButtons setState: config_GetInt( VLCIntf, "macosx-show-playmode-buttons")]; + [o_mi_togglePlaymodeButtons setState: config_GetInt(VLCIntf, "macosx-show-playmode-buttons")]; + [o_mi_toggleEffectsButton setTitle: _NS("Show Audio Effects Button")]; + [o_mi_toggleEffectsButton setState: config_GetInt(VLCIntf, "macosx-show-effects-button")]; + [o_mi_toggleSidebar setTitle: _NS("Show Sidebar")]; + [o_mi_toggleSidebar setState: config_GetInt(VLCIntf, "macosx-show-sidebar")]; [o_mu_playlistTableColumns setTitle: _NS("Playlist Table Columns")]; [o_mu_controls setTitle: _NS("Playback")]; @@ -310,6 +357,7 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_mi_random setTitle: _NS("Random")]; [o_mi_repeat setTitle: _NS("Repeat One")]; [o_mi_loop setTitle: _NS("Repeat All")]; + [o_mi_AtoBloop setTitle: _NS("A→B Loop")]; [o_mi_quitAfterPB setTitle: _NS("Quit after Playback")]; [o_mi_fwd setTitle: _NS("Step Forward")]; [o_mi_bwd setTitle: _NS("Step Backward")]; @@ -350,15 +398,24 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_mu_crop setTitle: _NS("Crop")]; [o_mi_screen setTitle: _NS("Fullscreen Video Device")]; [o_mu_screen setTitle: _NS("Fullscreen Video Device")]; - [o_mi_subtitle setTitle: _NS("Subtitles Track")]; - [o_mu_subtitle setTitle: _NS("Subtitles Track")]; - [o_mi_addSub setTitle: _NS("Open File...")]; [o_mi_deinterlace setTitle: _NS("Deinterlace")]; [o_mu_deinterlace setTitle: _NS("Deinterlace")]; [o_mi_deinterlace_mode setTitle: _NS("Deinterlace mode")]; [o_mu_deinterlace_mode setTitle: _NS("Deinterlace mode")]; [o_mi_ffmpeg_pp setTitle: _NS("Post processing")]; [o_mu_ffmpeg_pp setTitle: _NS("Post processing")]; + + [o_mu_subtitles setTitle:_NS("Subtitles")]; + [o_mi_openSubtitleFile setTitle: _NS("Add Subtitle File...")]; + [o_mi_subtitle_track setTitle: _NS("Subtitles Track")]; + [o_mu_subtitle_tracks setTitle: _NS("Subtitles Track")]; + [o_mi_subtitle_size setTitle: _NS("Text Size")]; + [o_mi_subtitle_textcolor setTitle: _NS("Text Color")]; + [o_mi_subtitle_outlinethickness setTitle: _NS("Outline Thickness")]; + [o_mi_subtitle_bgopacity setView: o_mi_subtitle_bgopacity_view]; + [o_mi_subtitle_bgopacity_lbl setStringValue: _NS("Background Opacity")]; + [o_mi_subtitle_bgopacity_lbl_gray setStringValue: _NS("Background Opacity")]; + [o_mi_subtitle_bgcolor setTitle: _NS("Background Color")]; [o_mi_teletext setTitle: _NS("Teletext")]; [o_mi_teletext_transparent setTitle: _NS("Transparent")]; [o_mi_teletext_index setTitle: _NS("Index")]; @@ -373,7 +430,7 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_mi_player setTitle: _NS("Player...")]; [o_mi_controller setTitle: _NS("Main Window...")]; [o_mi_audioeffects setTitle: _NS("Audio Effects...")]; - [o_mi_videoeffects setTitle: _NS("Video Filters...")]; + [o_mi_videoeffects setTitle: _NS("Video Effects...")]; [o_mi_bookmarks setTitle: _NS("Bookmarks...")]; [o_mi_playlist setTitle: _NS("Playlist...")]; [o_mi_info setTitle: _NS("Media Information...")]; @@ -415,22 +472,26 @@ static VLCMainMenu *_o_sharedInstance = nil; NSMenu *o_context_menu = [[NSMenu alloc] init]; NSMenuItem *o_mi_tmp; - for( NSUInteger i = 0; i < [o_ptc_menuorder count]; i++ ) - { + NSUInteger count = [o_ptc_menuorder count]; + for (NSUInteger i = 0; i < count; i++) { NSString *o_title = [o_ptc_translation_dict objectForKey:[o_ptc_menuorder objectAtIndex:i]]; o_mi_tmp = [o_mu_playlistTableColumns addItemWithTitle:o_title action:@selector(togglePlaylistColumnTable:) keyEquivalent:@""]; - [o_mi_tmp setTarget:self]; + /* don't set a valid target for the title column selector, since we want it to be disabled */ + if (![[o_ptc_menuorder objectAtIndex:i] isEqualToString: TITLE_COLUMN]) + [o_mi_tmp setTarget:self]; [o_mi_tmp setTag:i]; o_mi_tmp = [o_context_menu addItemWithTitle:o_title action:@selector(togglePlaylistColumnTable:) keyEquivalent:@""]; - [o_mi_tmp setTarget:self]; + /* don't set a valid target for the title column selector, since we want it to be disabled */ + if (![[o_ptc_menuorder objectAtIndex:i] isEqualToString: TITLE_COLUMN]) + [o_mi_tmp setTarget:self]; [o_mi_tmp setTag:i]; } - if( !o_mu_playlistTableColumnsContextMenu ) + if (!o_mu_playlistTableColumnsContextMenu) o_mu_playlistTableColumnsContextMenu = [o_context_menu retain]; return [o_context_menu autorelease]; } @@ -440,14 +501,13 @@ static VLCMainMenu *_o_sharedInstance = nil; - (void)releaseRepresentedObjects:(NSMenu *)the_menu { - if( !p_intf ) return; + if (!p_intf) return; NSArray *menuitems_array = [the_menu itemArray]; NSUInteger menuItemCount = [menuitems_array count]; - for( NSUInteger i=0; i < menuItemCount; i++ ) - { + for (NSUInteger i=0; i < menuItemCount; i++) { NSMenuItem *one_item = [menuitems_array objectAtIndex: i]; - if( [one_item hasSubmenu] ) + if ([one_item hasSubmenu]) [self releaseRepresentedObjects: [one_item submenu]]; [one_item setRepresentedObject:NULL]; @@ -459,11 +519,10 @@ static VLCMainMenu *_o_sharedInstance = nil; - (void)setupMenus { - playlist_t * p_playlist = pl_Get( p_intf ); - input_thread_t * p_input = playlist_CurrentInput( p_playlist ); - if( p_input != NULL ) - { - [o_mi_record setEnabled: var_GetBool( p_input, "can-record" )]; + playlist_t * p_playlist = pl_Get(p_intf); + input_thread_t * p_input = playlist_CurrentInput(p_playlist); + if (p_input != NULL) { + [o_mi_record setEnabled: var_GetBool(p_input, "can-record")]; [self setupVarMenuItem: o_mi_program target: (vlc_object_t *)p_input var: "program" selector: @selector(toggleVar:)]; @@ -480,31 +539,22 @@ static VLCMainMenu *_o_sharedInstance = nil; [self setupVarMenuItem: o_mi_videotrack target: (vlc_object_t *)p_input var: "video-es" selector: @selector(toggleVar:)]; - [self setupVarMenuItem: o_mi_subtitle target: (vlc_object_t *)p_input + [self setupVarMenuItem: o_mi_subtitle_track target: (vlc_object_t *)p_input var: "spu-es" selector: @selector(toggleVar:)]; - /* special case for "Open File" inside the subtitles menu item */ - if( [o_mi_videotrack isEnabled] == YES ) - [o_mi_subtitle setEnabled: YES]; - - audio_output_t * p_aout = input_GetAout( p_input ); - if( p_aout != NULL ) - { + audio_output_t * p_aout = playlist_GetAout(p_playlist); + if (p_aout != NULL) { [self setupVarMenuItem: o_mi_channels target: (vlc_object_t *)p_aout - var: "audio-channels" selector: @selector(toggleVar:)]; - - [self setupVarMenuItem: o_mi_device target: (vlc_object_t *)p_aout - var: "audio-device" selector: @selector(toggleVar:)]; + var: "stereo-mode" selector: @selector(toggleVar:)]; [self setupVarMenuItem: o_mi_visual target: (vlc_object_t *)p_aout var: "visual" selector: @selector(toggleVar:)]; - vlc_object_release( p_aout ); + vlc_object_release(p_aout); } - vout_thread_t * p_vout = input_GetVout( p_input ); + vout_thread_t * p_vout = getVoutForActiveWindow(); - if( p_vout != NULL ) - { + if (p_vout != NULL) { [self setupVarMenuItem: o_mi_aspect_ratio target: (vlc_object_t *)p_vout var: "aspect-ratio" selector: @selector(toggleVar:)]; @@ -522,11 +572,11 @@ static VLCMainMenu *_o_sharedInstance = nil; (vlc_object_t *)p_vout var:"postprocess" selector: @selector(toggleVar:)]; #endif - vlc_object_release( p_vout ); + vlc_object_release(p_vout); [self refreshVoutDeviceMenu:nil]; } - vlc_object_release( p_input ); + vlc_object_release(p_input); } else [o_mi_record setEnabled: NO]; @@ -549,8 +599,7 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_mitem setEnabled: YES]; [o_mitem setTarget: self]; NSRect s_rect; - for (NSUInteger i = 0; i < count; i++) - { + for (NSUInteger i = 0; i < count; i++) { s_rect = [[o_screens objectAtIndex: i] frame]; [o_submenu addItemWithTitle: [NSString stringWithFormat: @"%@ %li (%ix%i)", _NS("Screen"), i+1, (int)s_rect.size.width, (int)s_rect.size.height] action:@selector(toggleFullscreenDevice:) keyEquivalent:@""]; @@ -559,7 +608,7 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_mitem setEnabled: YES]; [o_mitem setTarget: self]; } - [[o_submenu itemWithTag: var_InheritInteger( VLCIntf, "macosx-vdev" )] setState: NSOnState]; + [[o_submenu itemWithTag: var_InheritInteger(VLCIntf, "macosx-vdev")] setState: NSOnState]; } - (void)setSubmenusEnabled:(BOOL)b_enabled @@ -570,15 +619,27 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_mi_audiotrack setEnabled: b_enabled]; [o_mi_visual setEnabled: b_enabled]; [o_mi_videotrack setEnabled: b_enabled]; - [o_mi_subtitle setEnabled: b_enabled]; + [o_mi_subtitle_track setEnabled: b_enabled]; [o_mi_channels setEnabled: b_enabled]; [o_mi_deinterlace setEnabled: b_enabled]; [o_mi_deinterlace_mode setEnabled: b_enabled]; [o_mi_ffmpeg_pp setEnabled: b_enabled]; - [o_mi_device setEnabled: b_enabled]; [o_mi_screen setEnabled: b_enabled]; [o_mi_aspect_ratio setEnabled: b_enabled]; [o_mi_crop setEnabled: b_enabled]; +} + +- (void)setSubtitleMenuEnabled:(BOOL)b_enabled +{ + [o_mi_openSubtitleFile setEnabled: b_enabled]; + if (b_enabled) { + [o_mi_subtitle_bgopacity_lbl_gray setHidden: YES]; + [o_mi_subtitle_bgopacity_lbl setHidden: NO]; + } else { + [o_mi_subtitle_bgopacity_lbl_gray setHidden: NO]; + [o_mi_subtitle_bgopacity_lbl setHidden: YES]; + } + [o_mi_subtitle_bgopacity_sld setEnabled: b_enabled]; [o_mi_teletext setEnabled: b_enabled]; } @@ -588,17 +649,16 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_mi_rate_sld setEnabled: b_enabled]; [o_mi_rate_sld setIntValue: [[VLCCoreInteraction sharedInstance] playbackRate]]; int i = [[VLCCoreInteraction sharedInstance] playbackRate]; - double speed = pow( 2, (double)i / 17 ); + double speed = pow(2, (double)i / 17); [o_mi_rate_fld setStringValue: [NSString stringWithFormat:@"%.2fx", speed]]; if (b_enabled) { [o_mi_rate_lbl setHidden: NO]; [o_mi_rate_lbl_gray setHidden: YES]; - } - else - { + } else { [o_mi_rate_lbl setHidden: YES]; [o_mi_rate_lbl_gray setHidden: NO]; } + [self setSubtitleMenuEnabled: b_enabled]; [o_pool release]; } @@ -610,40 +670,58 @@ static VLCMainMenu *_o_sharedInstance = nil; /* Load extensions if needed */ // TODO: Implement preference for autoloading extensions on mac - // if( !var_InheritBool( p_intf, "qt-autoload-extensions") - // && ![o_extMgr isLoaded] ) + // if (!var_InheritBool(p_intf, "qt-autoload-extensions") + // && ![o_extMgr isLoaded]) // { // return; // } - if( ![o_extMgr isLoaded] && ![o_extMgr cannotLoad] ) - { + if (![o_extMgr isLoaded] && ![o_extMgr cannotLoad]) { [o_extMgr loadExtensions]; } /* Let the ExtensionsManager itself build the menu */ [o_extMgr buildMenu:o_mu_extensions]; - [o_mi_extensions setEnabled: ( [o_mu_extensions numberOfItems] > 0 )]; + [o_mi_extensions setEnabled: ([o_mu_extensions numberOfItems] > 0)]; } #pragma mark - #pragma mark View + +- (IBAction)toggleEffectsButton:(id)sender +{ + BOOL b_value = !config_GetInt(VLCIntf, "macosx-show-effects-button"); + config_PutInt(VLCIntf, "macosx-show-effects-button", b_value); + [[[[VLCMain sharedInstance] mainWindow] controlsBar] toggleEffectsButton]; + [o_mi_toggleEffectsButton setState: b_value]; +} + - (IBAction)toggleJumpButtons:(id)sender { - BOOL b_value = !config_GetInt( VLCIntf, "macosx-show-playback-buttons" ); - config_PutInt( VLCIntf, "macosx-show-playback-buttons", b_value ); - [[[VLCMain sharedInstance] mainWindow] toggleJumpButtons]; + BOOL b_value = !config_GetInt(VLCIntf, "macosx-show-playback-buttons"); + config_PutInt(VLCIntf, "macosx-show-playback-buttons", b_value); + [[[[VLCMain sharedInstance] mainWindow] controlsBar] toggleJumpButtons]; [o_mi_toggleJumpButtons setState: b_value]; } - (IBAction)togglePlaymodeButtons:(id)sender { - BOOL b_value = !config_GetInt( VLCIntf, "macosx-show-playmode-buttons" ); - config_PutInt( VLCIntf, "macosx-show-playmode-buttons", b_value ); - [[[VLCMain sharedInstance] mainWindow] togglePlaymodeButtons]; + BOOL b_value = !config_GetInt(VLCIntf, "macosx-show-playmode-buttons"); + config_PutInt(VLCIntf, "macosx-show-playmode-buttons", b_value); + [[[[VLCMain sharedInstance] mainWindow] controlsBar] togglePlaymodeButtons]; [o_mi_togglePlaymodeButtons setState: b_value]; } +- (IBAction)toggleSidebar:(id)sender +{ + [[[VLCMain sharedInstance] mainWindow] toggleLeftSubSplitView]; +} + +- (void)updateSidebarMenuItem +{ + [o_mi_toggleSidebar setState: config_GetInt(VLCIntf, "macosx-show-sidebar")]; +} + - (IBAction)togglePlaylistColumnTable:(id)sender { NSInteger i_new_state = ![sender state]; @@ -679,20 +757,88 @@ static VLCMainMenu *_o_sharedInstance = nil; { [[VLCCoreInteraction sharedInstance] setPlaybackRate: [o_mi_rate_sld intValue]]; int i = [[VLCCoreInteraction sharedInstance] playbackRate]; - double speed = pow( 2, (double)i / 17 ); + double speed = pow(2, (double)i / 17); [o_mi_rate_fld setStringValue: [NSString stringWithFormat:@"%.2fx", speed]]; } - (void)updatePlaybackRate { int i = [[VLCCoreInteraction sharedInstance] playbackRate]; - double speed = pow( 2, (double)i / 17 ); + double speed = pow(2, (double)i / 17); [o_mi_rate_fld setStringValue: [NSString stringWithFormat:@"%.2fx", speed]]; [o_mi_rate_sld setIntValue: i]; } +- (IBAction)toggleAtoBloop:(id)sender +{ + [[VLCCoreInteraction sharedInstance] setAtoB]; +} + +#pragma mark - +#pragma mark audio menu +- (void)refreshAudioDeviceList +{ + char **ids, **names; + char *currentDevice; + + [o_mu_device removeAllItems]; + + audio_output_t * p_aout = getAout(); + if (!p_aout) + return; + + int n = aout_DevicesList(p_aout, &ids, &names); + if (n == -1) { + vlc_object_release(p_aout); + return; + } + + currentDevice = aout_DeviceGet(p_aout); + NSMenuItem * o_mi_tmp; + + for (NSUInteger x = 0; x < n; x++) { + o_mi_tmp = [o_mu_device addItemWithTitle:[NSString stringWithFormat:@"%s", names[x]] action:@selector(toggleAudioDevice:) keyEquivalent:@""]; + [o_mi_tmp setTarget:self]; + [o_mi_tmp setTag:[[NSString stringWithFormat:@"%s", ids[x]] intValue]]; + } + vlc_object_release(p_aout); + + [[o_mu_device itemWithTag:[[NSString stringWithFormat:@"%s", currentDevice] intValue]] setState:NSOnState]; + + for (NSUInteger x = 0; x < n; x++) { + free(ids[x]); + free(names[x]); + } + free(ids); + free(names); + + [o_mu_device setAutoenablesItems:YES]; + [o_mi_device setEnabled:YES]; +} + +- (IBAction)toggleAudioDevice:(id)sender +{ + audio_output_t * p_aout = getAout(); + if (!p_aout) + return; + + int returnValue = 0; + + if ([sender tag] > 0) + returnValue = aout_DeviceSet(p_aout, [[NSString stringWithFormat:@"%li", [sender tag]] UTF8String]); + else + returnValue = aout_DeviceSet(p_aout, NULL); + + if (returnValue != 0) + msg_Warn(VLCIntf, "failed to set audio device %li", [sender tag]); + + vlc_object_release(p_aout); + [self refreshAudioDeviceList]; +} + #pragma mark - #pragma mark video menu + - (IBAction)toggleFullscreen:(id)sender { [[VLCCoreInteraction sharedInstance] toggleFullscreen]; @@ -700,61 +846,55 @@ static VLCMainMenu *_o_sharedInstance = nil; - (IBAction)resizeVideoWindow:(id)sender { - input_thread_t *p_input = pl_CurrentInput( VLCIntf ); - if (p_input) - { - vout_thread_t *p_vout = getVout(); - if (p_vout) - { + input_thread_t *p_input = pl_CurrentInput(VLCIntf); + if (p_input) { + vout_thread_t *p_vout = getVoutForActiveWindow(); + if (p_vout) { if (sender == o_mi_half_window) - var_SetFloat( p_vout, "zoom", 0.5 ); + var_SetFloat(p_vout, "zoom", 0.5); else if (sender == o_mi_normal_window) - var_SetFloat( p_vout, "zoom", 1.0 ); + var_SetFloat(p_vout, "zoom", 1.0); else if (sender == o_mi_double_window) - var_SetFloat( p_vout, "zoom", 2.0 ); + var_SetFloat(p_vout, "zoom", 2.0); else { - [[[[[VLCMain sharedInstance] mainWindow] videoView] window] performZoom:sender]; + [[NSApp keyWindow] performZoom:sender]; } - vlc_object_release( p_vout ); + vlc_object_release(p_vout); } - vlc_object_release( p_input ); + vlc_object_release(p_input); } } - (IBAction)floatOnTop:(id)sender { - input_thread_t *p_input = pl_CurrentInput( VLCIntf ); - if (p_input) - { - vout_thread_t *p_vout = getVout(); - if (p_vout) - { - var_ToggleBool( p_vout, "video-on-top" ); - vlc_object_release( p_vout ); + input_thread_t *p_input = pl_CurrentInput(VLCIntf); + if (p_input) { + vout_thread_t *p_vout = getVoutForActiveWindow(); + if (p_vout) { + var_ToggleBool(p_vout, "video-on-top"); + vlc_object_release(p_vout); } - vlc_object_release( p_input ); + vlc_object_release(p_input); } } - (IBAction)createVideoSnapshot:(id)sender { - input_thread_t *p_input = pl_CurrentInput( VLCIntf ); - if (p_input) - { - vout_thread_t *p_vout = getVout(); - if (p_vout) - { - var_TriggerCallback( p_vout, "video-snapshot" ); - vlc_object_release( p_vout ); + input_thread_t *p_input = pl_CurrentInput(VLCIntf); + if (p_input) { + vout_thread_t *p_vout = getVoutForActiveWindow(); + if (p_vout) { + var_TriggerCallback(p_vout, "video-snapshot"); + vlc_object_release(p_vout); } - vlc_object_release( p_input ); + vlc_object_release(p_input); } } - (IBAction)toggleFullscreenDevice:(id)sender { - config_PutInt( VLCIntf, "macosx-vdev", [sender tag] ); + config_PutInt(VLCIntf, "macosx-vdev", [sender tag]); [self refreshVoutDeviceMenu: nil]; } @@ -763,6 +903,118 @@ static VLCMainMenu *_o_sharedInstance = nil; return o_vout_menu; } +#pragma mark - Subtitles Menu +- (IBAction)addSubtitleFile:(id)sender +{ + NSInteger i_returnValue = 0; + input_thread_t * p_input = pl_CurrentInput(VLCIntf); + if (!p_input) + return; + + input_item_t *p_item = input_GetItem(p_input); + if (!p_item) { + vlc_object_release(p_input); + return; + } + + char *path = input_item_GetURI(p_item); + if (!path) + path = strdup(""); + + NSOpenPanel * openPanel = [NSOpenPanel openPanel]; + [openPanel setCanChooseFiles: YES]; + [openPanel setCanChooseDirectories: NO]; + [openPanel setAllowsMultipleSelection: YES]; + [openPanel setAllowedFileTypes: [NSArray arrayWithObjects: @"cdg",@"@idx",@"srt",@"sub",@"utf",@"ass",@"ssa",@"aqt",@"jss",@"psb",@"rt",@"smi",@"txt",@"smil", nil]]; + [openPanel setDirectoryURL:[NSURL fileURLWithPath:[[NSString stringWithUTF8String:path] stringByExpandingTildeInPath]]]; + i_returnValue = [openPanel runModal]; + free(path); + + if (i_returnValue == NSOKButton) { + NSUInteger c = 0; + if (!p_input) + return; + + c = [[openPanel URLs] count]; + + for (int i = 0; i < c ; i++) { + msg_Dbg(VLCIntf, "loading subs from %s", [[[[openPanel URLs] objectAtIndex: i] path] UTF8String]); + if (input_AddSubtitle(p_input, [[[[openPanel URLs] objectAtIndex: i] path] UTF8String], TRUE)) + msg_Warn(VLCIntf, "unable to load subtitles from '%s'", + [[[[openPanel URLs] objectAtIndex: i] path] UTF8String]); + } + } + vlc_object_release(p_input); +} + +- (IBAction)switchSubtitleOption:(id)sender +{ + vlc_object_t *p_freetype; + p_freetype = (vlc_object_t *) vlc_object_find_name(pl_Get(VLCIntf), "freetype"); + int intValue = [sender tag]; + NSString *representedObject = [sender representedObject]; + + if (p_freetype) { + var_SetInteger(p_freetype, [representedObject UTF8String], intValue); + NSMenu *menu = [sender menu]; + NSUInteger count = [menu numberOfItems]; + for (NSUInteger x = 0; x < count; x++) + [[menu itemAtIndex:x] setState:NSOffState]; + [[menu itemWithTag:intValue] setState:NSOnState]; + vlc_object_release(p_freetype); + } + config_PutInt(p_freetype, [representedObject UTF8String], intValue); +} + +- (IBAction)switchSubtitleBackgroundOpacity:(id)sender +{ + vlc_object_t *p_freetype; + p_freetype = (vlc_object_t *) vlc_object_find_name(pl_Get(VLCIntf), "freetype"); + int intValue = [sender intValue]; + + if (p_freetype) { + var_SetInteger(p_freetype, "freetype-background-opacity", intValue); + vlc_object_release(p_freetype); + } + config_PutInt(p_freetype, "freetype-background-opacity", intValue); +} + +- (IBAction)telxTransparent:(id)sender +{ + vlc_object_t *p_vbi; + p_vbi = (vlc_object_t *) vlc_object_find_name(pl_Get(VLCIntf), "zvbi"); + if (p_vbi) { + var_SetBool(p_vbi, "vbi-opaque", [sender state]); + [sender setState: ![sender state]]; + vlc_object_release(p_vbi); + } +} + +- (IBAction)telxNavLink:(id)sender +{ + intf_thread_t * p_intf = VLCIntf; + vlc_object_t *p_vbi; + int i_page = 0; + + if ([[sender title] isEqualToString: _NS("Index")]) + i_page = 'i' << 16; + else if ([[sender title] isEqualToString: _NS("Red")]) + i_page = 'r' << 16; + else if ([[sender title] isEqualToString: _NS("Green")]) + i_page = 'g' << 16; + else if ([[sender title] isEqualToString: _NS("Yellow")]) + i_page = 'y' << 16; + else if ([[sender title] isEqualToString: _NS("Blue")]) + i_page = 'b' << 16; + if (i_page == 0) return; + + p_vbi = (vlc_object_t *) vlc_object_find_name(pl_Get(VLCIntf), "zvbi"); + if (p_vbi) { + var_SetInteger(p_vbi, "vbi-page", i_page); + vlc_object_release(p_vbi); + } +} + #pragma mark - #pragma mark Panels @@ -799,10 +1051,10 @@ static VLCMainMenu *_o_sharedInstance = nil; - (IBAction)showConvertAndSave:(id)sender { - if( o_convertandsave == nil ) + if (o_convertandsave == nil) o_convertandsave = [[VLCConvertAndSave alloc] init]; - if( !b_nib_convertandsave_loaded ) + if (!b_nib_convertandsave_loaded) b_nib_convertandsave_loaded = [NSBundle loadNibNamed:@"ConvertAndSave" owner: NSApp]; [o_convertandsave toggleWindow]; @@ -810,10 +1062,10 @@ static VLCMainMenu *_o_sharedInstance = nil; - (IBAction)showVideoEffects:(id)sender { - if( o_videoeffects == nil ) + if (o_videoeffects == nil) o_videoeffects = [[VLCVideoEffects alloc] init]; - if( !b_nib_videoeffects_loaded ) + if (!b_nib_videoeffects_loaded) b_nib_videoeffects_loaded = [NSBundle loadNibNamed:@"VideoEffects" owner: NSApp]; [o_videoeffects toggleWindow:sender]; @@ -848,10 +1100,7 @@ static VLCMainMenu *_o_sharedInstance = nil; - (IBAction)viewPreferences:(id)sender { - NSInteger i_level = NSNormalWindowLevel; - NSInteger i_video_window_level = [[[[VLCMainWindow sharedInstance] videoView] window] level]; - if( i_video_window_level == NSStatusWindowLevel ) - i_level = NSStatusWindowLevel; + NSInteger i_level = [[[VLCMain sharedInstance] voutController] currentWindowLevel]; [[[VLCMain sharedInstance] simplePreferences] showSimplePrefsWithLevel:i_level]; } @@ -860,10 +1109,10 @@ static VLCMainMenu *_o_sharedInstance = nil; - (void)initAbout { - if(! o_about ) + if (! o_about) o_about = [[VLAboutBox alloc] init]; - if( !b_nib_about_loaded ) + if (!b_nib_about_loaded) b_nib_about_loaded = [NSBundle loadNibNamed:@"About" owner: NSApp]; } @@ -876,7 +1125,7 @@ static VLCMainMenu *_o_sharedInstance = nil; - (IBAction)showLicense:(id)sender { [self initAbout]; - [o_about showGPL: sender]; + [o_about showGPL]; } - (IBAction)viewHelp:(id)sender @@ -970,8 +1219,8 @@ static VLCMainMenu *_o_sharedInstance = nil; - (void)setShuffle { bool b_value; - playlist_t *p_playlist = pl_Get( VLCIntf ); - b_value = var_GetBool( p_playlist, "random" ); + playlist_t *p_playlist = pl_Get(VLCIntf); + b_value = var_GetBool(p_playlist, "random"); [o_mi_random setState: b_value]; } @@ -985,10 +1234,9 @@ static VLCMainMenu *_o_sharedInstance = nil; selector:(SEL)pf_callback { vlc_value_t val, text; - int i_type = var_Type( p_object, psz_variable ); + int i_type = var_Type(p_object, psz_variable); - switch( i_type & VLC_VAR_TYPE ) - { + switch(i_type & VLC_VAR_TYPE) { case VLC_VAR_VOID: case VLC_VAR_BOOL: case VLC_VAR_VARIABLE: @@ -1001,28 +1249,25 @@ static VLCMainMenu *_o_sharedInstance = nil; } /* Get the descriptive name of the variable */ - var_Change( p_object, psz_variable, VLC_VAR_GETTEXT, &text, NULL ); - [o_mi setTitle: _NS( text.psz_string ? text.psz_string : psz_variable )]; + var_Change(p_object, psz_variable, VLC_VAR_GETTEXT, &text, NULL); + [o_mi setTitle: _NS(text.psz_string ? text.psz_string : psz_variable)]; - if( i_type & VLC_VAR_HASCHOICE ) - { + if (i_type & VLC_VAR_HASCHOICE) { NSMenu *o_menu = [o_mi submenu]; [self setupVarMenu: o_menu forMenuItem: o_mi target:p_object var:psz_variable selector:pf_callback]; - free( text.psz_string ); + free(text.psz_string); return; } - if( var_Get( p_object, psz_variable, &val ) < 0 ) - { + if (var_Get(p_object, psz_variable, &val) < 0) { return; } VLCAutoGeneratedMenuContent *o_data; - switch( i_type & VLC_VAR_TYPE ) - { + switch(i_type & VLC_VAR_TYPE) { case VLC_VAR_VOID: o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object andValue: val ofType: i_type]; @@ -1033,7 +1278,7 @@ static VLCMainMenu *_o_sharedInstance = nil; o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object andValue: val ofType: i_type]; [o_mi setRepresentedObject: [o_data autorelease]]; - if( !( i_type & VLC_VAR_ISCOMMAND ) ) + if (!(i_type & VLC_VAR_ISCOMMAND)) [o_mi setState: val.b_bool ? TRUE : FALSE ]; break; @@ -1041,8 +1286,8 @@ static VLCMainMenu *_o_sharedInstance = nil; break; } - if( ( i_type & VLC_VAR_TYPE ) == VLC_VAR_STRING ) free( val.psz_string ); - free( text.psz_string ); + if ((i_type & VLC_VAR_TYPE) == VLC_VAR_STRING) free(val.psz_string); + free(text.psz_string); } @@ -1062,8 +1307,7 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_parent setEnabled:NO]; /* Aspect Ratio */ - if( [[o_parent title] isEqualToString: _NS("Aspect-ratio")] == YES ) - { + if ([[o_parent title] isEqualToString: _NS("Aspect-ratio")] == YES) { NSMenuItem *o_lmi_tmp2; o_lmi_tmp2 = [o_menu addItemWithTitle: _NS("Lock Aspect Ratio") action: @selector(lockVideosAspectRatio:) keyEquivalent: @""]; [o_lmi_tmp2 setTarget: [[VLCMain sharedInstance] controls]]; @@ -1073,33 +1317,21 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_menu addItem: [NSMenuItem separatorItem]]; } - /* special case for the subtitles item */ - if( [[o_parent title] isEqualToString: _NS("Subtitles Track")] == YES ) - { - NSMenuItem * o_lmi_tmp; - o_lmi_tmp = [o_menu addItemWithTitle: _NS("Open File...") action: @selector(addSubtitleFile:) keyEquivalent: @""]; - [o_lmi_tmp setTarget: [[VLCMain sharedInstance] controls]]; - [o_lmi_tmp setEnabled: YES]; - [o_parent setEnabled: YES]; - } - /* Check the type of the object variable */ - i_type = var_Type( p_object, psz_variable ); + i_type = var_Type(p_object, psz_variable); /* Make sure we want to display the variable */ - if( i_type & VLC_VAR_HASCHOICE ) - { - var_Change( p_object, psz_variable, VLC_VAR_CHOICESCOUNT, &val, NULL ); - if( val.i_int == 0 ) + if (i_type & VLC_VAR_HASCHOICE) { + var_Change(p_object, psz_variable, VLC_VAR_CHOICESCOUNT, &val, NULL); + if (val.i_int == 0) return; - if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 ) + if ((i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1) return; } else return; - switch( i_type & VLC_VAR_TYPE ) - { + switch(i_type & VLC_VAR_TYPE) { case VLC_VAR_VOID: case VLC_VAR_BOOL: case VLC_VAR_VARIABLE: @@ -1111,36 +1343,28 @@ static VLCMainMenu *_o_sharedInstance = nil; return; } - if( var_Get( p_object, psz_variable, &val ) < 0 ) - { + if (var_Get(p_object, psz_variable, &val) < 0) { return; } - if( var_Change( p_object, psz_variable, VLC_VAR_GETLIST, - &val_list, &text_list ) < 0 ) - { - if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string ); + if (var_Change(p_object, psz_variable, VLC_VAR_GETLIST, + &val_list, &text_list) < 0) { + if ((i_type & VLC_VAR_TYPE) == VLC_VAR_STRING) free(val.psz_string); return; } /* make (un)sensitive */ - [o_parent setEnabled: ( val_list.p_list->i_count > 1 )]; - - /* another special case for the subtitles item */ - if( [[o_parent title] isEqualToString: _NS("Subtitles Track")] == YES ) - [o_menu addItem: [NSMenuItem separatorItem]]; + [o_parent setEnabled: (val_list.p_list->i_count > 1)]; - for( i = 0; i < val_list.p_list->i_count; i++ ) - { + for (i = 0; i < val_list.p_list->i_count; i++) { NSMenuItem * o_lmi; NSString *o_title = @""; VLCAutoGeneratedMenuContent *o_data; - switch( i_type & VLC_VAR_TYPE ) - { + switch(i_type & VLC_VAR_TYPE) { case VLC_VAR_STRING: - o_title = _NS( text_list.p_list->p_values[i].psz_string ? text_list.p_list->p_values[i].psz_string : val_list.p_list->p_values[i].psz_string ); + o_title = _NS(text_list.p_list->p_values[i].psz_string ? text_list.p_list->p_values[i].psz_string : val_list.p_list->p_values[i].psz_string); o_lmi = [o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""]; o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object @@ -1148,7 +1372,7 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_lmi setRepresentedObject: [o_data autorelease]]; [o_lmi setTarget: self]; - if( !strcmp( val.psz_string, val_list.p_list->p_values[i].psz_string ) && !( i_type & VLC_VAR_ISCOMMAND ) ) + if (!strcmp(val.psz_string, val_list.p_list->p_values[i].psz_string) && !(i_type & VLC_VAR_ISCOMMAND)) [o_lmi setState: TRUE ]; break; @@ -1156,7 +1380,7 @@ static VLCMainMenu *_o_sharedInstance = nil; case VLC_VAR_INTEGER: o_title = text_list.p_list->p_values[i].psz_string ? - _NS( text_list.p_list->p_values[i].psz_string ) : [NSString stringWithFormat: @"%"PRId64, val_list.p_list->p_values[i].i_int]; + _NS(text_list.p_list->p_values[i].psz_string) : [NSString stringWithFormat: @"%"PRId64, val_list.p_list->p_values[i].i_int]; o_lmi = [o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""]; o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object @@ -1164,7 +1388,7 @@ static VLCMainMenu *_o_sharedInstance = nil; [o_lmi setRepresentedObject: [o_data autorelease]]; [o_lmi setTarget: self]; - if( val_list.p_list->p_values[i].i_int == val.i_int && !( i_type & VLC_VAR_ISCOMMAND ) ) + if (val_list.p_list->p_values[i].i_int == val.i_int && !(i_type & VLC_VAR_ISCOMMAND)) [o_lmi setState: TRUE ]; break; @@ -1173,17 +1397,9 @@ static VLCMainMenu *_o_sharedInstance = nil; } } - /* special case for the subtitles sub-menu - * In case that we don't have any subs, we don't want a separator item at the end */ - if( [[o_parent title] isEqualToString: _NS("Subtitles Track")] == YES ) - { - if( [o_menu numberOfItems] == 2 ) - [o_menu removeItemAtIndex: 1]; - } - /* clean up everything */ - if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string ); - var_FreeList( &val_list, &text_list ); + if ((i_type & VLC_VAR_TYPE) == VLC_VAR_STRING) free(val.psz_string); + var_FreeList(&val_list, &text_list); } - (IBAction)toggleVar:(id)sender @@ -1205,19 +1421,14 @@ static VLCMainMenu *_o_sharedInstance = nil; VLCAutoGeneratedMenuContent *menuContent = (VLCAutoGeneratedMenuContent *)data; /* Preserve settings across vouts via the playlist object: */ - if( !strcmp( [menuContent name], "fullscreen" ) || !strcmp( [menuContent name], "video-on-top" ) ) - var_Set( pl_Get( VLCIntf ), [menuContent name] , [menuContent value] ); - - /* save our audio device across multiple sessions */ - if( !strcmp( [menuContent name], "audio-device" ) ) - config_PutInt( VLCIntf, "macosx-audio-device", [menuContent value].i_int ); + if (!strcmp([menuContent name], "fullscreen") || !strcmp([menuContent name], "video-on-top")) + var_Set(pl_Get(VLCIntf), [menuContent name] , [menuContent value]); p_object = [menuContent vlcObject]; - if( p_object != NULL ) - { - var_Set( p_object, [menuContent name], [menuContent value] ); - vlc_object_release( p_object ); + if (p_object != NULL) { + var_Set(p_object, [menuContent name], [menuContent value]); + vlc_object_release(p_object); [o_pool release]; return true; } @@ -1234,117 +1445,100 @@ static VLCMainMenu *_o_sharedInstance = nil; NSString *o_title = [o_mi title]; BOOL bEnabled = TRUE; vlc_value_t val; - playlist_t * p_playlist = pl_Get( p_intf ); - input_thread_t * p_input = playlist_CurrentInput( p_playlist ); + playlist_t * p_playlist = pl_Get(p_intf); + input_thread_t * p_input = playlist_CurrentInput(p_playlist); - if( [o_title isEqualToString: _NS("Stop")] ) - { - if( p_input == NULL ) - { + if ([o_title isEqualToString: _NS("Stop")]) { + if (!p_input) bEnabled = FALSE; - } [self setupMenus]; /* Make sure input menu is up to date */ - } - else if( [o_title isEqualToString: _NS("Previous")] || - [o_title isEqualToString: _NS("Next")] ) - { + } else if ([o_title isEqualToString: _NS("Previous")] || + [o_title isEqualToString: _NS("Next")]) { PL_LOCK; - bEnabled = playlist_CurrentSize( p_playlist ) > 1; + bEnabled = playlist_CurrentSize(p_playlist) > 1; PL_UNLOCK; - } - else if( [o_title isEqualToString: _NS("Random")] ) - { + } else if ([o_title isEqualToString: _NS("Random")]) { int i_state; - var_Get( p_playlist, "random", &val ); + var_Get(p_playlist, "random", &val); i_state = val.b_bool ? NSOnState : NSOffState; [o_mi setState: i_state]; - } - else if( [o_title isEqualToString: _NS("Repeat One")] ) - { + } else if ([o_title isEqualToString: _NS("Repeat One")]) { int i_state; - var_Get( p_playlist, "repeat", &val ); + var_Get(p_playlist, "repeat", &val); i_state = val.b_bool ? NSOnState : NSOffState; [o_mi setState: i_state]; - } - else if( [o_title isEqualToString: _NS("Repeat All")] ) - { + } else if ([o_title isEqualToString: _NS("Repeat All")]) { int i_state; - var_Get( p_playlist, "loop", &val ); + var_Get(p_playlist, "loop", &val); i_state = val.b_bool ? NSOnState : NSOffState; [o_mi setState: i_state]; - } - else if( [o_title isEqualToString: _NS("Quit after Playback")] ) - { + } else if ([o_title isEqualToString: _NS("Quit after Playback")]) { int i_state; - var_Get( p_playlist, "play-and-exit", &val ); + var_Get(p_playlist, "play-and-exit", &val); i_state = val.b_bool ? NSOnState : NSOffState; [o_mi setState: i_state]; - } - else if( [o_title isEqualToString: _NS("Step Forward")] || - [o_title isEqualToString: _NS("Step Backward")] || - [o_title isEqualToString: _NS("Jump To Time")]) - { - if( p_input != NULL ) - { - var_Get( p_input, "can-seek", &val); + } else if ([o_title isEqualToString: _NS("Step Forward")] || + [o_title isEqualToString: _NS("Step Backward")] || + [o_title isEqualToString: _NS("Jump To Time")]) { + if (p_input != NULL) { + var_Get(p_input, "can-seek", &val); bEnabled = val.b_bool; } else bEnabled = FALSE; - } - else if( [o_title isEqualToString: _NS("Mute")] ) - { + } else if ([o_title isEqualToString: _NS("Mute")]) { [o_mi setState: [[VLCCoreInteraction sharedInstance] mute] ? NSOnState : NSOffState]; [self setupMenus]; /* Make sure audio menu is up to date */ - } - else if( [o_title isEqualToString: _NS("Half Size")] || - [o_title isEqualToString: _NS("Normal Size")] || - [o_title isEqualToString: _NS("Double Size")] || - [o_title isEqualToString: _NS("Fit to Screen")] || - [o_title isEqualToString: _NS("Snapshot")] || - [o_title isEqualToString: _NS("Fullscreen")] || - [o_title isEqualToString: _NS("Float on Top")] ) - { + [self refreshAudioDeviceList]; + } else if ([o_title isEqualToString: _NS("Half Size")] || + [o_title isEqualToString: _NS("Normal Size")] || + [o_title isEqualToString: _NS("Double Size")] || + [o_title isEqualToString: _NS("Fit to Screen")] || + [o_title isEqualToString: _NS("Snapshot")] || + [o_title isEqualToString: _NS("Fullscreen")] || + [o_title isEqualToString: _NS("Float on Top")]) { bEnabled = FALSE; - if( p_input != NULL ) - { - vout_thread_t *p_vout = input_GetVout( p_input ); - if( p_vout != NULL ) - { - if( [o_title isEqualToString: _NS("Float on Top")] ) - [o_mi setState: var_GetBool( p_vout, "video-on-top" )]; + if (p_input != NULL) { + vout_thread_t *p_vout = getVoutForActiveWindow(); + if (p_vout != NULL) { + if ([o_title isEqualToString: _NS("Float on Top")]) + [o_mi setState: var_GetBool(p_vout, "video-on-top")]; - bEnabled = TRUE; + if ([o_title isEqualToString: _NS("Fullscreen")]) + [o_mi setState: var_GetBool(p_vout, "fullscreen")]; - vlc_object_release( p_vout ); + bEnabled = TRUE; + vlc_object_release(p_vout); } } - if( [o_title isEqualToString: _NS("Fullscreen")] ) - { - [o_mi setState: var_GetBool( p_playlist, "fullscreen" )]; - bEnabled = TRUE; - } + [self setupMenus]; /* Make sure video menu is up to date */ + } else { + NSMenuItem *o_mi_parent = [o_mi parentItem]; + if (o_mi_parent == o_mi_subtitle_size || o_mi == o_mi_subtitle_size || + o_mi_parent == o_mi_subtitle_textcolor || o_mi == o_mi_subtitle_textcolor || + o_mi_parent == o_mi_subtitle_bgcolor || o_mi == o_mi_subtitle_bgcolor || + o_mi_parent == o_mi_subtitle_bgopacity || o_mi == o_mi_subtitle_bgopacity || + o_mi_parent == o_mi_subtitle_outlinethickness || o_mi == o_mi_subtitle_outlinethickness || + o_mi_parent == o_mi_teletext || o_mi == o_mi_teletext) + bEnabled = o_mi_openSubtitleFile.isEnabled; } /* Special case for telx menu */ - if( [o_title isEqualToString: _NS("Normal Size")] ) - { + if ([o_title isEqualToString: _NS("Normal Size")]) { NSMenuItem *item = [[o_mi menu] itemWithTitle:_NS("Teletext")]; - - -bool b_telx = p_input && var_GetInteger( p_input, "teletext-es" ) >= 0; + bool b_telx = p_input && var_GetInteger(p_input, "teletext-es") >= 0; [[item submenu] setAutoenablesItems:NO]; - for( int k=0; k < [[item submenu] numberOfItems]; k++ ) - { + + for (int k=0; k < [[item submenu] numberOfItems]; k++) [[[item submenu] itemAtIndex:k] setEnabled: b_telx]; - } } - if( p_input ) vlc_object_release( p_input ); + if (p_input) + vlc_object_release(p_input); - return( bEnabled ); + return bEnabled; } @end @@ -1363,26 +1557,25 @@ bool b_telx = p_input && var_GetInteger( p_input, "teletext-es" ) >= 0; { self = [super init]; - if( self != nil ) - { - _vlc_object = vlc_object_hold( object ); - psz_name = strdup( name ); + if (self != nil) { + _vlc_object = vlc_object_hold(object); + psz_name = strdup(name); i_type = type; value = val; - if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) - value.psz_string = strdup( val.psz_string ); + if ((i_type & VLC_VAR_TYPE) == VLC_VAR_STRING) + value.psz_string = strdup(val.psz_string); } - return( self ); + return(self); } - (void)dealloc { - if( _vlc_object ) - vlc_object_release( _vlc_object ); - if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) - free( value.psz_string ); - free( psz_name ); + if (_vlc_object) + vlc_object_release(_vlc_object); + if ((i_type & VLC_VAR_TYPE) == VLC_VAR_STRING) + free(value.psz_string); + free(psz_name); [super dealloc]; } @@ -1398,7 +1591,7 @@ bool b_telx = p_input && var_GetInteger( p_input, "teletext-es" ) >= 0; - (vlc_object_t *)vlcObject { - return vlc_object_hold( _vlc_object ); + return vlc_object_hold(_vlc_object); }