@@ -45,10 +45,11 @@ fn requested_gtk_im_module() -> Option<String> {
4545 . ok ( )
4646 . and_then ( |value| normalize_im_module ( value. trim ( ) ) )
4747 . or_else ( || {
48- env:: var ( "XMODIFIERS" )
49- . ok ( )
50- . and_then ( |value| value. split ( "@im=" ) . nth ( 1 ) )
51- . and_then ( normalize_im_module)
48+ env:: var ( "XMODIFIERS" ) . ok ( ) . and_then ( |value| {
49+ value
50+ . split_once ( "@im=" )
51+ . and_then ( |( _, module) | normalize_im_module ( module) )
52+ } )
5253 } )
5354}
5455
@@ -110,13 +111,17 @@ mod tests {
110111
111112 struct EnvRestore {
112113 gtk_im_module_file : Option < std:: ffi:: OsString > ,
114+ gtk_im_module : Option < std:: ffi:: OsString > ,
115+ xmodifiers : Option < std:: ffi:: OsString > ,
113116 appdir : Option < std:: ffi:: OsString > ,
114117 }
115118
116119 impl EnvRestore {
117120 fn capture ( ) -> Self {
118121 Self {
119122 gtk_im_module_file : env:: var_os ( "GTK_IM_MODULE_FILE" ) ,
123+ gtk_im_module : env:: var_os ( "GTK_IM_MODULE" ) ,
124+ xmodifiers : env:: var_os ( "XMODIFIERS" ) ,
120125 appdir : env:: var_os ( "APPDIR" ) ,
121126 }
122127 }
@@ -129,6 +134,14 @@ mod tests {
129134 Some ( value) => env:: set_var ( "GTK_IM_MODULE_FILE" , value) ,
130135 None => env:: remove_var ( "GTK_IM_MODULE_FILE" ) ,
131136 }
137+ match & self . gtk_im_module {
138+ Some ( value) => env:: set_var ( "GTK_IM_MODULE" , value) ,
139+ None => env:: remove_var ( "GTK_IM_MODULE" ) ,
140+ }
141+ match & self . xmodifiers {
142+ Some ( value) => env:: set_var ( "XMODIFIERS" , value) ,
143+ None => env:: remove_var ( "XMODIFIERS" ) ,
144+ }
132145 match & self . appdir {
133146 Some ( value) => env:: set_var ( "APPDIR" , value) ,
134147 None => env:: remove_var ( "APPDIR" ) ,
@@ -170,9 +183,7 @@ mod tests {
170183 let _lock = ENV_LOCK . lock ( ) . unwrap ( ) ;
171184 let _restore = EnvRestore :: capture ( ) ;
172185 let dir = tempfile:: tempdir ( ) . unwrap ( ) ;
173- let cache_path = dir
174- . path ( )
175- . join ( "usr/lib/gtk-3.0/3.0.0/immodules.cache" ) ;
186+ let cache_path = dir. path ( ) . join ( "usr/lib/gtk-3.0/3.0.0/immodules.cache" ) ;
176187 fs:: create_dir_all ( cache_path. parent ( ) . unwrap ( ) ) . unwrap ( ) ;
177188 fs:: write ( & cache_path, "\" xim\" \n " ) . unwrap ( ) ;
178189
@@ -192,6 +203,19 @@ mod tests {
192203 assert_eq ! ( normalize_im_module( " " ) , None ) ;
193204 }
194205
206+ #[ test]
207+ fn requested_im_module_falls_back_to_xmodifiers ( ) {
208+ let _lock = ENV_LOCK . lock ( ) . unwrap ( ) ;
209+ let _restore = EnvRestore :: capture ( ) ;
210+
211+ unsafe {
212+ env:: remove_var ( "GTK_IM_MODULE" ) ;
213+ env:: set_var ( "XMODIFIERS" , "@im=fcitx5" ) ;
214+ }
215+
216+ assert_eq ! ( requested_gtk_im_module( ) , Some ( "fcitx" . to_string( ) ) ) ;
217+ }
218+
195219 #[ test]
196220 fn active_cache_supports_requested_module ( ) {
197221 let _lock = ENV_LOCK . lock ( ) . unwrap ( ) ;
0 commit comments