@@ -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
1414use super :: { Appearance , DefaultStyle } ;
15+ use enumflags2:: { BitFlag , BitFlags } ;
1516use iced_graphics:: { Compositor , compositor} ;
1617use 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,
0 commit comments