@@ -18,7 +18,6 @@ static const char* kZeroWidthSpace = "\xef\xbb\xbf"; //"\xe2\x80\x8b";
18
18
19
19
namespace rime {
20
20
21
-
22
21
ChordComposer::ChordComposer (const Ticket& ticket) : Processor(ticket) {
23
22
if (!engine_)
24
23
return ;
@@ -44,55 +43,49 @@ ChordComposer::~ChordComposer() {
44
43
unhandled_key_connection_.disconnect ();
45
44
}
46
45
47
- ProcessResult ChordComposer::ProcessKeyEvent (const KeyEvent& key_event) {
48
- if (pass_thru_)
46
+ ProcessResult ChordComposer::ProcessFunctionKey (const KeyEvent& key_event) {
47
+ if (key_event. release ()) {
49
48
return kNoop ;
50
- bool chording = !chord_.empty ();
51
- if (key_event.shift () || key_event.ctrl () || key_event.alt ()) {
52
- ClearChord ();
53
- return chording ? kAccepted : kNoop ;
54
49
}
55
- bool is_key_up = key_event.release ();
56
50
int ch = key_event.keycode ();
57
- Context* ctx = engine_->context ();
58
- if (!is_key_up && ch == XK_Return) {
51
+ if (ch == XK_Return) {
59
52
if (!raw_sequence_.empty ()) {
60
53
// commit raw input
61
- ctx ->set_input (raw_sequence_);
54
+ engine_-> context () ->set_input (raw_sequence_);
62
55
// then the sequence should not be used again
63
56
raw_sequence_.clear ();
64
57
}
65
58
ClearChord ();
66
- return kNoop ;
67
- }
68
- if (!is_key_up && ch == XK_BackSpace) {
59
+ } else if (ch == XK_BackSpace) {
69
60
// invalidate raw sequence
70
61
raw_sequence_.clear ();
71
62
ClearChord ();
72
63
if (DeleteLastSyllable ()) {
73
64
return kAccepted ;
74
65
}
75
- return kNoop ;
76
- }
77
- if (!is_key_up && ch == XK_Escape) {
66
+ } else if (ch == XK_Escape) {
78
67
// clear the raw sequence
79
68
raw_sequence_.clear ();
80
69
ClearChord ();
81
- return kNoop ;
82
70
}
83
- if (!is_key_up && ch >= 0x20 && ch <= 0x7e ) {
84
- // save raw input
85
- if (!ctx->IsComposing () || !raw_sequence_.empty ()) {
86
- raw_sequence_.push_back (ch);
87
- DLOG (INFO) << " update raw sequence: " << raw_sequence_;
88
- }
71
+ return kNoop ;
72
+ }
73
+
74
+ ProcessResult ChordComposer::ProcessChordingKey (const KeyEvent& key_event) {
75
+ bool chording = !chord_.empty ();
76
+ if (key_event.shift () || key_event.ctrl () || key_event.alt ()) {
77
+ ClearChord ();
78
+ return chording ? kAccepted : kNoop ;
89
79
}
80
+ bool is_key_up = key_event.release ();
81
+ int ch = key_event.keycode ();
82
+ // non chording key
90
83
if (std::find (chording_keys_.begin (),
91
84
chording_keys_.end (),
92
85
KeyEvent{ch, 0 }) == chording_keys_.end ()) {
93
86
return chording ? kAccepted : kNoop ;
94
87
}
95
- // in alphabet
88
+ // chording key
96
89
if (is_key_up) {
97
90
if (pressed_.erase (ch) != 0 && pressed_.empty ()) {
98
91
FinishChord ();
@@ -107,6 +100,26 @@ ProcessResult ChordComposer::ProcessKeyEvent(const KeyEvent& key_event) {
107
100
return kAccepted ;
108
101
}
109
102
103
+ ProcessResult ChordComposer::ProcessKeyEvent (const KeyEvent& key_event) {
104
+ if (pass_thru_) {
105
+ return ProcessFunctionKey (key_event);
106
+ }
107
+ bool is_key_up = key_event.release ();
108
+ int ch = key_event.keycode ();
109
+ if (!is_key_up && ch >= 0x20 && ch <= 0x7e ) {
110
+ // save raw input
111
+ if (!engine_->context ()->IsComposing () || !raw_sequence_.empty ()) {
112
+ raw_sequence_.push_back (ch);
113
+ DLOG (INFO) << " update raw sequence: " << raw_sequence_;
114
+ }
115
+ }
116
+ auto result = ProcessChordingKey (key_event);
117
+ if (result != kNoop ) {
118
+ return result;
119
+ }
120
+ return ProcessFunctionKey (key_event);
121
+ }
122
+
110
123
string ChordComposer::SerializeChord () {
111
124
KeySequence key_sequence;
112
125
for (KeyEvent key : chording_keys_) {
@@ -208,7 +221,7 @@ void ChordComposer::OnContextUpdate(Context* ctx) {
208
221
else if (composing_) {
209
222
composing_ = false ;
210
223
raw_sequence_.clear ();
211
- DLOG (INFO) << " clear sequence." ;
224
+ DLOG (INFO) << " clear raw sequence." ;
212
225
}
213
226
}
214
227
@@ -219,7 +232,7 @@ void ChordComposer::OnUnhandledKey(Context* ctx, const KeyEvent& key) {
219
232
if ((key.modifier () & ~kShiftMask ) == 0 &&
220
233
key.keycode () >= 0x20 && key.keycode () <= 0x7e ) {
221
234
raw_sequence_.clear ();
222
- DLOG (INFO) << " clear sequence." ;
235
+ DLOG (INFO) << " clear raw sequence." ;
223
236
}
224
237
}
225
238
0 commit comments