aboutsummaryrefslogtreecommitdiff
path: root/sway/criteria.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/criteria.c')
-rw-r--r--sway/criteria.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/sway/criteria.c b/sway/criteria.c
index 11b41f35..b2582851 100644
--- a/sway/criteria.c
+++ b/sway/criteria.c
@@ -685,3 +685,36 @@ cleanup:
criteria_destroy(criteria);
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;
+}