[vlc-commits] [Git][videolan/vlc][master] macosx: add SF Symbols icons to main menu, library, play queue, vout context menus
Felix Paul Kühne (@fkuehne)
gitlab at videolan.org
Fri May 29 12:48:43 UTC 2026
Felix Paul Kühne pushed to branch master at VideoLAN / VLC
Commits:
88f1fb5a by Serhii Bykov at 2026-05-29T14:24:21+02:00
macosx: add SF Symbols icons to main menu, library, play queue, vout context menus
- - - - -
6 changed files:
- modules/gui/macosx/Makefile.am
- + modules/gui/macosx/extensions/NSMenuItem+VLCAdditions.h
- + modules/gui/macosx/extensions/NSMenuItem+VLCAdditions.m
- modules/gui/macosx/library/VLCLibraryMenuController.m
- modules/gui/macosx/menus/VLCMainMenu.m
- modules/gui/macosx/playqueue/VLCPlayQueueMenuController.m
Changes:
=====================================
modules/gui/macosx/Makefile.am
=====================================
@@ -112,6 +112,8 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/extensions/NSIndexSet+VLCAdditions.m \
gui/macosx/extensions/NSMenu+VLCAdditions.h \
gui/macosx/extensions/NSMenu+VLCAdditions.m \
+ gui/macosx/extensions/NSMenuItem+VLCAdditions.h \
+ gui/macosx/extensions/NSMenuItem+VLCAdditions.m \
gui/macosx/extensions/NSScreen+VLCAdditions.h \
gui/macosx/extensions/NSScreen+VLCAdditions.m \
gui/macosx/extensions/NSString+Helpers.h \
=====================================
modules/gui/macosx/extensions/NSMenuItem+VLCAdditions.h
=====================================
@@ -0,0 +1,37 @@
+/*****************************************************************************
+* NSMenuItem+VLCAdditions.h: MacOS X interface module
+*****************************************************************************
+* Copyright (C) 2026 VLC authors and VideoLAN
+*
+* Author: Serhii Bykov <esphynox at gmail.com>
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+*****************************************************************************/
+
+#import <Cocoa/Cocoa.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+ at interface NSMenuItem (VLCAdditions)
+
+/* Sets the receiver's image to the given SF Symbol to match the macOS 26
+ * system behaviour. This is a no-op before macOS 26, and when the user opted
+ * out via `defaults write -g NSMenuEnableActionImages -bool NO`, leaving the
+ * menu item without an image. */
+- (void)vlc_setActionImageWithSystemSymbolName:(NSString *)symbolName;
+
+ at end
+
+NS_ASSUME_NONNULL_END
=====================================
modules/gui/macosx/extensions/NSMenuItem+VLCAdditions.m
=====================================
@@ -0,0 +1,39 @@
+/*****************************************************************************
+* NSMenuItem+VLCAdditions.m: MacOS X interface module
+*****************************************************************************
+* Copyright (C) 2026 VLC authors and VideoLAN
+*
+* Author: Serhii Bykov <esphynox at gmail.com>
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+*****************************************************************************/
+
+#import "NSMenuItem+VLCAdditions.h"
+
+ at implementation NSMenuItem (VLCAdditions)
+
+- (void)vlc_setActionImageWithSystemSymbolName:(NSString *)symbolName
+{
+ if (@available(macOS 26.0, *)) {
+ NSNumber * const enabled = [NSUserDefaults.standardUserDefaults objectForKey:@"NSMenuEnableActionImages"];
+ if (enabled != nil && !enabled.boolValue) {
+ return;
+ }
+ self.image = [NSImage imageWithSystemSymbolName:symbolName
+ accessibilityDescription:nil];
+ }
+}
+
+ at end
=====================================
modules/gui/macosx/library/VLCLibraryMenuController.m
=====================================
@@ -23,6 +23,7 @@
#import "VLCLibraryMenuController.h"
#import "extensions/NSMenu+VLCAdditions.h"
+#import "extensions/NSMenuItem+VLCAdditions.h"
#import "extensions/NSString+Helpers.h"
#import "library/VLCInputItem.h"
@@ -108,6 +109,18 @@
NSMenuItem *createPlaylistItem = [[NSMenuItem alloc] initWithTitle:_NS("Create Playlist from Selection") action:@selector(createPlaylistFromSelection:) keyEquivalent:@""];
createPlaylistItem.target = self;
+ [playItem vlc_setActionImageWithSystemSymbolName:@"play.fill"];
+ [appendItem vlc_setActionImageWithSystemSymbolName:@"text.line.last.and.arrowtriangle.forward"];
+ [createPlaylistItem vlc_setActionImageWithSystemSymbolName:@"music.note.list"];
+ [self.favoriteItem vlc_setActionImageWithSystemSymbolName:@"heart"];
+ [bookmarkItem vlc_setActionImageWithSystemSymbolName:@"bookmark"];
+ [addToLibraryItem vlc_setActionImageWithSystemSymbolName:@"plus.rectangle.on.folder"];
+ [revealItem vlc_setActionImageWithSystemSymbolName:@"folder"];
+ [_deleteItem vlc_setActionImageWithSystemSymbolName:@"trash"];
+ [markUnseenItem vlc_setActionImageWithSystemSymbolName:@"eye.slash"];
+ [informationItem vlc_setActionImageWithSystemSymbolName:@"info.circle"];
+ [addItem vlc_setActionImageWithSystemSymbolName:@"folder.badge.plus"];
+
_libraryMenu = [[NSMenu alloc] initWithTitle:@""];
[_libraryMenu addMenuItemsFromArray:@[
playItem,
@@ -188,6 +201,7 @@
}
self.favoriteItem.title = anyUnfavorited ? _NS("Add to Favorites") : _NS("Remove from Favorites");
self.favoriteItem.action = anyUnfavorited ? @selector(addFavorite:) : @selector(removeFavorite:);
+ [self.favoriteItem vlc_setActionImageWithSystemSymbolName:(anyUnfavorited ? @"heart" : @"heart.slash")];
// Update delete menu item title based on whether items are file-backed
BOOL hasFileBacked = NO;
=====================================
modules/gui/macosx/menus/VLCMainMenu.m
=====================================
@@ -22,6 +22,7 @@
#import "VLCMainMenu.h"
+#import "extensions/NSMenuItem+VLCAdditions.h"
#import "extensions/NSScreen+VLCAdditions.h"
#import "extensions/NSString+Helpers.h"
@@ -518,6 +519,74 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
[_voutMenuSubtitlestrackMenu setTitle: _NS("Subtitles Track")];
[_voutMenufullscreen setTitle: _NS("Fullscreen")];
[_voutMenusnapshot setTitle: _NS("Snapshot")];
+
+ /* File menu */
+ [_open_generic vlc_setActionImageWithSystemSymbolName:@"doc.badge.ellipsis"];
+ [_open_file vlc_setActionImageWithSystemSymbolName:@"doc"];
+ [_open_disc vlc_setActionImageWithSystemSymbolName:@"opticaldisc"];
+ [_open_net vlc_setActionImageWithSystemSymbolName:@"antenna.radiowaves.left.and.right"];
+ [_open_capture vlc_setActionImageWithSystemSymbolName:@"camera.viewfinder"];
+ [_connect_to_server vlc_setActionImageWithSystemSymbolName:@"server.rack"];
+ [_revealInFinder vlc_setActionImageWithSystemSymbolName:@"folder"];
+ [_save_playlist vlc_setActionImageWithSystemSymbolName:@"square.and.arrow.down"];
+ [_convertandsave vlc_setActionImageWithSystemSymbolName:@"arrow.triangle.2.circlepath"];
+
+ /* Playback menu */
+ [_play vlc_setActionImageWithSystemSymbolName:@"play.fill"];
+ [_stop vlc_setActionImageWithSystemSymbolName:@"stop.fill"];
+ [_record vlc_setActionImageWithSystemSymbolName:@"record.circle"];
+ [_previous vlc_setActionImageWithSystemSymbolName:@"backward.end.fill"];
+ [_next vlc_setActionImageWithSystemSymbolName:@"forward.end.fill"];
+ [_fwd vlc_setActionImageWithSystemSymbolName:@"goforward.10"];
+ [_bwd vlc_setActionImageWithSystemSymbolName:@"gobackward.10"];
+ [_random vlc_setActionImageWithSystemSymbolName:@"shuffle"];
+ [_repeat vlc_setActionImageWithSystemSymbolName:@"repeat"];
+ [_AtoBloop vlc_setActionImageWithSystemSymbolName:@"repeat.1"];
+ [_jumpToTime vlc_setActionImageWithSystemSymbolName:@"timer"];
+ [_sortPlayQueue vlc_setActionImageWithSystemSymbolName:@"arrow.up.arrow.down"];
+ [_lyrics vlc_setActionImageWithSystemSymbolName:@"text.quote"];
+
+ /* Audio menu */
+ [_vol_up vlc_setActionImageWithSystemSymbolName:@"speaker.wave.3.fill"];
+ [_vol_down vlc_setActionImageWithSystemSymbolName:@"speaker.wave.1.fill"];
+ [_mute vlc_setActionImageWithSystemSymbolName:@"speaker.slash.fill"];
+ [_audiotrack vlc_setActionImageWithSystemSymbolName:@"waveform"];
+ [_channels vlc_setActionImageWithSystemSymbolName:@"speaker.2.fill"];
+ [_audioDevice vlc_setActionImageWithSystemSymbolName:@"airplay.audio"];
+ [_visual vlc_setActionImageWithSystemSymbolName:@"music.note.tv"];
+
+ /* Video menu */
+ [_fullscreenItem vlc_setActionImageWithSystemSymbolName:@"arrow.up.left.and.arrow.down.right"];
+ [_snapshot vlc_setActionImageWithSystemSymbolName:@"camera"];
+ [_floatontop vlc_setActionImageWithSystemSymbolName:@"square.3.layers.3d.top.filled"];
+ [_videotrack vlc_setActionImageWithSystemSymbolName:@"video"];
+
+ /* Subtitles menu */
+ [_openSubtitleFile vlc_setActionImageWithSystemSymbolName:@"captions.bubble"];
+ [_subtitle_track vlc_setActionImageWithSystemSymbolName:@"text.bubble"];
+
+ /* Window menu */
+ [_info vlc_setActionImageWithSystemSymbolName:@"info.circle"];
+ [_audioeffects vlc_setActionImageWithSystemSymbolName:@"slider.horizontal.3"];
+ [_videoeffects vlc_setActionImageWithSystemSymbolName:@"wand.and.sparkles"];
+ [_bookmarks vlc_setActionImageWithSystemSymbolName:@"bookmark"];
+ [_playQueue vlc_setActionImageWithSystemSymbolName:@"list.bullet"];
+
+ /* Vout context menu */
+ [_voutMenuplay vlc_setActionImageWithSystemSymbolName:@"play.fill"];
+ [_voutMenustop vlc_setActionImageWithSystemSymbolName:@"stop.fill"];
+ [_voutMenuRecord vlc_setActionImageWithSystemSymbolName:@"record.circle"];
+ [_voutMenuprev vlc_setActionImageWithSystemSymbolName:@"backward.end.fill"];
+ [_voutMenunext vlc_setActionImageWithSystemSymbolName:@"forward.end.fill"];
+ [_voutMenuvolup vlc_setActionImageWithSystemSymbolName:@"speaker.wave.3.fill"];
+ [_voutMenuvoldown vlc_setActionImageWithSystemSymbolName:@"speaker.wave.1.fill"];
+ [_voutMenumute vlc_setActionImageWithSystemSymbolName:@"speaker.slash.fill"];
+ [_voutMenuAudiotrack vlc_setActionImageWithSystemSymbolName:@"waveform"];
+ [_voutMenuVideotrack vlc_setActionImageWithSystemSymbolName:@"video"];
+ [_voutMenuOpenSubtitleFile vlc_setActionImageWithSystemSymbolName:@"captions.bubble"];
+ [_voutMenuSubtitlestrack vlc_setActionImageWithSystemSymbolName:@"text.bubble"];
+ [_voutMenufullscreen vlc_setActionImageWithSystemSymbolName:@"arrow.up.left.and.arrow.down.right"];
+ [_voutMenusnapshot vlc_setActionImageWithSystemSymbolName:@"camera"];
}
- (void)setupKeyboardShortcuts
@@ -1581,6 +1650,8 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
[_play setTitle: _NS("Play")];
[_dockMenuplay setTitle: _NS("Play")];
[_voutMenuplay setTitle: _NS("Play")];
+ [_play vlc_setActionImageWithSystemSymbolName:@"play.fill"];
+ [_voutMenuplay vlc_setActionImageWithSystemSymbolName:@"play.fill"];
}
- (void)setPause
@@ -1588,6 +1659,8 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
[_play setTitle: _NS("Pause")];
[_dockMenuplay setTitle: _NS("Pause")];
[_voutMenuplay setTitle: _NS("Pause")];
+ [_play vlc_setActionImageWithSystemSymbolName:@"pause.fill"];
+ [_voutMenuplay vlc_setActionImageWithSystemSymbolName:@"pause.fill"];
}
- (void)setRepeatOne
=====================================
modules/gui/macosx/playqueue/VLCPlayQueueMenuController.m
=====================================
@@ -26,6 +26,7 @@
#import "extensions/NSString+Helpers.h"
#import "extensions/NSMenu+VLCAdditions.h"
+#import "extensions/NSMenuItem+VLCAdditions.h"
#import "library/VLCLibraryController.h"
#import "main/VLCMain.h"
#import "playqueue/VLCPlayQueueController.h"
@@ -95,6 +96,15 @@
_sortMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Sort Play Queue") action:nil keyEquivalent:@""];
[_sortMenuItem setSubmenu:_playQueueSortingMenuController.playQueueSortingMenu];
+ [_playMenuItem vlc_setActionImageWithSystemSymbolName:@"play.fill"];
+ [_removeMenuItem vlc_setActionImageWithSystemSymbolName:@"minus.circle"];
+ [_revealInFinderMenuItem vlc_setActionImageWithSystemSymbolName:@"folder"];
+ [_informationMenuItem vlc_setActionImageWithSystemSymbolName:@"info.circle"];
+ [_addFilesToPlayQueueMenuItem vlc_setActionImageWithSystemSymbolName:@"plus.circle"];
+ [_clearPlayQueueMenuItem vlc_setActionImageWithSystemSymbolName:@"xmark.circle"];
+ [_createPlaylistMenuItem vlc_setActionImageWithSystemSymbolName:@"music.note.list"];
+ [_sortMenuItem vlc_setActionImageWithSystemSymbolName:@"arrow.up.arrow.down"];
+
self.items = @[
_playMenuItem,
_removeMenuItem,
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/88f1fb5ad387f90f58485f7f8d0af4227bc237f7
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/88f1fb5ad387f90f58485f7f8d0af4227bc237f7
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