[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