[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