+static void dump_event_state_mask(yajl_gen gen, Binding *bind) {
+ y(array_open);
+ for (int i = 0; i < 20; i++) {
+ if (bind->event_state_mask & (1 << i)) {
+ switch (1 << i) {
+ case XCB_KEY_BUT_MASK_SHIFT:
+ ystr("shift");
+ break;
+ case XCB_KEY_BUT_MASK_LOCK:
+ ystr("lock");
+ break;
+ case XCB_KEY_BUT_MASK_CONTROL:
+ ystr("ctrl");
+ break;
+ case XCB_KEY_BUT_MASK_MOD_1:
+ ystr("Mod1");
+ break;
+ case XCB_KEY_BUT_MASK_MOD_2:
+ ystr("Mod2");
+ break;
+ case XCB_KEY_BUT_MASK_MOD_3:
+ ystr("Mod3");
+ break;
+ case XCB_KEY_BUT_MASK_MOD_4:
+ ystr("Mod4");
+ break;
+ case XCB_KEY_BUT_MASK_MOD_5:
+ ystr("Mod5");
+ break;
+ case XCB_KEY_BUT_MASK_BUTTON_1:
+ ystr("Button1");
+ break;
+ case XCB_KEY_BUT_MASK_BUTTON_2:
+ ystr("Button2");
+ break;
+ case XCB_KEY_BUT_MASK_BUTTON_3:
+ ystr("Button3");
+ break;
+ case XCB_KEY_BUT_MASK_BUTTON_4:
+ ystr("Button4");
+ break;
+ case XCB_KEY_BUT_MASK_BUTTON_5:
+ ystr("Button5");
+ break;
+ case (I3_XKB_GROUP_MASK_1 << 16):
+ ystr("Group1");
+ break;
+ case (I3_XKB_GROUP_MASK_2 << 16):
+ ystr("Group2");
+ break;
+ case (I3_XKB_GROUP_MASK_3 << 16):
+ ystr("Group3");
+ break;
+ case (I3_XKB_GROUP_MASK_4 << 16):
+ ystr("Group4");
+ break;
+ }
+ }
+ }
+ y(array_close);
+}
+
+static void dump_binding(yajl_gen gen, Binding *bind) {
+ y(map_open);
+ ystr("input_code");
+ y(integer, bind->keycode);
+
+ ystr("input_type");
+ ystr((const char *)(bind->input_type == B_KEYBOARD ? "keyboard" : "mouse"));
+
+ ystr("symbol");
+ if (bind->symbol == NULL)
+ y(null);
+ else
+ ystr(bind->symbol);
+
+ ystr("command");
+ ystr(bind->command);
+
+ // This key is only provided for compatibility, new programs should use
+ // event_state_mask instead.
+ ystr("mods");
+ dump_event_state_mask(gen, bind);
+
+ ystr("event_state_mask");
+ dump_event_state_mask(gen, bind);
+
+ y(map_close);
+}
+