Merge pull request #237 from zonble/dev/latin_input

Allows users to type Latin letters while using shift + letter keys.
This commit is contained in:
Weizhong Yang a.k.a zonble 2022-01-17 10:44:19 +08:00 committed by GitHub
commit 6c2707c4e9
3 changed files with 35 additions and 10 deletions

2
.gitignore vendored
View File

@ -13,3 +13,5 @@ Credits.rtf
# C_count.occ.exe # C_count.occ.exe
.idea .idea
.swiftpm .swiftpm
.vscode
__pycache__

View File

@ -75,6 +75,16 @@ const vector<Bigram> McBopomofoLM::bigramsForKeys(const string& preceedingKey, c
const vector<Unigram> McBopomofoLM::unigramsForKey(const string& key) const vector<Unigram> McBopomofoLM::unigramsForKey(const string& key)
{ {
if (key == " ") {
vector<Unigram> spaceUnigrams;
Unigram g;
g.keyValue.key = " ";
g.keyValue.value= " ";
g.score = 0;
spaceUnigrams.push_back(g);
return spaceUnigrams;
}
vector<Unigram> allUnigrams; vector<Unigram> allUnigrams;
vector<Unigram> userUnigrams; vector<Unigram> userUnigrams;
@ -104,6 +114,10 @@ const vector<Unigram> McBopomofoLM::unigramsForKey(const string& key)
bool McBopomofoLM::hasUnigramsForKey(const string& key) bool McBopomofoLM::hasUnigramsForKey(const string& key)
{ {
if (key == " ") {
return true;
}
if (!m_excludedPhrases.hasUnigramsForKey(key)) { if (!m_excludedPhrases.hasUnigramsForKey(key)) {
return m_userPhrases.hasUnigramsForKey(key) || m_languageModel.hasUnigramsForKey(key); return m_userPhrases.hasUnigramsForKey(key) || m_languageModel.hasUnigramsForKey(key);
} }

View File

@ -173,7 +173,7 @@ static double FindHighestScore(const vector<NodeAnchor>& nodes, double epsilon)
NSMenuItem *halfWidthPunctuationMenuItem = [menu addItemWithTitle:NSLocalizedString(@"Use Half-Width Punctuations", @"") action:@selector(toggleHalfWidthPunctuation:) keyEquivalent:@""]; NSMenuItem *halfWidthPunctuationMenuItem = [menu addItemWithTitle:NSLocalizedString(@"Use Half-Width Punctuations", @"") action:@selector(toggleHalfWidthPunctuation:) keyEquivalent:@""];
halfWidthPunctuationMenuItem.state = Preferences.halfWidthPunctuationEnabled ? NSControlStateValueOn : NSControlStateValueOff; 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) { if (_inputMode == kBopomofoModeIdentifier && optionKeyPressed) {
NSMenuItem *phaseReplacementMenuItem = [menu addItemWithTitle:NSLocalizedString(@"Use Phrase Replacement", @"") action:@selector(togglePhraseReplacementEnabled:) keyEquivalent:@""]; 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 the composing buffer is empty and there's no reading, and there is some function key combination, we ignore it
if (![_composingBuffer length] && if (![_composingBuffer length] &&
_bpmfReadingBuffer->isEmpty() && _bpmfReadingBuffer->isEmpty() &&
((flags & NSCommandKeyMask) || (flags & NSControlKeyMask) || (flags & NSAlternateKeyMask) || (flags & NSNumericPadKeyMask))) { ((flags & NSEventModifierFlagCommand) || (flags & NSEventModifierFlagControl) || (flags & NSEventModifierFlagOption) || (flags & NSEventModifierFlagNumericPad))) {
return NO; 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. // first commit everything in the buffer.
if (flags & NSShiftKeyMask) { if (flags & NSEventModifierFlagShift) {
return NO; return NO;
} }
@ -583,7 +583,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; }
return YES; return YES;
} }
if (flags & NSNumericPadKeyMask) { if (flags & NSEventModifierFlagNumericPad) {
if (keyCode != kLeftKeyCode && keyCode != kRightKeyCode && keyCode != kDownKeyCode && keyCode != kUpKeyCode && charCode != 32 && isprint(charCode)) { if (keyCode != kLeftKeyCode && keyCode != kRightKeyCode && keyCode != kDownKeyCode && keyCode != kUpKeyCode && charCode != 32 && isprint(charCode)) {
if ([_composingBuffer length]) { if ([_composingBuffer length]) {
[self commitComposition:client]; [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 // Shift + left
if ((keyCode == cursorBackwardKey || emacsKey == McBopomofoEmacsKeyBackward) if ((keyCode == cursorBackwardKey || emacsKey == McBopomofoEmacsKeyBackward)
&& (flags & NSShiftKeyMask)) { && (flags & NSEventModifierFlagShift)) {
if (_builder->markerCursorIndex() > 0) { if (_builder->markerCursorIndex() > 0) {
_builder->setMarkerCursorIndex(_builder->markerCursorIndex() - 1); _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 // Shift + Right
if ((keyCode == cursorForwardKey || emacsKey == McBopomofoEmacsKeyForward) if ((keyCode == cursorForwardKey || emacsKey == McBopomofoEmacsKeyForward)
&& (flags & NSShiftKeyMask)) { && (flags & NSEventModifierFlagShift)) {
if (_builder->markerCursorIndex() < _builder->length()) { if (_builder->markerCursorIndex() < _builder->length()) {
_builder->setMarkerCursorIndex(_builder->markerCursorIndex() + 1); _builder->setMarkerCursorIndex(_builder->markerCursorIndex() + 1);
} }
@ -708,7 +708,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; }
if (_bpmfReadingBuffer->isEmpty() && [_composingBuffer length] > 0 && (keyCode == extraChooseCandidateKey || charCode == 32 || (useVerticalMode && (keyCode == verticalModeOnlyChooseCandidateKey)))) { if (_bpmfReadingBuffer->isEmpty() && [_composingBuffer length] > 0 && (keyCode == extraChooseCandidateKey || charCode == 32 || (useVerticalMode && (keyCode == verticalModeOnlyChooseCandidateKey)))) {
if (charCode == 32) { if (charCode == 32) {
// if the spacebar is NOT set to be a selection key // 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()) { if (_builder->cursorIndex() >= _builder->length()) {
[_composingBuffer appendString:@" "]; [_composingBuffer appendString:@" "];
[self commitComposition:client]; [self commitComposition:client];
@ -775,7 +775,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; }
return NO; return NO;
} }
if (flags & NSShiftKeyMask) { if (flags & NSEventModifierFlagShift) {
// Shift + left // Shift + left
if (_builder->cursorIndex() > 0) { if (_builder->cursorIndex() > 0) {
_builder->setMarkerCursorIndex(_builder->cursorIndex() - 1); _builder->setMarkerCursorIndex(_builder->cursorIndex() - 1);
@ -807,7 +807,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; }
return NO; return NO;
} }
if (flags & NSShiftKeyMask) { if (flags & NSEventModifierFlagShift) {
// Shift + Right // Shift + Right
if (_builder->cursorIndex() < _builder->length()) { if (_builder->cursorIndex() < _builder->length()) {
_builder->setMarkerCursorIndex(_builder->cursorIndex() + 1); _builder->setMarkerCursorIndex(_builder->cursorIndex() + 1);
@ -964,6 +964,15 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; }
return YES; 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 // still nothing, then we update the composing buffer (some app has
// strange behavior if we don't do this, "thinking" the key is not // strange behavior if we don't do this, "thinking" the key is not
// actually consumed) // actually consumed)
@ -1211,7 +1220,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; }
// Function key pressed. // Function key pressed.
BOOL includeShift = Preferences.functionKeyKeyboardLayoutOverrideIncludeShiftKey; 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 // Override the keyboard layout and let the OS do its thing
[client overrideKeyboardWithKeyboardNamed:functionKeyKeyboardLayoutID]; [client overrideKeyboardWithKeyboardNamed:functionKeyKeyboardLayoutID];
return NO; return NO;