Tóm tắt: bỏ sleep_for, chuyển sang chờ event SurroundingTextUpdated là thay đổi cải thiện lớn nhất mình đo được cho mode Uinput trên Wayland:
Mô tả lỗi
Wayland, mode Uinput (Smooth), gõ nhanh trên Firefox bị mất chữ. Mình đo bằng bàn phím ảo uinput, 15 cụm Telex mỗi lượt, bản hiện tại chỉ ra 9–14/15 trên Firefox.
Nguyên nhân: backspace đi qua kernel (uinput), còn chữ mới đi qua Wayland text-input. Hai đường khác nhau nên chữ mới hay tới trước backspace. Code hiện tại chờ bằng sleep_for 2 ms mỗi backspace, rồi retry 3 × 2 ms.
Chỗ sleep_for đó không thể đúng: fcitx5 chỉ có một event loop, mà InputContextSurroundingTextUpdated (tín hiệu "app đã xoá xong") lại đi qua đúng cái loop đang bị sleep_for chặn. Ngủ bao lâu cũng không thấy tín hiệu tới, nên retry 3 × 2 ms thực chất lần nào cũng chạy đủ 6 ms. Mình thử tăng thời gian ngủ lên 12,5 lần: Firefox chỉ từ 8/15 lên 9/15, nằm trong nhiễu.
Các bước tái hiện
- Wayland (mình dùng KDE Plasma 6), Mode = Uinput (Smooth)
- Mở Firefox, gõ nhanh
dduwowcj truwowngf hocj vào một ô bất kỳ
Kết quả mong đợi
được trường học
Kết quả thực tế
Thỉnh thoảng mất chữ, 1–6 cụm trên 15
Hướng fix
Không sleep_for nữa: trả event loop về ngay, nghe InputContextSurroundingTextUpdated, kiểm tra bằng nội dung ô (không dùng realtextLen), quá 50 ms thì commit như cũ. App không có surrounding text (terminal, Chromium X11) vẫn đi đường sleep cũ.
|
50 ms/phím |
5 ms/phím |
| Firefox, 4 ô |
60/60 |
60/60 |
| Kate, Konsole, Alacritty, Meld, Electron |
15/15 mỗi app |
15/15 mỗi app |
| Edge, 4 ô trong trang |
60/60 |
30/30 |
| Edge thanh địa chỉ |
15/15 |
14/15 |
Đánh đổi: đổi cửa sổ trong vòng 50 ms sau khi bấm phím dấu thì ô cũ mất chữ đó.
Trên X11 mình đo thì Firefox không bị (15/15 cả khi bật lẫn tắt), nên đây là lỗi riêng Wayland.
Code nằm ở #477 (draft), mặc định tắt. Ai đang bị thì thử được bằng cách thêm WaitSurroundingEvent=True vào ~/.config/fcitx5/conf/lotus.conf. Có thể là cùng lỗi với #319 và #267. @archion11 @lamsonquaikhach bạn thử giúp mình với, nếu vẫn còn gặp.
Phiên bản fcitx5-lotus
dev tại thời điểm đo (08/09/2026)
Cách cài đặt
Tự build từ source
Hệ điều hành / Distro
CachyOS
Môi trường Desktop
KDE Plasma (Wayland)
Mô tả lỗi
Wayland, mode Uinput (Smooth), gõ nhanh trên Firefox bị mất chữ. Mình đo bằng bàn phím ảo uinput, 15 cụm Telex mỗi lượt, bản hiện tại chỉ ra 9–14/15 trên Firefox.
Nguyên nhân: backspace đi qua kernel (uinput), còn chữ mới đi qua Wayland text-input. Hai đường khác nhau nên chữ mới hay tới trước backspace. Code hiện tại chờ bằng
sleep_for2 ms mỗi backspace, rồi retry 3 × 2 ms.Chỗ
sleep_forđó không thể đúng: fcitx5 chỉ có một event loop, màInputContextSurroundingTextUpdated(tín hiệu "app đã xoá xong") lại đi qua đúng cái loop đang bịsleep_forchặn. Ngủ bao lâu cũng không thấy tín hiệu tới, nên retry 3 × 2 ms thực chất lần nào cũng chạy đủ 6 ms. Mình thử tăng thời gian ngủ lên 12,5 lần: Firefox chỉ từ 8/15 lên 9/15, nằm trong nhiễu.Các bước tái hiện
dduwowcj truwowngf hocjvào một ô bất kỳKết quả mong đợi
được trường họcKết quả thực tế
Thỉnh thoảng mất chữ, 1–6 cụm trên 15
Hướng fix
Không
sleep_fornữa: trả event loop về ngay, ngheInputContextSurroundingTextUpdated, kiểm tra bằng nội dung ô (không dùngrealtextLen), quá 50 ms thì commit như cũ. App không có surrounding text (terminal, Chromium X11) vẫn đi đường sleep cũ.Đánh đổi: đổi cửa sổ trong vòng 50 ms sau khi bấm phím dấu thì ô cũ mất chữ đó.
Trên X11 mình đo thì Firefox không bị (15/15 cả khi bật lẫn tắt), nên đây là lỗi riêng Wayland.
Code nằm ở #477 (draft), mặc định tắt. Ai đang bị thì thử được bằng cách thêm
WaitSurroundingEvent=Truevào~/.config/fcitx5/conf/lotus.conf. Có thể là cùng lỗi với #319 và #267. @archion11 @lamsonquaikhach bạn thử giúp mình với, nếu vẫn còn gặp.Phiên bản fcitx5-lotus
devtại thời điểm đo (08/09/2026)Cách cài đặt
Tự build từ source
Hệ điều hành / Distro
CachyOS
Môi trường Desktop
KDE Plasma (Wayland)