@@ -1676,10 +1676,11 @@ fn extract_focus_layer(actions: &FocusActions) -> Option<String> {
16761676 } )
16771677}
16781678
1679- fn update_status_for_focus (
1679+ async fn update_status_for_focus (
16801680 handler : & Arc < Mutex < FocusHandler > > ,
16811681 status_broadcaster : & StatusBroadcaster ,
16821682 win : & WindowInfo ,
1683+ kanata : & KanataClient ,
16831684 default_layer : & str ,
16841685) -> Option < FocusActions > {
16851686 let ( actions, virtual_keys, focus_layer) = {
@@ -1694,23 +1695,26 @@ fn update_status_for_focus(
16941695
16951696 status_broadcaster. update_virtual_keys ( virtual_keys) ;
16961697 if let Some ( layer) = focus_layer {
1697- status_broadcaster. update_focus_layer ( layer) ;
1698+ if let Some ( resolved_layer) = kanata. resolve_layer_name ( & layer, false ) . await {
1699+ status_broadcaster. update_focus_layer ( resolved_layer) ;
1700+ }
16981701 }
16991702
17001703 actions
17011704}
17021705
1703- fn handle_focus_event (
1706+ async fn handle_focus_event (
17041707 handler : & Arc < Mutex < FocusHandler > > ,
17051708 status_broadcaster : & StatusBroadcaster ,
17061709 pause_broadcaster : & PauseBroadcaster ,
17071710 win : & WindowInfo ,
1711+ kanata : & KanataClient ,
17081712 default_layer : & str ,
17091713) -> Option < FocusActions > {
17101714 if pause_broadcaster. is_paused ( ) {
17111715 return None ;
17121716 }
1713- update_status_for_focus ( handler, status_broadcaster, win, default_layer)
1717+ update_status_for_focus ( handler, status_broadcaster, win, kanata , default_layer) . await
17141718}
17151719
17161720fn native_terminal_window ( ) -> WindowInfo {
@@ -2001,8 +2005,11 @@ async fn apply_focus_for_env(
20012005 status_broadcaster,
20022006 pause_broadcaster,
20032007 & win,
2008+ kanata,
20042009 & default_layer,
2005- ) {
2010+ )
2011+ . await
2012+ {
20062013 execute_focus_actions ( kanata, actions) . await ;
20072014 }
20082015 Ok ( ( ) )
@@ -2037,8 +2044,11 @@ async fn apply_session_focus(
20372044 status_broadcaster,
20382045 pause_broadcaster,
20392046 & win,
2047+ kanata,
20402048 & default_layer,
2041- ) {
2049+ )
2050+ . await
2051+ {
20422052 execute_focus_actions ( kanata, actions) . await ;
20432053 }
20442054
@@ -2537,6 +2547,33 @@ impl KanataClient {
25372547 }
25382548 }
25392549
2550+ fn resolve_layer_name_from_inner (
2551+ inner : & KanataClientInner ,
2552+ layer_name : & str ,
2553+ warn_unknown : bool ,
2554+ ) -> Option < String > {
2555+ if !inner. known_layers . is_empty ( )
2556+ && !inner. known_layers . iter ( ) . any ( |layer| layer == layer_name)
2557+ {
2558+ if warn_unknown && !inner. quiet {
2559+ eprintln ! (
2560+ "[Kanata] Warning: Unknown layer \" {}\" , switching to default instead" ,
2561+ layer_name
2562+ ) ;
2563+ }
2564+ return inner
2565+ . config_default_layer
2566+ . clone ( )
2567+ . or_else ( || inner. auto_default_layer . clone ( ) ) ;
2568+ }
2569+ Some ( layer_name. to_string ( ) )
2570+ }
2571+
2572+ async fn resolve_layer_name ( & self , layer_name : & str , warn_unknown : bool ) -> Option < String > {
2573+ let inner = self . inner . lock ( ) . await ;
2574+ Self :: resolve_layer_name_from_inner ( & inner, layer_name, warn_unknown)
2575+ }
2576+
25402577 pub async fn connect_with_retry ( & self ) {
25412578 let delays = [ 0 , 1000 , 2000 , 5000 ] ;
25422579 let mut attempt = 0 ;
@@ -2744,28 +2781,11 @@ impl KanataClient {
27442781 pub async fn change_layer ( & self , layer_name : & str ) -> bool {
27452782 let mut inner = self . inner . lock ( ) . await ;
27462783
2747- // Validate layer exists if we have known layers
2748- let target_layer = if !inner. known_layers . is_empty ( )
2749- && !inner. known_layers . iter ( ) . any ( |l| l == layer_name)
2750- {
2751- // Unknown layer - warn and fall back to default
2752- if !inner. quiet {
2753- eprintln ! (
2754- "[Kanata] Warning: Unknown layer \" {}\" , switching to default instead" ,
2755- layer_name
2756- ) ;
2757- }
2758- let default = inner
2759- . config_default_layer
2760- . clone ( )
2761- . or_else ( || inner. auto_default_layer . clone ( ) ) ;
2762- match default {
2763- Some ( d) => d,
2784+ let target_layer =
2785+ match Self :: resolve_layer_name_from_inner ( & inner, layer_name, true ) {
2786+ Some ( layer) => layer,
27642787 None => return false ,
2765- }
2766- } else {
2767- layer_name. to_string ( )
2768- } ;
2788+ } ;
27692789
27702790 let current = inner. current_layer . clone ( ) ;
27712791 if current. as_deref ( ) == Some ( & target_layer) {
@@ -3303,8 +3323,11 @@ async fn run_wayland(
33033323 & status_broadcaster,
33043324 & pause_broadcaster,
33053325 & win,
3326+ & kanata,
33063327 & default_layer,
3307- ) {
3328+ )
3329+ . await
3330+ {
33083331 execute_focus_actions ( & kanata, actions) . await ;
33093332 }
33103333 continue ;
@@ -3344,8 +3367,11 @@ async fn run_wayland(
33443367 & status_broadcaster,
33453368 & pause_broadcaster,
33463369 & win,
3370+ & kanata,
33473371 & default_layer,
3348- ) {
3372+ )
3373+ . await
3374+ {
33493375 execute_focus_actions ( & kanata, actions) . await ;
33503376 }
33513377 }
@@ -3533,8 +3559,11 @@ async fn run_x11(
35333559 & status_broadcaster,
35343560 & pause_broadcaster,
35353561 & win,
3562+ & kanata,
35363563 & default_layer,
3537- ) {
3564+ )
3565+ . await
3566+ {
35383567 execute_focus_actions ( & kanata, actions) . await ;
35393568 }
35403569 }
@@ -4276,12 +4305,16 @@ impl DbusWindowFocusService {
42764305 . block_on ( async { self . kanata . default_layer ( ) . await } )
42774306 . unwrap_or_default ( ) ;
42784307
4279- let actions = update_status_for_focus (
4280- & self . handler ,
4281- & self . status_broadcaster ,
4282- & win,
4283- & default_layer,
4284- ) ;
4308+ let actions = self . runtime_handle . block_on ( async {
4309+ update_status_for_focus (
4310+ & self . handler ,
4311+ & self . status_broadcaster ,
4312+ & win,
4313+ & self . kanata ,
4314+ & default_layer,
4315+ )
4316+ . await
4317+ } ) ;
42854318
42864319 if let Some ( actions) = actions {
42874320 let kanata = self . kanata . clone ( ) ;
0 commit comments