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;