aboutsummaryrefslogtreecommitdiff
path: root/src/ipc/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipc/server.rs')
-rw-r--r--src/ipc/server.rs20
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)