From 612c2367ca2c65b48fd98f9aa13206b97bd2e697 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Tue, 28 Jul 2026 03:07:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(tray):=20=E6=8B=A6=E6=88=AA=E6=89=98?= =?UTF-8?q?=E7=9B=98=E7=AA=97=E5=8F=A3=E7=9A=84=20map/configure/property?= =?UTF-8?q?=20=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/x11/event.c | 6 ++++ src/backend/x11/tray.c | 61 +++++++++++++++++++++++++++++++++++++++++ src/backend/x11/tray.h | 12 ++++++++ 3 files changed, 79 insertions(+) diff --git a/src/backend/x11/event.c b/src/backend/x11/event.c index 4109138..98be483 100644 --- a/src/backend/x11/event.c +++ b/src/backend/x11/event.c @@ -190,6 +190,8 @@ static bool handle_map_request( event_t *event, const xcb_map_request_event_t *xcb_event ) { + if (tray_handle_map_request(backend, xcb_event)) return false; + event->type = ZDWM_EVENT_WINDOW_MAP_REQUEST; return populate_window_event( backend, @@ -231,6 +233,8 @@ static bool handle_configure_request( event_t *event, const xcb_configure_request_event_t *xcb_event ) { + if (tray_handle_configure_request(backend, xcb_event)) return false; + event->type = ZDWM_EVENT_CONFIGURE_REQUEST; auto data = &event->as.configure_request; data->window = xcb_event->window; @@ -342,6 +346,8 @@ static bool handle_property_notify( event_t *event, const xcb_property_notify_event_t *xcb_event ) { + if (tray_handle_property_notify(backend, xcb_event)) return false; + auto window_id = xcb_event->window; if ( xcb_event->atom == backend->atoms.WM_NAME || diff --git a/src/backend/x11/tray.c b/src/backend/x11/tray.c index bc6d1cb..b90bea6 100644 --- a/src/backend/x11/tray.c +++ b/src/backend/x11/tray.c @@ -487,3 +487,64 @@ bool tray_handle_client_message( return true; } + +bool tray_handle_configure_request( + backend_t *backend, + const xcb_configure_request_event_t *ev +) { + auto tray = get_tray_host(backend); + if (!tray || !tray->initialized) return false; + + if (ev->window == tray->container) { + tray_dispatch_callback(tray); + return true; + } + + auto icon = tray_get_icon(tray, ev->window); + if (!icon) return false; + + if ((ev->value_mask & XCB_CONFIG_WINDOW_WIDTH) && ev->width > 0) { + icon->natural_width = (int32_t)ev->width; + } + if ((ev->value_mask & XCB_CONFIG_WINDOW_HEIGHT) && ev->height > 0) { + icon->natural_height = (int32_t)ev->height; + } + + tray_dispatch_callback(tray); + return true; +} + +bool tray_handle_map_request( + backend_t *backend, + const xcb_map_request_event_t *ev +) { + auto tray = get_tray_host(backend); + if (!tray || !tray->initialized) return false; + + auto conn = backend->conn; + if (ev->window == tray->container) { + tray_dispatch_callback(tray); + return true; + } + + auto icon = tray_get_icon(tray, ev->window); + if (!icon && ev->parent != tray->container) return false; + + xcb_map_window(conn, ev->window); + xcb_flush(conn); + + tray_dispatch_callback(tray); + return true; +} + +bool tray_handle_property_notify( + backend_t *backend, + const xcb_property_notify_event_t *ev +) { + auto tray = get_tray_host(backend); + if (!tray || !tray->initialized) return false; + + if (ev->window == XCB_WINDOW_NONE) return false; + if (ev->window == tray->container) return true; + return tray_get_icon(tray, ev->window) != nullptr; +} diff --git a/src/backend/x11/tray.h b/src/backend/x11/tray.h index 963b85f..a415636 100644 --- a/src/backend/x11/tray.h +++ b/src/backend/x11/tray.h @@ -22,3 +22,15 @@ bool tray_handle_client_message( backend_t *backend, const xcb_client_message_event_t *ev ); +bool tray_handle_configure_request( + backend_t *backend, + const xcb_configure_request_event_t *ev +); +bool tray_handle_map_request( + backend_t *backend, + const xcb_map_request_event_t *ev +); +bool tray_handle_property_notify( + backend_t *backend, + const xcb_property_notify_event_t *ev +);