Clean up.

This commit is contained in:
2025-01-14 18:33:00 -08:00
parent 9bc0dfc6f3
commit c16426270c
9 changed files with 25 additions and 169 deletions

View File

@@ -46,12 +46,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
} }
} }
//func applicationWillTerminate(_ notification: Notification) {
//}
func windowDidBecomeKey(_ notification: Notification) {
}
func windowDidResignKey(_ notification: Notification) { func windowDidResignKey(_ notification: Notification) {
if window.isVisible { if window.isVisible {
window.orderOut(nil) 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]
}
}

View File

@@ -1,53 +1,43 @@
import Cocoa import Cocoa
import Carbon
protocol EditableNSTextFieldDelegate: AnyObject { protocol EditableNSTextFieldDelegate: AnyObject {
func lostFocus() func lostFocus()
} }
final class EditableNSTextField: NSTextField { 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? weak var auxiliaryDelegate: EditableNSTextFieldDelegate?
override func performKeyEquivalent(with event: NSEvent) -> Bool { override func performKeyEquivalent(with event: NSEvent) -> Bool {
if event.type == NSEvent.EventType.keyDown { if event.type == NSEvent.EventType.keyDown {
if (event.modifierFlags.rawValue & let modifiers = event.modifierFlags.rawValue
NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) let key = event.keyCode
== commandKey
{ if modsContains(keys: OSCmd, in: modifiers) {
// TODO: Use virtual key codes instead of characters. if key == kVK_ANSI_X {
switch event.charactersIgnoringModifiers! {
case "x":
if NSApp.sendAction(#selector(NSText.cut(_:)), if NSApp.sendAction(#selector(NSText.cut(_:)),
to: nil, from: self) to: nil, from: self)
{ return true } { return true }
case "c": } else if key == kVK_ANSI_C {
if NSApp.sendAction(#selector(NSText.copy(_:)), if NSApp.sendAction(#selector(NSText.copy(_:)),
to: nil, from: self) to: nil, from: self)
{ return true } { return true }
case "v": } else if key == kVK_ANSI_V {
if NSApp.sendAction(#selector(NSText.paste(_:)), if NSApp.sendAction(#selector(NSText.paste(_:)),
to: nil, from: self) to: nil, from: self)
{ return true } { return true }
case "z": } else if key == kVK_ANSI_Z {
if NSApp.sendAction(Selector(("undo:")), if NSApp.sendAction(Selector(("undo:")),
to: nil, from: self) to: nil, from: self)
{ return true } { return true }
case "a": } else if key == kVK_ANSI_A {
if NSApp.sendAction( if NSApp.sendAction(
#selector(NSResponder.selectAll(_:)), to: nil, #selector(NSResponder.selectAll(_:)), to: nil,
from: self) from: self)
{ return true } { return true }
default:
break
} }
} else if (event.modifierFlags.rawValue & } else if modsContains(keys: OSCmd | OSShift, in: modifiers) {
NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) if key == kVK_ANSI_Z {
== commandShiftKey
{
if event.charactersIgnoringModifiers == "Z" {
if NSApp.sendAction(Selector(("redo:")), to: nil, if NSApp.sendAction(Selector(("redo:")), to: nil,
from: self) from: self)
{ return true } { return true }

View File

@@ -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()
}
}

View File

@@ -8,10 +8,10 @@ XCODE_PATH = $(shell xcode-select --print-path)
EXEC = Grapp EXEC = Grapp
SRCMODULES = Helpers.swift EditableNSTextField.swift EventMonitor.swift \ SRCMODULES = Helpers.swift EditableNSTextField.swift EventMonitor.swift \
GlobalEventTap.swift PopoverPanel.swift SearchViewController.swift \ PopoverPanel.swift SearchViewController.swift \
SettingsViewController.swift HotKeyManager.swift \ SettingsViewController.swift HotKeyManager.swift \
KeyDetectorButton.swift PathManager.swift PathsTableCellView.swift \ KeyDetectorButton.swift PathManager.swift PathsTableCellView.swift \
ProgramTableViewCell.swift ProgramsTableView.swift ShadowView.swift \ ProgramsTable.swift ShadowView.swift \
AppDelegate.swift main.swift AppDelegate.swift main.swift
ARMOBJMODULES = $(addprefix ./arm64/,$(SRCMODULES:.swift=.o)) ARMOBJMODULES = $(addprefix ./arm64/,$(SRCMODULES:.swift=.o))
X86OBJMODULES = $(addprefix ./x86_64/,$(SRCMODULES:.swift=.o)) X86OBJMODULES = $(addprefix ./x86_64/,$(SRCMODULES:.swift=.o))

View File

@@ -1,6 +1,10 @@
import AppKit import AppKit
class ProgramTableRowView: NSTableRowView { final class ProgramsTableView: NSTableView {
override var acceptsFirstResponder: Bool { false }
}
class ProgramsTableRowView: NSTableRowView {
override func drawSelection(in dirtyRect: NSRect) { override func drawSelection(in dirtyRect: NSRect) {
if self.selectionHighlightStyle != .none { if self.selectionHighlightStyle != .none {
let selectionColor = NSColor.controlAccentColor let selectionColor = NSColor.controlAccentColor
@@ -11,7 +15,7 @@ class ProgramTableRowView: NSTableRowView {
} }
} }
class ProgramTableViewCell: NSTableCellView { class ProgramsTableViewCell: NSTableCellView {
var id: Int = -1 var id: Int = -1
private(set) var isEditing = false private(set) var isEditing = false

View File

@@ -1,5 +0,0 @@
import AppKit
final class ProgramsTableView: NSTableView {
override var acceptsFirstResponder: Bool { false }
}

View File

@@ -395,13 +395,13 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
func tableView(_ tableView: NSTableView, func tableView(_ tableView: NSTableView,
rowViewForRow row: Int) -> NSTableRowView? rowViewForRow row: Int) -> NSTableRowView?
{ {
return ProgramTableRowView() return ProgramsTableRowView()
} }
func tableView(_ tableView: NSTableView, func tableView(_ tableView: NSTableView,
viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
{ {
let cell = ProgramTableViewCell() let cell = ProgramsTableViewCell()
let program = programsList[row] let program = programsList[row]
// PERF: This is very slow, even with 10 items on the list! It has // PERF: This is very slow, even with 10 items on the list! It has

View File

@@ -3,7 +3,8 @@ import Carbon
import ServiceManagement import ServiceManagement
class SettingsViewController: NSViewController, NSTextFieldDelegate, class SettingsViewController: NSViewController, NSTextFieldDelegate,
KeyDetectorButtonDelegate, NSTableViewDataSource, NSTableViewDelegate, KeyDetectorButtonDelegate,
NSTableViewDataSource, NSTableViewDelegate,
PathsTableCellViewDelegate PathsTableCellViewDelegate
{ {
private var recording = false private var recording = false
@@ -546,7 +547,4 @@ class SettingsViewController: NSViewController, NSTextFieldDelegate,
cell.id = row cell.id = row
return cell return cell
} }
func tableViewSelectionDidChange(_ notification: Notification) {
}
} }

View File

@@ -12,7 +12,6 @@ class ShadowView: NSView {
private func setupView() { private func setupView() {
wantsLayer = true wantsLayer = true
guard let layer = layer else { return } guard let layer = layer else { return }
let shadow = NSShadow() let shadow = NSShadow()