SessionCtl // Handle .keyUp events when necessary.

This commit is contained in:
ShikiSuen 2023-07-03 20:23:43 +08:00
parent 63421dbcac
commit ea9a1e1d75
2 changed files with 53 additions and 24 deletions

View File

@ -29,6 +29,9 @@ public class SessionCtl: IMKInputController {
/// ///
public static var areWeNerfing = false public static var areWeNerfing = false
///
public var previouslyHandledEvents: [NSEvent] = .init()
/// IMK /// IMK
private var candidateIMK: CtlCandidateProtocol? private var candidateIMK: CtlCandidateProtocol?
@ -432,7 +435,7 @@ public extension SessionCtl {
/// - Returns: uint NSEvent NSEvent.h /// - Returns: uint NSEvent NSEvent.h
override func recognizedEvents(_ sender: Any!) -> Int { override func recognizedEvents(_ sender: Any!) -> Int {
_ = sender // _ = sender //
let events: NSEvent.EventTypeMask = [.keyDown, .flagsChanged] let events: NSEvent.EventTypeMask = [.keyDown, .flagsChanged, .keyUp]
return Int(events.rawValue) return Int(events.rawValue)
} }

View File

@ -31,15 +31,46 @@ public extension SessionCtl {
return false return false
} }
// Shift macOS 10.15 macOS
// event event var Shift
if Self.theShiftKeyDetector.check(event) {
toggleAlphanumericalMode()
// Shift
return true
}
var result = false
if [.keyDown, .flagsChanged].contains(event.type) {
result = handleKeyDown(event: event)
if result, event.type == .keyDown {
previouslyHandledEvents.append(event)
}
} else if event.type == .keyUp {
result = handleKeyUp(event: event)
}
return result
}
private func handleKeyUp(event: NSEvent) -> Bool {
guard ![.ofEmpty, .ofAbortion].contains(state.type) else { return false }
let codes = previouslyHandledEvents.map(\.keyCode)
if codes.contains(event.keyCode) {
previouslyHandledEvents = previouslyHandledEvents.filter { prevEvent in
prevEvent.keyCode != event.keyCode
}.deduplicated
return true
}
return false
}
private func handleKeyDown(event: NSEvent) -> Bool {
// MARK: // MARK:
// recognizedEvents
if event.type != .keyDown, event.type != .flagsChanged { return false }
// deactivated empty() // deactivated empty()
if let client = client(), state.type == .ofDeactivated { if state.type == .ofDeactivated {
state = IMEState.ofEmpty() state = IMEState.ofEmpty()
return handle(event, client: client) return handleKeyDown(event: event)
} }
// Caps Lock macOS 12 Monterey // Caps Lock macOS 12 Monterey
@ -59,25 +90,10 @@ public extension SessionCtl {
} }
} }
// // JIS
func toggleAlphanumericalMode() { if event.type == .keyDown, event.isJISAlphanumericalKey {
let status = "NotificationSwitchRevolver".localized
Notifier.notify(
message: isASCIIMode.toggled()
? "Alphanumerical Input Mode".localized + "\n" + status
: "Chinese Input Mode".localized + "\n" + status
)
}
// Shift macOS 10.15 macOS
// JIS macOS 10.09
// event event var Shift
// Shift keyUp
if (event.type == .keyDown && event.isJISAlphanumericalKey) || Self.theShiftKeyDetector.check(event) {
toggleAlphanumericalMode() toggleAlphanumericalMode()
// Adobe Photoshop JIS true return true // Adobe Photoshop JIS true
// Shift
return true
} }
// MARK: // MARK:
@ -164,4 +180,14 @@ public extension SessionCtl {
return result return result
} }
///
private func toggleAlphanumericalMode() {
let status = "NotificationSwitchRevolver".localized
Notifier.notify(
message: isASCIIMode.toggled()
? NSLocalizedString("Alphanumerical Input Mode", comment: "") + "\n" + status
: NSLocalizedString("Chinese Input Mode", comment: "") + "\n" + status
)
}
} }