diff options
| author | 2025-02-13 05:19:32 +0100 | |
|---|---|---|
| committer | 2025-02-13 05:19:32 +0100 | |
| commit | f889008e21971b461ec7c54d9a7667a23f6ab35b (patch) | |
| tree | 91d9d34c87796da424104c46705e9f1aceb69f92 /winit | |
| parent | 97f1db3783dca5a4f60a9f89668613de4dfe9edd (diff) | |
| parent | 89a4dc2ac2a751fdcae921997bb93a76f9b667f9 (diff) | |
| download | iced-f889008e21971b461ec7c54d9a7667a23f6ab35b.tar.gz iced-f889008e21971b461ec7c54d9a7667a23f6ab35b.tar.bz2 iced-f889008e21971b461ec7c54d9a7667a23f6ab35b.zip | |
Merge pull request #2793 from rhysd/issue-2792
Fix the initial candidate window position
Diffstat (limited to '')
| -rw-r--r-- | winit/src/program/window_manager.rs | 93 | 
1 files changed, 52 insertions, 41 deletions
| diff --git a/winit/src/program/window_manager.rs b/winit/src/program/window_manager.rs index d5b334df..27306439 100644 --- a/winit/src/program/window_manager.rs +++ b/winit/src/program/window_manager.rs @@ -75,6 +75,7 @@ where                  mouse_interaction: mouse::Interaction::None,                  redraw_at: None,                  preedit: None, +                ime_state: None,              },          ); @@ -166,6 +167,7 @@ where      pub renderer: P::Renderer,      pub redraw_at: Option<Instant>,      preedit: Option<Preedit<P::Renderer>>, +    ime_state: Option<(Point, input_method::Purpose)>,  }  impl<P, C> Window<P, C> @@ -206,52 +208,36 @@ where      pub fn request_input_method(&mut self, input_method: InputMethod) {          match input_method { -            InputMethod::None => {}              InputMethod::Disabled => { -                self.raw.set_ime_allowed(false); +                self.disable_ime();              } -            InputMethod::Allowed | InputMethod::Open { .. } => { -                self.raw.set_ime_allowed(true); -            } -        } - -        if let InputMethod::Open { -            position, -            purpose, -            preedit, -        } = input_method -        { -            self.raw.set_ime_cursor_area( -                LogicalPosition::new(position.x, position.y), -                LogicalSize::new(10, 10), // TODO? -            ); - -            self.raw.set_ime_purpose(conversion::ime_purpose(purpose)); - -            if let Some(preedit) = preedit { -                if preedit.content.is_empty() { -                    self.preedit = None; -                } else if let Some(overlay) = &mut self.preedit { -                    overlay.update( -                        position, -                        &preedit, -                        self.state.background_color(), -                        &self.renderer, -                    ); +            InputMethod::Enabled { +                position, +                purpose, +                preedit, +            } => { +                self.enable_ime(position, purpose); + +                if let Some(preedit) = preedit { +                    if preedit.content.is_empty() { +                        self.preedit = None; +                    } else { +                        let mut overlay = +                            self.preedit.take().unwrap_or_else(Preedit::new); + +                        overlay.update( +                            position, +                            &preedit, +                            self.state.background_color(), +                            &self.renderer, +                        ); + +                        self.preedit = Some(overlay); +                    }                  } else { -                    let mut overlay = Preedit::new(); -                    overlay.update( -                        position, -                        &preedit, -                        self.state.background_color(), -                        &self.renderer, -                    ); - -                    self.preedit = Some(overlay); +                    self.preedit = None;                  }              } -        } else { -            self.preedit = None;          }      } @@ -268,6 +254,31 @@ where              );          }      } + +    fn enable_ime(&mut self, position: Point, purpose: input_method::Purpose) { +        if self.ime_state.is_none() { +            self.raw.set_ime_allowed(true); +        } + +        if self.ime_state != Some((position, purpose)) { +            self.raw.set_ime_cursor_area( +                LogicalPosition::new(position.x, position.y), +                LogicalSize::new(10, 10), // TODO? +            ); +            self.raw.set_ime_purpose(conversion::ime_purpose(purpose)); + +            self.ime_state = Some((position, purpose)); +        } +    } + +    fn disable_ime(&mut self) { +        if self.ime_state.is_some() { +            self.raw.set_ime_allowed(false); +            self.ime_state = None; +        } + +        self.preedit = None; +    }  }  struct Preedit<Renderer> | 
