mirror of
https://github.com/swaywm/sway.git
synced 2024-11-26 09:51:29 +00:00
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`.
This commit is contained in:
parent
a8402035e9
commit
843e2ad2c1
|
@ -135,6 +135,7 @@ struct sway_config {
|
||||||
list_t *workspace_outputs;
|
list_t *workspace_outputs;
|
||||||
list_t *output_configs;
|
list_t *output_configs;
|
||||||
list_t *criteria;
|
list_t *criteria;
|
||||||
|
list_t *active_bar_modifiers;
|
||||||
struct sway_mode *current_mode;
|
struct sway_mode *current_mode;
|
||||||
struct bar_config *current_bar;
|
struct bar_config *current_bar;
|
||||||
uint32_t floating_mod;
|
uint32_t floating_mod;
|
||||||
|
@ -176,6 +177,11 @@ void merge_output_config(struct output_config *dst, struct output_config *src);
|
||||||
void apply_output_config(struct output_config *oc, swayc_t *output);
|
void apply_output_config(struct output_config *oc, swayc_t *output);
|
||||||
void free_output_config(struct output_config *oc);
|
void free_output_config(struct output_config *oc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the list of active bar modifiers
|
||||||
|
*/
|
||||||
|
void update_active_bar_modifiers(void);
|
||||||
|
|
||||||
int workspace_output_cmp_workspace(const void *a, const void *b);
|
int workspace_output_cmp_workspace(const void *a, const void *b);
|
||||||
|
|
||||||
int sway_binding_cmp(const void *a, const void *b);
|
int sway_binding_cmp(const void *a, const void *b);
|
||||||
|
|
|
@ -1751,6 +1751,9 @@ static struct cmd_results *bar_cmd_hidden_state(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// active bar modifiers might have changed.
|
||||||
|
update_active_bar_modifiers();
|
||||||
|
|
||||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1775,6 +1778,9 @@ static struct cmd_results *bar_set_mode(struct bar_config *bar, const char *mode
|
||||||
if (strcmp(old_mode, bar->mode) != 0) {
|
if (strcmp(old_mode, bar->mode) != 0) {
|
||||||
if (!config->reading) {
|
if (!config->reading) {
|
||||||
ipc_event_barconfig_update(bar);
|
ipc_event_barconfig_update(bar);
|
||||||
|
|
||||||
|
// active bar modifiers might have changed.
|
||||||
|
update_active_bar_modifiers();
|
||||||
}
|
}
|
||||||
sway_log(L_DEBUG, "Setting mode: '%s' for bar: %s", bar->mode, bar->id);
|
sway_log(L_DEBUG, "Setting mode: '%s' for bar: %s", bar->mode, bar->id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,8 @@ static void free_config(struct sway_config *config) {
|
||||||
free_output_config(config->output_configs->items[i]);
|
free_output_config(config->output_configs->items[i]);
|
||||||
}
|
}
|
||||||
list_free(config->output_configs);
|
list_free(config->output_configs);
|
||||||
|
|
||||||
|
list_free(config->active_bar_modifiers);
|
||||||
free(config);
|
free(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,6 +147,33 @@ static void config_defaults(struct sway_config *config) {
|
||||||
config->edge_gaps = true;
|
config->edge_gaps = true;
|
||||||
config->gaps_inner = 0;
|
config->gaps_inner = 0;
|
||||||
config->gaps_outer = 0;
|
config->gaps_outer = 0;
|
||||||
|
|
||||||
|
config->active_bar_modifiers = create_list();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int compare_modifiers(const void *left, const void *right) {
|
||||||
|
uint32_t a = *(uint32_t *)left;
|
||||||
|
uint32_t b = *(uint32_t *)right;
|
||||||
|
|
||||||
|
return a - b;
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_active_bar_modifiers() {
|
||||||
|
if (config->active_bar_modifiers->length > 0) {
|
||||||
|
list_free(config->active_bar_modifiers);
|
||||||
|
config->active_bar_modifiers = create_list();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct bar_config *bar;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < config->bars->length; ++i) {
|
||||||
|
bar = config->bars->items[i];
|
||||||
|
if (strcmp(bar->mode, "hide") == 0 && strcmp(bar->hidden_state, "hide") == 0) {
|
||||||
|
if (list_seq_find(config->active_bar_modifiers, compare_modifiers, &bar->modifier) < 0) {
|
||||||
|
list_add(config->active_bar_modifiers, &bar->modifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *get_config_path(void) {
|
static char *get_config_path(void) {
|
||||||
|
@ -215,6 +244,8 @@ bool load_config(const char *file) {
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
|
update_active_bar_modifiers();
|
||||||
|
|
||||||
return config_load_success;
|
return config_load_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -390,20 +390,19 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle bar modifiers pressed/released
|
// handle bar modifiers pressed/released
|
||||||
struct bar_config *bar;
|
uint32_t modifier;
|
||||||
for (i = 0; i < config->bars->length; ++i) {
|
for (i = 0; i < config->active_bar_modifiers->length; ++i) {
|
||||||
bar = config->bars->items[i];
|
modifier = *(uint32_t *)config->active_bar_modifiers->items[i];
|
||||||
if (strcmp(bar->mode, "hide") == 0 && strcmp(bar->hidden_state, "hide") == 0) {
|
|
||||||
switch (modifier_state_changed(modifiers->mods, bar->modifier)) {
|
switch (modifier_state_changed(modifiers->mods, modifier)) {
|
||||||
case MOD_STATE_PRESSED:
|
case MOD_STATE_PRESSED:
|
||||||
ipc_event_modifier(bar->modifier, "pressed");
|
ipc_event_modifier(modifier, "pressed");
|
||||||
break;
|
break;
|
||||||
case MOD_STATE_RELEASED:
|
case MOD_STATE_RELEASED:
|
||||||
ipc_event_modifier(bar->modifier, "released");
|
ipc_event_modifier(modifier, "released");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// update modifiers state
|
// update modifiers state
|
||||||
modifiers_state_update(modifiers->mods);
|
modifiers_state_update(modifiers->mods);
|
||||||
return EVENT_PASSTHROUGH;
|
return EVENT_PASSTHROUGH;
|
||||||
|
|
Loading…
Reference in a new issue