diff options
author | Simon Ser <contact@emersion.fr> | 2019-06-09 20:29:57 +0300 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2019-06-09 15:04:50 -0400 |
commit | 84e4061bf40ab8749fb467e5662ea495d98036ab (patch) | |
tree | 853371764fbf33eff67bcb0a97bccbceb7334aa2 /sway | |
parent | 5b1a8d62b9c8fa7c25b70e01910abd761fae9855 (diff) |
ipc: add xkb_layout_names and xkb_active_layout_index
These can be useful to implement per-window layouts as a script.
See https://github.com/swaywm/sway/issues/2361
Diffstat (limited to 'sway')
-rw-r--r-- | sway/ipc-json.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/sway/ipc-json.c b/sway/ipc-json.c index b9abc47f..7a65be07 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -824,19 +824,24 @@ json_object *ipc_json_describe_input(struct sway_input_device *device) { struct wlr_keyboard *keyboard = device->wlr_device->keyboard; struct xkb_keymap *keymap = keyboard->keymap; struct xkb_state *state = keyboard->xkb_state; + + json_object *layouts_arr = json_object_new_array(); + json_object_object_add(object, "xkb_layout_names", layouts_arr); + 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); + const char *layout = xkb_keymap_layout_get_name(keymap, layout_idx); + json_object_array_add(layouts_arr, + layout ? json_object_new_string(layout) : NULL); + + 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_index", + json_object_new_int(layout_idx)); json_object_object_add(object, "xkb_active_layout_name", - layout ? json_object_new_string(layout) : NULL); - break; + layout ? json_object_new_string(layout) : NULL); } } } |