aboutsummaryrefslogtreecommitdiffstats
path: root/sway/ipc-json.c
diff options
context:
space:
mode:
authorLibravatar Simon Ser <contact@emersion.fr>2019-06-09 20:29:57 +0300
committerLibravatar Drew DeVault <sir@cmpwn.com>2019-06-09 15:04:50 -0400
commit84e4061bf40ab8749fb467e5662ea495d98036ab (patch)
tree853371764fbf33eff67bcb0a97bccbceb7334aa2 /sway/ipc-json.c
parentconfig/input: validate xkb keymap before storing (diff)
downloadsway-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
Diffstat (limited to 'sway/ipc-json.c')
-rw-r--r--sway/ipc-json.c21
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 }