From fb9054a18be98c3afc47a4fc47de081d19962fbd Mon Sep 17 00:00:00 2001 From: David Date: Fri, 7 Feb 2025 13:00:06 +0800 Subject: [PATCH] fix(komorebi-bar-keyboard): fix retrival of current input method Previously, current input method was retrieved via the Language::CurrentInputMethodLanguageTag() call, which is inaccurate as it is retrieving the current input method of the bar itself, so it will only be updated when the bar is in focus. The fix is getting the TID of the currently focused window and read its input method. --- Cargo.toml | 2 +- komorebi-bar/src/keyboard.rs | 113 +++++++++++++++++++++++++++++------ schema.asc.json | Bin 4093 -> 8524 bytes schema.bar.json | Bin 276166 -> 277762 bytes schema.json | Bin 85753 -> 177362 bytes 5 files changed, 97 insertions(+), 18 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b02e0cfd..22aa6d79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,10 +45,10 @@ version = "0.58" features = [ "implement", "Foundation_Numerics", - "Globalization", "Win32_System_Com", "Win32_UI_Shell_Common", # for IObjectArray "Win32_Foundation", + "Win32_Globalization", "Win32_Graphics_Dwm", "Win32_Graphics_Gdi", "Win32_Graphics_Direct2D", diff --git a/komorebi-bar/src/keyboard.rs b/komorebi-bar/src/keyboard.rs index 5364d14a..c215ddb2 100755 --- a/komorebi-bar/src/keyboard.rs +++ b/komorebi-bar/src/keyboard.rs @@ -1,6 +1,5 @@ use crate::config::LabelPrefix; use crate::render::RenderConfig; -use crate::selected_frame::SelectableFrame; use crate::widget::BarWidget; use eframe::egui::text::LayoutJob; use eframe::egui::Align; @@ -12,38 +11,126 @@ use eframe::egui::WidgetText; use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; -use windows::Globalization::Language; +use std::time::Duration; +use std::time::Instant; +use windows::Win32::Globalization::LCIDToLocaleName; +use windows::Win32::Globalization::LOCALE_ALLOW_NEUTRAL_NAMES; +use windows::Win32::System::SystemServices::LOCALE_NAME_MAX_LENGTH; +use windows::Win32::UI::Input::KeyboardAndMouse::GetKeyboardLayout; +use windows::Win32::UI::WindowsAndMessaging::GetForegroundWindow; +use windows::Win32::UI::WindowsAndMessaging::GetWindowThreadProcessId; + +const DEFAULT_DATA_REFRESH_INTERVAL: u64 = 1; +const ERROR_TEXT: &str = "Error"; #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] pub struct KeyboardConfig { /// Enable the Input widget pub enable: bool, + /// Data refresh interval (default: 1 second) + pub data_refresh_interval: Option, /// Display label prefix pub label_prefix: Option, } impl From for Keyboard { fn from(value: KeyboardConfig) -> Self { + let data_refresh_interval = value.data_refresh_interval.unwrap_or(DEFAULT_DATA_REFRESH_INTERVAL); Self { enable: value.enable, + data_refresh_interval, label_prefix: value.label_prefix.unwrap_or(LabelPrefix::IconAndText), + last_updated: Instant::now(), + lang_name: get_lang(), } } } pub struct Keyboard { pub enable: bool, - pub label_prefix: LabelPrefix, + data_refresh_interval: u64, + label_prefix: LabelPrefix, + last_updated: Instant, + lang_name: String, +} + +/// Retrieves the name of the active keyboard layout for the current foreground window. +/// +/// This function determines the active keyboard layout by querying the system for the +/// foreground window's thread ID and its associated keyboard layout. It then attempts +/// to retrieve the locale name corresponding to the keyboard layout. +/// +/// # Failure Cases +/// +/// This function can fail in two distinct scenarios: +/// +/// 1. **Failure to Retrieve the Locale Name**: +/// If the system fails to retrieve the locale name (e.g., due to an invalid or unsupported +/// language identifier), the function will return `Err(())`. +/// +/// 2. **Invalid UTF-16 Characters in the Locale Name**: +/// If the retrieved locale name contains invalid UTF-16 sequences, the conversion to a Rust +/// `String` will fail, and the function will return `Err(())`. +/// +/// # Returns +/// +/// - `Ok(String)`: The name of the active keyboard layout as a valid UTF-8 string. +/// - `Err(())`: Indicates that the function failed to retrieve the locale name or encountered +/// invalid UTF-16 characters during conversion. +fn get_active_keyboard_layout() -> Result { + let foreground_window_tid = unsafe { GetWindowThreadProcessId(GetForegroundWindow(), None) }; + let lcid = unsafe { GetKeyboardLayout(foreground_window_tid) }; + + // Extract the low word (language identifier) from the keyboard layout handle. + let lang_id = (lcid.0 as u32) & 0xFFFF; + let mut locale_name_buffer = [0; LOCALE_NAME_MAX_LENGTH as usize]; + let char_count = unsafe { + LCIDToLocaleName( + lang_id, + Some(&mut locale_name_buffer), + LOCALE_ALLOW_NEUTRAL_NAMES, + ) + }; + + match char_count { + 0 => Err(()), + _ => String::from_utf16(&locale_name_buffer[..char_count as usize]).map_err(|_| ()), + } +} + +/// Retrieves the name of the active keyboard layout or a fallback error message. +/// +/// # Behavior +/// +/// - **Success Case**: +/// If [`get_active_keyboard_layout`] succeeds, this function returns the retrieved keyboard +/// layout name as a `String`. +/// +/// - **Failure Case**: +/// If [`get_active_keyboard_layout`] fails, this function returns the value of `ERROR_TEXT` +/// as a fallback message. This ensures that the function always returns a valid `String`, +/// even in error scenarios. +/// +/// # Returns +/// +/// A `String` representing either: +/// - The name of the active keyboard layout, or +/// - The fallback error message (`ERROR_TEXT`) if the layout name cannot be retrieved. +fn get_lang() -> String { + get_active_keyboard_layout().unwrap_or_else(|_| ERROR_TEXT.to_string()) } impl Keyboard { fn output(&mut self) -> String { - let lang = Language::CurrentInputMethodLanguageTag() - .map(|lang| lang.to_string()) - .unwrap_or_else(|_| "error".to_string()); + let now = Instant::now(); + if now.duration_since(self.last_updated) > Duration::from_secs(self.data_refresh_interval) { + self.last_updated = now; + self.lang_name = get_lang(); + } + match self.label_prefix { - LabelPrefix::Text | LabelPrefix::IconAndText => format!("KB: {}", lang), - LabelPrefix::None | LabelPrefix::Icon => lang, + LabelPrefix::Text | LabelPrefix::IconAndText => format!("KB: {}", self.lang_name), + LabelPrefix::None | LabelPrefix::Icon => self.lang_name.clone(), } } } @@ -77,15 +164,7 @@ impl BarWidget for Keyboard { ); config.apply_on_widget(false, ui, |ui| { - if SelectableFrame::new(false) - .show(ui, |ui| { - ui.add( - Label::new(WidgetText::LayoutJob(layout_job.clone())) - .selectable(false), - ) - }) - .clicked() - {} + ui.add(Label::new(WidgetText::LayoutJob(layout_job.clone())).selectable(false)) }); } } diff --git a/schema.asc.json b/schema.asc.json index d39fec394f51a43224fe339e2ac2f386f1270582..5aedbe2eb27e4218daffe60c22d23e9aaddf26ca 100644 GIT binary patch literal 8524 zcmeHM+iuf95S?cv{=qUla(hGK4NApD(4vC42vxxlH!;wrBrZ@8zYd%;%hbD@wd0fo z@eo;Uob`I{b7pq(>*sg5C>JEdmCI$B$vYWKDTh+v`z>7^OO5Lo->&0&k3ADPlB>bq zYgn7g2+xQ3EaU)hT$LMg6DvN=OQ3qi<5)|Dogcx`xZMV)W2{t=q`_d(ei~n8_}9KZTr)H_T5z0t*h6Z_FhvWt!&$=v_ie zYEF4ea8AANG_57H=nU^oRm)LeQSNqckoE~8%F%p%=6&1Yc5Ta7aQ3|yKHq{}3fP4n zXd)=w^Gq%6qN#1q6OF1dsF*#C#(uEkTiHq2&u{IPqm`KpwAS%ioVoqEG@j4!Y^+jd z>X}+Sa;P>gVbd{U@(Vr-*p>fN`I2GxO!sovP-AMCv|J8up-0Hm!1SoZ>2A?Jla0GBf5QuK6f6diyO|;NBpaebr1q-}W)8QQ#DD==aX+h`y%p zUtAk`dgD3t5Yc4aSexYBTSAu_h~`ce>G{AWuGSw{j3YOd7{GTt=Q8&P!3ljGvE@&> z`gi$^Ib;hXj`Vn5^-ly=TCvtT;kP5 z^H$EKc~)ko{oRb(@8?rlmupS<1T3ob&L$3NpK(5wo~6=ixqQHL_T%&Ou++@%JkwOi zKOK4Iy?A2K&qwL1=vB<>>T1)zj-!Wqwnc8Pr)+;lIrtNy>;Ouf-#CL^q)ERF zHhZ^ci|zQkQ!eL3?8+MXQx-8^ZI-d;eWZuL6B_tbob_xpu`__e-Y2hOKGwGI7l`p>WK2frr7cAJln`OImH zlQ`nTsy2^}Ik2S9Z<~)4a|%5}rRooL%`t~z1>)(r{oI@DyqJEjvCE>YizX{kpPlX( z^&0$Hy}BgWQ*BDjwcGjLMK{b}J9qSCzpeFfv9#e^^qbRk**6oNZ## I-MRn20V%5@hyVZp literal 4093 zcmdT{OK;mS48HeQ2;PqCvfF^(vewuGeW5AV4MX8-Hf^huC0CN0dPV;GD9H~cX}WCK zVacTpB~l+hQsS4#Jwl?FIxV51(E*7{W9oy+qF2_> zFvG!mP3xMolo}?*tcH~3EIpJWXGNo&vD@C(Znyk?3#suonq|zoQGTvu4azXk81WIq zTVM)u8~?>5gPaMsQ%|Nk4Gz3$IOsDq^C_U;!eI*>#(06-#|(r)prD3jn^6Z*8^uK7 zAUYr*nhN)QbFiExet=;a9S=FxIy785ZY&i4iO#7hqwedq`|E(B?-Tiim@?3*Vzp%n z&5_HOn35WjfdN%90i=|3LIt5?9SGB;q$1;x4X}pvf(p1~>UHj&J?9eZheY%h>2i4* zk|Y%sv;d;J9w2ijGC9|TYSM@5Z38HGP{;eoud`C6XuGr#*%A%sJ&$(R^~f==iChd;2&rrX`{s0kNwkRyzk7{}rEL0o{MTu7+JeF+ z+BR>0uiCH|HJO(zEwLZ(0XrAS&DAW4za+=gukl5EbVK3?10sWrT)BoJGt**4mI}KI z9pc-6Tc&cUQudvP76d#{r``hwN*Jx}F-!<{)`1CS4d-o|myi87~ zC-LEj>FN9UhQK{O=0pm@X(Q5d_n6aM&XeHv-nNI>GrUoSFEPd?MiR%N8=#bTYzb+{ zpC8)c;AX!q_ASY8rg^ckVU9EZPJWKvFf_u*A>e zf6-W|I9SDg;!`erx>_QYf8O0;HHRIW^WDVvlm8iEHVDme97a^MXI7?;V|+;=Y%O9( z2@=STrBEyKbd)LGf6Kb^V|K+%`Ml6wRe}oc8s^9Sm`=n-4T;ag4;<1x)~$003=8zOr#$i(YkQ|Ghx2@ zCWhAN}&9Sep-6pL)lhChZ4 sWn#(u0t$Et9gigFQ)$qDHDtHq&fBo&&^-~YJ9)USu7sAj#ol7?7xo$$0{{R3 diff --git a/schema.bar.json b/schema.bar.json index b80925342bdb98fd9e023ce2c97c9a7037f23be8..8440827e19ffb13024d6f2b4019ea600d0f18522 100644 GIT binary patch delta 136 zcmX^1R-oyZzy`g5$#LQbcoi6m8B!UN8S)wO7*Zw+Y8g*Vuyd#L?$aaTzrm9H@uFnJJZ7~41I~mmg diff --git a/schema.json b/schema.json index 54ee1d81ff4826b80822d64bd35f8f03005624c7..6d6678e4c46055065506879f6b7fd94f21938f00 100644 GIT binary patch literal 177362 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 literal 85753 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 V_f;d&x~E@VEy7>_{LMdq^S_S{#0mfa