From 4252604c52a829b47e02c203847727b7a210f585 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Sat, 16 Aug 2025 06:43:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E7=90=86=20xcb=20=E5=85=89=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/xcb/cursor.c | 18 ++++++++++++++---- src/xcb/xcb-private.h | 1 + src/xcb/xcb.c | 12 +++++++++--- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/xcb/cursor.c b/src/xcb/cursor.c index f6b8116..9ef0d15 100644 --- a/src/xcb/cursor.c +++ b/src/xcb/cursor.c @@ -103,14 +103,24 @@ static const char *xcursor_font_tostr(uint16_t c) { return NULL; } +static xcb_cursor_t cursor_list[LENGTH(xcursor_font)]; +xcb_cursor_context_t *cursor_ctx = NULL; + xcb_cursor_t get_xcb_cursor(cursor_t cursor) { - xcb_cursor_context_t *ctx = get_xcb_cursor_context(); - if (!ctx) die("cannot get cursor:"); + if (!cursor_ctx) cursor_ctx = get_xcb_cursor_context(); + if (!cursor_ctx) die("cannot get cursor:"); - static xcb_cursor_t cursor_list[LENGTH(xcursor_font)]; if (!cursor_list[cursor]) { const char *name = xcursor_font_tostr(cursor); - cursor_list[cursor] = xcb_cursor_load_cursor(ctx, name); + cursor_list[cursor] = xcb_cursor_load_cursor(cursor_ctx, name); } return cursor_list[cursor]; } + +void clean_xcb_cursor(void) { + for (int i = 0; i < LENGTH(xcursor_font); i++) { + xcb_cursor_t cursor = cursor_list[i]; + if (cursor) xcb_free_cursor(conn, cursor); + } + xcb_cursor_context_free(cursor_ctx); +} diff --git a/src/xcb/xcb-private.h b/src/xcb/xcb-private.h index 5b0e2e1..123c9b2 100644 --- a/src/xcb/xcb-private.h +++ b/src/xcb/xcb-private.h @@ -6,3 +6,4 @@ extern xcb_connection_t *conn; extern xcb_screen_t *screen; xcb_cursor_t get_xcb_cursor(cursor_t cursor); +void clean_xcb_cursor(void); diff --git a/src/xcb/xcb.c b/src/xcb/xcb.c index 4a57f09..16bbf4e 100644 --- a/src/xcb/xcb.c +++ b/src/xcb/xcb.c @@ -226,11 +226,13 @@ window_list_t *scan_window_list(void) { 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; + xcb_window_t *list = xcb_query_tree_children(tree_reply); int len = xcb_query_tree_children_length(tree_reply); uint32_t count = 0; - xcb_window_t temp_windoow_array[len]; + xcb_window_t temp_window_array[len]; for (int i = 0; i < len; i++) { xcb_window_t window = list[i]; @@ -238,6 +240,8 @@ window_list_t *scan_window_list(void) { xcb_get_window_attributes(conn, window); xcb_get_window_attributes_reply_t *attribute_reply = xcb_get_window_attributes_reply(conn, wa_cookie, NULL); + if (!attribute_reply) continue; + uint8_t override_redirect = attribute_reply->override_redirect; uint8_t map_state = attribute_reply->map_state; free(attribute_reply); @@ -249,7 +253,7 @@ window_list_t *scan_window_list(void) { xcb_icccm_get_wm_transient_for_reply(conn, p_cookie, &transient_for, NULL); if (transient_for != XCB_NONE) continue; - temp_windoow_array[count] = window; + temp_window_array[count] = window; count++; } free(tree_reply); @@ -257,7 +261,7 @@ window_list_t *scan_window_list(void) { if (!count) return NULL; xcb_window_t *window_list = ecalloc(count, sizeof(xcb_window_t)); - for (uint32_t i = 0; i < count; i++) window_list[i] = temp_windoow_array[i]; + for (uint32_t i = 0; i < count; i++) window_list[i] = temp_window_array[i]; window_list_t *r = ecalloc(1, sizeof(window_list_t)); r->count = count; @@ -283,6 +287,8 @@ void start_xcb_event_loop(void) { } void clean_xcb(void) { + clean_xcb_cursor(); + if (wm_check_window != XCB_NONE) { xcb_destroy_window(conn, wm_check_window); wm_check_window = XCB_NONE;