From 6edcdbde1723788ae0aa0fb146c62da49805a746 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Thu, 4 Aug 2022 18:04:54 +0800 Subject: [PATCH] Repo // +ShiftKeyUpChecker. --- AUTHORS | 1 + LICENSE-CHS.txt | 1 + LICENSE-CHT.txt | 1 + LICENSE-JPN.txt | 1 + LICENSE.txt | 1 + .../3rdParty/Qwertyyb/ShiftKeyUpChecker.swift | 57 +++++++++++++++++++ vChewing.xcodeproj/project.pbxproj | 12 ++++ 7 files changed, 74 insertions(+) create mode 100644 Source/3rdParty/Qwertyyb/ShiftKeyUpChecker.swift diff --git a/AUTHORS b/AUTHORS index be7b269f..fb456c5a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -6,6 +6,7 @@ $ Main contributors and volunteers of this repository (vChewing for macOS): $ 3rd-Party Modules Used: +- ShiftKeyUpChecker: (c) 2019 and onwards Qwertyyb (March Yang) (MIT License). - LineReader: (c) 2019 and onwards Robert Muckle-Jones (Apache 2.0 License). - SwiftUI Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License). - SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0) diff --git a/LICENSE-CHS.txt b/LICENSE-CHS.txt index 09475c05..889ba222 100644 --- a/LICENSE-CHS.txt +++ b/LICENSE-CHS.txt @@ -16,6 +16,7 @@ vChewing macOS: MIT-NTL License 麻理(去商标)授权合约 $ 在本专案内用到了下述第三方模组: +- ShiftKeyUpChecker: (c) 2019 and onwards Qwertyyb (March Yang) (MIT License). - LineReader: (c) 2019 and onwards Robert Muckle-Jones (Apache 2.0 License). - SwiftUI Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License). - SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0) diff --git a/LICENSE-CHT.txt b/LICENSE-CHT.txt index fa1a3036..471669b7 100644 --- a/LICENSE-CHT.txt +++ b/LICENSE-CHT.txt @@ -16,6 +16,7 @@ vChewing macOS: MIT-NTL License 麻理(去商標)授權合約 $ 在該專案內用到了下述第三方: +- ShiftKeyUpChecker: (c) 2019 and onwards Qwertyyb (March Yang) (MIT License). - LineReader: (c) 2019 and onwards Robert Muckle-Jones (Apache 2.0 License). - SwiftUI Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License). - SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0) diff --git a/LICENSE-JPN.txt b/LICENSE-JPN.txt index 312a8424..7870b848 100644 --- a/LICENSE-JPN.txt +++ b/LICENSE-JPN.txt @@ -16,6 +16,7 @@ macOS 版威注音の開発:Shiki Suen, Isaac Xen, Hiraku Wang, など。 $ 他の用いたモジュール: +- ShiftKeyUpChecker: (c) 2019 and onwards Qwertyyb (March Yang) (MIT License). - LineReader: (c) 2019 and onwards Robert Muckle-Jones (Apache 2.0 License). - SwiftUI Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License). - SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0) diff --git a/LICENSE.txt b/LICENSE.txt index 3f536c8b..aed47104 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -16,6 +16,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI $ 3rd-Party Modules Used: +- ShiftKeyUpChecker: (c) 2019 and onwards Qwertyyb (March Yang) (MIT License). - LineReader: (c) 2019 and onwards Robert Muckle-Jones (Apache 2.0 License). - SwiftUI Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License). - SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0) diff --git a/Source/3rdParty/Qwertyyb/ShiftKeyUpChecker.swift b/Source/3rdParty/Qwertyyb/ShiftKeyUpChecker.swift new file mode 100644 index 00000000..cfb792ce --- /dev/null +++ b/Source/3rdParty/Qwertyyb/ShiftKeyUpChecker.swift @@ -0,0 +1,57 @@ +// (c) 2022 and onwards Qwertyyb (MIT License). +// ==================== +// This code is released under the MIT license (SPDX-License-Identifier: MIT) + +import Carbon +import Cocoa +import Foundation + +extension Date { + static func - (lhs: Date, rhs: Date) -> TimeInterval { + lhs.timeIntervalSinceReferenceDate - rhs.timeIntervalSinceReferenceDate + } +} + +class ShiftKeyUpChecker { + init() {} + private static var checkModifier: NSEvent.ModifierFlags { NSEvent.ModifierFlags.shift } + private static var checkKeyCode: [UInt16] { [KeyCode.kShift.rawValue, KeyCode.kRightShift.rawValue] } + + private static let delayInterval = 0.3 + + private static var lastTime: Date = .init() + + private static func checkModifierKeyUp(event: NSEvent) -> Bool { + if event.type == .flagsChanged, + event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .init(rawValue: 0), + Date() - lastTime <= delayInterval + { + // modifier keyup event + lastTime = Date(timeInterval: -3600 * 4, since: Date()) + return true + } + return false + } + + private static func checkModifierKeyDown(event: NSEvent) -> Bool { + let isLeftShift = event.modifierFlags.rawValue & UInt(NX_DEVICELSHIFTKEYMASK) != 0 + let isRightShift = event.modifierFlags.rawValue & UInt(NX_DEVICERSHIFTKEYMASK) != 0 + print("isLeftShift: \(isLeftShift), isRightShift: \(isRightShift)") + let isKeyDown = + event.type == .flagsChanged + && event.modifierFlags.intersection(.deviceIndependentFlagsMask) == checkModifier + && ShiftKeyUpChecker.checkKeyCode.contains(event.keyCode) + if isKeyDown { + // modifier keydown event + lastTime = Date() + } else { + lastTime = Date(timeInterval: -3600 * 4, since: Date()) + } + return false + } + + // To confirm that the shift key is "pressed-and-released". + public static func check(_ event: NSEvent) -> Bool { + ShiftKeyUpChecker.checkModifierKeyUp(event: event) || ShiftKeyUpChecker.checkModifierKeyDown(event: event) + } +} diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index ca8ab683..3b40eee5 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -49,6 +49,7 @@ 5B949BD92816DC5400D87B5D /* LineReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B949BD82816DC5400D87B5D /* LineReader.swift */; }; 5B949BDB2816DDBC00D87B5D /* LMConsolidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B949BDA2816DDBC00D87B5D /* LMConsolidator.swift */; }; 5BA0DF312817857D009E73BB /* lmUserOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA0DF2E2817857D009E73BB /* lmUserOverride.swift */; }; + 5BA58646289BCFAC0077D02F /* ShiftKeyUpChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA58645289BCFAC0077D02F /* ShiftKeyUpChecker.swift */; }; 5BA9FD0F27FEDB6B002DE248 /* suiPrefPaneGeneral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA9FD0A27FEDB6B002DE248 /* suiPrefPaneGeneral.swift */; }; 5BA9FD1027FEDB6B002DE248 /* suiPrefPaneKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA9FD0B27FEDB6B002DE248 /* suiPrefPaneKeyboard.swift */; }; 5BA9FD1127FEDB6B002DE248 /* ctlPrefUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA9FD0C27FEDB6B002DE248 /* ctlPrefUI.swift */; }; @@ -244,6 +245,7 @@ 5B949BD82816DC5400D87B5D /* LineReader.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = LineReader.swift; sourceTree = ""; usesTabs = 0; }; 5B949BDA2816DDBC00D87B5D /* LMConsolidator.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = LMConsolidator.swift; sourceTree = ""; usesTabs = 0; }; 5BA0DF2E2817857D009E73BB /* lmUserOverride.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = lmUserOverride.swift; sourceTree = ""; usesTabs = 0; }; + 5BA58645289BCFAC0077D02F /* ShiftKeyUpChecker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShiftKeyUpChecker.swift; sourceTree = ""; }; 5BA9FD0A27FEDB6B002DE248 /* suiPrefPaneGeneral.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = suiPrefPaneGeneral.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 5BA9FD0B27FEDB6B002DE248 /* suiPrefPaneKeyboard.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = suiPrefPaneKeyboard.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 5BA9FD0C27FEDB6B002DE248 /* ctlPrefUI.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlPrefUI.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; @@ -441,6 +443,7 @@ children = ( 5B84579B2871AD2200C93B01 /* HotenkaChineseConverter */, 5B949BD72816DC4400D87B5D /* LineReader */, + 5BA58644289BCFAC0077D02F /* Qwertyyb */, 5BA9FCEA27FED652002DE248 /* SindreSorhus */, 5BA9FD8C28006BA7002DE248 /* VDKComboBox */, ); @@ -624,6 +627,14 @@ path = LineReader; sourceTree = ""; }; + 5BA58644289BCFAC0077D02F /* Qwertyyb */ = { + isa = PBXGroup; + children = ( + 5BA58645289BCFAC0077D02F /* ShiftKeyUpChecker.swift */, + ); + path = Qwertyyb; + sourceTree = ""; + }; 5BA9FCEA27FED652002DE248 /* SindreSorhus */ = { isa = PBXGroup; children = ( @@ -1208,6 +1219,7 @@ 5B38F59F281E2E49007D5F5D /* 3_NodeAnchor.swift in Sources */, 5BFDF011289635C100417BBC /* ctlCandidateIMK.swift in Sources */, 5B62A34727AE7CD900A19448 /* ctlCandidate.swift in Sources */, + 5BA58646289BCFAC0077D02F /* ShiftKeyUpChecker.swift in Sources */, 5BA9FD3F27FEF3C8002DE248 /* Pane.swift in Sources */, 5BB802DA27FABA8300CF1C19 /* ctlInputMethod_Menu.swift in Sources */, 5B38F5A1281E2E49007D5F5D /* 1_Compositor.swift in Sources */,