@@ -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