Clean up.
This commit is contained in:
@@ -46,12 +46,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
//func applicationWillTerminate(_ notification: Notification) {
|
||||
//}
|
||||
|
||||
func windowDidBecomeKey(_ notification: Notification) {
|
||||
}
|
||||
|
||||
func windowDidResignKey(_ notification: Notification) {
|
||||
if window.isVisible {
|
||||
window.orderOut(nil)
|
||||
@@ -86,51 +80,3 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension String {
|
||||
subscript(index: Int) -> Character {
|
||||
return self[self.index(self.startIndex, offsetBy: index)]
|
||||
}
|
||||
}
|
||||
|
||||
extension String {
|
||||
public func levenshtein(_ other: String) -> Int {
|
||||
let sCount = self.count
|
||||
let oCount = other.count
|
||||
|
||||
guard sCount != 0 else {
|
||||
return oCount
|
||||
}
|
||||
|
||||
guard oCount != 0 else {
|
||||
return sCount
|
||||
}
|
||||
|
||||
let line : [Int] = Array(repeating: 0, count: oCount + 1)
|
||||
var mat : [[Int]] = Array(repeating: line, count: sCount + 1)
|
||||
|
||||
for i in 0...sCount {
|
||||
mat[i][0] = i
|
||||
}
|
||||
|
||||
for j in 0...oCount {
|
||||
mat[0][j] = j
|
||||
}
|
||||
|
||||
for j in 1...oCount {
|
||||
for i in 1...sCount {
|
||||
if self[i - 1] == other[j - 1] {
|
||||
mat[i][j] = mat[i - 1][j - 1] // no operation
|
||||
}
|
||||
else {
|
||||
let del = mat[i - 1][j] + 1 // deletion
|
||||
let ins = mat[i][j - 1] + 1 // insertion
|
||||
let sub = mat[i - 1][j - 1] + 1 // substitution
|
||||
mat[i][j] = min(min(del, ins), sub)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mat[sCount][oCount]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,43 @@
|
||||
import Cocoa
|
||||
import Carbon
|
||||
|
||||
protocol EditableNSTextFieldDelegate: AnyObject {
|
||||
func lostFocus()
|
||||
}
|
||||
|
||||
final class EditableNSTextField: NSTextField {
|
||||
private let commandKey = NSEvent.ModifierFlags.command.rawValue
|
||||
private let commandShiftKey = NSEvent.ModifierFlags.command.rawValue |
|
||||
NSEvent.ModifierFlags.shift.rawValue
|
||||
|
||||
weak var auxiliaryDelegate: EditableNSTextFieldDelegate?
|
||||
|
||||
override func performKeyEquivalent(with event: NSEvent) -> Bool {
|
||||
if event.type == NSEvent.EventType.keyDown {
|
||||
if (event.modifierFlags.rawValue &
|
||||
NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue)
|
||||
== commandKey
|
||||
{
|
||||
// TODO: Use virtual key codes instead of characters.
|
||||
switch event.charactersIgnoringModifiers! {
|
||||
case "x":
|
||||
let modifiers = event.modifierFlags.rawValue
|
||||
let key = event.keyCode
|
||||
|
||||
if modsContains(keys: OSCmd, in: modifiers) {
|
||||
if key == kVK_ANSI_X {
|
||||
if NSApp.sendAction(#selector(NSText.cut(_:)),
|
||||
to: nil, from: self)
|
||||
{ return true }
|
||||
case "c":
|
||||
} else if key == kVK_ANSI_C {
|
||||
if NSApp.sendAction(#selector(NSText.copy(_:)),
|
||||
to: nil, from: self)
|
||||
{ return true }
|
||||
case "v":
|
||||
} else if key == kVK_ANSI_V {
|
||||
if NSApp.sendAction(#selector(NSText.paste(_:)),
|
||||
to: nil, from: self)
|
||||
{ return true }
|
||||
case "z":
|
||||
} else if key == kVK_ANSI_Z {
|
||||
if NSApp.sendAction(Selector(("undo:")),
|
||||
to: nil, from: self)
|
||||
{ return true }
|
||||
case "a":
|
||||
} else if key == kVK_ANSI_A {
|
||||
if NSApp.sendAction(
|
||||
#selector(NSResponder.selectAll(_:)), to: nil,
|
||||
from: self)
|
||||
{ return true }
|
||||
default:
|
||||
break
|
||||
}
|
||||
} else if (event.modifierFlags.rawValue &
|
||||
NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue)
|
||||
== commandShiftKey
|
||||
{
|
||||
if event.charactersIgnoringModifiers == "Z" {
|
||||
} else if modsContains(keys: OSCmd | OSShift, in: modifiers) {
|
||||
if key == kVK_ANSI_Z {
|
||||
if NSApp.sendAction(Selector(("redo:")), to: nil,
|
||||
from: self)
|
||||
{ return true }
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
import AppKit
|
||||
import Carbon
|
||||
import OSLog
|
||||
|
||||
fileprivate func handleGlobalEvents(proxy: CGEventTapProxy,
|
||||
type: CGEventType, event: CGEvent,
|
||||
refcon: UnsafeMutableRawPointer?
|
||||
) -> Unmanaged<CGEvent>? {
|
||||
let logger = Logger(
|
||||
subsystem: Bundle.main.bundleIdentifier!,
|
||||
category: String(describing: AppDelegate.self)
|
||||
)
|
||||
|
||||
switch type {
|
||||
case .keyDown:
|
||||
//logger.debug(".keyDown")
|
||||
|
||||
let keyCode = "keyCode: \(event.getIntegerValueField(.keyboardEventKeycode))"
|
||||
logger.debug("\(keyCode, privacy: .public)")
|
||||
|
||||
//if (event.flags.rawValue & CGEventFlags.maskAlternate.rawValue) == CGEventFlags.maskAlternate.rawValue &&
|
||||
// (event.flags.rawValue & (CGEventFlags.maskShift.rawValue | CGEventFlags.maskControl.rawValue | CGEventFlags.maskCommand.rawValue)) == 0 {
|
||||
// logger.debug("maskAlternate")
|
||||
//}
|
||||
//logger.debug("Option rawValue=\(CGEventFlags.maskAlternate.rawValue)")
|
||||
|
||||
// var keyCode = event.getIntegerValueField(.keyboardEventKeycode)
|
||||
//if keyCode == 49 {
|
||||
// logger.debug("EVENT TAP")
|
||||
// return nil
|
||||
//}
|
||||
case .keyUp:
|
||||
//logger.debug(".keyUp")
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
|
||||
//event.setIntegerValueField(.keyboardEventKeycode, value: keyCode) // NOTE: ???
|
||||
|
||||
return Unmanaged.passUnretained(event)
|
||||
}
|
||||
|
||||
final class GlobalEventTap {
|
||||
fileprivate static let logger = Logger(
|
||||
subsystem: Bundle.main.bundleIdentifier!,
|
||||
category: String(describing: GlobalEventTap.self)
|
||||
)
|
||||
|
||||
static let shared = GlobalEventTap()
|
||||
|
||||
private init() {}
|
||||
|
||||
deinit {}
|
||||
|
||||
func enable() {
|
||||
let eventMask = (1 << CGEventType.keyDown.rawValue) | (1 << CGEventType.keyUp.rawValue)
|
||||
guard let eventTap = CGEvent.tapCreate(tap: .cgSessionEventTap,
|
||||
place: .headInsertEventTap,
|
||||
options: .defaultTap,
|
||||
eventsOfInterest: CGEventMask(eventMask),
|
||||
callback: handleGlobalEvents,
|
||||
userInfo: nil) else {
|
||||
Self.logger.debug("Failed to create event.")
|
||||
return
|
||||
}
|
||||
|
||||
Self.logger.debug("Event was created.")
|
||||
|
||||
let runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0)
|
||||
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, .commonModes)
|
||||
CGEvent.tapEnable(tap: eventTap, enable: true)
|
||||
CFRunLoopRun()
|
||||
}
|
||||
}
|
||||
@@ -8,10 +8,10 @@ XCODE_PATH = $(shell xcode-select --print-path)
|
||||
EXEC = Grapp
|
||||
|
||||
SRCMODULES = Helpers.swift EditableNSTextField.swift EventMonitor.swift \
|
||||
GlobalEventTap.swift PopoverPanel.swift SearchViewController.swift \
|
||||
PopoverPanel.swift SearchViewController.swift \
|
||||
SettingsViewController.swift HotKeyManager.swift \
|
||||
KeyDetectorButton.swift PathManager.swift PathsTableCellView.swift \
|
||||
ProgramTableViewCell.swift ProgramsTableView.swift ShadowView.swift \
|
||||
ProgramsTable.swift ShadowView.swift \
|
||||
AppDelegate.swift main.swift
|
||||
ARMOBJMODULES = $(addprefix ./arm64/,$(SRCMODULES:.swift=.o))
|
||||
X86OBJMODULES = $(addprefix ./x86_64/,$(SRCMODULES:.swift=.o))
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
import AppKit
|
||||
|
||||
class ProgramTableRowView: NSTableRowView {
|
||||
final class ProgramsTableView: NSTableView {
|
||||
override var acceptsFirstResponder: Bool { false }
|
||||
}
|
||||
|
||||
class ProgramsTableRowView: NSTableRowView {
|
||||
override func drawSelection(in dirtyRect: NSRect) {
|
||||
if self.selectionHighlightStyle != .none {
|
||||
let selectionColor = NSColor.controlAccentColor
|
||||
@@ -11,7 +15,7 @@ class ProgramTableRowView: NSTableRowView {
|
||||
}
|
||||
}
|
||||
|
||||
class ProgramTableViewCell: NSTableCellView {
|
||||
class ProgramsTableViewCell: NSTableCellView {
|
||||
var id: Int = -1
|
||||
|
||||
private(set) var isEditing = false
|
||||
@@ -1,5 +0,0 @@
|
||||
import AppKit
|
||||
|
||||
final class ProgramsTableView: NSTableView {
|
||||
override var acceptsFirstResponder: Bool { false }
|
||||
}
|
||||
@@ -395,13 +395,13 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
|
||||
func tableView(_ tableView: NSTableView,
|
||||
rowViewForRow row: Int) -> NSTableRowView?
|
||||
{
|
||||
return ProgramTableRowView()
|
||||
return ProgramsTableRowView()
|
||||
}
|
||||
|
||||
func tableView(_ tableView: NSTableView,
|
||||
viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
|
||||
{
|
||||
let cell = ProgramTableViewCell()
|
||||
let cell = ProgramsTableViewCell()
|
||||
let program = programsList[row]
|
||||
|
||||
// PERF: This is very slow, even with 10 items on the list! It has
|
||||
|
||||
@@ -3,7 +3,8 @@ import Carbon
|
||||
import ServiceManagement
|
||||
|
||||
class SettingsViewController: NSViewController, NSTextFieldDelegate,
|
||||
KeyDetectorButtonDelegate, NSTableViewDataSource, NSTableViewDelegate,
|
||||
KeyDetectorButtonDelegate,
|
||||
NSTableViewDataSource, NSTableViewDelegate,
|
||||
PathsTableCellViewDelegate
|
||||
{
|
||||
private var recording = false
|
||||
@@ -546,7 +547,4 @@ class SettingsViewController: NSViewController, NSTextFieldDelegate,
|
||||
cell.id = row
|
||||
return cell
|
||||
}
|
||||
|
||||
func tableViewSelectionDidChange(_ notification: Notification) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ class ShadowView: NSView {
|
||||
|
||||
private func setupView() {
|
||||
wantsLayer = true
|
||||
|
||||
guard let layer = layer else { return }
|
||||
|
||||
let shadow = NSShadow()
|
||||
|
||||
Reference in New Issue
Block a user