Prevents using global state as possible.
This commit is contained in:
parent
1ad9e23918
commit
56c393cefa
|
@ -53,7 +53,7 @@ namespace Formosa {
|
||||||
void setJoinSeparator(const string& separator);
|
void setJoinSeparator(const string& separator);
|
||||||
const string joinSeparator() const;
|
const string joinSeparator() const;
|
||||||
|
|
||||||
vector<string> readingsAtRange(size_t begin, size_t end) const;
|
vector<string> readings() const;
|
||||||
|
|
||||||
Grid& grid();
|
Grid& grid();
|
||||||
|
|
||||||
|
@ -110,12 +110,9 @@ namespace Formosa {
|
||||||
m_cursorIndex++;
|
m_cursorIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline vector<string> BlockReadingBuilder::readingsAtRange(size_t begin, size_t end) const {
|
inline vector<string> BlockReadingBuilder::readings() const
|
||||||
vector<string> v;
|
{
|
||||||
for (size_t i = begin; i < end; i++) {
|
return m_readings;
|
||||||
v.push_back(m_readings[i]);
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool BlockReadingBuilder::deleteReadingBeforeCursor()
|
inline bool BlockReadingBuilder::deleteReadingBeforeCursor()
|
||||||
|
|
|
@ -308,18 +308,8 @@ static double FindHighestScore(const vector<NodeAnchor> &nodes, double epsilon)
|
||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) handleInput:(KeyHandlerInput *)input state:(InputState *)state
|
- (BOOL)handleInput:(KeyHandlerInput *)input state:(InputState *)state stateCallback:(void (^)(InputState *))stateCallback candidateSelectionCallback:(void (^)(void))candidateSelectionCallback errorCallback:(void (^)(void))errorCallback
|
||||||
stateCallback:(void (^)(InputState *))stateCallback
|
|
||||||
candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
|
||||||
errorCallback:(void (^)(void))errorCallback
|
|
||||||
{
|
{
|
||||||
bool composeReading = false;
|
|
||||||
NSInteger cursorForwardKey = input.cursorForwardKey;
|
|
||||||
NSInteger cursorBackwardKey = input.cursorBackwardKey;
|
|
||||||
NSInteger extraChooseCandidateKey = input.extraChooseCandidateKey;
|
|
||||||
NSInteger absorbedArrowKey = input.absorbedArrowKey;
|
|
||||||
NSInteger verticalModeOnlyChooseCandidateKey = input.verticalModeOnlyChooseCandidateKey;
|
|
||||||
|
|
||||||
// get the unicode character code
|
// get the unicode character code
|
||||||
UniChar charCode = input.charCode;
|
UniChar charCode = input.charCode;
|
||||||
uint16 keyCode = input.keyCode;
|
uint16 keyCode = input.keyCode;
|
||||||
|
@ -334,12 +324,12 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
|
|
||||||
// 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
|
||||||
BOOL isFunctionKey = ((flags & NSEventModifierFlagCommand) || (flags & NSEventModifierFlagControl) || (flags & NSEventModifierFlagOption) || (flags & NSEventModifierFlagNumericPad));
|
BOOL isFunctionKey = ((flags & NSEventModifierFlagCommand) || (flags & NSEventModifierFlagControl) || (flags & NSEventModifierFlagOption) || (flags & NSEventModifierFlagNumericPad));
|
||||||
if (![_state isKindOfClass:[InputStateInputting class]] && isFunctionKey) {
|
if (![state isKindOfClass:[InputStateInputting class]] && isFunctionKey) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Caps Lock processing : if Caps Lock is on, temporarily disable bopomofo.
|
// Caps Lock processing : if Caps Lock is on, temporarily disable bopomofo.
|
||||||
if (charCode == 8 || charCode == 13 || keyCode == absorbedArrowKey || keyCode == extraChooseCandidateKey || keyCode == cursorForwardKey || keyCode == cursorBackwardKey) {
|
if (charCode == 8 || charCode == 13 || keyCode == input.absorbedArrowKey || keyCode == input.extraChooseCandidateKey || keyCode == input.cursorForwardKey || keyCode == input.cursorBackwardKey) {
|
||||||
// do nothing if backspace is pressed -- we ignore the key
|
// do nothing if backspace is pressed -- we ignore the key
|
||||||
} else if (flags & NSAlphaShiftKeyMask) {
|
} else if (flags & NSAlphaShiftKeyMask) {
|
||||||
// process all possible combination, we hope.
|
// process all possible combination, we hope.
|
||||||
|
@ -386,6 +376,8 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool composeReading = false;
|
||||||
|
|
||||||
// MARK: Handle BPMF Keys
|
// MARK: Handle BPMF Keys
|
||||||
// see if it's valid BPMF reading
|
// see if it's valid BPMF reading
|
||||||
if (_bpmfReadingBuffer->isValidKey((char) charCode)) {
|
if (_bpmfReadingBuffer->isValidKey((char) charCode)) {
|
||||||
|
@ -454,7 +446,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
// keyCode 125 = Down, charCode 32 = Space
|
// keyCode 125 = Down, charCode 32 = Space
|
||||||
if (_bpmfReadingBuffer->isEmpty() &&
|
if (_bpmfReadingBuffer->isEmpty() &&
|
||||||
[state isKindOfClass:[InputStateNotEmpty class]] &&
|
[state isKindOfClass:[InputStateNotEmpty class]] &&
|
||||||
(keyCode == extraChooseCandidateKey || charCode == 32 || (input.useVerticalMode && (keyCode == verticalModeOnlyChooseCandidateKey)))) {
|
(keyCode == input.extraChooseCandidateKey || charCode == 32 || (input.useVerticalMode && (keyCode == input.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 ((flags & NSEventModifierFlagShift) != 0 || !Preferences.chooseCandidateUsingSpace) {
|
if ((flags & NSEventModifierFlagShift) != 0 || !Preferences.chooseCandidateUsingSpace) {
|
||||||
|
@ -486,12 +478,12 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Cursor backward
|
// MARK: Cursor backward
|
||||||
if (keyCode == cursorBackwardKey || emacsKey == McBopomofoEmacsKeyBackward) {
|
if (keyCode == input.cursorBackwardKey || emacsKey == McBopomofoEmacsKeyBackward) {
|
||||||
return [self _handleBackwardWithState:state flags:flags stateCallback:stateCallback errorCallback:errorCallback];
|
return [self _handleBackwardWithState:state flags:flags stateCallback:stateCallback errorCallback:errorCallback];
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Cursor forward
|
// MARK: Cursor forward
|
||||||
if (keyCode == cursorForwardKey || emacsKey == McBopomofoEmacsKeyForward) {
|
if (keyCode == input.cursorForwardKey || emacsKey == McBopomofoEmacsKeyForward) {
|
||||||
return [self _handleForwardWithState:state flags:flags stateCallback:stateCallback errorCallback:errorCallback];
|
return [self _handleForwardWithState:state flags:flags stateCallback:stateCallback errorCallback:errorCallback];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -506,7 +498,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: AbsorbedArrowKey
|
// MARK: AbsorbedArrowKey
|
||||||
if (keyCode == absorbedArrowKey || keyCode == extraChooseCandidateKey) {
|
if (keyCode == input.absorbedArrowKey || keyCode == input.extraChooseCandidateKey) {
|
||||||
return [self _handleAbsorbedArrowKeyWithState:state stateCallback:stateCallback errorCallback:errorCallback];
|
return [self _handleAbsorbedArrowKeyWithState:state stateCallback:stateCallback errorCallback:errorCallback];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -584,7 +576,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
|
|
||||||
if (_bpmfReadingBuffer->isEmpty()) {
|
if (_bpmfReadingBuffer->isEmpty()) {
|
||||||
// no nee to beep since the event is deliberately triggered by user
|
// no nee to beep since the event is deliberately triggered by user
|
||||||
if (![_state isKindOfClass:[InputStateInputting class]]) {
|
if (![state isKindOfClass:[InputStateInputting class]]) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -604,7 +596,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (![_state isKindOfClass:[InputStateInputting class]]) {
|
if (![state isKindOfClass:[InputStateInputting class]]) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
InputStateInputting *currentState = (InputStateInputting *) state;
|
InputStateInputting *currentState = (InputStateInputting *) state;
|
||||||
|
@ -613,6 +605,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
// Shift + left
|
// Shift + left
|
||||||
if (_builder->cursorIndex() > 0) {
|
if (_builder->cursorIndex() > 0) {
|
||||||
InputStateMarking *marking = [[InputStateMarking alloc] initWithComposingBuffer:currentState.composingBuffer cursorIndex:currentState.cursorIndex markerIndex:currentState.cursorIndex - 1];
|
InputStateMarking *marking = [[InputStateMarking alloc] initWithComposingBuffer:currentState.composingBuffer cursorIndex:currentState.cursorIndex markerIndex:currentState.cursorIndex - 1];
|
||||||
|
marking.readings = [self _currentReadings];
|
||||||
stateCallback(marking);
|
stateCallback(marking);
|
||||||
} else {
|
} else {
|
||||||
errorCallback();
|
errorCallback();
|
||||||
|
@ -639,7 +632,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (![_state isKindOfClass:[InputStateInputting class]]) {
|
if (![state isKindOfClass:[InputStateInputting class]]) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -648,6 +641,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
// Shift + Right
|
// Shift + Right
|
||||||
if (_builder->cursorIndex() < _builder->length()) {
|
if (_builder->cursorIndex() < _builder->length()) {
|
||||||
InputStateMarking *marking = [[InputStateMarking alloc] initWithComposingBuffer:currentState.composingBuffer cursorIndex:currentState.cursorIndex markerIndex:currentState.cursorIndex + 1];
|
InputStateMarking *marking = [[InputStateMarking alloc] initWithComposingBuffer:currentState.composingBuffer cursorIndex:currentState.cursorIndex markerIndex:currentState.cursorIndex + 1];
|
||||||
|
marking.readings = [self _currentReadings];
|
||||||
stateCallback(marking);
|
stateCallback(marking);
|
||||||
} else {
|
} else {
|
||||||
errorCallback();
|
errorCallback();
|
||||||
|
@ -673,7 +667,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (![_state isKindOfClass:[InputStateInputting class]]) {
|
if (![state isKindOfClass:[InputStateInputting class]]) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -697,7 +691,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (![_state isKindOfClass:[InputStateInputting class]]) {
|
if (![state isKindOfClass:[InputStateInputting class]]) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -749,7 +743,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
- (BOOL)_handleDeleteWithState:(InputState *)state stateCallback:(void (^)(InputState *))stateCallback errorCallback:(void (^)(void))errorCallback
|
- (BOOL)_handleDeleteWithState:(InputState *)state stateCallback:(void (^)(InputState *))stateCallback errorCallback:(void (^)(void))errorCallback
|
||||||
{
|
{
|
||||||
if (_bpmfReadingBuffer->isEmpty()) {
|
if (_bpmfReadingBuffer->isEmpty()) {
|
||||||
if (![_state isKindOfClass:[InputStateInputting class]]) {
|
if (![state isKindOfClass:[InputStateInputting class]]) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -849,6 +843,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
index -= 1;
|
index -= 1;
|
||||||
InputStateMarking *marking = [[InputStateMarking alloc] initWithComposingBuffer:state.composingBuffer cursorIndex:state.cursorIndex markerIndex:index];
|
InputStateMarking *marking = [[InputStateMarking alloc] initWithComposingBuffer:state.composingBuffer cursorIndex:state.cursorIndex markerIndex:index];
|
||||||
|
marking.readings = state.readings;
|
||||||
stateCallback(marking);
|
stateCallback(marking);
|
||||||
} else {
|
} else {
|
||||||
stateCallback(state);
|
stateCallback(state);
|
||||||
|
@ -863,6 +858,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
if (index < state.composingBuffer.length) {
|
if (index < state.composingBuffer.length) {
|
||||||
index += 1;
|
index += 1;
|
||||||
InputStateMarking *marking = [[InputStateMarking alloc] initWithComposingBuffer:state.composingBuffer cursorIndex:state.cursorIndex markerIndex:index];
|
InputStateMarking *marking = [[InputStateMarking alloc] initWithComposingBuffer:state.composingBuffer cursorIndex:state.cursorIndex markerIndex:index];
|
||||||
|
marking.readings = state.readings;
|
||||||
stateCallback(marking);
|
stateCallback(marking);
|
||||||
} else {
|
} else {
|
||||||
stateCallback(state);
|
stateCallback(state);
|
||||||
|
@ -1099,7 +1095,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
BOOL result = [self handleInput:input state:_state stateCallback:^(InputState *state) {
|
BOOL result = [self handleInput:input state:_state stateCallback:^(InputState *state) {
|
||||||
[self handleState:state client:client];
|
[self handleState:state client:client];
|
||||||
} candidateSelectionCallback:^{
|
} candidateSelectionCallback:^{
|
||||||
|
[self handleState:self->_state client:(self->_currentCandidateClient ? self->_currentCandidateClient : client)];
|
||||||
} errorCallback:^{
|
} errorCallback:^{
|
||||||
NSBeep();
|
NSBeep();
|
||||||
}];
|
}];
|
||||||
|
@ -1252,6 +1248,16 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
return cursorIndex;
|
return cursorIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSArray *)_currentReadings
|
||||||
|
{
|
||||||
|
NSMutableArray *readingsArray = [[NSMutableArray alloc] init];
|
||||||
|
vector<std::string> v = _builder->readings();
|
||||||
|
for(vector<std::string>::iterator it_i=v.begin(); it_i!=v.end(); ++it_i) {
|
||||||
|
[readingsArray addObject:[NSString stringWithUTF8String:it_i->c_str()]];
|
||||||
|
}
|
||||||
|
return readingsArray;
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - States Handling
|
#pragma mark - States Handling
|
||||||
|
|
||||||
- (NSString *)_convertToSimplifiedChineseIfRequired:(NSString *)text
|
- (NSString *)_convertToSimplifiedChineseIfRequired:(NSString *)text
|
||||||
|
@ -1273,6 +1279,11 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
|
|
||||||
- (void)_commitText:(NSString *)text client:(id)client
|
- (void)_commitText:(NSString *)text client:(id)client
|
||||||
{
|
{
|
||||||
|
NSString *buffer = [self _convertToSimplifiedChineseIfRequired:text];
|
||||||
|
if (!buffer.length) {
|
||||||
|
return;;
|
||||||
|
}
|
||||||
|
|
||||||
// if it's Terminal, we don't commit at the first call (the client of which will not be IPMDServerClientWrapper)
|
// if it's Terminal, we don't commit at the first call (the client of which will not be IPMDServerClientWrapper)
|
||||||
// then we defer the update in the next runloop round -- so that the composing buffer is not
|
// then we defer the update in the next runloop round -- so that the composing buffer is not
|
||||||
// meaninglessly flushed, an annoying bug in Terminal.app since Mac OS X 10.5
|
// meaninglessly flushed, an annoying bug in Terminal.app since Mac OS X 10.5
|
||||||
|
@ -1280,46 +1291,44 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
if (_currentDeferredClient) {
|
if (_currentDeferredClient) {
|
||||||
id currentDeferredClient = _currentDeferredClient;
|
id currentDeferredClient = _currentDeferredClient;
|
||||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||||
NSString *buffer = [self _convertToSimplifiedChineseIfRequired:text];
|
|
||||||
[currentDeferredClient insertText:buffer replacementRange:NSMakeRange(NSNotFound, NSNotFound)];
|
[currentDeferredClient insertText:buffer replacementRange:NSMakeRange(NSNotFound, NSNotFound)];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
NSString *buffer = [self _convertToSimplifiedChineseIfRequired:text];
|
|
||||||
[client insertText:buffer replacementRange:NSMakeRange(NSNotFound, NSNotFound)];
|
[client insertText:buffer replacementRange:NSMakeRange(NSNotFound, NSNotFound)];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)handleState:(InputState *)newState client:(id)client
|
- (void)handleState:(InputState *)newState client:(id)client
|
||||||
{
|
{
|
||||||
if ([newState isKindOfClass:[InputStateDeactive class]]) {
|
if ([newState isKindOfClass:[InputStateDeactive class]]) {
|
||||||
[self _handleInputStateDeactive:(InputStateDeactive *) newState client:client];
|
[self _handleInputStateDeactive:(InputStateDeactive *) newState previous:_state client:client];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([newState isKindOfClass:[InputStateEmpty class]]) {
|
if ([newState isKindOfClass:[InputStateEmpty class]]) {
|
||||||
[self _handleInputStateEmpty:(InputStateEmpty *) newState client:client];
|
[self _handleInputStateEmpty:(InputStateEmpty *) newState previous:_state client:client];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([newState isKindOfClass:[InputStateCommitting class]]) {
|
if ([newState isKindOfClass:[InputStateCommitting class]]) {
|
||||||
[self _handleInputStateCommitting:(InputStateCommitting *) newState client:client];
|
[self _handleInputStateCommitting:(InputStateCommitting *) newState previous:_state client:client];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([newState isKindOfClass:[InputStateInputting class]]) {
|
if ([newState isKindOfClass:[InputStateInputting class]]) {
|
||||||
[self _handleInputStateInputting:(InputStateInputting *) newState client:client];
|
[self _handleInputStateInputting:(InputStateInputting *) newState previous:_state client:client];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([newState isKindOfClass:[InputStateMarking class]]) {
|
if ([newState isKindOfClass:[InputStateMarking class]]) {
|
||||||
[self _handleInputStateMarking:(InputStateMarking *) newState client:client];
|
[self _handleInputStateMarking:(InputStateMarking *) newState previous:_state client:client];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([newState isKindOfClass:[InputStateChoosingCandidate class]]) {
|
if ([newState isKindOfClass:[InputStateChoosingCandidate class]]) {
|
||||||
[self _handleInputStateChoosingCandidate:(InputStateChoosingCandidate *)newState client:client];
|
[self _handleInputStateChoosingCandidate:(InputStateChoosingCandidate *)newState previous:_state client:client];
|
||||||
}
|
}
|
||||||
|
|
||||||
_state = newState;
|
_state = newState;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_handleInputStateDeactive:(InputStateDeactive *)state client:(id)client
|
- (void)_handleInputStateDeactive:(InputStateDeactive *)state previous:(InputState *)previous client:(id)client
|
||||||
{
|
{
|
||||||
// clean up reading buffer residues
|
// clean up reading buffer residues
|
||||||
if (!_bpmfReadingBuffer->isEmpty()) {
|
if (!_bpmfReadingBuffer->isEmpty()) {
|
||||||
|
@ -1328,7 +1337,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
}
|
}
|
||||||
|
|
||||||
// commit any residue in the composing buffer
|
// commit any residue in the composing buffer
|
||||||
if ([_state isKindOfClass:[InputStateInputting class]]) {
|
if ([previous isKindOfClass:[InputStateInputting class]]) {
|
||||||
NSString *buffer = [(InputStateInputting *) _state composingBuffer];
|
NSString *buffer = [(InputStateInputting *) _state composingBuffer];
|
||||||
[self _commitText:buffer client:client];
|
[self _commitText:buffer client:client];
|
||||||
}
|
}
|
||||||
|
@ -1341,10 +1350,10 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
[self _hideTooltip];
|
[self _hideTooltip];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_handleInputStateEmpty:(InputStateEmpty *)state client:(id)client
|
- (void)_handleInputStateEmpty:(InputStateEmpty *)state previous:(InputState *)previous client:(id)client
|
||||||
{
|
{
|
||||||
// commit any residue in the composing buffer
|
// commit any residue in the composing buffer
|
||||||
if ([_state isKindOfClass:[InputStateInputting class]]) {
|
if ([previous isKindOfClass:[InputStateInputting class]]) {
|
||||||
NSString *buffer = [(InputStateInputting *) _state composingBuffer];
|
NSString *buffer = [(InputStateInputting *) _state composingBuffer];
|
||||||
[self _commitText:buffer client:client];
|
[self _commitText:buffer client:client];
|
||||||
}
|
}
|
||||||
|
@ -1355,19 +1364,19 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
[self _hideTooltip];
|
[self _hideTooltip];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_handleInputStateCommitting:(InputStateCommitting *)state client:(id)client
|
- (void)_handleInputStateCommitting:(InputStateCommitting *)state previous:(InputState *)previous client:(id)client
|
||||||
{
|
{
|
||||||
NSString *poppedText = [state poppedText];
|
NSString *poppedText = [state poppedText];
|
||||||
[client insertText:poppedText replacementRange:NSMakeRange(NSNotFound, NSNotFound)];
|
[self _commitText:poppedText client:client];
|
||||||
gCurrentCandidateController.visible = NO;
|
gCurrentCandidateController.visible = NO;
|
||||||
[self _hideTooltip];
|
[self _hideTooltip];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_handleInputStateInputting:(InputStateInputting *)state client:(id)client
|
- (void)_handleInputStateInputting:(InputStateInputting *)state previous:(InputState *)previous client:(id)client
|
||||||
{
|
{
|
||||||
NSString *poppedText = state.poppedText;
|
NSString *poppedText = state.poppedText;
|
||||||
if (poppedText.length) {
|
if (poppedText.length) {
|
||||||
[client insertText:poppedText replacementRange:NSMakeRange(NSNotFound, NSNotFound)];
|
[self _commitText:poppedText client:client];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSUInteger cursorIndex = [state cursorIndex];
|
NSUInteger cursorIndex = [state cursorIndex];
|
||||||
|
@ -1381,7 +1390,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
[self _hideTooltip];
|
[self _hideTooltip];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_handleInputStateMarking:(InputStateMarking *)state client:(id)client
|
- (void)_handleInputStateMarking:(InputStateMarking *)state previous:(InputState *)previous client:(id)client
|
||||||
{
|
{
|
||||||
NSUInteger cursorIndex = [state cursorIndex];
|
NSUInteger cursorIndex = [state cursorIndex];
|
||||||
NSAttributedString *attrString = [state attributedString];
|
NSAttributedString *attrString = [state attributedString];
|
||||||
|
@ -1394,7 +1403,7 @@ candidateSelectionCallback:(void (^)(void))candidateSelectionCallback
|
||||||
[self _showTooltip:state.tooltip composingBuffer:state.composingBuffer client:client];
|
[self _showTooltip:state.tooltip composingBuffer:state.composingBuffer client:client];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_handleInputStateChoosingCandidate:(InputStateChoosingCandidate *)state client:(id)client
|
- (void)_handleInputStateChoosingCandidate:(InputStateChoosingCandidate *)state previous:(InputState *)previous client:(id)client
|
||||||
{
|
{
|
||||||
NSUInteger cursorIndex = [state cursorIndex];
|
NSUInteger cursorIndex = [state cursorIndex];
|
||||||
NSAttributedString *attrString = [state attributedString];
|
NSAttributedString *attrString = [state attributedString];
|
||||||
|
|
|
@ -59,7 +59,6 @@ private let kMaxMarkRangeLength = 6
|
||||||
|
|
||||||
/// Represents that the user is marking a range in the composing buffer.
|
/// Represents that the user is marking a range in the composing buffer.
|
||||||
class InputStateMarking: InputStateNotEmpty {
|
class InputStateMarking: InputStateNotEmpty {
|
||||||
@objc private(set) var readings: [String] = []
|
|
||||||
@objc private(set) var markerIndex: UInt = 0
|
@objc private(set) var markerIndex: UInt = 0
|
||||||
@objc private(set) var markedRange: NSRange = NSRange(location: 0, length: 0)
|
@objc private(set) var markedRange: NSRange = NSRange(location: 0, length: 0)
|
||||||
@objc var tooltip: String {
|
@objc var tooltip: String {
|
||||||
|
@ -83,6 +82,7 @@ class InputStateMarking: InputStateNotEmpty {
|
||||||
return String(format: NSLocalizedString("You are now selecting \"%@\". Press enter to add a new phrase.", comment: ""), text)
|
return String(format: NSLocalizedString("You are now selecting \"%@\". Press enter to add a new phrase.", comment: ""), text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@objc var readings: [String] = []
|
||||||
|
|
||||||
@objc init(composingBuffer: String, cursorIndex: UInt, markerIndex: UInt) {
|
@objc init(composingBuffer: String, cursorIndex: UInt, markerIndex: UInt) {
|
||||||
super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex)
|
super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex)
|
||||||
|
|
Loading…
Reference in New Issue