diff options
-rw-r--r-- | include/ipc.h | 3 | ||||
-rw-r--r-- | include/sway/config.h | 1 | ||||
-rw-r--r-- | include/sway/ipc-server.h | 1 | ||||
-rw-r--r-- | include/swaybar/config.h | 1 | ||||
-rw-r--r-- | sway/config/bar.c | 2 | ||||
-rw-r--r-- | sway/input/keyboard.c | 28 | ||||
-rw-r--r-- | sway/ipc-server.c | 18 | ||||
-rw-r--r-- | swaybar/ipc.c | 19 |
8 files changed, 66 insertions, 7 deletions
diff --git a/include/ipc.h b/include/ipc.h index a3f60e19..9063b933 100644 --- a/include/ipc.h +++ b/include/ipc.h | |||
@@ -30,6 +30,9 @@ enum ipc_command_type { | |||
30 | IPC_EVENT_BINDING = ((1<<31) | 5), | 30 | IPC_EVENT_BINDING = ((1<<31) | 5), |
31 | IPC_EVENT_SHUTDOWN = ((1<<31) | 6), | 31 | IPC_EVENT_SHUTDOWN = ((1<<31) | 6), |
32 | IPC_EVENT_TICK = ((1<<31) | 7), | 32 | IPC_EVENT_TICK = ((1<<31) | 7), |
33 | |||
34 | // sway-specific event types | ||
35 | IPC_EVENT_BAR_STATE_UPDATE = ((1<<31) | 20), | ||
33 | }; | 36 | }; |
34 | 37 | ||
35 | #endif | 38 | #endif |
diff --git a/include/sway/config.h b/include/sway/config.h index f21ecbb1..be5a00b5 100644 --- a/include/sway/config.h +++ b/include/sway/config.h | |||
@@ -191,6 +191,7 @@ struct bar_config { | |||
191 | * In "show" mode, it will always be shown on top of the active workspace. | 191 | * In "show" mode, it will always be shown on top of the active workspace. |
192 | */ | 192 | */ |
193 | char *hidden_state; | 193 | char *hidden_state; |
194 | bool visible_by_modifier; // only relevant in "hide" mode | ||
194 | /** | 195 | /** |
195 | * Id name used to identify the bar through IPC. | 196 | * Id name used to identify the bar through IPC. |
196 | * | 197 | * |
diff --git a/include/sway/ipc-server.h b/include/sway/ipc-server.h index 80180ec4..3c43f74d 100644 --- a/include/sway/ipc-server.h +++ b/include/sway/ipc-server.h | |||
@@ -15,6 +15,7 @@ void ipc_event_workspace(struct sway_workspace *old, | |||
15 | struct sway_workspace *new, const char *change); | 15 | struct sway_workspace *new, const char *change); |
16 | void ipc_event_window(struct sway_container *window, const char *change); | 16 | void ipc_event_window(struct sway_container *window, const char *change); |
17 | void ipc_event_barconfig_update(struct bar_config *bar); | 17 | void ipc_event_barconfig_update(struct bar_config *bar); |
18 | void ipc_event_bar_state_update(struct bar_config *bar); | ||
18 | void ipc_event_mode(const char *mode, bool pango); | 19 | void ipc_event_mode(const char *mode, bool pango); |
19 | void ipc_event_shutdown(const char *reason); | 20 | void ipc_event_shutdown(const char *reason); |
20 | void ipc_event_binding(struct sway_binding *binding); | 21 | void ipc_event_binding(struct sway_binding *binding); |
diff --git a/include/swaybar/config.h b/include/swaybar/config.h index 10904bca..5d40790a 100644 --- a/include/swaybar/config.h +++ b/include/swaybar/config.h | |||
@@ -32,6 +32,7 @@ struct swaybar_config { | |||
32 | char *sep_symbol; | 32 | char *sep_symbol; |
33 | char *mode; | 33 | char *mode; |
34 | char *hidden_state; | 34 | char *hidden_state; |
35 | char *modifier; | ||
35 | bool strip_workspace_numbers; | 36 | bool strip_workspace_numbers; |
36 | bool binding_mode_indicator; | 37 | bool binding_mode_indicator; |
37 | bool wrap_scroll; | 38 | bool wrap_scroll; |
diff --git a/sway/config/bar.c b/sway/config/bar.c index 5726e95b..8b88642e 100644 --- a/sway/config/bar.c +++ b/sway/config/bar.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include "stringop.h" | 16 | #include "stringop.h" |
17 | #include "list.h" | 17 | #include "list.h" |
18 | #include "log.h" | 18 | #include "log.h" |
19 | #include "util.h" | ||
19 | 20 | ||
20 | static void terminate_swaybar(pid_t pid) { | 21 | static void terminate_swaybar(pid_t pid) { |
21 | wlr_log(WLR_DEBUG, "Terminating swaybar %d", pid); | 22 | wlr_log(WLR_DEBUG, "Terminating swaybar %d", pid); |
@@ -101,6 +102,7 @@ struct bar_config *default_bar_config(void) { | |||
101 | bar->binding_mode_indicator = true; | 102 | bar->binding_mode_indicator = true; |
102 | bar->verbose = false; | 103 | bar->verbose = false; |
103 | bar->pid = 0; | 104 | bar->pid = 0; |
105 | bar->modifier = get_modifier_mask_by_name("Mod4"); | ||
104 | if (!(bar->mode = strdup("dock"))) { | 106 | if (!(bar->mode = strdup("dock"))) { |
105 | goto cleanup; | 107 | goto cleanup; |
106 | } | 108 | } |
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index fb1fe7b5..2c8b41cd 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include "sway/input/input-manager.h" | 9 | #include "sway/input/input-manager.h" |
10 | #include "sway/input/keyboard.h" | 10 | #include "sway/input/keyboard.h" |
11 | #include "sway/input/seat.h" | 11 | #include "sway/input/seat.h" |
12 | #include "sway/ipc-server.h" | ||
12 | #include "log.h" | 13 | #include "log.h" |
13 | 14 | ||
14 | /** | 15 | /** |
@@ -66,10 +67,10 @@ static void update_shortcut_state(struct sway_shortcut_state *state, | |||
66 | bool last_key_was_a_modifier = raw_modifiers != state->last_raw_modifiers; | 67 | bool last_key_was_a_modifier = raw_modifiers != state->last_raw_modifiers; |
67 | state->last_raw_modifiers = raw_modifiers; | 68 | state->last_raw_modifiers = raw_modifiers; |
68 | 69 | ||
69 | if (last_key_was_a_modifier && state->last_keycode) { | 70 | if (last_key_was_a_modifier && state->last_keycode) { |
70 | // Last pressed key before this one was a modifier | 71 | // Last pressed key before this one was a modifier |
71 | state_erase_key(state, state->last_keycode); | 72 | state_erase_key(state, state->last_keycode); |
72 | } | 73 | } |
73 | 74 | ||
74 | if (event->state == WLR_KEY_PRESSED) { | 75 | if (event->state == WLR_KEY_PRESSED) { |
75 | // Add current key to set; there may be duplicates | 76 | // Add current key to set; there may be duplicates |
@@ -235,7 +236,6 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { | |||
235 | code_modifiers); | 236 | code_modifiers); |
236 | } | 237 | } |
237 | 238 | ||
238 | |||
239 | bool handled = false; | 239 | bool handled = false; |
240 | 240 | ||
241 | // Identify active release binding | 241 | // Identify active release binding |
@@ -337,6 +337,19 @@ static int handle_keyboard_repeat(void *data) { | |||
337 | return 0; | 337 | return 0; |
338 | } | 338 | } |
339 | 339 | ||
340 | static void determine_bar_visibility(uint32_t modifiers) { | ||
341 | for (int i = 0; i < config->bars->length; ++i) { | ||
342 | struct bar_config *bar = config->bars->items[i]; | ||
343 | if (strcmp(bar->mode, bar->hidden_state) == 0) { // both are "hide" | ||
344 | bool should_be_visible = (~modifiers & bar->modifier) == 0; | ||
345 | if (bar->visible_by_modifier != should_be_visible) { | ||
346 | bar->visible_by_modifier = should_be_visible; | ||
347 | ipc_event_bar_state_update(bar); | ||
348 | } | ||
349 | } | ||
350 | } | ||
351 | } | ||
352 | |||
340 | static void handle_keyboard_modifiers(struct wl_listener *listener, | 353 | static void handle_keyboard_modifiers(struct wl_listener *listener, |
341 | void *data) { | 354 | void *data) { |
342 | struct sway_keyboard *keyboard = | 355 | struct sway_keyboard *keyboard = |
@@ -346,6 +359,9 @@ static void handle_keyboard_modifiers(struct wl_listener *listener, | |||
346 | keyboard->seat_device->input_device->wlr_device; | 359 | keyboard->seat_device->input_device->wlr_device; |
347 | wlr_seat_set_keyboard(wlr_seat, wlr_device); | 360 | wlr_seat_set_keyboard(wlr_seat, wlr_device); |
348 | wlr_seat_keyboard_notify_modifiers(wlr_seat, &wlr_device->keyboard->modifiers); | 361 | wlr_seat_keyboard_notify_modifiers(wlr_seat, &wlr_device->keyboard->modifiers); |
362 | |||
363 | uint32_t modifiers = wlr_keyboard_get_modifiers(wlr_device->keyboard); | ||
364 | determine_bar_visibility(modifiers); | ||
349 | } | 365 | } |
350 | 366 | ||
351 | struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, | 367 | struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, |
@@ -464,7 +480,7 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { | |||
464 | keyboard->keyboard_key.notify = handle_keyboard_key; | 480 | keyboard->keyboard_key.notify = handle_keyboard_key; |
465 | 481 | ||
466 | wl_list_remove(&keyboard->keyboard_modifiers.link); | 482 | wl_list_remove(&keyboard->keyboard_modifiers.link); |
467 | wl_signal_add( &wlr_device->keyboard->events.modifiers, | 483 | wl_signal_add(&wlr_device->keyboard->events.modifiers, |
468 | &keyboard->keyboard_modifiers); | 484 | &keyboard->keyboard_modifiers); |
469 | keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; | 485 | keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; |
470 | } | 486 | } |
diff --git a/sway/ipc-server.c b/sway/ipc-server.c index 2d915502..63c95503 100644 --- a/sway/ipc-server.c +++ b/sway/ipc-server.c | |||
@@ -349,6 +349,22 @@ void ipc_event_barconfig_update(struct bar_config *bar) { | |||
349 | json_object_put(json); | 349 | json_object_put(json); |
350 | } | 350 | } |
351 | 351 | ||
352 | void ipc_event_bar_state_update(struct bar_config *bar) { | ||
353 | if (!ipc_has_event_listeners(IPC_EVENT_BAR_STATE_UPDATE)) { | ||
354 | return; | ||
355 | } | ||
356 | wlr_log(WLR_DEBUG, "Sending bar_state_update event"); | ||
357 | |||
358 | json_object *json = json_object_new_object(); | ||
359 | json_object_object_add(json, "id", json_object_new_string(bar->id)); | ||
360 | json_object_object_add(json, "visible_by_modifier", | ||
361 | json_object_new_boolean(bar->visible_by_modifier)); | ||
362 | |||
363 | const char *json_string = json_object_to_json_string(json); | ||
364 | ipc_send_event(json_string, IPC_EVENT_BAR_STATE_UPDATE); | ||
365 | json_object_put(json); | ||
366 | } | ||
367 | |||
352 | void ipc_event_mode(const char *mode, bool pango) { | 368 | void ipc_event_mode(const char *mode, bool pango) { |
353 | if (!ipc_has_event_listeners(IPC_EVENT_MODE)) { | 369 | if (!ipc_has_event_listeners(IPC_EVENT_MODE)) { |
354 | return; | 370 | return; |
@@ -651,6 +667,8 @@ void ipc_client_handle_command(struct ipc_client *client) { | |||
651 | client->subscribed_events |= event_mask(IPC_EVENT_WORKSPACE); | 667 | client->subscribed_events |= event_mask(IPC_EVENT_WORKSPACE); |
652 | } else if (strcmp(event_type, "barconfig_update") == 0) { | 668 | } else if (strcmp(event_type, "barconfig_update") == 0) { |
653 | client->subscribed_events |= event_mask(IPC_EVENT_BARCONFIG_UPDATE); | 669 | client->subscribed_events |= event_mask(IPC_EVENT_BARCONFIG_UPDATE); |
670 | } else if (strcmp(event_type, "bar_state_update") == 0) { | ||
671 | client->subscribed_events |= event_mask(IPC_EVENT_BAR_STATE_UPDATE); | ||
654 | } else if (strcmp(event_type, "mode") == 0) { | 672 | } else if (strcmp(event_type, "mode") == 0) { |
655 | client->subscribed_events |= event_mask(IPC_EVENT_MODE); | 673 | client->subscribed_events |= event_mask(IPC_EVENT_MODE); |
656 | } else if (strcmp(event_type, "shutdown") == 0) { | 674 | } else if (strcmp(event_type, "shutdown") == 0) { |
diff --git a/swaybar/ipc.c b/swaybar/ipc.c index 56379fdb..c7fdffae 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c | |||
@@ -367,7 +367,7 @@ bool ipc_initialize(struct swaybar *bar) { | |||
367 | struct swaybar_config *config = bar->config; | 367 | struct swaybar_config *config = bar->config; |
368 | char subscribe[128]; // suitably large buffer | 368 | char subscribe[128]; // suitably large buffer |
369 | len = snprintf(subscribe, 128, | 369 | len = snprintf(subscribe, 128, |
370 | "[ \"barconfig_update\" %s %s ]", | 370 | "[ \"barconfig_update\" , \"bar_state_update\" %s %s ]", |
371 | config->binding_mode_indicator ? ", \"mode\"" : "", | 371 | config->binding_mode_indicator ? ", \"mode\"" : "", |
372 | config->workspace_buttons ? ", \"workspace\"" : ""); | 372 | config->workspace_buttons ? ", \"workspace\"" : ""); |
373 | free(ipc_single_command(bar->ipc_event_socketfd, | 373 | free(ipc_single_command(bar->ipc_event_socketfd, |
@@ -375,6 +375,20 @@ bool ipc_initialize(struct swaybar *bar) { | |||
375 | return true; | 375 | return true; |
376 | } | 376 | } |
377 | 377 | ||
378 | static bool handle_bar_state_update(struct swaybar *bar, json_object *event) { | ||
379 | json_object *json_id; | ||
380 | json_object_object_get_ex(event, "id", &json_id); | ||
381 | const char *id = json_object_get_string(json_id); | ||
382 | if (strcmp(id, bar->id) != 0) { | ||
383 | return false; | ||
384 | } | ||
385 | |||
386 | json_object *visible_by_modifier; | ||
387 | json_object_object_get_ex(event, "visible_by_modifier", &visible_by_modifier); | ||
388 | bar->visible_by_modifier = json_object_get_boolean(visible_by_modifier); | ||
389 | return determine_bar_visibility(bar, false); | ||
390 | } | ||
391 | |||
378 | static bool handle_barconfig_update(struct swaybar *bar, | 392 | static bool handle_barconfig_update(struct swaybar *bar, |
379 | json_object *json_config) { | 393 | json_object *json_config) { |
380 | json_object *json_id; | 394 | json_object *json_id; |
@@ -444,6 +458,9 @@ bool handle_ipc_readable(struct swaybar *bar) { | |||
444 | case IPC_EVENT_BARCONFIG_UPDATE: | 458 | case IPC_EVENT_BARCONFIG_UPDATE: |
445 | bar_is_dirty = handle_barconfig_update(bar, result); | 459 | bar_is_dirty = handle_barconfig_update(bar, result); |
446 | break; | 460 | break; |
461 | case IPC_EVENT_BAR_STATE_UPDATE: | ||
462 | bar_is_dirty = handle_bar_state_update(bar, result); | ||
463 | break; | ||
447 | default: | 464 | default: |
448 | bar_is_dirty = false; | 465 | bar_is_dirty = false; |
449 | break; | 466 | break; |