mirror of
https://github.com/swaywm/sway.git
synced 2024-11-04 23:43:14 +00:00
Avoid adding duplicate criteria for no_focus and command
This commit is contained in:
parent
17c9a0e84f
commit
e4bba906b6
|
@ -40,6 +40,9 @@ struct criteria {
|
||||||
};
|
};
|
||||||
|
|
||||||
bool criteria_is_empty(struct criteria *criteria);
|
bool criteria_is_empty(struct criteria *criteria);
|
||||||
|
bool criteria_is_equal(struct criteria *left, struct criteria *right);
|
||||||
|
|
||||||
|
bool criteria_already_exists(struct criteria *criteria);
|
||||||
|
|
||||||
void criteria_destroy(struct criteria *criteria);
|
void criteria_destroy(struct criteria *criteria);
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,14 @@ struct cmd_results *cmd_for_window(int argc, char **argv) {
|
||||||
criteria->type = CT_COMMAND;
|
criteria->type = CT_COMMAND;
|
||||||
criteria->cmdlist = join_args(argv + 1, argc - 1);
|
criteria->cmdlist = join_args(argv + 1, argc - 1);
|
||||||
|
|
||||||
|
// Check if it already exists
|
||||||
|
if (criteria_already_exists(criteria)) {
|
||||||
|
sway_log(SWAY_DEBUG, "for_window already exists: '%s' -> '%s'",
|
||||||
|
criteria->raw, criteria->cmdlist);
|
||||||
|
criteria_destroy(criteria);
|
||||||
|
return cmd_results_new(CMD_SUCCESS, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
list_add(config->criteria, criteria);
|
list_add(config->criteria, criteria);
|
||||||
sway_log(SWAY_DEBUG, "for_window: '%s' -> '%s' added", criteria->raw, criteria->cmdlist);
|
sway_log(SWAY_DEBUG, "for_window: '%s' -> '%s' added", criteria->raw, criteria->cmdlist);
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,16 @@ struct cmd_results *cmd_no_focus(int argc, char **argv) {
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
criteria->type = CT_NO_FOCUS;
|
criteria->type = CT_NO_FOCUS;
|
||||||
|
|
||||||
|
// Check if it already exists
|
||||||
|
if (criteria_already_exists(criteria)) {
|
||||||
|
sway_log(SWAY_DEBUG, "no_focus already exists: '%s'", criteria->raw);
|
||||||
|
criteria_destroy(criteria);
|
||||||
|
return cmd_results_new(CMD_SUCCESS, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
list_add(config->criteria, criteria);
|
list_add(config->criteria, criteria);
|
||||||
|
|
||||||
return cmd_results_new(CMD_SUCCESS, NULL);
|
return cmd_results_new(CMD_SUCCESS, NULL);
|
||||||
|
|
|
@ -685,3 +685,36 @@ cleanup:
|
||||||
criteria_destroy(criteria);
|
criteria_destroy(criteria);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool criteria_is_equal(struct criteria *left, struct criteria *right) {
|
||||||
|
if (left->type != right->type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// XXX Only implemented for CT_NO_FOCUS for now.
|
||||||
|
if (left->type == CT_NO_FOCUS) {
|
||||||
|
return strcmp(left->raw, right->raw) == 0;
|
||||||
|
}
|
||||||
|
if (left->type == CT_COMMAND) {
|
||||||
|
return strcmp(left->raw, right->raw) == 0
|
||||||
|
&& strcmp(left->cmdlist, right->cmdlist) == 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool criteria_already_exists(struct criteria *criteria) {
|
||||||
|
// XXX Only implemented for CT_NO_FOCUS and CT_COMMAND for now.
|
||||||
|
// While criteria_is_equal also obeys this limitation, this is a shortcut
|
||||||
|
// to avoid processing the list.
|
||||||
|
if (criteria->type != CT_NO_FOCUS && criteria->type != CT_COMMAND) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_t *criterias = config->criteria;
|
||||||
|
for (int i = 0; i < criterias->length; ++i) {
|
||||||
|
struct criteria *existing = criterias->items[i];
|
||||||
|
if (criteria_is_equal(criteria, existing)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue