Chế độ gửi chữ
Cách GTV đưa chữ vào từng loại ứng dụng, và vì sao chọn chế độ mặc định.
Các chế độ
Bộ gõ không gạch chân phải sửa chữ đã nằm trong ứng dụng (viet + s ra viét).
IBus có vài cách làm việc đó và không cách nào đúng ở mọi toolkit. Kết quả đo trên ứng dụng thật:
| Chế độ | Cách làm | GTK3 | Terminal (VTE) | Chrome / VS Code |
|---|---|---|---|---|
backspace (mặc định) | forward BackSpace, chờ pause_ms, rồi CommitText | ✅ | ✅ | ✅ |
surrounding | DeleteSurroundingText + CommitText. Mặc định cho ứng dụng GTK4 | ✅ | – | ❌ Chrome báo hỗ trợ nhưng bỏ qua lệnh xóa |
forward-keys | mọi thứ (kể cả chữ) forward như phím | ✅ | ✅ | ❌ bỏ keysym Unicode |
select | forward Shift+Left rồi CommitText | thử nghiệm | thử nghiệm | thử nghiệm |
preedit | chữ đang gõ nằm trong preedit | ✅ | ✅ | ✅ (Chrome luôn vẽ gạch chân) |
off | tắt tiếng Việt cho ứng dụng đó, phím đi thẳng | ✅ | ✅ | ✅ |
backspace là chế độ duy nhất đúng ở cả ba toolkit nên là mặc định. Nếu một ứng dụng lỗi, thử
"<wm_class>" = "preedit" trong [apps], rồi tăng pause_ms.
Cách đặt xem ở trang cách dùng.
Vì sao backspace của GTV chạy được khi các bộ gõ khác hỏng
Cùng một ý tưởng (BackSpace rồi commit) nhưng bốn chỗ khác biệt quyết định:
- Một đường ra duy nhất, có thứ tự. Handler trả lời client ngay. Một thread riêng phát mọi signal theo hàng đợi, nên không có hai nơi cùng phát và đua nhau trên connection.
- Không bao giờ để phím “đi thẳng” (native). Toolkit xếp phím native vào hàng đợi và xử lý sau các signal commit, nên chữ bị đảo hoặc mất. Mọi ký tự in được đều đi bằng CommitText. Phím không in được (Enter, mũi tên…) gặp lúc hàng đợi bận cũng được forward qua hàng đợi.
- Chờ đủ lâu sau khi forward phím. Chrome và GTK xử lý phím forward trễ hơn commit gửi ngay sau đó. Sau mỗi lần forward, output kế tiếp chờ
pause_ms, và các commit liền nhau được gộp thành mộtCommitText. Pause nằm ở thread phát, không chặn reply, nên đúng cả khiIBUS_ENABLE_SYNC_MODE=1. - Bỏ qua tín hiệu giả do chính mình gây ra. GTK gọi
Reset, còn Chrome gửiResethoặc focus change mỗi khi xử lý một BackSpace, kể cả BackSpace do engine forward. Những tín hiệu này trong 200 ms sau phím forward của mình bị bỏ qua, nếu không engine quên từ đang gõ.
Thanh địa chỉ trình duyệt
Thanh địa chỉ có inline autocomplete: phần gợi ý sau con trỏ đang được chọn, nên BackSpace đầu tiên xóa gợi ý chứ không xóa chữ vừa gõ.
Khi con trỏ nằm trong 80 px trên cùng của cửa sổ trình duyệt (Chrome, Chromium, Brave, Vivaldi, Edge, Opera, Firefox), GTV dùng
address_bar_mode (mặc định backspace): forward thêm Delete trước BackSpace để bỏ phần gợi ý, và pause tối thiểu 60 ms vì Chrome cập nhật gợi ý chậm hơn lúc gõ. Phím Tab ở đây cũng do GTV forward lại: Tab đi qua bộ gõ không còn nhận gợi ý inline của Chrome, còn Tab do GTV forward thì nhận được. preedit không rớt chữ nhưng Chrome luôn gạch chân chữ đang gõ.