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 | |
parent | config/input: validate xkb keymap before storing (diff) | |
download | sway-84e4061bf40ab8749fb467e5662ea495d98036ab.tar.gz sway-84e4061bf40ab8749fb467e5662ea495d98036ab.tar.zst sway-84e4061bf40ab8749fb467e5662ea495d98036ab.zip |
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
-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) { | |||
824 | struct wlr_keyboard *keyboard = device->wlr_device->keyboard; | 824 | struct wlr_keyboard *keyboard = device->wlr_device->keyboard; |
825 | struct xkb_keymap *keymap = keyboard->keymap; | 825 | struct xkb_keymap *keymap = keyboard->keymap; |
826 | struct xkb_state *state = keyboard->xkb_state; | 826 | struct xkb_state *state = keyboard->xkb_state; |
827 | |||
828 | json_object *layouts_arr = json_object_new_array(); | ||
829 | json_object_object_add(object, "xkb_layout_names", layouts_arr); | ||
830 | |||
827 | xkb_layout_index_t num_layouts = xkb_keymap_num_layouts(keymap); | 831 | xkb_layout_index_t num_layouts = xkb_keymap_num_layouts(keymap); |
828 | xkb_layout_index_t layout_idx; | 832 | xkb_layout_index_t layout_idx; |
829 | for (layout_idx = 0; layout_idx < num_layouts; layout_idx++) { | 833 | for (layout_idx = 0; layout_idx < num_layouts; layout_idx++) { |
830 | bool is_active = | 834 | const char *layout = xkb_keymap_layout_get_name(keymap, layout_idx); |
831 | xkb_state_layout_index_is_active(state, | 835 | json_object_array_add(layouts_arr, |
832 | layout_idx, | 836 | layout ? json_object_new_string(layout) : NULL); |
833 | XKB_STATE_LAYOUT_EFFECTIVE); | 837 | |
838 | bool is_active = xkb_state_layout_index_is_active(state, | ||
839 | layout_idx, XKB_STATE_LAYOUT_EFFECTIVE); | ||
834 | if (is_active) { | 840 | if (is_active) { |
835 | const char *layout = | 841 | json_object_object_add(object, "xkb_active_layout_index", |
836 | xkb_keymap_layout_get_name(keymap, layout_idx); | 842 | json_object_new_int(layout_idx)); |
837 | json_object_object_add(object, "xkb_active_layout_name", | 843 | json_object_object_add(object, "xkb_active_layout_name", |
838 | layout ? json_object_new_string(layout) : NULL); | 844 | layout ? json_object_new_string(layout) : NULL); |
839 | break; | ||
840 | } | 845 | } |
841 | } | 846 | } |
842 | } | 847 | } |