feat(core/rules): 添加规则匹配和解析功能

This commit is contained in:
2026-04-13 03:02:58 +08:00
parent 9dd3ae00d2
commit ead8160a61
2 changed files with 48 additions and 0 deletions

View File

@@ -1,5 +1,9 @@
#include "core/rules.h" #include "core/rules.h"
#include <stddef.h>
#include <string.h>
#include <zdwm/types.h>
#include "base/memory.h" #include "base/memory.h"
#include "core/types.h" #include "core/types.h"
@@ -35,3 +39,43 @@ void rules_cleanup(rules_t *rules) {
rules->capacity = 0; rules->capacity = 0;
rules->count = 0; rules->count = 0;
} }
static inline bool str_match(const char *pattern, const char *value) {
return !pattern || (value && strcmp(pattern, value) == 0);
}
static bool rule_match_window(const rule_match_t *match,
const window_metadata_t *meta) {
return str_match(match->app_id, meta->app_id) &&
str_match(match->role, meta->role) &&
str_match(match->class_name, meta->class_name) &&
str_match(match->instance_name, meta->instance_name);
}
static void rule_action_merge(const rule_action_t *src, rule_action_t *dest) {
if (!src || !dest) return;
if (src->workspace != ZDWM_WORKSPACE_ID_INVALID) {
dest->workspace = src->workspace;
}
dest->switch_to_workspace |= src->switch_to_workspace;
dest->fullscreen |= src->fullscreen;
dest->maximize |= src->maximize;
dest->floating |= src->floating;
}
bool rules_resolve(const rules_t *rules, const window_metadata_t *metadata,
rule_action_t *action_out) {
if (!action_out) return false;
bool matched = false;
for (size_t i = 0; i < rules->count; ++i) {
if (!rule_match_window(&rules->items[i].match, metadata)) continue;
matched = true;
rule_action_merge(&rules->items[i].action, action_out);
}
return matched;
}

View File

@@ -3,6 +3,7 @@
#include <stddef.h> #include <stddef.h>
#include "core/types.h" #include "core/types.h"
#include "core/window.h"
typedef struct rule_item_t { typedef struct rule_item_t {
rule_match_t match; rule_match_t match;
@@ -17,3 +18,6 @@ typedef struct rules_t {
bool rules_move(rules_t *src, rules_t *dest); bool rules_move(rules_t *src, rules_t *dest);
void rules_cleanup(rules_t *rules); void rules_cleanup(rules_t *rules);
bool rules_resolve(const rules_t *rules, const window_metadata_t *metadata,
rule_action_t *action_out);