From a75c7b7086d06a4b3c845ba7d4c3b44a07bad6d5 Mon Sep 17 00:00:00 2001 From: zonble Date: Mon, 17 Jan 2022 00:45:45 +0800 Subject: [PATCH 1/2] Allows users to type Latin letters while using shift + letter keys. Fixes issue #162. --- .gitignore | 2 ++ Source/Engine/McBopomofoLM.cpp | 14 ++++++++++++++ Source/InputMethodController.mm | 31 +++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 242ad78a..9bb340dc 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ Credits.rtf # C_count.occ.exe .idea .swiftpm +.vscode +__pycache__ diff --git a/Source/Engine/McBopomofoLM.cpp b/Source/Engine/McBopomofoLM.cpp index 9c73bcef..8c32d0d4 100644 --- a/Source/Engine/McBopomofoLM.cpp +++ b/Source/Engine/McBopomofoLM.cpp @@ -75,6 +75,16 @@ const vector McBopomofoLM::bigramsForKeys(const string& preceedingKey, c const vector McBopomofoLM::unigramsForKey(const string& key) { + if (key == " ") { + vector spaceUnigrams; + Unigram g; + g.keyValue.key = " "; + g.keyValue.value= " "; + g.score = 0; + spaceUnigrams.push_back(g); + return spaceUnigrams; + } + vector allUnigrams; vector userUnigrams; @@ -104,6 +114,10 @@ const vector McBopomofoLM::unigramsForKey(const string& key) bool McBopomofoLM::hasUnigramsForKey(const string& key) { + if (key == " ") { + return true; + } + if (!m_excludedPhrases.hasUnigramsForKey(key)) { return m_userPhrases.hasUnigramsForKey(key) || m_languageModel.hasUnigramsForKey(key); } diff --git a/Source/InputMethodController.mm b/Source/InputMethodController.mm index a1e30e27..b7142e87 100644 --- a/Source/InputMethodController.mm +++ b/Source/InputMethodController.mm @@ -173,7 +173,7 @@ static double FindHighestScore(const vector& nodes, double epsilon) NSMenuItem *halfWidthPunctuationMenuItem = [menu addItemWithTitle:NSLocalizedString(@"Use Half-Width Punctuations", @"") action:@selector(toggleHalfWidthPunctuation:) keyEquivalent:@""]; halfWidthPunctuationMenuItem.state = Preferences.halfWidthPunctuationEnabled ? NSControlStateValueOn : NSControlStateValueOff; - BOOL optionKeyPressed = [[NSEvent class] respondsToSelector:@selector(modifierFlags)] && ([NSEvent modifierFlags] & NSAlternateKeyMask); + BOOL optionKeyPressed = [[NSEvent class] respondsToSelector:@selector(modifierFlags)] && ([NSEvent modifierFlags] & NSEventModifierFlagOption); if (_inputMode == kBopomofoModeIdentifier && optionKeyPressed) { NSMenuItem *phaseReplacementMenuItem = [menu addItemWithTitle:NSLocalizedString(@"Use Phrase Replacement", @"") action:@selector(togglePhraseReplacementEnabled:) keyEquivalent:@""]; @@ -553,7 +553,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } // if the composing buffer is empty and there's no reading, and there is some function key combination, we ignore it if (![_composingBuffer length] && _bpmfReadingBuffer->isEmpty() && - ((flags & NSCommandKeyMask) || (flags & NSControlKeyMask) || (flags & NSAlternateKeyMask) || (flags & NSNumericPadKeyMask))) { + ((flags & NSEventModifierFlagCommand) || (flags & NSEventModifierFlagControl) || (flags & NSEventModifierFlagOption) || (flags & NSEventModifierFlagNumericPad))) { return NO; } @@ -568,7 +568,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } } // first commit everything in the buffer. - if (flags & NSShiftKeyMask) { + if (flags & NSEventModifierFlagShift) { return NO; } @@ -583,7 +583,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } return YES; } - if (flags & NSNumericPadKeyMask) { + if (flags & NSEventModifierFlagNumericPad) { if (keyCode != kLeftKeyCode && keyCode != kRightKeyCode && keyCode != kDownKeyCode && keyCode != kUpKeyCode && charCode != 32 && isprint(charCode)) { if ([_composingBuffer length]) { [self commitComposition:client]; @@ -621,7 +621,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } } // Shift + left if ((keyCode == cursorBackwardKey || emacsKey == McBopomofoEmacsKeyBackward) - && (flags & NSShiftKeyMask)) { + && (flags & NSEventModifierFlagShift)) { if (_builder->markerCursorIndex() > 0) { _builder->setMarkerCursorIndex(_builder->markerCursorIndex() - 1); } @@ -633,7 +633,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } } // Shift + Right if ((keyCode == cursorForwardKey || emacsKey == McBopomofoEmacsKeyForward) - && (flags & NSShiftKeyMask)) { + && (flags & NSEventModifierFlagShift)) { if (_builder->markerCursorIndex() < _builder->length()) { _builder->setMarkerCursorIndex(_builder->markerCursorIndex() + 1); } @@ -704,11 +704,13 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } return YES; } +// NSLog(@"flags 1 %lu", (flags & NSEventModifierFlagShift)); + // keyCode 125 = Down, charCode 32 = Space if (_bpmfReadingBuffer->isEmpty() && [_composingBuffer length] > 0 && (keyCode == extraChooseCandidateKey || charCode == 32 || (useVerticalMode && (keyCode == verticalModeOnlyChooseCandidateKey)))) { if (charCode == 32) { // if the spacebar is NOT set to be a selection key - if (!Preferences.chooseCandidateUsingSpace) { + if ((flags & NSEventModifierFlagShift) != 0 || !Preferences.chooseCandidateUsingSpace) { if (_builder->cursorIndex() >= _builder->length()) { [_composingBuffer appendString:@" "]; [self commitComposition:client]; @@ -775,7 +777,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } return NO; } - if (flags & NSShiftKeyMask) { + if (flags & NSEventModifierFlagShift) { // Shift + left if (_builder->cursorIndex() > 0) { _builder->setMarkerCursorIndex(_builder->cursorIndex() - 1); @@ -807,7 +809,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } return NO; } - if (flags & NSShiftKeyMask) { + if (flags & NSEventModifierFlagShift) { // Shift + Right if (_builder->cursorIndex() < _builder->length()) { _builder->setMarkerCursorIndex(_builder->cursorIndex() + 1); @@ -964,6 +966,15 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } return YES; } + if ((char)charCode >= 'A' && (char)charCode <= 'Z') { + if ([_composingBuffer length]) { + string letter = string("_letter_") + string(1, (char)charCode); + if ([self _handlePunctuation:letter usingVerticalMode:useVerticalMode client:client]) { + return YES; + } + } + } + // still nothing, then we update the composing buffer (some app has // strange behavior if we don't do this, "thinking" the key is not // actually consumed) @@ -1211,7 +1222,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } // Function key pressed. BOOL includeShift = Preferences.functionKeyKeyboardLayoutOverrideIncludeShiftKey; - if (([event modifierFlags] & ~NSShiftKeyMask) || (([event modifierFlags] & NSShiftKeyMask) && includeShift)) { + if (([event modifierFlags] & ~NSEventModifierFlagShift) || (([event modifierFlags] & NSEventModifierFlagShift) && includeShift)) { // Override the keyboard layout and let the OS do its thing [client overrideKeyboardWithKeyboardNamed:functionKeyKeyboardLayoutID]; return NO; From e9b1a8ad4a0f891a87f9f666087f8a26ad7d0d41 Mon Sep 17 00:00:00 2001 From: zonble Date: Mon, 17 Jan 2022 00:55:36 +0800 Subject: [PATCH 2/2] Removes unused comments. --- Source/InputMethodController.mm | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/InputMethodController.mm b/Source/InputMethodController.mm index b7142e87..ce635f93 100644 --- a/Source/InputMethodController.mm +++ b/Source/InputMethodController.mm @@ -704,8 +704,6 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } return YES; } -// NSLog(@"flags 1 %lu", (flags & NSEventModifierFlagShift)); - // keyCode 125 = Down, charCode 32 = Space if (_bpmfReadingBuffer->isEmpty() && [_composingBuffer length] > 0 && (keyCode == extraChooseCandidateKey || charCode == 32 || (useVerticalMode && (keyCode == verticalModeOnlyChooseCandidateKey)))) { if (charCode == 32) {