summaryrefslogtreecommitdiffstats
path: root/winit
diff options
context:
space:
mode:
Diffstat (limited to 'winit')
-rw-r--r--winit/src/program.rs2
-rw-r--r--winit/src/program/window_manager.rs101
2 files changed, 60 insertions, 43 deletions
diff --git a/winit/src/program.rs b/winit/src/program.rs
index 7ead4c3b..9a64fa51 100644
--- a/winit/src/program.rs
+++ b/winit/src/program.rs
@@ -363,7 +363,7 @@ where
(
ControlFlow::WaitUntil(current),
ControlFlow::WaitUntil(new),
- ) if new < current => {}
+ ) if current < new => {}
(
ControlFlow::WaitUntil(target),
ControlFlow::Wait,
diff --git a/winit/src/program/window_manager.rs b/winit/src/program/window_manager.rs
index ae214e7c..139d787a 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>
@@ -322,7 +333,9 @@ where
self.content = Renderer::Paragraph::with_spans(Text {
content: &spans,
bounds: Size::INFINITY,
- size: renderer.default_size(),
+ size: preedit
+ .text_size
+ .unwrap_or_else(|| renderer.default_size()),
line_height: text::LineHeight::default(),
font: renderer.default_font(),
horizontal_alignment: alignment::Horizontal::Left,
@@ -330,6 +343,10 @@ where
shaping: text::Shaping::Advanced,
wrapping: text::Wrapping::None,
});
+
+ self.spans.clear();
+ self.spans
+ .extend(spans.into_iter().map(text::Span::to_static));
}
}