diff options
Diffstat (limited to 'src/ipc/server.rs')
| -rw-r--r-- | src/ipc/server.rs | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/ipc/server.rs b/src/ipc/server.rs index d05131a3..5b614a83 100644 --- a/src/ipc/server.rs +++ b/src/ipc/server.rs @@ -8,8 +8,9 @@ use calloop::io::Async; use directories::BaseDirs; use futures_util::io::{AsyncReadExt, BufReader}; use futures_util::{AsyncBufReadExt, AsyncWriteExt}; -use niri_ipc::{OutputConfigChanged, Reply, Request, Response}; +use niri_ipc::{KeyboardLayouts, OutputConfigChanged, Reply, Request, Response}; use smithay::desktop::Window; +use smithay::input::keyboard::XkbContextHandler; use smithay::reexports::calloop::generic::Generic; use smithay::reexports::calloop::{Interest, LoopHandle, Mode, PostAction}; use smithay::reexports::rustix::fs::unlink; @@ -235,6 +236,23 @@ async fn process(ctx: &ClientCtx, request: Request) -> Reply { let output = result.map_err(|_| String::from("error getting active output info"))?; Response::FocusedOutput(output) } + Request::KeyboardLayouts => { + let (tx, rx) = async_channel::bounded(1); + ctx.event_loop.insert_idle(move |state| { + let keyboard = state.niri.seat.get_keyboard().unwrap(); + let layout = keyboard.with_xkb_state(state, |context| { + let layouts = context.keymap().layouts(); + KeyboardLayouts { + names: layouts.map(str::to_owned).collect(), + current_idx: context.active_layout().0 as u8, + } + }); + let _ = tx.send_blocking(layout); + }); + let result = rx.recv().await; + let layout = result.map_err(|_| String::from("error getting layout info"))?; + Response::KeyboardLayouts(layout) + } }; Ok(response) |
