From c5deb6f6d1fdf4a7f30c33700722c1477a780ae6 Mon Sep 17 00:00:00 2001 From: Kai Azim Date: Tue, 28 Oct 2025 22:36:38 -0600 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20Add=20`kVK=5FDelete`=20and=20`kV?= =?UTF-8?q?K=5FHelp`=20to=20special=20Fn=20keys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Loop/Core/Triggers/KeybindObserver.swift | 2 +- Loop/Extensions/CGKeyCode+Extensions.swift | 36 ++++++++++++++-------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Loop/Core/Triggers/KeybindObserver.swift b/Loop/Core/Triggers/KeybindObserver.swift index 6f7ed758..b6234098 100644 --- a/Loop/Core/Triggers/KeybindObserver.swift +++ b/Loop/Core/Triggers/KeybindObserver.swift @@ -76,7 +76,7 @@ final class KeybindObserver { var filteredFlags = event.flags - if keyCode.isArrowKey || keyCode.isFKey, !previousEventFlags.contains(.maskSecondaryFn) { + if keyCode.isFnSpecialKey, !previousEventFlags.contains(.maskSecondaryFn) { filteredFlags.remove(.maskSecondaryFn) } diff --git a/Loop/Extensions/CGKeyCode+Extensions.swift b/Loop/Extensions/CGKeyCode+Extensions.swift index 47c48eee..4e2c2906 100644 --- a/Loop/Extensions/CGKeyCode+Extensions.swift +++ b/Loop/Extensions/CGKeyCode+Extensions.swift @@ -183,20 +183,32 @@ extension CGKeyCode { return rightModifiers.contains(self) } - var isArrowKey: Bool { - let arrowKeys: Set = [.kVK_LeftArrow, .kVK_RightArrow, .kVK_DownArrow, .kVK_UpArrow] - return arrowKeys.contains(self) - } - - var isFKey: Bool { - let fKeys: Set = [ - .kVK_F1, .kVK_F2, .kVK_F3, .kVK_F4, .kVK_F5, - .kVK_F6, .kVK_F7, .kVK_F8, .kVK_F9, .kVK_F10, - .kVK_F11, .kVK_F12, .kVK_F13, .kVK_F14, .kVK_F15, - .kVK_F16, .kVK_F17, .kVK_F18, .kVK_F19, .kVK_F20 + var isFnSpecialKey: Bool { + /// See: https://github.com/koekeishiya/skhd/issues/1 + let specialKeys: Set = [ + .kVK_Delete, /// Usually `kVK_ForwardDelete`, but `baseKey(flags:)` converts that back into `kVK_Delete` if the fn key is also being pressed. + .kVK_Help ] - return fKeys.contains(self) + let allKeys = specialKeys + .union(Self.arrowKeys) + .union(Self.fKeys) + + return allKeys.contains(self) } + + private static let arrowKeys: Set = [ + .kVK_LeftArrow, + .kVK_RightArrow, + .kVK_DownArrow, + .kVK_UpArrow + ] + + private static let fKeys: Set = [ + .kVK_F1, .kVK_F2, .kVK_F3, .kVK_F4, .kVK_F5, + .kVK_F6, .kVK_F7, .kVK_F8, .kVK_F9, .kVK_F10, + .kVK_F11, .kVK_F12, .kVK_F13, .kVK_F14, .kVK_F15, + .kVK_F16, .kVK_F17, .kVK_F18, .kVK_F19, .kVK_F20 + ] } // MARK: Stringification of keycodes