Skip to content

Commit bc343dc

Browse files
committed
Backport new ibus-bamboo changes that handles word break better
Close #14 Close #15 Close #16
1 parent 4bb99f7 commit bc343dc

File tree

4 files changed

+76
-37
lines changed

4 files changed

+76
-37
lines changed

bamboo/bamboo-core

bamboo/engine_utils.go

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,25 @@ func isValidState(state uint32) bool {
5555
return true
5656
}
5757

58+
func (e *FcitxBambooEngine) isPrintableKey(state, keyVal uint32) bool {
59+
return isValidState(state) && e.isValidKeyVal(keyVal)
60+
}
61+
5862
func (e *FcitxBambooEngine) getCommitText(keyVal, state uint32) (string, bool) {
5963
var keyRune = rune(keyVal)
64+
isPrintableKey := e.isPrintableKey(state, keyVal)
6065
oldText := e.getPreeditString()
6166
// restore key strokes by pressing Shift + Space
6267
if e.shouldRestoreKeyStrokes {
6368
e.shouldRestoreKeyStrokes = false
6469
e.preeditor.RestoreLastWord(!bamboo.HasAnyVietnameseRune(oldText))
6570
return e.getPreeditString(), false
6671
}
67-
if e.preeditor.CanProcessKey(keyRune) {
72+
var keyS string
73+
if isPrintableKey {
74+
keyS = string(keyRune)
75+
}
76+
if isPrintableKey && e.preeditor.CanProcessKey(keyRune) {
6877
if state&FcitxLockMask != 0 {
6978
keyRune = e.toUpper(keyRune)
7079
}
@@ -81,7 +90,7 @@ func (e *FcitxBambooEngine) getCommitText(keyVal, state uint32) (string, bool) {
8190
var ret = e.getPreeditString()
8291
var lastRune = rune(ret[len(ret)-1])
8392
var isWordBreakRune = bamboo.IsWordBreakSymbol(lastRune)
84-
// TODO: THIS IS HACKING
93+
// TODO: THIS IS A HACK
8594
if isWordBreakRune {
8695
e.preeditor.RemoveLastChar(false)
8796
e.preeditor.ProcessKey(' ', bamboo.EnglishMode)
@@ -104,28 +113,46 @@ func (e *FcitxBambooEngine) getCommitText(keyVal, state uint32) (string, bool) {
104113
} else {
105114
return e.getPreeditString(), false
106115
}
107-
} else if bamboo.IsWordBreakSymbol(keyRune) {
116+
} else if e.macroEnabled {
108117
// macro processing
109-
if e.macroEnabled {
110-
var keyS = string(keyRune)
111-
if keyVal == FcitxSpace && e.macroTable.HasKey(oldText) {
112-
e.preeditor.Reset()
113-
return e.expandMacro(oldText) + keyS, keyVal == FcitxSpace
114-
} else {
115-
e.preeditor.ProcessKey(keyRune, e.getBambooInputMode())
116-
return oldText + keyS, keyVal == FcitxSpace
118+
if isPrintableKey && e.macroTable.HasPrefix(oldText+keyS) {
119+
e.preeditor.ProcessKey(keyRune, bamboo.EnglishMode)
120+
return oldText + keyS, false
121+
}
122+
if e.macroTable.HasKey(oldText) {
123+
if isPrintableKey {
124+
return e.expandMacro(oldText) + keyS, true
117125
}
126+
return e.expandMacro(oldText), true
118127
}
119-
if bamboo.HasAnyVietnameseRune(oldText) && e.mustFallbackToEnglish() {
120-
e.preeditor.RestoreLastWord(false)
121-
newText := e.preeditor.GetProcessedString(bamboo.EnglishMode) + string(keyRune)
128+
}
129+
return e.handleNonVnWord(keyVal, state), true
130+
}
131+
132+
func (e *FcitxBambooEngine) handleNonVnWord(keyVal, state uint32) string {
133+
var (
134+
keyS string
135+
keyRune = rune(keyVal)
136+
isPrintableKey = e.isPrintableKey(state, keyVal)
137+
oldText = e.getPreeditString()
138+
)
139+
if isPrintableKey {
140+
keyS = string(keyRune)
141+
}
142+
if bamboo.HasAnyVietnameseRune(oldText) && e.mustFallbackToEnglish() {
143+
e.preeditor.RestoreLastWord(false)
144+
newText := e.preeditor.GetProcessedString(bamboo.PunctuationMode|bamboo.EnglishMode) + keyS
145+
if isPrintableKey {
122146
e.preeditor.ProcessKey(keyRune, bamboo.EnglishMode)
123-
return newText, true
124147
}
148+
return newText
149+
}
150+
if isPrintableKey {
125151
e.preeditor.ProcessKey(keyRune, bamboo.EnglishMode)
126-
return oldText + string(keyRune), true
152+
return oldText + keyS
127153
}
128-
return "", true
154+
// Ctrl + A is treasted as a WBS
155+
return oldText + keyS
129156
}
130157

131158
func (e *FcitxBambooEngine) getMacroText() (bool, string) {
@@ -138,3 +165,14 @@ func (e *FcitxBambooEngine) getMacroText() (bool, string) {
138165
}
139166
return false, ""
140167
}
168+
169+
func (e *FcitxBambooEngine) isValidKeyVal(keyVal uint32) bool {
170+
var keyRune = rune(keyVal)
171+
if keyVal == FcitxBackSpace || bamboo.IsWordBreakSymbol(keyRune) {
172+
return true
173+
}
174+
if ok, _ := e.getMacroText(); ok && keyVal == FcitxTab {
175+
return true
176+
}
177+
return e.preeditor.CanProcessKey(keyRune)
178+
}

bamboo/fcitxbambooengine.go

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,10 @@ func (e *FcitxBambooEngine) preeditProcessKeyEvent(keyVal uint32, state uint32)
5757
var oldText = e.getPreeditString()
5858
defer e.updateLastKeyWithShift(keyVal, state)
5959

60-
// workaround for chrome's address bar and Google SpreadSheets
6160
if !e.shouldRestoreKeyStrokes {
62-
if !isValidState(state) || !e.canProcessKey(keyVal) ||
63-
(!e.macroEnabled && rawKeyLen == 0 && !e.preeditor.CanProcessKey(keyRune)) {
64-
if rawKeyLen > 0 {
65-
e.commitPreeditAndReset(e.getPreeditString())
66-
}
61+
if !e.preeditor.CanProcessKey(keyRune) && rawKeyLen == 0 && !e.macroEnabled {
62+
// don't process special characters if rawKeyLen == 0,
63+
// workaround for Chrome's address bar and Google SpreadSheets
6764
return false
6865
}
6966
}
@@ -92,12 +89,13 @@ func (e *FcitxBambooEngine) preeditProcessKeyEvent(keyVal uint32, state uint32)
9289
}
9390

9491
newText, isWordBreakRune := e.getCommitText(keyVal, state)
92+
isPrintableKey := e.isPrintableKey(state, keyVal)
9593
if isWordBreakRune {
9694
e.commitPreeditAndReset(newText)
97-
return true
95+
return isPrintableKey
9896
}
9997
e.updatePreedit(newText)
100-
return true
98+
return isPrintableKey
10199
}
102100

103101
func (e *FcitxBambooEngine) expandMacro(str string) string {
@@ -204,14 +202,3 @@ func (e *FcitxBambooEngine) commitPreeditAndReset(s string) {
204202
e.preeditText = ""
205203
e.preeditor.Reset()
206204
}
207-
208-
func (e *FcitxBambooEngine) canProcessKey(keyVal uint32) bool {
209-
var keyRune = rune(keyVal)
210-
if keyVal == FcitxSpace || keyVal == FcitxBackSpace || bamboo.IsWordBreakSymbol(keyRune) {
211-
return true
212-
}
213-
if ok, _ := e.getMacroText(); ok && keyVal == FcitxTab {
214-
return true
215-
}
216-
return e.preeditor.CanProcessKey(keyRune)
217-
}

bamboo/utils.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package main
1010

1111
import (
1212
"bamboo-core"
13+
"strings"
1314
"unicode"
1415
)
1516

@@ -44,3 +45,16 @@ func inKeyList(list []rune, key rune) bool {
4445
}
4546
return false
4647
}
48+
49+
// Backport missing function in bamboo-core
50+
func (e *MacroTable) HasPrefix(key string) bool {
51+
if e.mTable[key] != "" {
52+
return true
53+
}
54+
for k := range e.mTable {
55+
if strings.HasPrefix(k, key) {
56+
return true
57+
}
58+
}
59+
return false
60+
}

0 commit comments

Comments
 (0)