summaryrefslogtreecommitdiffstats
path: root/sway
diff options
context:
space:
mode:
authorLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-01-05 23:18:59 +0100
committerLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-01-05 23:18:59 +0100
commit843e2ad2c140288733110691f7dc8252fbe4dc16 (patch)
tree3244491ed6cc45666e0599f8cbb3099864f627eb /sway
parentAdd modifier key to bar_config json (diff)
downloadsway-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.c6
-rw-r--r--sway/config.c31
-rw-r--r--sway/handlers.c23
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
154static 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
161void 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
150static char *get_config_path(void) { 179static 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