diff options
author | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-05 23:18:59 +0100 |
---|---|---|
committer | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-05 23:18:59 +0100 |
commit | 843e2ad2c140288733110691f7dc8252fbe4dc16 (patch) | |
tree | 3244491ed6cc45666e0599f8cbb3099864f627eb /sway | |
parent | Add modifier key to bar_config json (diff) | |
download | sway-843e2ad2c140288733110691f7dc8252fbe4dc16.tar.gz sway-843e2ad2c140288733110691f7dc8252fbe4dc16.tar.zst sway-843e2ad2c140288733110691f7dc8252fbe4dc16.zip |
Only send modifier event once for active modifiers
This makes sure that a modifier event is only sent for active bar
modifiers, and that it is only sent once for each of those modifiers.
An active bar modifier is a modifier defined for a bar with `mode hide`
and `hidden_state hide`.
Diffstat (limited to 'sway')
-rw-r--r-- | sway/commands.c | 6 | ||||
-rw-r--r-- | sway/config.c | 31 | ||||
-rw-r--r-- | sway/handlers.c | 23 |
3 files changed, 48 insertions, 12 deletions
diff --git a/sway/commands.c b/sway/commands.c index 963d8f12..3a4079e4 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -1751,6 +1751,9 @@ static struct cmd_results *bar_cmd_hidden_state(int argc, char **argv) { | |||
1751 | } | 1751 | } |
1752 | } | 1752 | } |
1753 | 1753 | ||
1754 | // active bar modifiers might have changed. | ||
1755 | update_active_bar_modifiers(); | ||
1756 | |||
1754 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 1757 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
1755 | } | 1758 | } |
1756 | 1759 | ||
@@ -1775,6 +1778,9 @@ static struct cmd_results *bar_set_mode(struct bar_config *bar, const char *mode | |||
1775 | if (strcmp(old_mode, bar->mode) != 0) { | 1778 | if (strcmp(old_mode, bar->mode) != 0) { |
1776 | if (!config->reading) { | 1779 | if (!config->reading) { |
1777 | ipc_event_barconfig_update(bar); | 1780 | ipc_event_barconfig_update(bar); |
1781 | |||
1782 | // active bar modifiers might have changed. | ||
1783 | update_active_bar_modifiers(); | ||
1778 | } | 1784 | } |
1779 | sway_log(L_DEBUG, "Setting mode: '%s' for bar: %s", bar->mode, bar->id); | 1785 | sway_log(L_DEBUG, "Setting mode: '%s' for bar: %s", bar->mode, bar->id); |
1780 | } | 1786 | } |
diff --git a/sway/config.c b/sway/config.c index 87b1342d..95d8f339 100644 --- a/sway/config.c +++ b/sway/config.c | |||
@@ -103,6 +103,8 @@ static void free_config(struct sway_config *config) { | |||
103 | free_output_config(config->output_configs->items[i]); | 103 | free_output_config(config->output_configs->items[i]); |
104 | } | 104 | } |
105 | list_free(config->output_configs); | 105 | list_free(config->output_configs); |
106 | |||
107 | list_free(config->active_bar_modifiers); | ||
106 | free(config); | 108 | free(config); |
107 | } | 109 | } |
108 | 110 | ||
@@ -145,6 +147,33 @@ static void config_defaults(struct sway_config *config) { | |||
145 | config->edge_gaps = true; | 147 | config->edge_gaps = true; |
146 | config->gaps_inner = 0; | 148 | config->gaps_inner = 0; |
147 | config->gaps_outer = 0; | 149 | config->gaps_outer = 0; |
150 | |||
151 | config->active_bar_modifiers = create_list(); | ||
152 | } | ||
153 | |||
154 | static int compare_modifiers(const void *left, const void *right) { | ||
155 | uint32_t a = *(uint32_t *)left; | ||
156 | uint32_t b = *(uint32_t *)right; | ||
157 | |||
158 | return a - b; | ||
159 | } | ||
160 | |||
161 | void update_active_bar_modifiers() { | ||
162 | if (config->active_bar_modifiers->length > 0) { | ||
163 | list_free(config->active_bar_modifiers); | ||
164 | config->active_bar_modifiers = create_list(); | ||
165 | } | ||
166 | |||
167 | struct bar_config *bar; | ||
168 | int i; | ||
169 | for (i = 0; i < config->bars->length; ++i) { | ||
170 | bar = config->bars->items[i]; | ||
171 | if (strcmp(bar->mode, "hide") == 0 && strcmp(bar->hidden_state, "hide") == 0) { | ||
172 | if (list_seq_find(config->active_bar_modifiers, compare_modifiers, &bar->modifier) < 0) { | ||
173 | list_add(config->active_bar_modifiers, &bar->modifier); | ||
174 | } | ||
175 | } | ||
176 | } | ||
148 | } | 177 | } |
149 | 178 | ||
150 | static char *get_config_path(void) { | 179 | static char *get_config_path(void) { |
@@ -215,6 +244,8 @@ bool load_config(const char *file) { | |||
215 | } | 244 | } |
216 | fclose(f); | 245 | fclose(f); |
217 | 246 | ||
247 | update_active_bar_modifiers(); | ||
248 | |||
218 | return config_load_success; | 249 | return config_load_success; |
219 | } | 250 | } |
220 | 251 | ||
diff --git a/sway/handlers.c b/sway/handlers.c index 4cbec0ab..db3a0206 100644 --- a/sway/handlers.c +++ b/sway/handlers.c | |||
@@ -390,18 +390,17 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier | |||
390 | } | 390 | } |
391 | 391 | ||
392 | // handle bar modifiers pressed/released | 392 | // handle bar modifiers pressed/released |
393 | struct bar_config *bar; | 393 | uint32_t modifier; |
394 | for (i = 0; i < config->bars->length; ++i) { | 394 | for (i = 0; i < config->active_bar_modifiers->length; ++i) { |
395 | bar = config->bars->items[i]; | 395 | modifier = *(uint32_t *)config->active_bar_modifiers->items[i]; |
396 | if (strcmp(bar->mode, "hide") == 0 && strcmp(bar->hidden_state, "hide") == 0) { | 396 | |
397 | switch (modifier_state_changed(modifiers->mods, bar->modifier)) { | 397 | switch (modifier_state_changed(modifiers->mods, modifier)) { |
398 | case MOD_STATE_PRESSED: | 398 | case MOD_STATE_PRESSED: |
399 | ipc_event_modifier(bar->modifier, "pressed"); | 399 | ipc_event_modifier(modifier, "pressed"); |
400 | break; | 400 | break; |
401 | case MOD_STATE_RELEASED: | 401 | case MOD_STATE_RELEASED: |
402 | ipc_event_modifier(bar->modifier, "released"); | 402 | ipc_event_modifier(modifier, "released"); |
403 | break; | 403 | break; |
404 | } | ||
405 | } | 404 | } |
406 | } | 405 | } |
407 | // update modifiers state | 406 | // update modifiers state |