[vlc-commits] [Git][videolan/vlc][master] 5 commits: macosx: Disable video menu submenu menu items when there is no active video

Steve Lhomme (@robUx4) gitlab at videolan.org
Tue Aug 4 03:58:24 UTC 2026



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
d0236cd0 by Claudio Cambra at 2026-08-04T03:45:57+00:00
macosx: Disable video menu submenu menu items when there is no active video

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
b51e3b5c by Claudio Cambra at 2026-08-04T03:45:57+00:00
macosx: Disable subtitle submenu menu items if there are no subtitle tracks

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
981a7c1b by Claudio Cambra at 2026-08-04T03:45:57+00:00
macosx: Disable recents menu entries if there are no recent items

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

f f

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
067cf7e8 by Claudio Cambra at 2026-08-04T03:45:57+00:00
macosx: Disable renderers menu item if there are no available external renderers

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
9f3b0b15 by Claudio Cambra at 2026-08-04T03:45:57+00:00
macosx: Disable audio submenus if there are no available audio tracks

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -


5 changed files:

- modules/gui/macosx/menus/VLCMainMenu.m
- modules/gui/macosx/menus/VLCRecentStreamsMenuController.h
- modules/gui/macosx/menus/VLCRecentStreamsMenuController.m
- modules/gui/macosx/menus/renderers/VLCRendererMenuController.h
- modules/gui/macosx/menus/renderers/VLCRendererMenuController.m


Changes:

=====================================
modules/gui/macosx/menus/VLCMainMenu.m
=====================================
@@ -114,6 +114,7 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
     __strong VLCTimeSelectionPanelController *_timeSelectionPanel;
     __strong VLCCustomCropArWindowController *_customARController;
 }
+
 @end
 
 @implementation VLCMainMenu
@@ -153,12 +154,16 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
     [self setupKeyboardShortcuts];
 
     /* configure playback / controls menu */
+    self.fileMenu.delegate = self;
     self.controlsMenu.delegate = self;
+    self.audioMenu.delegate = self;
+    self.videoMenu.delegate = self;
     self.subtitlesMenu.delegate = self;
     [_rendererNoneItem setState:NSOnState];
     _rendererMenuController = [[VLCRendererMenuController alloc] init];
     _rendererMenuController.rendererNoneItem = _rendererNoneItem;
     _rendererMenuController.rendererMenu = _rendererMenu;
+    _rendererMenuController.rendererMenuItem = _rendererMenuItem;
     _playQueueSortingController = [[VLCPlayQueueSortingMenuController alloc] init];
     _sortPlayQueue.submenu = _playQueueSortingController.playQueueSortingMenu;
     _recentStreamsMenuController =
@@ -294,6 +299,10 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
     [_voutMenumute matchKeyEquivalentsOfMenuItem:_mute];
     [_voutMenufullscreen matchKeyEquivalentsOfMenuItem:_fullscreenItem];
     [_voutMenusnapshot matchKeyEquivalentsOfMenuItem:_snapshot];
+
+    [self updateVideoSubmenuEnablement];
+    [self updateAudioSubmenuEnablement];
+    [self updateRecentMenuEnablement];
 }
 
 - (void)setupMenu:(NSMenu *)menu withIntList:(char *)psz_name andSelector:(SEL)selector
@@ -693,6 +702,46 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
 
 #pragma mark - Interface update
 
+- (void)updateVideoSubmenuEnablement
+{
+    vout_thread_t * const p_vout = _playerController.videoOutputThreadForKeyWindow;
+    const BOOL enabled = p_vout != NULL &&
+                         _playerController.currentMedia != nil &&
+                         _playerController.activeVideoPlayback;
+
+    _aspect_ratio.enabled = enabled;
+    _crop.enabled = enabled;
+    _deinterlace.enabled = enabled;
+    _deinterlace_mode.enabled = enabled;
+    _postprocessing.enabled = enabled;
+    _screen.enabled = enabled;
+    _videotrack.enabled = enabled && _playerController.videoTracks.count > 0;
+
+    if (p_vout != NULL)
+        vout_Release(p_vout);
+}
+
+- (void)updateAudioSubmenuEnablement
+{
+    audio_output_t * const p_aout = _playerController.mainAudioOutput;
+    const BOOL enabled = p_aout != NULL &&
+                         _playerController.currentMedia != nil &&
+                         _playerController.playerState != VLC_PLAYER_STATE_STOPPED;
+
+    _audiotrack.enabled = enabled && _playerController.audioTracks.count > 0;
+    _channels.enabled = enabled;
+    _visual.enabled = enabled;
+
+    if (p_aout != NULL)
+        aout_Release(p_aout);
+}
+
+- (void)updateRecentMenuEnablement
+{
+    _open_recent.enabled = NSDocumentController.sharedDocumentController.recentDocumentURLs.count > 0;
+    _recent_streams.enabled = _recentStreamsMenuController.hasEntries;
+}
+
 - (void)mediaItemChanged:(NSNotification *)notification
 {
     [self updateTrackHandlingMenus:notification];
@@ -702,6 +751,9 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
         [self rebuildAoutMenu];
         [self rebuildVoutMenu];
     }
+
+    [self updateVideoSubmenuEnablement];
+    [self updateAudioSubmenuEnablement];
 }
 
 - (void)rebuildAoutMenu
@@ -727,6 +779,7 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
 - (void)voutListChanged:(NSNotification *)aNotification
 {
     [self rebuildVoutMenu];
+    [self updateVideoSubmenuEnablement];
 }
 
 - (void)rebuildVoutMenu
@@ -794,11 +847,22 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
         [menuItem setTarget: self];
     }
     [[submenu itemWithTag: var_InheritInteger(getIntf(), "macosx-vdev")] setState: NSOnState];
+    [self updateVideoSubmenuEnablement];
 }
 
 - (void)updateSubtitlesMenu:(NSNotification *)notification
 {
     const BOOL enabled = [self validateUserInterfaceItem:self.openSubtitleFile];
+    const BOOL hasSubtitleTracks = _playerController.subtitleTracks.count > 0;
+
+    self.subtitleSize.enabled = enabled;
+    self.subtitle_track.enabled = enabled && hasSubtitleTracks;
+    self.subtitle_textcolor.enabled = enabled;
+    self.subtitle_outlinethickness.enabled = enabled;
+    self.subtitle_bgopacity.enabled = enabled;
+    self.subtitle_bgcolor.enabled = enabled;
+    self.teletext.enabled = enabled && _playerController.teletextMenuAvailable;
+
     self.subtitleSizeSlider.enabled = enabled;
 
     const unsigned int scaleFactor = _playerController.subtitleTextScalingFactor;
@@ -1035,6 +1099,8 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
                    category:SPU_ES];
 
     [self updateSubtitlesMenu:notification];
+    [self updateVideoSubmenuEnablement];
+    [self updateAudioSubmenuEnablement];
 }
 
 - (void)rebuildTracksMenu:(NSMenu *)menu
@@ -1611,6 +1677,9 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
 
 - (void)playbackStateChanged:(NSNotification *)aNotification
 {
+    [self updateVideoSubmenuEnablement];
+    [self updateAudioSubmenuEnablement];
+
     switch (_playerController.playerState) {
         case VLC_PLAYER_STATE_PLAYING:
             [self setPause];
@@ -1963,6 +2032,19 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
 - (void)menuWillOpen:(NSMenu *)menu
 {
     [_rendererMenuController startRendererDiscoveries];
+    [_rendererMenuController updateRendererMenuItemEnablement];
+
+    if (menu == self.fileMenu) {
+        [self updateRecentMenuEnablement];
+    }
+
+    if (menu == self.audioMenu) {
+        [self updateAudioSubmenuEnablement];
+    }
+
+    if (menu == self.videoMenu) {
+        [self updateVideoSubmenuEnablement];
+    }
 
     if (@available(macOS 10.16, *)) {
 
@@ -1985,6 +2067,7 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
         }
 
         if (menu == _subtitlesMenu) {
+            [self updateSubtitlesMenu:nil];
             _subtitle_bgopacity_view_offset_constraint.constant = menuItemOffset;
             _subtitleSizeViewOffsetConstraint.constant = menuItemOffset;
         }
@@ -2076,7 +2159,7 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
         return _playerController.currentMedia != nil && _playerController.teletextMenuAvailable;
     } else if (mi == self.voutMenuAudiotrack) {
         return _playerController.audioTracks.count > 0;
-    } else if (mi == self.voutMenuVideotrack) {
+    } else if (mi == self.videotrack || mi == self.voutMenuVideotrack) {
         return _playerController.videoTracks.count > 0;
     } else if (mi == self.voutMenuSubtitlestrack) {
         return _playerController.subtitleTracks.count > 0;


=====================================
modules/gui/macosx/menus/VLCRecentStreamsMenuController.h
=====================================
@@ -26,6 +26,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface VLCRecentStreamsMenuController : NSObject
 
+ at property (readonly) BOOL hasEntries;
+
 - (instancetype)initWithSubmenu:(NSMenu *)submenu;
 
 @end


=====================================
modules/gui/macosx/menus/VLCRecentStreamsMenuController.m
=====================================
@@ -89,6 +89,7 @@ static void recentStreamsLibraryCallback(void *p_data, const vlc_ml_event_t *p_e
 - (void)rebuild
 {
     [_submenu removeAllItems];
+    _hasEntries = NO;
 
     if (_mediaLibrary == NULL) {
         return;
@@ -125,6 +126,8 @@ static void recentStreamsLibraryCallback(void *p_data, const vlc_ml_event_t *p_e
         vlc_ml_media_list_release(list);
     }
 
+    _hasEntries = hasEntries;
+
     NSMenuItem *clearItem = [[NSMenuItem alloc] initWithTitle:_NS("Clear Menu")
                                                        action:@selector(clearRecentStreams:)
                                                 keyEquivalent:@""];


=====================================
modules/gui/macosx/menus/renderers/VLCRendererMenuController.h
=====================================
@@ -28,11 +28,13 @@
 @interface VLCRendererMenuController : NSObject <VLCRendererDiscoveryDelegate>
 
 @property (readwrite, weak) NSMenu *rendererMenu;
+ at property (readwrite, weak) NSMenuItem *rendererMenuItem;
 @property (readwrite, weak) NSMenuItem *rendererNoneItem;
 @property (readonly, strong) NSArray<VLCRendererItem *> *rendererItems;
 
 - (void)startRendererDiscoveries;
 - (void)stopRendererDiscoveries;
+- (void)updateRendererMenuItemEnablement;
 - (void)selectRenderer:(NSMenuItem *)sender;
 
 @end


=====================================
modules/gui/macosx/menus/renderers/VLCRendererMenuController.m
=====================================
@@ -44,6 +44,12 @@
 
 @implementation VLCRendererMenuController
 
+- (void)setRendererMenuItem:(NSMenuItem *)rendererMenuItem
+{
+    _rendererMenuItem = rendererMenuItem;
+    [self updateRendererMenuItemEnablement];
+}
+
 - (instancetype)init
 {
     self = [super init];
@@ -100,6 +106,7 @@
     NSMutableArray * const mutableRenderers = _rendererItems.mutableCopy;
     [mutableRenderers addObject:item];
     _rendererItems = mutableRenderers.copy;
+    [self updateRendererMenuItemEnablement];
 
     // Check if the item is already selected
     if (_selectedItem.representedObject != nil) {
@@ -138,6 +145,7 @@
     NSMutableArray * const mutableRenderers = _rendererItems.mutableCopy;
     [mutableRenderers removeObject:item];
     _rendererItems = mutableRenderers.copy;
+    [self updateRendererMenuItemEnablement];
 
     const NSInteger index = [_rendererMenu indexOfItemWithRepresentedObject:item];
     if (index >= 0) {
@@ -165,6 +173,11 @@
     }
 }
 
+- (void)updateRendererMenuItemEnablement
+{
+    _rendererMenuItem.enabled = _rendererItems.count > 0;
+}
+
 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
     if (menuItem == _rendererNoneItem ||
         [[menuItem representedObject] isKindOfClass:[VLCRendererItem class]]) {



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/c6241125f6a645c09e54c1b97ed9f1e0d0007ea2...9f3b0b15421330811a369353149520a17012c20f

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/c6241125f6a645c09e54c1b97ed9f1e0d0007ea2...9f3b0b15421330811a369353149520a17012c20f
You're receiving this email because of your account on code.videolan.org. Manage all notifications: https://code.videolan.org/-/profile/notifications | Help: https://code.videolan.org/help




More information about the vlc-commits mailing list