summaryrefslogtreecommitdiffstats
path: root/winit/src/program.rs
diff options
context:
space:
mode:
Diffstat (limited to 'winit/src/program.rs')
-rw-r--r--winit/src/program.rs156
1 files changed, 8 insertions, 148 deletions
diff --git a/winit/src/program.rs b/winit/src/program.rs
index 688d6731..302bc6c3 100644
--- a/winit/src/program.rs
+++ b/winit/src/program.rs
@@ -3,8 +3,6 @@ mod state;
mod window_manager;
pub use state::State;
-use winit::dpi::LogicalPosition;
-use winit::dpi::LogicalSize;
use crate::conversion;
use crate::core;
@@ -581,8 +579,6 @@ async fn run_instance<P, C>(
let mut clipboard = Clipboard::unconnected();
let mut compositor_receiver: Option<oneshot::Receiver<_>> = None;
- let mut preedit = Preedit::<P>::new();
-
debug.startup_finished();
loop {
@@ -878,29 +874,15 @@ async fn run_instance<P, C>(
if let user_interface::State::Updated {
redraw_request,
- caret_info,
+ input_method,
} = ui_state
{
- match redraw_request {
- Some(window::RedrawRequest::NextFrame) => {
- window.raw.request_redraw();
- window.redraw_at = None;
- }
- Some(window::RedrawRequest::At(at)) => {
- window.redraw_at = Some(at);
- }
- None => {}
- }
-
- if let Some(caret_info) = caret_info {
- update_input_method(
- window,
- &mut preedit,
- &caret_info,
- );
- }
+ window.request_redraw(redraw_request);
+ window.request_input_method(input_method);
}
+ window.draw_preedit();
+
debug.render_started();
match compositor.present(
&mut window.renderer,
@@ -1048,31 +1030,14 @@ async fn run_instance<P, C>(
match ui_state {
user_interface::State::Updated {
redraw_request: _redraw_request,
- caret_info,
+ input_method,
} => {
#[cfg(not(
feature = "unconditional-rendering"
))]
- match _redraw_request {
- Some(
- window::RedrawRequest::NextFrame,
- ) => {
- window.raw.request_redraw();
- window.redraw_at = None;
- }
- Some(window::RedrawRequest::At(at)) => {
- window.redraw_at = Some(at);
- }
- None => {}
- }
+ window.request_redraw(_redraw_request);
- if let Some(caret_info) = caret_info {
- update_input_method(
- window,
- &mut preedit,
- &caret_info,
- );
- }
+ window.request_input_method(input_method);
}
user_interface::State::Outdated => {
uis_stale = true;
@@ -1165,111 +1130,6 @@ async fn run_instance<P, C>(
let _ = ManuallyDrop::into_inner(user_interfaces);
}
-fn update_input_method<P, C>(
- window: &mut crate::program::window_manager::Window<P, C>,
- preedit: &mut Preedit<P>,
- caret_info: &crate::core::CaretInfo,
-) where
- P: Program,
- C: Compositor<Renderer = P::Renderer> + 'static,
-{
- window.raw.set_ime_allowed(caret_info.input_method_allowed);
- window.raw.set_ime_cursor_area(
- LogicalPosition::new(caret_info.position.x, caret_info.position.y),
- LogicalSize::new(10, 10),
- );
-
- let text = window.state.preedit();
- if !text.is_empty() {
- preedit.update(text.as_str(), &window.renderer);
- preedit.fill(
- &mut window.renderer,
- window.state.text_color(),
- window.state.background_color(),
- caret_info.position,
- );
- }
-}
-
-struct Preedit<P: Program> {
- content: Option<<P::Renderer as core::text::Renderer>::Paragraph>,
-}
-
-impl<P: Program> Preedit<P> {
- fn new() -> Self {
- Self { content: None }
- }
-
- fn update(&mut self, text: &str, renderer: &P::Renderer) {
- use core::text::Paragraph as _;
- use core::text::Renderer as _;
-
- self.content = Some(
- <P::Renderer as core::text::Renderer>::Paragraph::with_text(
- core::Text::<&str, <P::Renderer as core::text::Renderer>::Font> {
- content: text,
- bounds: Size::INFINITY,
- size: renderer.default_size(),
- line_height: core::text::LineHeight::default(),
- font: renderer.default_font(),
- horizontal_alignment: core::alignment::Horizontal::Left,
- vertical_alignment: core::alignment::Vertical::Top, //Bottom,
- shaping: core::text::Shaping::Advanced,
- wrapping: core::text::Wrapping::None,
- },
- ),
- );
- }
-
- fn fill(
- &self,
- renderer: &mut P::Renderer,
- fore_color: core::Color,
- bg_color: core::Color,
- caret_position: Point,
- ) {
- use core::text::Paragraph as _;
- use core::text::Renderer as _;
- use core::Renderer as _;
-
- let Some(ref content) = self.content else {
- return;
- };
- if content.min_width() < 1.0 {
- return;
- }
-
- let top_left = Point::new(
- caret_position.x,
- caret_position.y - content.min_height(),
- );
- let bounds = core::Rectangle::new(top_left, content.min_bounds());
- renderer.with_layer(bounds, |renderer| {
- renderer.fill_quad(
- core::renderer::Quad {
- bounds,
- ..Default::default()
- },
- core::Background::Color(bg_color),
- );
-
- let underline = 2.;
- renderer.fill_quad(
- core::renderer::Quad {
- bounds: bounds.shrink(core::Padding {
- top: bounds.height - underline,
- ..Default::default()
- }),
- ..Default::default()
- },
- core::Background::Color(fore_color),
- );
-
- renderer.fill_paragraph(content, top_left, fore_color, bounds);
- });
- }
-}
-
/// Builds a window's [`UserInterface`] for the [`Program`].
fn build_user_interface<'a, P: Program>(
program: &'a P,