You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Mình sẽ lấy ví dụ Firefox (có thể tái hiện lên hầu hết các browser khác như Chrome,...).
Giải thích khá dài dòng, mình sẽ để video ở đây cho mọi người dễ hình dung
output_clip.mp4
Lỗi chỉ xảy ra ở chế độ gõ non-preedit (tất cả các chế độ gõ trừ chế độ số 1 và số 2. Số 2 cũng là kiểu non-preedit nhưng vấn đề hơi khác một chút, tạm thời để sau)
Cách hoạt động kiểu gõ non-preedit của bamboo/lotus:
Ví dụ người dùng gõ từ Hien
Gõ thêm chữ r để thêm dấu hỏi
Thực chất bộ gõ không thể trực tiếp thay đổi chữ e trong từ trên thành ẻ ngay được mà phải xóa chữ e và cả từ đứng sau nó -> Với từ trên, bộ gõ sẽ tự động fake 2 lần phím backspace vào chương trình
Thêm từ ẻ vào và bổ sung lại các từ đứng sau nó -> Trong trường hợp này là thêm từ ẻn
Ra từ Hiẻn
Tương tự nếu thêm chữ e để cho ra ê vào
Tuy nhiên, đã xảy ra một vấn đề, nếu từ đang gõ đang bị chèn bởi chữ suggest của browser (xem video trên cho dễ hiểu) thì khi backspace sẽ bị "thiếu" một backspace nữa (bởi 1 backspace đã dùng để xóa chữ suggest kia), gây ra vấn đề như trên.
Mình đã thử sửa bằng một idea đó là dùng một field mang tên currentWordNearCursor (tên biến đã rõ ràng các bạn có thể hiểu để làm gì). Biến này được update thông qua hook SetSurroundingText(...) của ibus để cập nhật từ mới mỗi khi bạn làm chuột chữ di chuyển
Từ đây, chúng ta có thể thông qua hàm updatePreviousTextInBatch(oldText, newText string, isWordBreakRune bool) xử lý phần tự động backspace và thêm từ mới (chỉ cần tập trung tham số newText sẽ chứa từ đáng ra sẽ được output, như ví dụ trên qua hàm này sẽ là từ hiẻn nhưng chưa backspace và thêm từ mới). Chỉ cần một chút thuật toán đối chiếu với field currentWordNearCursor để check có bị dư một từ sau khi thêm backspace để thêm một extra backspace nữa là xong.
log.Printf("Updating Previous Text %s ---> %s\n", oldText, newText)
e.bsCommitText(offsetRunes)
}
Tuy nhiên một vấn đề nhỏ là hàm SendBackspace() sử dụng ForwardKeyEvent(...) của ibus để fake phím backspace (trong hầu hết các chế độ gõ), cách này khiến cho hook SetSurroundingText(...) không trigger được cho dù trỏ chữ có di chuyển (với backspace bình thường thì được), dẫn đến việc currentWordNearCursor cũng không được update đúng cách và không lấy được từ sau khi backspace (chưa thêm chữ mới).
fmt.Println("There's something wrong with wmClasses")
}
}
Không biết có ai có solution để giúp mình vấn đề này không. Chỉ cần có một cách để trigger hook SetSurroundingText(...) mà không phụ thuộc vào điều kiện của ibus là được. Cám ơn mn bỏ thời gian để đọc 🥇Nếu được thì giúp mình một PR có ích nhé. (đang dang dở tại commit 4ccb3a1)
Mình sẽ lấy ví dụ Firefox (có thể tái hiện lên hầu hết các browser khác như Chrome,...).
Giải thích khá dài dòng, mình sẽ để video ở đây cho mọi người dễ hình dung
output_clip.mp4
Lỗi chỉ xảy ra ở chế độ gõ non-preedit (tất cả các chế độ gõ trừ chế độ số 1 và số 2. Số 2 cũng là kiểu non-preedit nhưng vấn đề hơi khác một chút, tạm thời để sau)
Cách hoạt động kiểu gõ non-preedit của bamboo/lotus:
Hienrđể thêm dấu hỏietrong từ trên thànhẻngay được mà phải xóa chữ e và cả từ đứng sau nó -> Với từ trên, bộ gõ sẽ tự động fake 2 lần phím backspace vào chương trìnhẻvào và bổ sung lại các từ đứng sau nó -> Trong trường hợp này là thêm từẻnHiẻneđể cho raêvàoTuy nhiên, đã xảy ra một vấn đề, nếu từ đang gõ đang bị chèn bởi chữ suggest của browser (xem video trên cho dễ hiểu) thì khi backspace sẽ bị "thiếu" một backspace nữa (bởi 1 backspace đã dùng để xóa chữ suggest kia), gây ra vấn đề như trên.
Mình đã thử sửa bằng một idea đó là dùng một field mang tên
currentWordNearCursor(tên biến đã rõ ràng các bạn có thể hiểu để làm gì). Biến này được update thông qua hookSetSurroundingText(...)của ibus để cập nhật từ mới mỗi khi bạn làm chuột chữ di chuyểnibus-lotus/engine.go
Line 65 in 4ccb3a1
ibus-lotus/engine.go
Lines 161 to 163 in 4ccb3a1
Từ đây, chúng ta có thể thông qua hàm
updatePreviousTextInBatch(oldText, newText string, isWordBreakRune bool)xử lý phần tự động backspace và thêm từ mới (chỉ cần tập trung tham sốnewTextsẽ chứa từ đáng ra sẽ được output, như ví dụ trên qua hàm này sẽ là từhiẻnnhưng chưa backspace và thêm từ mới). Chỉ cần một chút thuật toán đối chiếu với fieldcurrentWordNearCursorđể check có bị dư một từ sau khi thêm backspace để thêm một extra backspace nữa là xong.ibus-lotus/engine_backspace.go
Lines 191 to 228 in 4ccb3a1
Tuy nhiên một vấn đề nhỏ là hàm
SendBackspace()sử dụngForwardKeyEvent(...)của ibus để fake phím backspace (trong hầu hết các chế độ gõ), cách này khiến cho hookSetSurroundingText(...)không trigger được cho dù trỏ chữ có di chuyển (với backspace bình thường thì được), dẫn đến việccurrentWordNearCursorcũng không được update đúng cách và không lấy được từ sau khi backspace (chưa thêm chữ mới).ibus-lotus/engine_backspace.go
Lines 267 to 324 in 4ccb3a1
Không biết có ai có solution để giúp mình vấn đề này không. Chỉ cần có một cách để trigger hook
SetSurroundingText(...)mà không phụ thuộc vào điều kiện của ibus là được. Cám ơn mn bỏ thời gian để đọc 🥇Nếu được thì giúp mình một PR có ích nhé. (đang dang dở tại commit 4ccb3a1)