修改规则格式

This commit is contained in:
2025-08-23 02:28:02 +08:00
parent 2e75dbf75e
commit bd052edffe
3 changed files with 83 additions and 42 deletions

View File

@@ -145,6 +145,21 @@ static void print_client(client_t *c) {
printf("name: %s\n", c->name);
printf("===== client info end ======\n");
}
static void print_rule(const rule_t *r) {
printf("==================== rule ====================\n");
printf("class: %s, instance: %s, title: %s\n", r->class, r->instance,
r->title);
printf("floating: %s, maximize: %s, fullscreen: %s, switch to tag: %s\n",
bool2string(r->action.floating), bool2string(r->action.maximize),
bool2string(r->action.fullscreen),
bool2string(r->action.switch_to_tag));
for (uint32_t i = 0; r->tag && r->tag[i].monitor_amount; i++) {
const rule_tag_t *t = &r->tag[i];
printf("monitor amount: %u, monitor index: %u, tags: %b\n",
t->monitor_amount, t->monitor_index, t->tags);
}
printf("================== rule end ==================\n");
}
/* 调试函数结束 */
void init_monitors(void) {
@@ -533,35 +548,45 @@ void apply_rules(client_t *client) {
window_class_instance_t class_instance;
get_window_class_instance(client->window, &class_instance);
printf("class: %s, instance: %s\n", class_instance.class,
class_instance.instance);
bool switch_to_tag = 0;
for (int i = 0; i < LENGTH(rules); i++) {
const rule_t *r = &rules[i];
if (!((!r->monitor_amount || monitor_amount == r->monitor_amount) &&
(!r->title || strstr(client->name, r->title)) &&
if (!((!r->title || strstr(client->name, r->title)) &&
(!r->class || strstr(class_instance.class, r->class)) &&
(!r->instance || strstr(class_instance.instance, r->instance)))) {
continue;
}
switch_to_tag = r->switch_to_tag;
client->fullscreen = r->fullscreen;
client->maximize = r->maximize;
client->floating = r->floating;
print_rule(r);
if (r->tags) {
monitor_t *m = monitors;
for (uint32_t i = 0; i < r->monitor_index; i++) m = m ? m->next : NULL;
if (!m) continue;
uint32_t tags_mask = 0;
for (uint32_t i = 0; m->tags[i]; i++) {
tags_mask |= 1 << 0;
switch_to_tag = r->action.switch_to_tag;
client->fullscreen = r->action.fullscreen;
client->maximize = r->action.maximize;
client->floating = r->action.floating;
if (!r->tag) continue;
const rule_tag_t *tag = NULL;
for (uint32_t i = 0;; i++) {
const rule_tag_t *t = &r->tag[i];
if (!t->monitor_amount) break;
if (t->monitor_amount == monitor_amount) {
tag = t;
break;
}
client->tags = r->tags & tags_mask;
}
if (tag) {
monitor_t *m = monitors;
for (uint32_t i = 0; i < tag->monitor_index; i++) m = m ? m->next : NULL;
if (!m) continue;
uint32_t tags_mask = 0;
for (uint32_t i = 0; m->tags[i]; i++) tags_mask |= (1 << i);
client->tags = tag->tags & tags_mask;
}
}
if (!client->tags) {
client->monitor = current_monitor;
client->tags = current_monitor->selected_tags;
@@ -571,6 +596,7 @@ void apply_rules(client_t *client) {
current_monitor->selected_tags = client->tags;
}
print_client(client);
printf("apply rules done\n");
}
@@ -614,7 +640,6 @@ void apply_monitor_layout(monitor_t *monitor) {
if (!monitor || !monitor->layout || !monitor->layout->arrange) return;
monitor->layout->arrange(monitor);
print_client(monitor->clients);
for (client_t *c = next_visible_client(monitor->clients); c;
c = next_visible_client(c->next)) {
printf("apply window[0x%x] rect: x: %d, y: %d, w: %u, h: %u, bw: %u\n",