Skip to content

Commit 56290d1

Browse files
committed
feat: preedit render problem solved
1 parent 6f6f783 commit 56290d1

File tree

3 files changed

+66
-54
lines changed

3 files changed

+66
-54
lines changed

iced_layershell/src/actions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub(crate) enum LayerShellAction {
1919
RedrawAll,
2020
RedrawWindow(LayerId), // maybe one day it is useful, but now useless
2121
NewMenu(IcedNewPopupSettings, iced_core::window::Id),
22-
Ime(input_method::InputMethod),
22+
Ime(input_method::InputMethod, BitFlags<ImeState>),
2323
ImeWithId(LayerId, input_method::InputMethod, BitFlags<ImeState>),
2424
}
2525

iced_layershell/src/application.rs

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ use crate::{
77
clipboard::LayerShellClipboard,
88
conversion,
99
error::Error,
10-
ime_preedit::Preedit,
10+
ime_preedit::{ImeState, Preedit},
1111
settings::VirtualKeyboardSettings,
1212
};
1313

1414
use super::{Appearance, DefaultStyle};
15+
use enumflags2::{BitFlag, BitFlags};
1516
use iced_graphics::{Compositor, compositor};
1617
use state::State;
1718

@@ -337,23 +338,27 @@ where
337338
LayerShellAction::RedrawWindow(index) => {
338339
ev.append_return_data(ReturnData::RedrawIndexRequest(index));
339340
}
340-
LayerShellAction::Ime(ime) => match ime {
341+
LayerShellAction::Ime(ime, ime_flags) => match ime {
341342
iced_core::InputMethod::Disabled => {
342343
ev.set_ime_allowed(false);
343344
}
344345
iced_core::InputMethod::Enabled {
345346
position, purpose, ..
346347
} => {
347-
ev.set_ime_allowed(true);
348-
ev.set_ime_purpose(conversion::ime_purpose(purpose));
349-
ev.set_ime_cursor_area(
350-
layershellev::dpi::LogicalPosition::new(position.x, position.y),
351-
layershellev::dpi::LogicalSize {
352-
width: 10,
353-
height: 10,
354-
},
355-
ev.main_window().id(),
356-
);
348+
if ime_flags.contains(ImeState::ToBeAllowed) {
349+
ev.set_ime_allowed(true);
350+
}
351+
if ime_flags.contains(ImeState::ToBeUpdate) {
352+
ev.set_ime_purpose(conversion::ime_purpose(purpose));
353+
ev.set_ime_cursor_area(
354+
layershellev::dpi::LogicalPosition::new(position.x, position.y),
355+
layershellev::dpi::LogicalSize {
356+
width: 10,
357+
height: 10,
358+
},
359+
ev.main_window().id(),
360+
);
361+
}
357362
}
358363
},
359364
_ => {}
@@ -389,17 +394,25 @@ where
389394
background_color: iced_core::Color,
390395
input_method: InputMethod,
391396
renderer: &A::Renderer,
392-
) {
397+
) -> BitFlags<ImeState> {
393398
match input_method {
394399
InputMethod::Disabled => {
395400
self.disable_ime();
401+
ImeState::empty()
396402
}
397403
InputMethod::Enabled {
398404
position,
399405
purpose,
400406
preedit,
401407
} => {
402-
self.enable_ime(position, purpose);
408+
let mut flags = ImeState::empty();
409+
if self.ime_state.is_none() {
410+
flags.insert(ImeState::ToBeAllowed);
411+
}
412+
if self.ime_state != Some((position, purpose)) {
413+
flags.insert(ImeState::ToBeUpdate);
414+
}
415+
self.update_ime(position, purpose);
403416

404417
if let Some(preedit) = preedit {
405418
if preedit.content.is_empty() {
@@ -414,6 +427,7 @@ where
414427
} else {
415428
self.preedit = None;
416429
}
430+
flags
417431
}
418432
}
419433
}
@@ -437,7 +451,7 @@ where
437451
}
438452
}
439453

440-
fn enable_ime(&mut self, position: iced_core::Point, purpose: input_method::Purpose) {
454+
fn update_ime(&mut self, position: iced_core::Point, purpose: input_method::Purpose) {
441455
if self.ime_state != Some((position, purpose)) {
442456
self.ime_state = Some((position, purpose));
443457
}
@@ -553,29 +567,10 @@ async fn run_instance<A, E, C>(
553567
&mut clipboard,
554568
&mut messages,
555569
);
556-
if let user_interface::State::Updated {
557-
redraw_request: _, // NOTE: I do not know how to use it now
558-
input_method,
559-
} = ui_state
560-
{
561-
events.push(redraw_event.clone());
562-
custom_actions.push(LayerShellAction::Ime(input_method.clone()));
563-
im_drawer.request_input_method(
564-
state.background_color(),
565-
input_method,
566-
&renderer,
567-
);
568-
}
569-
im_drawer.draw_preedit(
570-
&mut renderer,
571-
state.text_color(),
572-
state.background_color(),
573-
state.viewport().logical_size(),
574-
);
575570

576571
runtime.broadcast(iced_futures::subscription::Event::Interaction {
577572
window: main_id,
578-
event: redraw_event,
573+
event: redraw_event.clone(),
579574
status: iced_core::event::Status::Ignored,
580575
});
581576

@@ -594,9 +589,6 @@ async fn run_instance<A, E, C>(
594589
custom_actions.push(LayerShellAction::Mouse(new_mouse_interaction));
595590
mouse_interaction = new_mouse_interaction;
596591
}
597-
// TODO: check mouse_interaction
598-
599-
debug.render_started();
600592

601593
debug.draw_started();
602594
user_interface.draw(
@@ -608,7 +600,27 @@ async fn run_instance<A, E, C>(
608600
state.cursor(),
609601
);
610602
debug.draw_finished();
603+
debug.render_started();
604+
if let user_interface::State::Updated {
605+
redraw_request: _, // NOTE: I do not know how to use it now
606+
input_method,
607+
} = ui_state
608+
{
609+
events.push(redraw_event);
611610

611+
let ime_flags = im_drawer.request_input_method(
612+
state.background_color(),
613+
input_method.clone(),
614+
&renderer,
615+
);
616+
custom_actions.push(LayerShellAction::Ime(input_method, ime_flags));
617+
}
618+
im_drawer.draw_preedit(
619+
&mut renderer,
620+
state.text_color(),
621+
state.background_color(),
622+
state.viewport().logical_size(),
623+
);
612624
match compositor.present(
613625
&mut renderer,
614626
&mut surface,

iced_layershell/src/multi_window.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -694,21 +694,7 @@ async fn run_instance<A, E, C>(
694694
&mut clipboard,
695695
&mut messages,
696696
);
697-
if let user_interface::State::Updated {
698-
redraw_request: _, // NOTE: I do not know how to use it now
699-
input_method,
700-
} = ui_state
701-
{
702-
events.push((Some(id), redraw_event.clone()));
703-
let need_update_ime = window.request_input_method(input_method.clone());
704-
custom_actions.push(LayerShellAction::ImeWithId(
705-
oid.expect("id should exist when refreshing"),
706-
input_method,
707-
need_update_ime,
708-
));
709-
}
710697

711-
window.draw_preedit();
712698
debug.draw_started();
713699
let new_mouse_interaction = ui.draw(
714700
&mut window.renderer,
@@ -748,7 +734,6 @@ async fn run_instance<A, E, C>(
748734
event: redraw_event.clone(),
749735
status: iced_core::event::Status::Ignored,
750736
});
751-
debug.render_started();
752737

753738
debug.draw_started();
754739
ui.draw(
@@ -760,6 +745,21 @@ async fn run_instance<A, E, C>(
760745
window.state.cursor(),
761746
);
762747
debug.draw_finished();
748+
if let user_interface::State::Updated {
749+
redraw_request: _, // NOTE: I do not know how to use it now
750+
input_method,
751+
} = ui_state
752+
{
753+
events.push((Some(id), redraw_event.clone()));
754+
let need_update_ime = window.request_input_method(input_method.clone());
755+
custom_actions.push(LayerShellAction::ImeWithId(
756+
oid.expect("id should exist when refreshing"),
757+
input_method,
758+
need_update_ime,
759+
));
760+
}
761+
window.draw_preedit();
762+
debug.render_started();
763763
if !is_new_window {
764764
match compositor.present(
765765
&mut window.renderer,

0 commit comments

Comments
 (0)