From bec21628904c630e8fd6dd785292ce26aa6b2b70 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Tue, 30 Sep 2025 16:21:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=20property=5Fnotify=20?= =?UTF-8?q?=E5=92=8C=20client=5Fmessage=20=E4=BA=8B=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=20xcb=20atom=20=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/xcb.h | 1 + src/main.c | 10 ++++++++-- src/xcb/wm-extension.c | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/include/xcb.h b/src/include/xcb.h index 4fea09e..d9a97b3 100644 --- a/src/include/xcb.h +++ b/src/include/xcb.h @@ -135,6 +135,7 @@ typedef enum atom_t { atom_zswm_client_info, /* 自定义属性,用于存储所在 monitor 和 tags */ } atom_t; xcb_atom_t get_xcb_atom(atom_t atom); +char *get_xcb_atom_name(xcb_atom_t atom); bool send_event(xcb_window_t window, atom_t atom); typedef enum wm_state_t { wm_state_withdrawn = 0, diff --git a/src/main.c b/src/main.c index 82aaf1a..418c314 100644 --- a/src/main.c +++ b/src/main.c @@ -926,8 +926,10 @@ void focus_in(focus_in_event_t *event) { } void property_notify(property_notify_event_t *event) { - logger("window: 0x%x state: %u, atom: %u\n", event->window, event->state, - event->xcb_atom); + char *atom_name = get_xcb_atom_name(event->xcb_atom); + logger("window: 0x%x state: %u, atom: %u, atom name: %s\n", event->window, + event->state, event->xcb_atom, atom_name); + free(atom_name); if (event->state == property_delete) return; client_t *c = get_client_of_window(event->window); @@ -956,6 +958,10 @@ void property_notify(property_notify_event_t *event) { } void client_message(client_message_event_t *event) { + char *atom_name = get_xcb_atom_name(event->message_type); + logger("client message: message type: %s\n", atom_name); + free(atom_name); + client_t *c = get_client_of_window(event->window); if (!c) return; diff --git a/src/xcb/wm-extension.c b/src/xcb/wm-extension.c index 6e5efb8..3ef1f87 100644 --- a/src/xcb/wm-extension.c +++ b/src/xcb/wm-extension.c @@ -111,6 +111,23 @@ xcb_atom_t get_xcb_atom(atom_t atom) { return atom_map[atom].xcb_atom; } +/** + * @brief 获取 xcb atom 名称 + * @returns xcb atom 对应的名称,使用后记得用 free 释放 + */ +char *get_xcb_atom_name(xcb_atom_t atom) { + xcb_get_atom_name_cookie_t cookie = xcb_get_atom_name(conn, atom); + xcb_get_atom_name_reply_t *reply = + xcb_get_atom_name_reply(conn, cookie, NULL); + int length = xcb_get_atom_name_name_length(reply); + char *name_buffer = ecalloc(1, length + 1); + const char *name = xcb_get_atom_name_name(reply); + strncpy(name_buffer, name, length); + + free(reply); + return name_buffer; +} + bool send_event(xcb_window_t window, atom_t atom) { if (atom < 0 || atom >= LENGTH(atom_map)) return false;