Repo // +ShiftKeyUpChecker.
This commit is contained in:
parent
0e1db68b96
commit
6edcdbde17
1
AUTHORS
1
AUTHORS
|
@ -6,6 +6,7 @@ $ Main contributors and volunteers of this repository (vChewing for macOS):
|
||||||
|
|
||||||
$ 3rd-Party Modules Used:
|
$ 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).
|
- 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 Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License).
|
||||||
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
||||||
|
|
|
@ -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).
|
- 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 Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License).
|
||||||
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
||||||
|
|
|
@ -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).
|
- 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 Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License).
|
||||||
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
||||||
|
|
|
@ -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).
|
- 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 Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License).
|
||||||
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
||||||
|
|
|
@ -16,6 +16,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
||||||
|
|
||||||
$ 3rd-Party Modules Used:
|
$ 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).
|
- 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 Preferences UI Framework: (c) 2018 and onwards Sindre Sorhus (MIT License).
|
||||||
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
- SwiftUI VDKComboBox: (c) 2022 and onwards Bryan Jones (CC BY-SA 4.0)
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -49,6 +49,7 @@
|
||||||
5B949BD92816DC5400D87B5D /* LineReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B949BD82816DC5400D87B5D /* LineReader.swift */; };
|
5B949BD92816DC5400D87B5D /* LineReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B949BD82816DC5400D87B5D /* LineReader.swift */; };
|
||||||
5B949BDB2816DDBC00D87B5D /* LMConsolidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B949BDA2816DDBC00D87B5D /* LMConsolidator.swift */; };
|
5B949BDB2816DDBC00D87B5D /* LMConsolidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B949BDA2816DDBC00D87B5D /* LMConsolidator.swift */; };
|
||||||
5BA0DF312817857D009E73BB /* lmUserOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA0DF2E2817857D009E73BB /* lmUserOverride.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 */; };
|
5BA9FD0F27FEDB6B002DE248 /* suiPrefPaneGeneral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA9FD0A27FEDB6B002DE248 /* suiPrefPaneGeneral.swift */; };
|
||||||
5BA9FD1027FEDB6B002DE248 /* suiPrefPaneKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA9FD0B27FEDB6B002DE248 /* suiPrefPaneKeyboard.swift */; };
|
5BA9FD1027FEDB6B002DE248 /* suiPrefPaneKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA9FD0B27FEDB6B002DE248 /* suiPrefPaneKeyboard.swift */; };
|
||||||
5BA9FD1127FEDB6B002DE248 /* ctlPrefUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA9FD0C27FEDB6B002DE248 /* ctlPrefUI.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 = "<group>"; usesTabs = 0; };
|
5B949BD82816DC5400D87B5D /* LineReader.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = LineReader.swift; sourceTree = "<group>"; usesTabs = 0; };
|
||||||
5B949BDA2816DDBC00D87B5D /* LMConsolidator.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = LMConsolidator.swift; sourceTree = "<group>"; usesTabs = 0; };
|
5B949BDA2816DDBC00D87B5D /* LMConsolidator.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = LMConsolidator.swift; sourceTree = "<group>"; usesTabs = 0; };
|
||||||
5BA0DF2E2817857D009E73BB /* lmUserOverride.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = lmUserOverride.swift; sourceTree = "<group>"; usesTabs = 0; };
|
5BA0DF2E2817857D009E73BB /* lmUserOverride.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = lmUserOverride.swift; sourceTree = "<group>"; usesTabs = 0; };
|
||||||
|
5BA58645289BCFAC0077D02F /* ShiftKeyUpChecker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShiftKeyUpChecker.swift; sourceTree = "<group>"; };
|
||||||
5BA9FD0A27FEDB6B002DE248 /* suiPrefPaneGeneral.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = suiPrefPaneGeneral.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
5BA9FD0A27FEDB6B002DE248 /* suiPrefPaneGeneral.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = suiPrefPaneGeneral.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||||
5BA9FD0B27FEDB6B002DE248 /* suiPrefPaneKeyboard.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = suiPrefPaneKeyboard.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
5BA9FD0B27FEDB6B002DE248 /* suiPrefPaneKeyboard.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = suiPrefPaneKeyboard.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||||
5BA9FD0C27FEDB6B002DE248 /* ctlPrefUI.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlPrefUI.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
5BA9FD0C27FEDB6B002DE248 /* ctlPrefUI.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlPrefUI.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||||
|
@ -441,6 +443,7 @@
|
||||||
children = (
|
children = (
|
||||||
5B84579B2871AD2200C93B01 /* HotenkaChineseConverter */,
|
5B84579B2871AD2200C93B01 /* HotenkaChineseConverter */,
|
||||||
5B949BD72816DC4400D87B5D /* LineReader */,
|
5B949BD72816DC4400D87B5D /* LineReader */,
|
||||||
|
5BA58644289BCFAC0077D02F /* Qwertyyb */,
|
||||||
5BA9FCEA27FED652002DE248 /* SindreSorhus */,
|
5BA9FCEA27FED652002DE248 /* SindreSorhus */,
|
||||||
5BA9FD8C28006BA7002DE248 /* VDKComboBox */,
|
5BA9FD8C28006BA7002DE248 /* VDKComboBox */,
|
||||||
);
|
);
|
||||||
|
@ -624,6 +627,14 @@
|
||||||
path = LineReader;
|
path = LineReader;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
5BA58644289BCFAC0077D02F /* Qwertyyb */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
5BA58645289BCFAC0077D02F /* ShiftKeyUpChecker.swift */,
|
||||||
|
);
|
||||||
|
path = Qwertyyb;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
5BA9FCEA27FED652002DE248 /* SindreSorhus */ = {
|
5BA9FCEA27FED652002DE248 /* SindreSorhus */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -1208,6 +1219,7 @@
|
||||||
5B38F59F281E2E49007D5F5D /* 3_NodeAnchor.swift in Sources */,
|
5B38F59F281E2E49007D5F5D /* 3_NodeAnchor.swift in Sources */,
|
||||||
5BFDF011289635C100417BBC /* ctlCandidateIMK.swift in Sources */,
|
5BFDF011289635C100417BBC /* ctlCandidateIMK.swift in Sources */,
|
||||||
5B62A34727AE7CD900A19448 /* ctlCandidate.swift in Sources */,
|
5B62A34727AE7CD900A19448 /* ctlCandidate.swift in Sources */,
|
||||||
|
5BA58646289BCFAC0077D02F /* ShiftKeyUpChecker.swift in Sources */,
|
||||||
5BA9FD3F27FEF3C8002DE248 /* Pane.swift in Sources */,
|
5BA9FD3F27FEF3C8002DE248 /* Pane.swift in Sources */,
|
||||||
5BB802DA27FABA8300CF1C19 /* ctlInputMethod_Menu.swift in Sources */,
|
5BB802DA27FABA8300CF1C19 /* ctlInputMethod_Menu.swift in Sources */,
|
||||||
5B38F5A1281E2E49007D5F5D /* 1_Compositor.swift in Sources */,
|
5B38F5A1281E2E49007D5F5D /* 1_Compositor.swift in Sources */,
|
||||||
|
|
Loading…
Reference in New Issue