InputHandler // Implementing Hanin Keyboard Symbol Input support.

This commit is contained in:
ShikiSuen 2023-02-10 21:38:11 +08:00
parent 86b85b9c83
commit b03670cbcf
10 changed files with 109 additions and 10 deletions

View File

@ -111,6 +111,12 @@ public class InputHandler: InputHandlerProtocol {
isCodePointInputMode = false
}
// MARK: - Hanin Keyboard Symbol Mode.
var isHaninKeyboardSymbolMode = false
static let tooltipHaninKeyboardSymbolMode: String = "\("Hanin Keyboard Symbol Input.".localized)  "
// MARK: - Codepoint Input Buffer.
var isCodePointInputMode = false {

View File

@ -198,11 +198,18 @@ extension InputHandler {
// MARK: - Flipping pages by using symbol menu keys (when they are not occupied).
if input.isSymbolMenuPhysicalKey {
var updated = true
let reverseTrigger = input.isShiftHold || input.isOptionHold
updated = reverseTrigger ? ctlCandidate.showPreviousLine() : ctlCandidate.showNextLine()
if !updated { delegate.callError("66F3477B") }
return true
switch input.modifierFlags {
case .shift, [],
.option where state.type != .ofSymbolTable:
var updated = true
let reverseTrigger = input.isShiftHold || input.isOptionHold
updated = reverseTrigger ? ctlCandidate.showPreviousLine() : ctlCandidate.showNextLine()
if !updated { delegate.callError("66F3477B") }
return true
case .option where state.type == .ofSymbolTable:
return handleHaninKeyboardSymbolModeToggle()
default: break
}
}
delegate.callError("172A0F81")

View File

@ -73,8 +73,26 @@ extension InputHandler {
} else if event.isSymbolMenuPhysicalKey {
//
switch imkC.currentLayout {
case .horizontal: _ = event.isShiftHold ? imkC.moveUp(self) : imkC.moveDown(self)
case .vertical: _ = event.isShiftHold ? imkC.moveLeft(self) : imkC.moveRight(self)
case .horizontal:
switch event.modifierFlags {
case []: imkC.moveDown(self)
case .shift,
.option where delegate.state.type != .ofSymbolTable:
imkC.moveUp(self)
case .option where delegate.state.type == .ofSymbolTable:
handleHaninKeyboardSymbolModeToggle()
default: break
}
case .vertical:
switch event.modifierFlags {
case []: imkC.moveRight(self)
case .shift,
.option where delegate.state.type != .ofSymbolTable:
imkC.moveLeft(self)
case .option where delegate.state.type == .ofSymbolTable:
handleHaninKeyboardSymbolModeToggle()
default: break
}
@unknown default: break
}
return true

View File

@ -100,9 +100,13 @@ extension InputHandler {
delegate.switchState(state.convertedToInputting)
}
// MARK: (Handle BPMF Keys)
// MARK: (Handle BPMF Keys & Hanin Keyboard Symbol Input)
if let compositionHandled = handleComposition(input: input) { return compositionHandled }
if isHaninKeyboardSymbolMode, input.modifierFlags.isEmpty || input.modifierFlags == .shift {
return handleHaninKeyboardSymbolModeInput(input: input)
} else if let compositionHandled = handleComposition(input: input) {
return compositionHandled
}
// MARK: (Calling candidate window using Up / Down or PageUp / PageDn.)
@ -165,7 +169,16 @@ extension InputHandler {
case [.option, .shift]:
return handlePunctuationList(alternative: true, isJIS: isJIS)
case .option:
return handleCodePointInputToggle()
switch (isCodePointInputMode, isHaninKeyboardSymbolMode) {
case (false, false): return handleCodePointInputToggle()
case (true, false):
handleCodePointInputToggle()
return handleHaninKeyboardSymbolModeToggle()
case (false, true):
return handleHaninKeyboardSymbolModeToggle()
default: break
}
return true
default: break
}
case .kSpace: // Space

View File

@ -293,6 +293,7 @@ extension InputHandler {
guard let delegate = delegate else { return false }
let state = delegate.state
if isHaninKeyboardSymbolMode { return handleHaninKeyboardSymbolModeToggle() }
if isCodePointInputMode { return handleCodePointInputToggle() }
guard state.type == .ofInputting else { return false }
@ -474,6 +475,7 @@ extension InputHandler {
guard let delegate = delegate else { return false }
let state = delegate.state
if isHaninKeyboardSymbolMode { return handleHaninKeyboardSymbolModeToggle() }
if isCodePointInputMode { return handleCodePointInputToggle() }
guard state.type == .ofInputting else { return false }
@ -572,6 +574,7 @@ extension InputHandler {
guard let delegate = delegate else { return false }
let state = delegate.state
if isHaninKeyboardSymbolMode { return handleHaninKeyboardSymbolModeToggle() }
if isCodePointInputMode { return handleCodePointInputToggle() }
guard state.type == .ofInputting else { return false }
@ -813,6 +816,53 @@ extension InputHandler {
return true
}
// MARK: -
@discardableResult func handleHaninKeyboardSymbolModeToggle() -> Bool {
guard let delegate = delegate, delegate.state.type != .ofDeactivated else { return false }
if isHaninKeyboardSymbolMode {
isHaninKeyboardSymbolMode = false
delegate.switchState(IMEState.ofAbortion())
return true
}
var updatedState = generateStateOfInputting(sansReading: true)
delegate.switchState(IMEState.ofCommitting(textToCommit: updatedState.displayedText))
updatedState = IMEState.ofEmpty()
updatedState.tooltipDuration = 0
updatedState.tooltip = Self.tooltipHaninKeyboardSymbolMode
delegate.switchState(updatedState)
isHaninKeyboardSymbolMode = true
return true
}
///
/// - Parameters:
/// - input:
/// - Returns: SessionCtl IMK
func handleHaninKeyboardSymbolModeInput(input: InputSignalProtocol) -> Bool {
guard let delegate = delegate, delegate.state.type != .ofDeactivated else { return false }
let charText = input.text.lowercased().applyingTransformFW2HW(reverse: false)
guard CandidateNode.mapHaninKeyboardSymbols.keys.contains(charText) else {
return handleHaninKeyboardSymbolModeToggle()
}
guard
charText.count == 1, let symbols = CandidateNode.queryHaninKeyboardSymbols(char: charText)
else {
delegate.callError("C1A760C7")
return true
}
// commit buffer ESC
let textToCommit = generateStateOfInputting(sansReading: true).displayedText
delegate.switchState(IMEState.ofCommitting(textToCommit: textToCommit))
if symbols.members.count == 1 {
delegate.switchState(IMEState.ofCommitting(textToCommit: symbols.members.map(\.name).joined()))
} else {
delegate.switchState(IMEState.ofSymbolTable(node: symbols))
}
isHaninKeyboardSymbolMode = false // toggle
return true
}
// MARK: -
///

View File

@ -1,4 +1,5 @@
"vChewing" = "vChewing";
"Hanin Keyboard Symbol Input." = "Hanin Keyboard Symbol Input.";
"Open App Support Folder" = "Open App Support Folder";
"Invalid Code Point." = "Invalid Code Point.";
"Code Point Input Mode." = "Code Point Input Mode.";

View File

@ -1,4 +1,5 @@
"vChewing" = "vChewing";
"Hanin Keyboard Symbol Input." = "Hanin Keyboard Symbol Input.";
"Open App Support Folder" = "Open App Support Folder";
"Invalid Code Point." = "Invalid Code Point.";
"Code Point Input Mode." = "Code Point Input Mode.";

View File

@ -1,4 +1,5 @@
"vChewing" = "威注音入力アプリ";
"Hanin Keyboard Symbol Input." = "漢音キーボード符号入力。";
"Open App Support Folder" = "App Support フォルダーを開く";
"Invalid Code Point." = "コードポイントは正しくない。";
"Code Point Input Mode." = "コードポイント入力。";

View File

@ -1,4 +1,5 @@
"vChewing" = "威注音输入法";
"Hanin Keyboard Symbol Input." = "汉音键盘符号模式。";
"Open App Support Folder" = "开启 App Support 目录";
"Invalid Code Point." = "内码不正确。";
"Code Point Input Mode." = "内码输入模式。";

View File

@ -1,4 +1,5 @@
"vChewing" = "威注音輸入法";
"Hanin Keyboard Symbol Input." = "漢音鍵盤符號模式。";
"Open App Support Folder" = "開啟 App Support 目錄";
"Invalid Code Point." = "內碼不正確。";
"Code Point Input Mode." = "內碼輸入模式。";