From 49a0b50a6d68bd5676b405aef30b455fca6fe8f0 Mon Sep 17 00:00:00 2001 From: lkn Date: Tue, 23 Jun 2026 21:22:14 +0200 Subject: [PATCH] fix widget rendering: stop polluting view_table with frame_buf IDs Frame_buf IDs (0x10000000-0x1FFFFFFF) were registered in the 256-entry view_table alongside WINGs views, filling it with tombstones until lookups failed. Now frame_buf IDs are excluded from the table; the 3 callers that passed frame_buf IDs to WMDrawString pass raw pixman pointers instead. --- WINGs/wfont_wl.c | 9 ++++----- WINGs/wrender_wl.c | 2 +- WINGs/wview_wl.c | 7 +++++++ src/backend/wayland/wl_badge.c | 4 ++-- src/backend/wayland/wl_window.c | 2 +- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/WINGs/wfont_wl.c b/WINGs/wfont_wl.c index 636a2ef..401f05f 100644 --- a/WINGs/wfont_wl.c +++ b/WINGs/wfont_wl.c @@ -25,11 +25,10 @@ extern void *W_GetViewBacking(unsigned long id); static inline pixman_image_t *wl_font_resolve_drawable(WMDrawable d) { - /* Synthetic IDs: 0x10000000-0x1FFFFFFF = WM frame_buf windows, - * 0x20000000-0x2FFFFFFF = WINGs view windows. - * Both are registered via W_RegisterBacking so W_GetViewBacking - * handles both ranges uniformly. */ - if ((unsigned long)d >= 0x10000000 && (unsigned long)d < 0x30000000) + /* WINGs view IDs (0x20000000-0x2FFFFFFF) are in the backing table. + * Frame_buf IDs (0x10000000-0x1FFFFFFF) are no longer stored; + * callers pass raw pixman_image_t pointers instead. */ + if ((unsigned long)d >= 0x20000000 && (unsigned long)d < 0x30000000) return (pixman_image_t *)W_GetViewBacking((unsigned long)d); return (pixman_image_t *)(uintptr_t)d; } diff --git a/WINGs/wrender_wl.c b/WINGs/wrender_wl.c index 86a0ed1..5b8b05a 100644 --- a/WINGs/wrender_wl.c +++ b/WINGs/wrender_wl.c @@ -32,7 +32,7 @@ extern void *W_GetViewBacking(unsigned long id); static inline pixman_image_t * resolve_drawable(WMDrawable d) { - if ((unsigned long)d >= 0x10000000 && (unsigned long)d < 0x30000000) + if ((unsigned long)d >= 0x20000000 && (unsigned long)d < 0x30000000) return (pixman_image_t *)W_GetViewBacking((unsigned long)d); return (pixman_image_t *)d; } diff --git a/WINGs/wview_wl.c b/WINGs/wview_wl.c index b59c067..8b57fd4 100644 --- a/WINGs/wview_wl.c +++ b/WINGs/wview_wl.c @@ -146,6 +146,11 @@ Bool W_IsValidView(W_View *view) */ void W_RegisterBacking(WNativeWindow id, void *img) { + /* Only register WINGs view IDs (0x20000000+) in the table. + * Frame_buf IDs (0x10000000-0x1FFFFFFF) are no longer stored here; + * callers pass raw pixman pointers for text drawing instead. */ + if ((unsigned long)id >= 0x10000000 && (unsigned long)id < 0x20000000) + return; view_table_put(id, NULL); W_SetViewBacking(id, img); } @@ -153,6 +158,8 @@ void W_RegisterBacking(WNativeWindow id, void *img) /* W_UnregisterBacking - remove a backing registration (on frame_buf destroy). */ void W_UnregisterBacking(WNativeWindow id) { + if ((unsigned long)id >= 0x10000000 && (unsigned long)id < 0x20000000) + return; view_table_remove(id); } diff --git a/src/backend/wayland/wl_badge.c b/src/backend/wayland/wl_badge.c index d7e31ae..ccb87de 100644 --- a/src/backend/wayland/wl_badge.c +++ b/src/backend/wayland/wl_badge.c @@ -47,7 +47,7 @@ wl_workspace_badge_render(WScreen *scr, WNativeWindow badge_win, for (int x = 0; x <= 4; x++) for (int y = 0; y <= 4; y++) - WMDrawString(scr->wmscreen, (WMDrawable)badge_win, scr->white, + WMDrawString(scr->wmscreen, (WMDrawable)(uintptr_t)fb->image, scr->white, scr->workspace_name_font, x, y, name, name_len); /* Save mask: pixels with any white component are visible */ @@ -58,7 +58,7 @@ wl_workspace_badge_render(WScreen *scr, WNativeWindow badge_win, /* Draw final text: white on black at center (2,2) */ for (int i = 0; i < npx; i++) px[i] = 0xFF000000; - WMDrawString(scr->wmscreen, (WMDrawable)badge_win, scr->white, + WMDrawString(scr->wmscreen, (WMDrawable)(uintptr_t)fb->image, scr->white, scr->workspace_name_font, 2, 2, name, name_len); /* Apply mask as alpha channel */ diff --git a/src/backend/wayland/wl_window.c b/src/backend/wayland/wl_window.c index e6c8d9c..d9ad6df 100644 --- a/src/backend/wayland/wl_window.c +++ b/src/backend/wayland/wl_window.c @@ -661,7 +661,7 @@ void wl_balloon_show(WScreen *scr, void *bal_ptr) } /* Draw text */ - WMDrawString(scr->wmscreen, (WMDrawable)fb->id, scr->black, font, + WMDrawString(scr->wmscreen, (WMDrawable)(uintptr_t)fb->image, scr->black, font, pad, pad, bal->text, textlen); /* Position near objectWindow */