emilk / egui

egui: an easy-to-use immediate mode GUI in Rust that runs on both web and native
https://www.egui.rs/
Apache License 2.0
20.93k stars 1.52k forks source link

[IME] Can't input CompositionEnd only characters because of checking ccursor.index and ime_cursor.index #4486

Open FrankLeeC opened 2 months ago

FrankLeeC commented 2 months ago

Describe the bug Sometimes can not type IME CompositionEnd characters.

To Reproduce Use 'PinYin' input, type some words, then type in some other character such as 【 】 ……

Expected behavior Type in any characters, including CompositionEnd characters.

Screenshots

https://github.com/emilk/egui/assets/16380650/fe9c1e7a-c665-4726-bf08-081b8c7c0c41

IME-BUG2

After typing !@, can not type any CompositionEnd character like 【】。,;

IME-BUG3 IME-BUG1

I'm using version 0.27.2, i see branch master has changed CompositionEnd to ImeEvent::Commit, but this bug still exists. Here is why this happens. /crates/egui/src/widgets/text_edit/builder.rs L974 if !prediction.is_empty() && cursor_range.secondary.ccursor.index == state.ime_cursor_range.secondary.ccursor.index this prediction make sure cursor_range.secondary.ccursor.index equals state.ime_cursor_range.secondary.ccursor.index . but when input CompositionEnd only characters after some other characters, cursor_range.secondary.ccursor.index is equals to the length of previous characters, and state.ime_cursor_range.secondary.ccursor.index equals to 0.

Below is my solution: IME-BUGFIX2 IME-BUGFIX1

https://github.com/emilk/egui/assets/16380650/6e2d7733-cea6-49e5-89ce-fd74e04963bc

If we check this two cursors.index only when ime_state equals true which meanings we triggered CompositionStart first and currently continue typing some IME characters. if we trigger CompositionEnd first, there is no need to check cursor.index.

Actually, i don't know why need to check cursor_range.secondary.ccursor.index == state.ime_cursor_range.secondary.ccursor.index, can you tell me the reason. Thanks 😊

Desktop (please complete the following information):

rustbasic commented 2 months ago

In the Master version, everything has been modified normally. It will be applied to all next versions.

cursor_range.secondary.ccursor.index == state.ime_cursor_range.secondary.ccursor.index The reason for checking is because the characters you are typing may be copied somewhere else.

FrankLeeC commented 2 months ago

In the Master version, everything has been modified normally.

It will be applied to all next versions.

cursor_range.secondary.ccursor.index == state.ime_cursor_range.secondary.ccursor.index

The reason for checking is because the characters you are typing may be copied somewhere else.

Thank you! I 'll test in next version 😀