aboutsummaryrefslogblamecommitdiffstats
path: root/WireGuard/WireGuard/UI/macOS/Application.swift
blob: 6e33802fd3b4df0da37c6291e731fe070dd6d93a (plain) (tree)
1
2
3
4
5
6
7
8
                               
                                                             


            
                                  
 
                                        




                                                       


                                                        
                                        



                                                                                

                     
                                                                                  
                                                                                                  



                                                           
     





                                                                                                                                                                        
                                                                                          









                                                     
 
// SPDX-License-Identifier: MIT
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.

import Cocoa

class Application: NSApplication {

    private let characterKeyCommands = [
        "x": #selector(NSText.cut(_:)),
        "c": #selector(NSText.copy(_:)),
        "v": #selector(NSText.paste(_:)),
        "z": #selector(UndoActionRespondable.undo(_:)),
        "a": #selector(NSResponder.selectAll(_:)),
        "Z": #selector(UndoActionRespondable.redo(_:)),
        "w": #selector(NSWindow.performClose(_:)),
        "m": #selector(NSWindow.performMiniaturize(_:)),
        "q": #selector(AppDelegate.quit)
    ]

    private var appDelegate: AppDelegate? //swiftlint:disable:this weak_delegate

    override init() {
        super.init()
        appDelegate = AppDelegate() // Keep a strong reference to the app delegate
        delegate = appDelegate // Set delegate before app.run() gets called in NSApplicationMain()
    }

    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 = characterKeyCommands[event.charactersIgnoringModifiers ?? ""] {
            sendAction(selector, to: nil, from: self)
        } else {
            super.sendEvent(event)
        }
    }
}

@objc protocol UndoActionRespondable {
    func undo(_ sender: AnyObject)
    func redo(_ sender: AnyObject)
}