-
Notifications
You must be signed in to change notification settings - Fork 937
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
wayland: clear IME preedit only when necessary #4084
Conversation
See this #2478 |
Could you post the |
Yes, and #2484 also seems relevant. This is part of what happens:
After receiving The problem in the IBus case specifically is that it sends a new (I couldn't get IBus to work -- I could ask the person who notified me of this to show their debug logs, though. We should see it looping the above fragment over and over for some time.) This is not directly a Winit issue, but rather is due to quirkiness of platforms and clients. This change makes it such that Winit only sends |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, I read it wrong initially, that should be good.
When all we'll be doing is setting a new preedit, the preedit doesn't have to be explicitly cleared first. This change is perhaps debatable. The direct reason for this is to make it easier to work around quirks/bugs: in [Masonry](https://github.com/linebender/xilem/masonry) we've found IBus appears to resend the IME preedit in response to `Window::set_ime_cursor_area` (`zwp_text_input_v3::set_cursor_rectangle`). Because currently the preedit is first cleared, a new IME cursor area is sent, which again causes IBus to resend the preedit. This can loop for a while. The Wayland protocol is mechanically quite prescriptive, it says for [`zwp_text_input_v3::done`](https://wayland.app/protocols/text-input-unstable-v3#zwp_text_input_v3:event:done) > 1. Replace existing preedit string with the cursor. 2. Delete requested surrounding text. 3. Insert commit string with the cursor at its end. 4. Calculate surrounding text to send. 5. Insert new preedit text in cursor position. 6. Place cursor inside preedit text. Winit currently doesn't do surrounding text, so 2. and 4. can be ignored. In Winit's IME model, without a commit, sending just the `Ime::Preedit` event without explicitly clearing is arguably still equivalent to doing 1., 5., and 6.
Thanks! |
When all we'll be doing is setting a new preedit, the preedit doesn't have to be explicitly cleared first. This change is perhaps debatable.
The direct reason for this is to make it easier to work around quirks/bugs: in Masonry we've found IBus appears to resend the IME preedit in response to
Window::set_ime_cursor_area
(
zwp_text_input_v3::set_cursor_rectangle
). Because currently the preedit is first cleared, a new IME cursor area is sent, which again causes IBus to resend the preedit. This can loop for a while.The Wayland protocol is mechanically quite prescriptive, it says for
zwp_text_input_v3::done
Winit currently doesn't do surrounding text, so 2. and 4. can be ignored. In Winit's IME model, without a commit, sending just the
Ime::Preedit
event without explicitly clearing is arguably still equivalent to doing 1., 5., and 6.changelog
module if knowledge of this change could be valuable to users