From a4f39d49f96f77ef2cf806e1f676ee07403d51a6 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Sun, 24 Aug 2025 21:46:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=95=E7=8B=AC=E7=9A=84?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E6=9D=A5=E5=88=9D=E5=A7=8B=E5=8C=96=20xcb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/xcb.h | 1 + src/main.c | 1 + src/xcb/xcb.c | 17 ++++++++++++++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/include/xcb.h b/src/include/xcb.h index 4d5550e..3adf3d6 100644 --- a/src/include/xcb.h +++ b/src/include/xcb.h @@ -11,6 +11,7 @@ #define WINDOW_NONE XCB_WINDOW_NONE bool has_other_wm_running(void); +void setup_xcb(void); int get_xcb_connection_fd(void); void flush_xcb_connection(void); diff --git a/src/main.c b/src/main.c index ab41731..017151a 100644 --- a/src/main.c +++ b/src/main.c @@ -945,6 +945,7 @@ int main(int argc, char *argv[]) { die("another window manager is already running"); } + setup_xcb(); init_monitors(); init_color_set(); init_monitor_bar(); diff --git a/src/xcb/xcb.c b/src/xcb/xcb.c index 22c7620..462bdfd 100644 --- a/src/xcb/xcb.c +++ b/src/xcb/xcb.c @@ -42,6 +42,20 @@ bool has_other_wm_running(void) { return false; } +void setup_xcb(void) { + uint32_t event_mask = + XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | + XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_POINTER_MOTION | + XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW | + XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_PROPERTY_CHANGE; + uint32_t mask = XCB_CW_EVENT_MASK; + xcb_params_cw_t params = {.event_mask = event_mask}; + xcb_aux_change_window_attributes(conn, screen->root, mask, ¶ms); + + init_icccm_extension(); + init_ewmh_extension(); +} + /** * @brief 获取 xcb 链接对应的文件描述符 */ @@ -169,9 +183,6 @@ void set_wallpaper(uint32_t *wallpaper_data) { * @note: 返回的窗口列表数据使用完后使用 free_window_list 释放 */ window_list_t *scan_window_list(void) { - init_icccm_extension(); - init_ewmh_extension(); - xcb_query_tree_cookie_t cookie = xcb_query_tree(conn, screen->root); xcb_query_tree_reply_t *tree_reply = xcb_query_tree_reply(conn, cookie, NULL); if (!tree_reply) return NULL;