@@ -32,15 +32,54 @@ function cancelLongPress() {
3232 }
3333}
3434
35- export function setPreedit ( auxUp : string , preedit : string ) {
35+ const textEncoder = new TextEncoder ( )
36+ const textDecoder = new TextDecoder ( )
37+ let timer : number | null = null
38+ let show = false
39+
40+ export function setPreedit ( auxUp : string , preedit : string , caret : number ) {
41+ if ( timer ) {
42+ clearInterval ( timer )
43+ timer = null
44+ }
3645 const container = getCandidateBar ( ) . querySelector ( '.fcitx-keyboard-candidates-container' ) !
3746 let element = container . querySelector ( '.fcitx-keyboard-preedit' )
3847 if ( auxUp || preedit ) {
3948 if ( ! element ) {
4049 element = div ( 'fcitx-keyboard-preedit' )
4150 container . prepend ( element )
4251 }
43- element . innerHTML = auxUp + preedit
52+ element . innerHTML = ''
53+ if ( auxUp ) {
54+ const auxUpElement = div ( 'fcitx-keyboard-aux-up' )
55+ auxUpElement . innerHTML = auxUp
56+ element . appendChild ( auxUpElement )
57+ }
58+ if ( preedit ) {
59+ const preCaretElement = div ( 'fcitx-keyboard-pre-caret' )
60+ if ( caret >= 0 ) {
61+ const preeditBytes = textEncoder . encode ( preedit )
62+ const preCaret = textDecoder . decode ( preeditBytes . subarray ( 0 , caret ) )
63+ const postCaret = textDecoder . decode ( preeditBytes . subarray ( caret , preeditBytes . length ) )
64+ preCaretElement . innerHTML = preCaret
65+ const caretElement = div ( 'fcitx-keyboard-caret' )
66+ element . append ( preCaretElement , caretElement )
67+ show = true
68+ timer = window . setInterval ( ( ) => {
69+ show = ! show
70+ caretElement . style . opacity = show ? '1' : '0'
71+ } , 500 )
72+ if ( postCaret ) {
73+ const postCaretElement = div ( 'fcitx-keyboard-post-caret' )
74+ postCaretElement . innerHTML = postCaret
75+ element . appendChild ( postCaretElement )
76+ }
77+ }
78+ else {
79+ preCaretElement . innerHTML = preedit
80+ element . appendChild ( preCaretElement )
81+ }
82+ }
4483 }
4584 else {
4685 element ?. remove ( )
0 commit comments