diff options
author | der richter <der.richter@gmx.de> | 2024-03-03 02:49:11 +0100 |
---|---|---|
committer | der richter <der.richter@gmx.de> | 2024-03-07 01:03:52 +0100 |
commit | fe35baa88e128f54d766fcb8b76857b036c91088 (patch) | |
tree | fffa3ae487636678456fd56b315a651292920335 | |
parent | bbbd6e272ce9bc7b87cff117d270728602df40b5 (diff) | |
download | mpv-fe35baa88e128f54d766fcb8b76857b036c91088.tar.bz2 mpv-fe35baa88e128f54d766fcb8b76857b036c91088.tar.xz |
mac/menu: rewrite menu bar in swift
-rw-r--r-- | meson.build | 12 | ||||
-rw-r--r-- | osdep/mac/application.h | 1 | ||||
-rw-r--r-- | osdep/mac/application_objc.h | 2 | ||||
-rw-r--r-- | osdep/mac/menu_bar.swift | 464 | ||||
-rw-r--r-- | osdep/mac/menubar.h | 30 | ||||
-rw-r--r-- | osdep/mac/menubar.m | 853 | ||||
-rw-r--r-- | osdep/mac/menubar_objc.h | 25 | ||||
-rw-r--r-- | osdep/mac/meson.build | 4 | ||||
-rw-r--r-- | osdep/mac/swift_bridge.h | 3 | ||||
-rw-r--r-- | video/out/mac/window.swift | 10 |
10 files changed, 483 insertions, 921 deletions
diff --git a/meson.build b/meson.build index c58de3e175..dd07caeb1e 100644 --- a/meson.build +++ b/meson.build @@ -396,8 +396,7 @@ if features['cocoa'] 'osdep/path-mac.m', 'osdep/utils-mac.c', 'osdep/mac/application.m', - 'osdep/mac/events.m', - 'osdep/mac/menubar.m') + 'osdep/mac/events.m') endif if posix @@ -1516,6 +1515,7 @@ if features['cocoa'] and features['swift'] swift_sources += files('osdep/mac/libmpv_helper.swift', 'osdep/mac/log_helper.swift', 'osdep/mac/mpv_helper.swift', + 'osdep/mac/menu_bar.swift', 'osdep/mac/precise_timer.swift', 'osdep/mac/swift_compat.swift', 'osdep/mac/swift_extensions.swift', @@ -1549,10 +1549,6 @@ if features['macos-media-player'] swift_sources += files('osdep/mac/remote_command_center.swift') endif -if features['swift'] and swift_sources.length() > 0 - subdir('osdep/mac') -endif - macos_touchbar = get_option('macos-touchbar').require( features['cocoa'] and cc.has_header('AppKit/NSTouchBar.h'), error_message: 'Either cocoa could not be found or AppKit/NSTouchBar.h could not be found!', @@ -1562,6 +1558,10 @@ if features['macos-touchbar'] sources += files('osdep/mac/touchbar.m') endif +if features['swift'] and swift_sources.length() > 0 + subdir('osdep/mac') +endif + # manpages manpage = 'DOCS/man/mpv.rst' diff --git a/osdep/mac/application.h b/osdep/mac/application.h index 6b83abd248..06e5f1dcb5 100644 --- a/osdep/mac/application.h +++ b/osdep/mac/application.h @@ -18,7 +18,6 @@ #ifndef MAC_APPLICATION #define MAC_APPLICATION -#include "osdep/mac/menubar.h" #include "options/m_option.h" enum { diff --git a/osdep/mac/application_objc.h b/osdep/mac/application_objc.h index ad4f13ec5d..6e492eef0e 100644 --- a/osdep/mac/application_objc.h +++ b/osdep/mac/application_objc.h @@ -17,9 +17,9 @@ #import <Cocoa/Cocoa.h> #include "osdep/mac/application.h" -#import "osdep/mac/menubar_objc.h" @class CocoaCB; +@class MenuBar; struct mpv_event; struct mpv_handle; diff --git a/osdep/mac/menu_bar.swift b/osdep/mac/menu_bar.swift new file mode 100644 index 0000000000..c5e39d8670 --- /dev/null +++ b/osdep/mac/menu_bar.swift @@ -0,0 +1,464 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * mpv 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see <http://www.gnu.org/licenses/>. + */ + +extension MenuBar { + enum MenuKey { + case normalSize + case halfSize + case doubleSize + case minimize + case zoom + } + + struct Config { + let name: String + let key: String + let modifiers: NSEvent.ModifierFlags + let action: Selector? + let target: AnyObject? + let command: String + let url: String? + let file: String? + let alertTitle1: String? + let alertText1: String? + let alertTitle2: String? + let alertText2: String? + let alertTitle3: String? + let alertText3: String? + let commandSpecial: MenuKey? + var menuItem: NSMenuItem? + var configs: [Config]? + + init( + name: String = "", + key: String = "", + modifiers: NSEvent.ModifierFlags = .command, + action: Selector? = nil, + target: AnyObject? = nil, + command: String = "", + url: String? = nil, + file: String? = nil, + alertTitle1: String? = nil, + alertText1: String? = nil, + alertTitle2: String? = nil, + alertText2: String? = nil, + alertTitle3: String? = nil, + alertText3: String? = nil, + commandSpecial: MenuKey? = nil, + menuItem: NSMenuItem? = nil, + configs: [Config]? = nil + ) { + self.name = name + self.key = key + self.modifiers = modifiers + self.action = action + self.target = target + self.command = command + self.url = url + self.file = file + self.alertTitle1 = alertTitle1 + self.alertText1 = alertText1 + self.alertTitle2 = alertTitle2 + self.alertText2 = alertText2 + self.alertTitle3 = alertTitle3 + self.alertText3 = alertText3 + self.commandSpecial = commandSpecial + self.menuItem = menuItem + self.configs = configs + } + } +} + +class MenuBar: NSObject { + var menuConfigs: [Config] = [] + let appIcon: NSImage + + @objc override init() { + UserDefaults.standard.set(false, forKey: "NSFullScreenMenuItemEverywhere") + UserDefaults.standard.set(true, forKey: "NSDisabledDictationMenuItem") + UserDefaults.standard.set(true, forKey: "NSDisabledCharacterPaletteMenuItem") + NSWindow.allowsAutomaticWindowTabbing = false + appIcon = (NSApp as? Application)?.getMPVIcon() ?? NSImage(size: NSSize(width: 1, height: 1)) + + super.init() + + let appMenuConfigs = [ + Config(name: "About mpv", action: #selector(about), target: self), + Config(name: "separator"), + Config( + name: "Preferences…", + key: ",", + action: #selector(preferences(_:)), + target: self, + file: "mpv.conf", + alertTitle1: "No Application found to open your config file.", + alertText1: "Please open the mpv.conf file with your preferred text editor in the now open folder to edit your config.", + alertTitle2: "No config file found.", + alertText2: "Please create a mpv.conf file with your preferred text editor in the now open folder.", + alertTitle3: "No config path or file found.", + alertText3: "Please create the following path ~/.config/mpv/ and a mpv.conf file within with your preferred text editor." + ), + Config( + name: "Keyboard Shortcuts Config…", + action: #selector(preferences(_:)), + target: self, + file: "input.conf", + alertTitle1: "No Application found to open your config file.", + alertText1: "Please open the input.conf file with your preferred text editor in the now open folder to edit your config.", + alertTitle2: "No config file found.", + alertText2: "Please create a input.conf file with your preferred text editor in the now open folder.", + alertTitle3: "No config path or file found.", + alertText3: "Please create the following path ~/.config/mpv/ and a input.conf file within with your preferred text editor." + ), + Config(name: "separator"), + Config(name: "Services"), + Config(name: "separator"), + Config(name: "Hide mpv", key: "h", action: #selector(NSApp.hide(_:))), + Config(name: "Hide Others", key: "h", modifiers: [.command, .option], action: #selector(NSApp.hideOtherApplications(_:))), + Config(name: "Show All", action: #selector(NSApp.unhideAllApplications(_:))), + Config(name: "separator"), + Config(name: "Quit and Remember Position", action: #selector(quit(_:)), target: self, command: "quit-watch-later"), + Config(name: "Quit mpv", key: "q", action: #selector(quit(_:)), target: self, command: "quit"), + ] + + let fileMenuConfigs = [ + Config(name: "Open File…", key: "o", action: #selector(openFile), target: self), + Config(name: "Open URL…", key: "O", action: #selector(openUrl), target: self), + Config(name: "Open Playlist…", action: #selector(openPlaylist), target: self), + Config(name: "separator"), + Config(name: "Close", key: "w", action: #selector(NSWindow.performClose(_:))), + Config(name: "Save Screenshot", action: #selector(command(_:)), target: self, command: "async screenshot"), + ] + + let editMenuConfigs = [ + Config(name: "Undo", key: "z", action: Selector(("undo:"))), + Config(name: "Redo", key: "Z", action: Selector(("redo:"))), + Config(name: "separator"), + Config(name: "Cut", key: "x", action: #selector(NSText.cut(_:))), + Config(name: "Copy", key: "c", action: #selector(NSText.copy(_:))), + Config(name: "Paste", key: "v", action: #selector(NSText.paste(_:))), + Config(name: "Select All", key: "a", action: #selector(NSResponder.selectAll(_:))), + ] + + var viewMenuConfigs = [ + Config(name: "Toggle Fullscreen", action: #selector(command(_:)), target: self, command: "cycle fullscreen"), + Config(name: "Toggle Float on Top", action: #selector(command(_:)), target: self, command: "cycle ontop"), + Config( + name: "Toggle Visibility on All Workspaces", + action: #selector(command(_:)), + target: self, + command: "cycle on-all-workspaces" + ), + ] +#if HAVE_MACOS_TOUCHBAR + viewMenuConfigs += [ + Config(name: "separator"), + Config(name: "Customize Touch Bar…", action: #selector(NSApp.toggleTouchBarCustomizationPalette(_:))), + ] +#endif + + let videoMenuConfigs = [ + Config(name: "Zoom Out", action: #selector(command(_:)), target: self, command: "add panscan -0.1"), + Config(name: "Zoom In", action: #selector(command(_:)), target: self, command: "add panscan 0.1"), + Config(name: "Reset Zoom", action: #selector(command(_:)), target: self, command: "set panscan 0"), + Config(name: "separator"), + Config(name: "Aspect Ratio 4:3", action: #selector(command(_:)), target: self, command: "set video-aspect-override \"4:3\""), + Config(name: "Aspect Ratio 16:9", action: #selector(command(_:)), target: self, command: "set video-aspect-override \"16:9\""), + Config(name: "Aspect Ratio 1.85:1", action: #selector(command(_:)), target: self, command: "set video-aspect-override \"1.85:1\""), + Config(name: "Aspect Ratio 2.35:1", action: #selector(command(_:)), target: self, command: "set video-aspect-override \"2.35:1\""), + Config(name: "Reset Aspect Ratio", action: #selector(command(_:)), target: self, command: "set video-aspect-override \"-1\""), + Config(name: "separator"), + Config(name: "Rotate Left", action: #selector(command(_:)), target: self, command: "cycle-values video-rotate 0 270 180 90"), + Config(name: "Rotate Right", action: #selector(command(_:)), target: self, command: "cycle-values video-rotate 90 180 270 0"), + Config(name: "Reset Rotation", action: #selector(command(_:)), target: self, command: "set video-rotate 0"), + Config(name: "separator"), + Config(name: "Half Size", key: "0", commandSpecial: .halfSize), + Config(name: "Normal Size", key: "1", commandSpecial: .normalSize), + Config(name: "Double Size", key: "2", commandSpecial: .doubleSize), + ] + + let audioMenuConfigs = [ + Config(name: "Next Audio Track", action: #selector(command(_:)), target: self, command: "cycle audio"), + Config(name: "Previous Audio Track", action: #selector(command(_:)), target: self, command: "cycle audio down"), + Config(name: "separator"), + Config(name: "Toggle Mute", action: #selector(command(_:)), target: self, command: "cycle mute"), + Config(name: "separator"), + Config(name: "Play Audio Later", action: #selector(command(_:)), target: self, command: "add audio-delay 0.1"), + Config(name: "Play Audio Earlier", action: #selector(command(_:)), target: self, command: "add audio-delay -0.1"), + Config(name: "Reset Audio Delay", action: #selector(command(_:)), target: self, command: "set audio-delay 0.0"), + ] + + let subtitleMenuConfigs = [ + Config(name: "Next Subtitle Track", action: #selector(command(_:)), target: self, command: "cycle sub"), + Config(name: "Previous Subtitle Track", action: #selector(command(_:)), target: self, command: "cycle sub down"), + Config(name: "separator"), + Config(name: "Toggle Force Style", action: #selector(command(_:)), target: self, command: "cycle-values sub-ass-override \"force\" \"no\""), + Config(name: "separator"), + Config(name: "Display Subtitles Later", action: #selector(command(_:)), target: self, command: "add sub-delay 0.1"), + Config(name: "Display Subtitles Earlier", action: #selector(command(_:)), target: self, command: "add sub-delay -0.1"), + Config(name: "Reset Subtitle Delay", action: #selector(command(_:)), target: self, command: "set sub-delay 0.0"), + ] + + let playbackMenuConfigs = [ + Config(name: "Toggle Pause", action: #selector(command(_:)), target: self, command: "cycle pause"), + Config(name: "Increase Speed", action: #selector(command(_:)), target: self, command: "add speed 0.1"), + Config(name: "Decrease Speed", action: #selector(command(_:)), target: self, command: "add speed -0.1"), + Config(name: "Reset Speed", action: #selector(command(_:)), target: self, command: "set speed 1.0"), + Config(name: "separator"), + Config(name: "Show Playlist", action: #selector(command(_:)), target: self, command: "script-message osc-playlist"), + Config(name: "Show Chapters", action: #selector(command(_:)), target: self, command: "script-message osc-chapterlist"), + Config(name: "Show Tracks", action: #selector(command(_:)), target: self, command: "script-message osc-tracklist"), + Config(name: "separator"), + Config(name: "Next File", action: #selector(command(_:)), target: self, command: "playlist-next"), + Config(name: "Previous File", action: #selector(command(_:)), target: self, command: "playlist-prev"), + Config(name: "Toggle Loop File", action: #selector(command(_:)), target: self, command: "cycle-values loop-file \"inf\" \"no\""), + Config(name: "Toggle Loop Playlist", action: #selector(command(_:)), target: self, command: "cycle-values loop-playlist \"inf\" \"no\""), + Config(name: "Shuffle", action: #selector(command(_:)), target: self, command: "playlist-shuffle"), + Config(name: "separator"), + Config(name: "Next Chapter", action: #selector(command(_:)), target: self, command: "add chapter 1"), + Config(name: "Previous Chapter", action: #selector(command(_:)), target: self, command: "add chapter -1"), + Config(name: "separator"), + Config(name: "Step Forward", action: #selector(command(_:)), target: self, command: "frame-step"), + Config(name: "Step Backward", action: #selector(command(_:)), target: self, command: "frame-back-step"), + ] + + let windowMenuConfigs = [ + Config(name: "Minimize", key: "m", commandSpecial: .minimize), + Config(name: "Zoom", key: "z", commandSpecial: .zoom), + ] + + let helpMenuConfigs = [ + Config(name: "mpv Website…", action: #selector(url(_:)), target: self, url: "https://mpv.io"), + Config(name: "mpv on GitHub…", action: #selector(url(_:)), target: self, url: "https://github.com/mpv-player/mpv"), + Config(name: "separator"), + Config(name: "Online Manual…", action: #selector(url(_:)), target: self, url: "https://mpv.io/manual/master/"), + Config(name: "Online Wiki…", action: #selector(url(_:)), target: self, url: "https://github.com/mpv-player/mpv/wiki"), + Config(name: "Release Notes…", action: #selector(url(_:)), target: self, url: "https://github.com/mpv-player/mpv/blob/master/RELEASE_NOTES"), + Config(name: "Keyboard Shortcuts…", action: #selector(url(_:)), target: self, url: "https://github.com/mpv-player/mpv/blob/master/etc/input.conf"), + Config(name: "separator"), + Config(name: "Report Issue…", action: #selector(url(_:)), target: self, url: "https://github.com/mpv-player/mpv/issues/new/choose"), + Config( + name: "Show log File…", + action: #selector(showFile(_:)), + target: self, + file: NSHomeDirectory() + "/Library/Logs/mpv.log", + alertTitle1: "No log File found.", + alertText1: "You deactivated logging for the Bundle." + ), + ] + + menuConfigs = [ + Config(name: "Apple", configs: appMenuConfigs), + Config(name: "File", configs: fileMenuConfigs), + Config(name: "Edit", configs: editMenuConfigs), + Config(name: "View", configs: viewMenuConfigs), + Config(name: "Video", configs: videoMenuConfigs), + Config(name: "Audio", configs: audioMenuConfigs), + Config(name: "Subtitle", configs: subtitleMenuConfigs), + Config(name: "Playback", configs: playbackMenuConfigs), + Config(name: "Window", configs: windowMenuConfigs), + Config(name: "Help", configs: helpMenuConfigs), + ] + + NSApp.mainMenu = generateMainMenu() + } + + func generateMainMenu() -> NSMenu { + let mainMenu = NSMenu(title: "MainMenu") + NSApp.servicesMenu = NSMenu() + + for (menuConfigIndex, menuConfig) in menuConfigs.enumerated() { + let menu = NSMenu(title: menuConfig.name) + let item = NSMenuItem(title: menuConfig.name, action: nil, keyEquivalent: menuConfig.key) + mainMenu.addItem(item) + mainMenu.setSubmenu(menu, for: item) + menuConfigs[menuConfigIndex].menuItem = item + + for (subConfigIndex, subConfig) in (menuConfig.configs ?? []).enumerated() { +#if HAVE_MACOS_TOUCHBAR + if subConfig.action == "toggleTouchBarCustomizationPalette:" { + continue + } +#endif + + if subConfig.name == "Show log File…" && ProcessInfo.processInfo.environment["MPVBUNDLE"] != "true" { + continue + } + + if subConfig.name == "separator" { + menu.addItem(NSMenuItem.separator()) + } else { + let subItem = NSMenuItem(title: subConfig.name, action: subConfig.action, keyEquivalent: subConfig.key) + subItem.target = subConfig.target + subItem.keyEquivalentModifierMask = subConfig.modifiers + menu.addItem(subItem) + menuConfigs[menuConfigIndex].configs?[subConfigIndex].menuItem = subItem + + if subConfig.name == "Services" { + subItem.submenu = NSApp.servicesMenu + } + } + } + } + + return mainMenu + } + + @objc func about() { + NSApp.orderFrontStandardAboutPanel(options: [ + .applicationName: "mpv", + .applicationIcon: appIcon, + .applicationVersion: String(cString: swift_mpv_version), + .init(rawValue: "Copyright"): String(cString: swift_mpv_copyright), + ]) + } + + @objc func preferences(_ menuItem: NSMenuItem) { + guard let menuConfig = getConfigFromMenu(menuItem: menuItem) else { return } + let configPaths: [String] = [ + NSHomeDirectory() + "/.mpv/", + NSHomeDirectory() + "/.config/mpv/", + ] + + for path in configPaths { + let configFile = path + (menuConfig.file ?? "") + + if FileManager.default.fileExists(atPath: configFile) { + if NSWorkspace.shared.openFile(configFile) { + return + } + NSWorkspace.shared.openFile(path) + alert(title: menuConfig.alertTitle1 ?? "", text: menuConfig.alertText1 ?? "") + return + } + + if NSWorkspace.shared.openFile(path) { + alert(title: menuConfig.alertTitle2 ?? "", text: menuConfig.alertText2 ?? "") + return + } + } + + alert(title: menuConfig.alertTitle3 ?? "", text: menuConfig.alertText3 ?? "") + } + + @objc func quit(_ menuItem: NSMenuItem) { + guard let menuConfig = getConfigFromMenu(menuItem: menuItem) else { return } + menuConfig.command.withCString { + (NSApp as? Application)?.stopMPV(UnsafeMutablePointer<CChar>(mutating: $0)) + } + } + + @objc func openFile() { + let panel = NSOpenPanel() + panel.allowsMultipleSelection = true + panel.canChooseDirectories = true + + if panel.runModal() == .OK { + var files: [String] = [] + for url in panel.urls { + files += [url.path] + } + (NSApp as? Application)?.openFiles(files) + } + } + + @objc func openPlaylist() { + let panel = NSOpenPanel() + + if panel.runModal() == .OK { + "loadlist \"\(panel.urls[0].path)\"".withCString { + (NSApp as? Application)?.queueCommand(UnsafeMutablePointer<CChar>(mutating: $0)) + } + } + } + + @objc func openUrl() { + let alert = NSAlert() + alert.messageText = "Open URL" + alert.icon = appIcon + alert.addButton(withTitle: "Ok") + alert.addButton(withTitle: "Cancel") + + let input = NSTextField(frame: NSRect(x: 0, y: 0, width: 300, height: 24)) + input.placeholderString = "URL" + alert.accessoryView = input + + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { + input.becomeFirstResponder() + } + + if alert.runModal() == .alertFirstButtonReturn && input.stringValue.count > 0 { + (NSApp as? Application)?.openFiles([input.stringValue]) + } + } + + @objc func command(_ menuItem: NSMenuItem) { + guard let menuConfig = getConfigFromMenu(menuItem: menuItem) else { return } + menuConfig.command.withCString { + (NSApp as? Application)?.queueCommand(UnsafeMutablePointer<CChar>(mutating: $0)) + } + } + + @objc func url(_ menuItem: NSMenuItem) { + guard let menuConfig = getConfigFromMenu(menuItem: menuItem), + let url = URL(string: menuConfig.url ?? "") else { return } + NSWorkspace.shared.open(url) + } + + @objc func showFile(_ menuItem: NSMenuItem) { + guard let menuConfig = getConfigFromMenu(menuItem: menuItem) else { return } + let url = URL(fileURLWithPath: menuConfig.file ?? "") + if FileManager.default.fileExists(atPath: url.path) { + NSWorkspace.shared.activateFileViewerSelecting([url]) + return + } + + alert(title: menuConfig.alertTitle1 ?? "", text: menuConfig.alertText1 ?? "") + } + + func alert(title: String, text: String) { + let alert = NSAlert() + alert.messageText = title + alert.informativeText = text + alert.icon = appIcon + alert.addButton(withTitle: "Ok") + alert.runModal() + } + + func getConfigFromMenu(menuItem: NSMenuItem) -> Config? { + for menuConfig in menuConfigs { + for subConfig in menuConfig.configs ?? [] { + if subConfig.menuItem == menuItem { + return subConfig + } + } + } + + return nil + } + + func register(_ selector: Selector, key: MenuKey) { + for menuConfig in menuConfigs { + for subConfig in menuConfig.configs ?? [] { + if subConfig.commandSpecial == key { + subConfig.menuItem?.action = selector + return + } + } + } + } +} diff --git a/osdep/mac/menubar.h b/osdep/mac/menubar.h deleted file mode 100644 index 65e3dda34a..0000000000 --- a/osdep/mac/menubar.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of mpv. - * - * mpv is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * mpv 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with mpv. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef MAC_MENUBAR -#define MAC_MENUBAR - -// Menu Keys identifying menu items -typedef enum { - MPM_H_SIZE, - MPM_N_SIZE, - MPM_D_SIZE, - MPM_MINIMIZE, - MPM_ZOOM, -} MPMenuKey; - -#endif /* MAC_MENUBAR */ diff --git a/osdep/mac/menubar.m b/osdep/mac/menubar.m deleted file mode 100644 index 6a4ea96afe..0000000000 --- a/osdep/mac/menubar.m +++ /dev/null @@ -1,853 +0,0 @@ -/* - * This file is part of mpv. - * - * mpv is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * mpv 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with mpv. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" -#include "common/common.h" - -#import "osdep/mac/menubar_objc.h" -#import "osdep/mac/application_objc.h" - -@implementation MenuBar -{ - NSArray *menuTree; -} - -- (id)init -{ - if (self = [super init]) { - NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults]; - [userDefaults setBool:NO forKey:@"NSFullScreenMenuItemEverywhere"]; - [userDefaults setBool:YES forKey:@"NSDisabledDictationMenuItem"]; - [userDefaults setBool:YES forKey:@"NSDisabledCharacterPaletteMenuItem"]; - [NSWindow setAllowsAutomaticWindowTabbing: NO]; - - menuTree = @[ - @{ - @"name": @"Apple", - @"menu": @[ - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"About mpv", - @"action" : @"about", - @"key" : @"", - @"target" : self - }], - @{ @"name": @"separator" }, - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Preferences…", - @"action" : @"preferences:", - @"key" : @",", - @"target" : self, - @"file" : @"mpv.conf", - @"alertTitle1": @"No Application found to open your config file.", - @"alertText1" : @"Please open the mpv.conf file with " - "your preferred text editor in the now " - "open folder to edit your config.", - @"alertTitle2": @"No config file found.", - @"alertText2" : @"Please create a mpv.conf file with your " - "preferred text editor in the now open folder.", - @"alertTitle3": @"No config path or file found.", - @"alertText3" : @"Please create the following path ~/.config/mpv/ " - "and a mpv.conf file within with your preferred " - "text editor." - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Keyboard Shortcuts Config…", - @"action" : @"preferences:", - @"key" : @"", - @"target" : self, - @"file" : @"input.conf", - @"alertTitle1": @"No Application found to open your config file.", - @"alertText1" : @"Please open the input.conf file with " - "your preferred text editor in the now " - "open folder to edit your config.", - @"alertTitle2": @"No config file found.", - @"alertText2" : @"Please create a input.conf file with your " - "preferred text editor in the now open folder.", - @"alertTitle3": @"No config path or file found.", - @"alertText3" : @"Please create the following path ~/.config/mpv/ " - "and a input.conf file within with your preferred " - "text editor." - }], - @{ @"name": @"separator" }, - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Services", - @"key" : @"", - }], - @{ @"name": @"separator" }, - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Hide mpv", - @"action" : @"hide:", - @"key" : @"h", - @"target" : NSApp - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Hide Others", - @"action" : @"hideOtherApplications:", - @"key" : @"h", - @"modifiers" : [NSNumber numberWithUnsignedInteger: - NSEventModifierFlagCommand | - NSEventModifierFlagOption], - @"target" : NSApp - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Show All", - @"action" : @"unhideAllApplications:", - @"key" : @"", - @"target" : NSApp - }], - @{ @"name": @"separator" }, - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Quit and Remember Position", - @"action" : @"quit:", - @"key" : @"", - @"target" : self, - @"cmd" : @"quit-watch-later" - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Quit mpv", - @"action" : @"quit:", - @"key" : @"q", - @"target" : self, - @"cmd" : @"quit" - }] - ] - }, - @{ - @"name": @"File", - @"menu": @[ - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Open File…", - @"action" : @"openFile", - @"key" : @"o", - @"target" : self - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Open URL…", - @"action" : @"openURL", - @"key" : @"O", - @"target" : self - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Open Playlist…", - @"action" : @"openPlaylist", - @"key" : @"", - @"target" : self - }], - @{ @"name": @"separator" }, - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Close", - @"action" : @"performClose:", - @"key" : @"w" - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Save Screenshot", - @"action" : @"cmd:", - @"key" : @"", - @"target" : self, - @"cmd" : @"async screenshot" - }] - ] - }, - @{ - @"name": @"Edit", - @"menu": @[ - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Undo", - @"action" : @"undo:", - @"key" : @"z" - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Redo", - @"action" : @"redo:", - @"key" : @"Z" - }], - @{ @"name": @"separator" }, - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Cut", - @"action" : @"cut:", - @"key" : @"x" - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Copy", - @"action" : @"copy:", - @"key" : @"c" - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Paste", - @"action" : @"paste:", - @"key" : @"v" - }], - [NSMutableDictionary dictionaryWithDictionary:@{ - @"name" : @"Select All", - @"action" : @"selectAll:", - @"key" : @"a" - }] - ] - }, - @{ - @"name": @"View", - @"menu": @[ - [NSMutableDictionary dictionaryWithDictionary:@{ - @"nam |