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 | |
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`.
-rw-r--r-- | include/config.h | 6 | ||||
-rw-r--r-- | sway/commands.c | 6 | ||||
-rw-r--r-- | sway/config.c | 31 | ||||
-rw-r--r-- | sway/handlers.c | 23 |
4 files changed, 54 insertions, 12 deletions
diff --git a/include/config.h b/include/config.h index a915fbed..5e1c39f3 100644 --- a/include/config.h +++ b/include/config.h | |||
@@ -135,6 +135,7 @@ struct sway_config { | |||
135 | list_t *workspace_outputs; | 135 | list_t *workspace_outputs; |
136 | list_t *output_configs; | 136 | list_t *output_configs; |
137 | list_t *criteria; | 137 | list_t *criteria; |
138 | list_t *active_bar_modifiers; | ||
138 | struct sway_mode *current_mode; | 139 | struct sway_mode *current_mode; |
139 | struct bar_config *current_bar; | 140 | struct bar_config *current_bar; |
140 | uint32_t floating_mod; | 141 | uint32_t floating_mod; |
@@ -176,6 +177,11 @@ void merge_output_config(struct output_config *dst, struct output_config *src); | |||
176 | void apply_output_config(struct output_config *oc, swayc_t *output); | 177 | void apply_output_config(struct output_config *oc, swayc_t *output); |
177 | void free_output_config(struct output_config *oc); | 178 | void free_output_config(struct output_config *oc); |
178 | 179 | ||
180 | /** | ||
181 | * Updates the list of active bar modifiers | ||
182 | */ | ||
183 | void update_active_bar_modifiers(void); | ||
184 | |||
179 | int workspace_output_cmp_workspace(const void *a, const void *b); | 185 | int workspace_output_cmp_workspace(const void *a, const void *b); |
180 | 186 | ||
181 | int sway_binding_cmp(const void *a, const void *b); | 187 | int sway_binding_cmp(const void *a, const void *b); |
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 |