@@ -941,87 +941,93 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
941941
942942 // MARK: Menu
943943
944+ private func menuItem (
945+ _ title : String , action : Selector ? , target : AnyObject ? = nil
946+ ) -> NSMenuItem {
947+ let item = NSMenuItem ( title : title , action : action , keyEquivalent : " " )
948+ item . target = target
949+ if let spec = headlessMenuShortcuts . first ( where : { $0 . title == title } ) {
950+ item . keyEquivalent = spec . key
951+ var mask : NSEvent . ModifierFlags = [ ]
952+ if spec . command { mask . insert ( . command ) }
953+ if spec . shift { mask . insert ( . shift ) }
954+ if spec . option { mask . insert ( . option ) }
955+ if spec . control { mask . insert ( . control ) }
956+ item . keyEquivalentModifierMask = mask
957+ }
958+ return item
959+ }
960+
944961 private func buildMenu ( ) {
945962 let main = NSMenu ( )
946963
947964 let appMenu = NSMenu ( )
948965 appMenu . addItem ( withTitle : " About Headless " ,
949966 action : #selector( NSApplication . orderFrontStandardAboutPanel ( _ : ) ) , keyEquivalent : " " )
950967 appMenu . addItem ( . separator ( ) )
951- appMenu . addItem ( withTitle : " Hide Headless " , action : #selector( NSApplication . hide ( _ : ) ) , keyEquivalent : " h " )
952- let hideOthers = appMenu . addItem ( withTitle : " Hide Others " ,
953- action : #selector( NSApplication . hideOtherApplications ( _ : ) ) , keyEquivalent : " h " )
954- hideOthers . keyEquivalentModifierMask = [ . command , . option ]
968+ appMenu . addItem ( menuItem ( " Hide Headless " , action : #selector( NSApplication . hide ( _ : ) ) ) )
969+ appMenu . addItem ( menuItem ( " Hide Others " , action : #selector( NSApplication . hideOtherApplications ( _ : ) ) ) )
955970 appMenu . addItem ( withTitle : " Show All " , action : #selector( NSApplication . unhideAllApplications ( _ : ) ) , keyEquivalent : " " )
956971 appMenu . addItem ( . separator ( ) )
957- appMenu . addItem ( withTitle : " Quit Headless " , action : #selector( NSApplication . terminate ( _ : ) ) , keyEquivalent : " q " )
972+ appMenu . addItem ( menuItem ( " Quit Headless " , action : #selector( NSApplication . terminate ( _ : ) ) ) )
958973 main . addItem ( withTitle : " Headless " , action : nil , keyEquivalent : " " ) . submenu = appMenu
959974
960975 let fileMenu = NSMenu ( title : " File " )
961- let newWin = fileMenu . addItem ( withTitle : " New Window " , action : #selector( newWindow ( _ : ) ) , keyEquivalent : " n " )
962- newWin . target = self
963- fileMenu . addItem ( withTitle : " Open Location… " ,
964- action : #selector( BrowserWindowController . openLocation ( _ : ) ) , keyEquivalent : " l " )
976+ fileMenu . addItem ( menuItem ( " New Window " , action : #selector( newWindow ( _ : ) ) , target : self ) )
977+ fileMenu . addItem ( menuItem ( " Open Location… " , action : #selector( BrowserWindowController . openLocation ( _ : ) ) ) )
965978 fileMenu . addItem ( . separator ( ) )
966- let snap = fileMenu . addItem ( withTitle : " Save Snapshot to Desktop " ,
967- action : #selector( BrowserWindowController . saveSnapshot ( _ : ) ) , keyEquivalent : " s " )
968- snap . keyEquivalentModifierMask = [ . command , . shift ]
979+ fileMenu . addItem ( menuItem (
980+ " Save Snapshot to Desktop " ,
981+ action : #selector( BrowserWindowController . saveSnapshot ( _ : ) )
982+ ) )
969983 fileMenu . addItem ( . separator ( ) )
970- fileMenu . addItem ( withTitle : " Close Window " , action : #selector( NSWindow . performClose ( _ : ) ) , keyEquivalent : " w " )
984+ fileMenu . addItem ( menuItem ( " Close Window " , action : #selector( NSWindow . performClose ( _ : ) ) ) )
971985 main . addItem ( withTitle : " File " , action : nil , keyEquivalent : " " ) . submenu = fileMenu
972986
973987 let editMenu = NSMenu ( title : " Edit " )
974- editMenu . addItem ( withTitle : " Undo " , action : NSSelectorFromString ( " undo: " ) , keyEquivalent : " z " )
975- editMenu . addItem ( withTitle : " Redo " , action : NSSelectorFromString ( " redo: " ) , keyEquivalent : " Z " )
988+ editMenu . addItem ( menuItem ( " Undo " , action : NSSelectorFromString ( " undo: " ) ) )
989+ editMenu . addItem ( menuItem ( " Redo " , action : NSSelectorFromString ( " redo: " ) ) )
976990 editMenu . addItem ( . separator ( ) )
977- editMenu . addItem ( withTitle : " Cut " , action : #selector( NSText . cut ( _ : ) ) , keyEquivalent : " x " )
978- editMenu . addItem ( withTitle : " Copy " , action : #selector( NSText . copy ( _ : ) ) , keyEquivalent : " c " )
979- editMenu . addItem ( withTitle : " Paste " , action : #selector( NSText . paste ( _ : ) ) , keyEquivalent : " v " )
980- editMenu . addItem ( withTitle : " Select All " , action : #selector( NSText . selectAll ( _ : ) ) , keyEquivalent : " a " )
991+ editMenu . addItem ( menuItem ( " Cut " , action : #selector( NSText . cut ( _ : ) ) ) )
992+ editMenu . addItem ( menuItem ( " Copy " , action : #selector( NSText . copy ( _ : ) ) ) )
993+ editMenu . addItem ( menuItem ( " Paste " , action : #selector( NSText . paste ( _ : ) ) ) )
994+ editMenu . addItem ( menuItem ( " Select All " , action : #selector( NSText . selectAll ( _ : ) ) ) )
981995 editMenu . addItem ( . separator ( ) )
982- let copyURL = editMenu . addItem ( withTitle : " Copy Current URL " ,
983- action : #selector( BrowserWindowController . copyPageURL ( _ : ) ) , keyEquivalent : " c " )
984- copyURL . keyEquivalentModifierMask = [ . command , . shift ]
996+ editMenu . addItem ( menuItem (
997+ " Copy Current URL " ,
998+ action : #selector( BrowserWindowController . copyPageURL ( _ : ) )
999+ ) )
9851000 main . addItem ( withTitle : " Edit " , action : nil , keyEquivalent : " " ) . submenu = editMenu
9861001
9871002 let viewMenu = NSMenu ( title : " View " )
988- viewMenu . addItem ( withTitle : " Reload Page " ,
989- action : #selector ( BrowserWindowController . reloadPage ( _ : ) ) , keyEquivalent : " r " )
990- let hardReload = viewMenu . addItem ( withTitle : " Reload Ignoring Cache " ,
991- action : #selector( BrowserWindowController . hardReloadPage ( _ : ) ) , keyEquivalent : " r " )
992- hardReload . keyEquivalentModifierMask = [ . command , . shift ]
1003+ viewMenu . addItem ( menuItem ( " Reload Page " , action : #selector ( BrowserWindowController . reloadPage ( _ : ) ) ) )
1004+ viewMenu . addItem ( menuItem (
1005+ " Reload Ignoring Cache " ,
1006+ action : #selector( BrowserWindowController . hardReloadPage ( _ : ) )
1007+ ) )
9931008 viewMenu . addItem ( . separator ( ) )
994- viewMenu . addItem ( withTitle : " Zoom In " ,
995- action : #selector( BrowserWindowController . zoomInPage ( _ : ) ) , keyEquivalent : " = " )
996- viewMenu . addItem ( withTitle : " Zoom Out " ,
997- action : #selector( BrowserWindowController . zoomOutPage ( _ : ) ) , keyEquivalent : " - " )
998- viewMenu . addItem ( withTitle : " Actual Size " ,
999- action : #selector( BrowserWindowController . resetZoom ( _ : ) ) , keyEquivalent : " 0 " )
1009+ viewMenu . addItem ( menuItem ( " Zoom In " , action : #selector( BrowserWindowController . zoomInPage ( _ : ) ) ) )
1010+ viewMenu . addItem ( menuItem ( " Zoom Out " , action : #selector( BrowserWindowController . zoomOutPage ( _ : ) ) ) )
1011+ viewMenu . addItem ( menuItem ( " Actual Size " , action : #selector( BrowserWindowController . resetZoom ( _ : ) ) ) )
10001012 viewMenu . addItem ( . separator ( ) )
1001- let fullScreen = viewMenu . addItem ( withTitle : " Enter Full Screen " ,
1002- action : #selector( NSWindow . toggleFullScreen ( _ : ) ) , keyEquivalent : " f " )
1003- fullScreen . keyEquivalentModifierMask = [ . command , . control ]
1013+ viewMenu . addItem ( menuItem ( " Enter Full Screen " , action : #selector( NSWindow . toggleFullScreen ( _ : ) ) ) )
10041014 main . addItem ( withTitle : " View " , action : nil , keyEquivalent : " " ) . submenu = viewMenu
10051015
10061016 let historyMenu = NSMenu ( title : " History " )
1007- historyMenu . addItem ( withTitle : " Back " ,
1008- action : #selector( BrowserWindowController . goBackAction ( _ : ) ) , keyEquivalent : " [ " )
1009- historyMenu . addItem ( withTitle : " Forward " ,
1010- action : #selector( BrowserWindowController . goForwardAction ( _ : ) ) , keyEquivalent : " ] " )
1017+ historyMenu . addItem ( menuItem ( " Back " , action : #selector( BrowserWindowController . goBackAction ( _ : ) ) ) )
1018+ historyMenu . addItem ( menuItem ( " Forward " , action : #selector( BrowserWindowController . goForwardAction ( _ : ) ) ) )
10111019 main . addItem ( withTitle : " History " , action : nil , keyEquivalent : " " ) . submenu = historyMenu
10121020
10131021 let windowMenu = NSMenu ( title : " Window " )
1014- windowMenu . addItem ( withTitle : " Minimize " , action : #selector( NSWindow . performMiniaturize ( _ : ) ) , keyEquivalent : " m " )
1022+ windowMenu . addItem ( menuItem ( " Minimize " , action : #selector( NSWindow . performMiniaturize ( _ : ) ) ) )
10151023 windowMenu . addItem ( withTitle : " Zoom " , action : #selector( NSWindow . performZoom ( _ : ) ) , keyEquivalent : " " )
10161024 windowMenu . addItem ( . separator ( ) )
1017- windowMenu . addItem ( withTitle : " Pin on Top " ,
1018- action : #selector( BrowserWindowController . togglePin ( _ : ) ) , keyEquivalent : " p " )
1025+ windowMenu . addItem ( menuItem ( " Pin on Top " , action : #selector( BrowserWindowController . togglePin ( _ : ) ) ) )
10191026 main . addItem ( withTitle : " Window " , action : nil , keyEquivalent : " " ) . submenu = windowMenu
10201027 NSApp . windowsMenu = windowMenu
10211028
10221029 let helpMenu = NSMenu ( title : " Help " )
1023- helpMenu . addItem ( withTitle : " Headless Help " ,
1024- action : #selector( BrowserWindowController . showHelpPage ( _ : ) ) , keyEquivalent : " ? " )
1030+ helpMenu . addItem ( menuItem ( " Headless Help " , action : #selector( BrowserWindowController . showHelpPage ( _ : ) ) ) )
10251031 main . addItem ( withTitle : " Help " , action : nil , keyEquivalent : " " ) . submenu = helpMenu
10261032 NSApp . helpMenu = helpMenu
10271033
0 commit comments