From 321b88864c0101cda2185d048e409ca252382678 Mon Sep 17 00:00:00 2001 From: Eric Kuck Date: Thu, 10 Jan 2019 11:21:20 +0200 Subject: [PATCH] Cut/copy/paste now work Signed-off-by: Eric Kuck --- .../WireGuard/UI/macOS/Application.swift | 42 ++++++++++++++++--- WireGuard/WireGuard/UI/macOS/StatusMenu.swift | 5 ++- .../UI/macOS/View/ConfTextStorage.swift | 1 + 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/WireGuard/WireGuard/UI/macOS/Application.swift b/WireGuard/WireGuard/UI/macOS/Application.swift index 9f7b810..fba0ac6 100644 --- a/WireGuard/WireGuard/UI/macOS/Application.swift +++ b/WireGuard/WireGuard/UI/macOS/Application.swift @@ -3,15 +3,45 @@ import Cocoa -var appDelegate: AppDelegate? - class Application: NSApplication { + + private let editorCommands = [ + "x": #selector(NSText.cut(_:)), + "c": #selector(NSText.copy(_:)), + "v": #selector(NSText.paste(_:)), + "z": #selector(UndoActionRespondable.undo(_:)), + "a": #selector(NSResponder.selectAll(_:)), + "Z": #selector(UndoActionRespondable.redo(_:)) + ] + + private var appDelegate: AppDelegate? //swiftlint:disable:this weak_delegate + // We use a custom Application class to be able to set the app delegate // before app.run() gets called in NSApplicationMain(). - override class var shared: NSApplication { - let app = NSApplication.shared + override init() { + super.init() appDelegate = AppDelegate() // Keep a strong reference to the app delegate - app.delegate = appDelegate - return app + delegate = appDelegate + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func sendEvent(_ event: NSEvent) { + let modifierFlags = event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue + + if event.type == .keyDown, + (modifierFlags == NSEvent.ModifierFlags.command.rawValue || modifierFlags == NSEvent.ModifierFlags.command.rawValue | NSEvent.ModifierFlags.shift.rawValue), + let selector = editorCommands[event.charactersIgnoringModifiers ?? ""] { + sendAction(selector, to: nil, from: self) + } else { + super.sendEvent(event) + } } } + +@objc protocol UndoActionRespondable { + func undo(_ sender: AnyObject) + func redo(_ sender: AnyObject) +} diff --git a/WireGuard/WireGuard/UI/macOS/StatusMenu.swift b/WireGuard/WireGuard/UI/macOS/StatusMenu.swift index a8a913f..0f5d665 100644 --- a/WireGuard/WireGuard/UI/macOS/StatusMenu.swift +++ b/WireGuard/WireGuard/UI/macOS/StatusMenu.swift @@ -10,8 +10,8 @@ class StatusMenu: NSMenu { var statusMenuItem: NSMenuItem? var networksMenuItem: NSMenuItem? - var firstTunnelMenuItemIndex: Int = 0 - var numberOfTunnelMenuItems: Int = 0 + var firstTunnelMenuItemIndex = 0 + var numberOfTunnelMenuItems = 0 var manageTunnelsRootVC: ManageTunnelsRootViewController? lazy var manageTunnelsWindow: NSWindow = { @@ -62,6 +62,7 @@ class StatusMenu: NSMenu { } @discardableResult + //swiftlint:disable:next cyclomatic_complexity func updateStatusMenuItems(with tunnel: TunnelContainer, ignoreInactive: Bool) -> Bool { guard let statusMenuItem = statusMenuItem, let networksMenuItem = networksMenuItem else { return false } var statusText: String diff --git a/WireGuard/WireGuard/UI/macOS/View/ConfTextStorage.swift b/WireGuard/WireGuard/UI/macOS/View/ConfTextStorage.swift index 5ed3e68..4678cc3 100644 --- a/WireGuard/WireGuard/UI/macOS/View/ConfTextStorage.swift +++ b/WireGuard/WireGuard/UI/macOS/View/ConfTextStorage.swift @@ -43,6 +43,7 @@ class ConfTextStorage: NSTextStorage { fatalError("init(pasteboardPropertyList:ofType:) has not been implemented") } + //swiftlint:disable:next function_body_length func updateAttributes(for theme: TextColorTheme) { self.defaultAttributes = [ .foregroundColor: theme.plainText,