From f7a3c735a743d43ba5d93fddc413a3e210146df6 Mon Sep 17 00:00:00 2001 From: Window Maker Date: Thu, 4 Jun 2026 09:14:12 +0200 Subject: [PATCH] fix titlebar button icons: XPM hex color parser off-by-one, remove output destroy listener --- src/backend/wayland/wl_framebuf.c | 15 ++++++++++++--- src/backend/wayland/wl_output.c | 16 ++++------------ src/backend/wayland/wl_types.h | 1 - wrlib/load_xpm_normalized.c | 4 ++-- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/backend/wayland/wl_framebuf.c b/src/backend/wayland/wl_framebuf.c index 8334add..a4a1987 100644 --- a/src/backend/wayland/wl_framebuf.c +++ b/src/backend/wayland/wl_framebuf.c @@ -734,12 +734,17 @@ wl_frame_paint_button(WCoreWindow *button, WTexture *texture, { (void)texture; (void)image; WFrameWindow *fwin = (WFrameWindow *)button->descriptor.parent; - if (!fwin || !fwin->core) + if (!fwin || !fwin->core) { + wwarning("btn: no fwin"); return; + } + wwarning("btn: paint button=%p is_right=%d", (void*)button, button == fwin->right_button ? 1 : 0); struct wl_frame_buf *btn_fb = frame_buf_find(button->window); - if (!btn_fb || !btn_fb->image) + if (!btn_fb || !btn_fb->image) { + wwarning("btn: no fb or no image (fb=%p)", (void*)btn_fb); return; + } int bw = btn_fb->width; int bh = btn_fb->height; @@ -750,14 +755,18 @@ wl_frame_paint_button(WCoreWindow *button, WTexture *texture, wl_state.btn_close_img = RGetImageFromXPMData( button->screen_ptr->rcontext, PRED_CLOSE_XPM); icon = wl_state.btn_close_img; + wwarning("btn: close img=%p", (void*)icon); } else if (button == fwin->left_button) { if (!wl_state.btn_iconify_img) wl_state.btn_iconify_img = RGetImageFromXPMData( button->screen_ptr->rcontext, PRED_ICONIFY_XPM); icon = wl_state.btn_iconify_img; + wwarning("btn: iconify img=%p", (void*)icon); } - if (!icon) + if (!icon) { + wwarning("btn: no icon!"); return; + } struct wl_frame_buf *tb_fb = fwin->titlebar ? frame_buf_find(fwin->titlebar->window) : NULL; uint32_t bg_pixel = 0xFF333333; diff --git a/src/backend/wayland/wl_output.c b/src/backend/wayland/wl_output.c index 33711f8..91ebc0b 100644 --- a/src/backend/wayland/wl_output.c +++ b/src/backend/wayland/wl_output.c @@ -38,16 +38,10 @@ handle_output_frame(struct wl_listener *listener, void *data) } } -#include - -static void handle_output_destroy(struct wl_listener *listener, void *data) -{ - (void)listener; (void)data; - wl_list_remove(&wl_state.output_frame_listener.link); - wl_state.scene_output = NULL; - wl_state.output = NULL; -} - +/* wlr_output_finish asserts that destroy.listener_list is empty, + * so we CANNOT listen to output->events.destroy. Instead the + * frame listener is cleaned up by wlr_scene_output_destroy which + * runs before wlr_output_finish in the teardown chain. */ void handle_backend_new_output(struct wl_listener *listener, void *data) { @@ -98,8 +92,6 @@ handle_backend_new_output(struct wl_listener *listener, void *data) wl_state.scene_output = wlr_scene_output_create(wl_state.scene, output); wl_state.output_frame_listener.notify = handle_output_frame; wl_signal_add(&output->events.frame, &wl_state.output_frame_listener); - wl_state.output_destroy_listener.notify = handle_output_destroy; - wl_signal_add(&output->events.destroy, &wl_state.output_destroy_listener); wwarning("wl_backend: scene output created for %s (%dx%d)", output->name, output->width, output->height); diff --git a/src/backend/wayland/wl_types.h b/src/backend/wayland/wl_types.h index b13d043..fcc84b3 100644 --- a/src/backend/wayland/wl_types.h +++ b/src/backend/wayland/wl_types.h @@ -213,7 +213,6 @@ struct wl_compositor_state { struct wlr_scene_output *scene_output; struct wl_listener backend_new_output_listener; struct wl_listener output_frame_listener; - struct wl_listener output_destroy_listener; char socket_name[64]; /* Phase 34: e.g. "wayland-0" */ int started; /* non-zero after successful display_open */ /* Self-pipe for async-signal-safe shutdown: signal handler writes to [1], diff --git a/wrlib/load_xpm_normalized.c b/wrlib/load_xpm_normalized.c index 9109220..4bf49e1 100644 --- a/wrlib/load_xpm_normalized.c +++ b/wrlib/load_xpm_normalized.c @@ -126,8 +126,8 @@ RImage *RGetImageFromXPMData(RContext * context, char **data) k = 0; j++; - while (data[line][j + k] != 0) - k++; + while (data[line][j + k] != 0 && data[line][j + k] != '"') + k++; if (k == 6) { if (sscanf(&(data[line][j]), "%2x%2x%2x", &red, &green, &blue) != 3) goto bad_format;