From d8ad429e3974690ed7b48e5ad1d5af6dc7f2aebe Mon Sep 17 00:00:00 2001 From: Harish Krupo Date: Mon, 12 Nov 2018 14:33:16 +0530 Subject: [PATCH] IPC: Send keyboard layout info in IPC_GET_INPUTS Signed-off-by: Harish Krupo --- sway/ipc-json.c | 22 ++++++++++++++++++++++ swaymsg/main.c | 11 +++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 4583558c..4d9a87d8 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -12,6 +12,7 @@ #include "sway/input/seat.h" #include #include +#include #include "wlr-layer-shell-unstable-v1-protocol.h" static const char *ipc_json_layout_description(enum sway_container_layout l) { @@ -503,6 +504,27 @@ json_object *ipc_json_describe_input(struct sway_input_device *device) { json_object_object_add(object, "type", json_object_new_string(describe_device_type(device))); + if (device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) { + struct wlr_keyboard *keyboard = device->wlr_device->keyboard; + struct xkb_keymap *keymap = keyboard->keymap; + struct xkb_state *state = keyboard->xkb_state; + xkb_layout_index_t num_layouts = xkb_keymap_num_layouts(keymap); + xkb_layout_index_t layout_idx; + for (layout_idx = 0; layout_idx < num_layouts; layout_idx++) { + bool is_active = + xkb_state_layout_index_is_active(state, + layout_idx, + XKB_STATE_LAYOUT_EFFECTIVE); + if (is_active) { + const char *layout = + xkb_keymap_layout_get_name(keymap, layout_idx); + json_object_object_add(object, "xkb_active_layout_name", + json_object_new_string(layout)); + break; + } + } + } + return object; } diff --git a/swaymsg/main.c b/swaymsg/main.c index 663518f6..243b5fdc 100644 --- a/swaymsg/main.c +++ b/swaymsg/main.c @@ -111,7 +111,7 @@ static const char *pretty_type_name(const char *name) { } static void pretty_print_input(json_object *i) { - json_object *id, *name, *type, *product, *vendor; + json_object *id, *name, *type, *product, *vendor, *kbdlayout; json_object_object_get_ex(i, "identifier", &id); json_object_object_get_ex(i, "name", &name); json_object_object_get_ex(i, "type", &type); @@ -123,7 +123,7 @@ static void pretty_print_input(json_object *i) { " Type: %s\n" " Identifier: %s\n" " Product ID: %d\n" - " Vendor ID: %d\n\n"; + " Vendor ID: %d\n"; printf(fmt, json_object_get_string(name), @@ -131,6 +131,13 @@ static void pretty_print_input(json_object *i) { json_object_get_string(id), json_object_get_int(product), json_object_get_int(vendor)); + + if (json_object_object_get_ex(i, "xkb_active_layout_name", &kbdlayout)) { + printf(" Active Keyboard Layout: %s\n", + json_object_get_string(kbdlayout)); + } + + printf("\n"); } static void pretty_print_seat(json_object *i) {