linux: Add keyboard_layout
and on_keyboard_layout_change
support (#22736)
No issue, as the functionality is currently not being used in Zed. This is more of a GPUI improvement. Currently, `keyboard_layout` and `on_keyboard_layout_change` are already handled on macOS. This PR implements the same for X11 and Wayland. Linux supports up to 4 keyboard layout groups (e.g., Group 0: English US, Group 1: Bulgarian, etc). On X11 and Wayland, `event` provides a new active group, which maps to the `layout_index`. We already store keymap state from where we can get the current `layout_index`. By comparing them, we determine if the layout has changed. X11: <img src="https://github.com/user-attachments/assets/b528db77-1ff2-4f17-aac5-7654837edeb9" alt="x11" width="300px" /> Wayland: <img src="https://github.com/user-attachments/assets/2b4e2a30-b0f4-495c-96bb-7bca41365d56" alt="wayland" width="300px" /> Release Notes: - N/A
This commit is contained in:
parent
76d18f3cd2
commit
d2d1779e0d
4 changed files with 65 additions and 4 deletions
|
@ -46,6 +46,7 @@ const FILE_PICKER_PORTAL_MISSING: &str =
|
|||
pub trait LinuxClient {
|
||||
fn compositor_name(&self) -> &'static str;
|
||||
fn with_common<R>(&self, f: impl FnOnce(&mut LinuxCommon) -> R) -> R;
|
||||
fn keyboard_layout(&self) -> String;
|
||||
fn displays(&self) -> Vec<Rc<dyn PlatformDisplay>>;
|
||||
#[allow(unused)]
|
||||
fn display(&self, id: DisplayId) -> Option<Rc<dyn PlatformDisplay>>;
|
||||
|
@ -76,6 +77,7 @@ pub(crate) struct PlatformHandlers {
|
|||
pub(crate) app_menu_action: Option<Box<dyn FnMut(&dyn Action)>>,
|
||||
pub(crate) will_open_app_menu: Option<Box<dyn FnMut()>>,
|
||||
pub(crate) validate_app_menu_command: Option<Box<dyn FnMut(&dyn Action) -> bool>>,
|
||||
pub(crate) keyboard_layout_change: Option<Box<dyn FnMut()>>,
|
||||
}
|
||||
|
||||
pub(crate) struct LinuxCommon {
|
||||
|
@ -133,11 +135,11 @@ impl<P: LinuxClient + 'static> Platform for P {
|
|||
}
|
||||
|
||||
fn keyboard_layout(&self) -> String {
|
||||
"unknown".into()
|
||||
self.keyboard_layout()
|
||||
}
|
||||
|
||||
fn on_keyboard_layout_change(&self, _callback: Box<dyn FnMut()>) {
|
||||
// todo(linux)
|
||||
fn on_keyboard_layout_change(&self, callback: Box<dyn FnMut()>) {
|
||||
self.with_common(|common| common.callbacks.keyboard_layout_change = Some(callback));
|
||||
}
|
||||
|
||||
fn run(&self, on_finish_launching: Box<dyn FnOnce()>) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue