From 5353e4c677f71ae0cf226e7f08affd986c81aa9e Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Tue, 7 Apr 2026 04:24:30 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AA=97=E5=8F=A3=20metadata=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20role=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/x11/event.c | 2 +- src/core/event.h | 5 +++-- src/core/state.c | 16 ++++++++++++++++ src/core/state.h | 11 +++++++---- src/core/window.h | 3 ++- src/core/wm_desc.h | 1 + 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/backend/x11/event.c b/src/backend/x11/event.c index 806c40e..ec0482c 100644 --- a/src/backend/x11/event.c +++ b/src/backend/x11/event.c @@ -18,7 +18,7 @@ static bool handle_map_request(backend_t *backend, event_t *event, event->type = ZDWM_EVENT_WINDOW_MAP_REQUEST; event->data.window_map_request.window = window; window_metadata_t *metadata = &event->data.window_map_request.metadata; - metadata->app_id = window_get_role(backend, window); + metadata->role = window_get_role(backend, window); metadata->title = window_get_title(backend, window); window_get_class(backend, window, &metadata->class_name, &metadata->instance_name); diff --git a/src/core/event.h b/src/core/event.h index b6612cc..add909c 100644 --- a/src/core/event.h +++ b/src/core/event.h @@ -82,8 +82,9 @@ typedef struct window_remove_event_t { typedef enum window_metadata_change_flags_t { ZDWM_WINDOW_METADATA_CHANGE_TITLE = 1u << 0, ZDWM_WINDOW_METADATA_CHANGE_APP_ID = 1u << 1, - ZDWM_WINDOW_METADATA_CHANGE_CLASS = 1u << 2, - ZDWM_WINDOW_METADATA_CHANGE_INSTANCE = 1u << 3, + ZDWM_WINDOW_METADATA_CHANGE_ROLE = 1u << 2, + ZDWM_WINDOW_METADATA_CHANGE_CLASS = 1u << 3, + ZDWM_WINDOW_METADATA_CHANGE_INSTANCE = 1u << 4, } window_metadata_change_flags_t; typedef struct window_metadata_change_event_t { diff --git a/src/core/state.c b/src/core/state.c index b615743..f61342d 100644 --- a/src/core/state.c +++ b/src/core/state.c @@ -66,6 +66,7 @@ void state_cleanup(state_t *state) { window_t *window = &state->windows[i]; p_delete(&window->title); p_delete(&window->app_id); + p_delete(&window->role); p_delete(&window->class_name); p_delete(&window->instance_name); } @@ -286,6 +287,7 @@ const window_t *state_window_add(state_t *state, const window_info_t *info) { state_window_set_frame_rect(state, id, info->frame_rect); state_window_set_title(state, id, info->title); state_window_set_app_id(state, id, info->app_id); + state_window_set_role(state, id, info->role); state_window_set_class(state, id, info->class_name); state_window_set_instance(state, id, info->instance_name); state_window_set_skip_taskbar(state, id, info->skip_taskbar); @@ -324,6 +326,7 @@ void state_window_remove(state_t *state, window_id_t id) { workspace_id_t workspace_id = window->workspace_id; p_delete(&window->title); p_delete(&window->app_id); + p_delete(&window->role); p_delete(&window->class_name); p_delete(&window->instance_name); @@ -453,6 +456,18 @@ bool state_window_set_app_id(state_t *state, window_id_t window_id, return true; } + +bool state_window_set_role(state_t *state, window_id_t window_id, + const char *role) { + window_t *window = (window_t *)state_window_get(state, window_id); + if (!window) return false; + + p_delete(&window->role); + window->role = p_strdup_nullable(role); + + return true; +} + bool state_window_set_class(state_t *state, window_id_t window_id, const char *class_name) { window_t *window = (window_t *)state_window_get(state, window_id); @@ -463,6 +478,7 @@ bool state_window_set_class(state_t *state, window_id_t window_id, return true; } + bool state_window_set_instance(state_t *state, window_id_t window_id, const char *instance_name) { window_t *window = (window_t *)state_window_get(state, window_id); diff --git a/src/core/state.h b/src/core/state.h index 943c77e..df5c3bb 100644 --- a/src/core/state.h +++ b/src/core/state.h @@ -24,10 +24,11 @@ typedef struct window_t { rect_t frame_rect; /* 当前外框矩形(由 layout 或 float_rect 解析) */ /* 元数据(核心算法不依赖,仅用于规则匹配和信息展示) */ - const char *title; - const char *app_id; - const char *class_name; - const char *instance_name; + char *title; + char *app_id; + char *role; + char *class_name; + char *instance_name; bool skip_taskbar; } window_t; @@ -170,6 +171,8 @@ bool state_window_set_title(state_t *state, window_id_t window_id, const char *title); bool state_window_set_app_id(state_t *state, window_id_t window_id, const char *app_id); +bool state_window_set_role(state_t *state, window_id_t window_id, + const char *role); bool state_window_set_class(state_t *state, window_id_t window_id, const char *class_name); bool state_window_set_instance(state_t *state, window_id_t window_id, diff --git a/src/core/window.h b/src/core/window.h index 2ee9c91..60e94b1 100644 --- a/src/core/window.h +++ b/src/core/window.h @@ -46,7 +46,8 @@ typedef struct window_props_t { typedef struct window_metadata_t { char *title; - char *app_id; /* X11 中将其当 role 用 */ + char *app_id; + char *role; char *class_name; char *instance_name; } window_metadata_t; diff --git a/src/core/wm_desc.h b/src/core/wm_desc.h index f62fce0..bbffc8c 100644 --- a/src/core/wm_desc.h +++ b/src/core/wm_desc.h @@ -17,6 +17,7 @@ typedef struct window_info_t { const char *title; const char *app_id; + const char *role; const char *class_name; const char *instance_name;