From 57a649713743969a018bd600aa0c8184bf3dd809 Mon Sep 17 00:00:00 2001 From: lkn Date: Sat, 23 May 2026 13:29:12 +0200 Subject: [PATCH] B1: fix appicon_show for Wayland (was no-op, icons never placed) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Wayland backend already had full wl_appicon_paint and wl_icon_paint implementations (tile + image composite + text + scene commit), but appicon_show was a no-op stub. This meant app icons were never initially placed or mapped when applications launched. Fix: wl_appicon_show now calls paint_app_icon() (pure policy code that handles PlaceIcon + wAppIconMove + wLowerFrame + window_map via vtable), identical to the X11 backend. Also mark A7 (placement) as verified — pure policy, zero backend calls. --- WAYLAND_ROADMAP.md | 8 +++++--- src/backend/wayland/wl_backend.c | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/WAYLAND_ROADMAP.md b/WAYLAND_ROADMAP.md index 3d22079..229db7f 100644 --- a/WAYLAND_ROADMAP.md +++ b/WAYLAND_ROADMAP.md @@ -81,6 +81,8 @@ Three major libraries: - C.1 skipped: XOR rubber-band drawing in `moveres.c` is inside `#if 0` — dead code - Native XDG client rendering fix: `surface_commit_listener` calls `wlr_output_schedule_frame()` on every buffer commit (commit 8d963e7) - **A4 Workspace switching**: map/unmap via vtable already worked; added workspace name badge overlay (pixman text rendering in WL_LAYER_OVERLAY, fade animation via new `workspace_badge_get_background` vtable slot) +- **A7 Placement**: verified pure policy code, zero backend calls needed +- **B1 App icon rendering**: wl_appicon_paint/wl_icon_paint already implemented; fixed wl_appicon_show (was no-op, now calls paint_app_icon for initial placement + map) --- @@ -96,7 +98,7 @@ Priority: HIGH — needed for daily-driver use. | A4 | ~~Workspace switching (create/destroy/switch)~~ | workspace.c, scene tree reparenting | ✅ Done | | A5 | ~~Alt-Tab window cycling + switch panel~~ | cycling.c, switchpanel.c, vtable switchpanel_enter | Medium | | A6 | ~~Window iconification (minimize) + miniwindow~~ | icon.c, appicon.c, vtable icon_paint/icon_update_pixmap | Done | -| A7 | Window placement algorithms (smart/cascade/random) | placement.c (may already work via vtable) | Low | +| A7 | ~~Window placement algorithms (smart/cascade/random)~~ | placement.c (pure policy, no backend calls) | ✅ Done | --- @@ -104,7 +106,7 @@ Priority: HIGH — needed for daily-driver use. | # | Task | Key Files | Complexity | |---|------|-----------|------------| -| B1 | App icon rendering (load .tiff/.png, render into dock) | appicon.c, wrlib loaders, vtable appicon_show | Medium | +| B1 | ~~App icon rendering (load .tiff/.png, render into dock)~~ | appicon.c, wrlib loaders, vtable appicon_show | ✅ Done | | B2 | Dock icon drag & drop (reorder, add/remove) | dock.c DnD handlers | Medium | | B3 | Dock auto-launch on login | dock.c session restore | Low | | B4 | Clip workspace indicator (number, arrows) | dock.c clip paint | Low | @@ -230,7 +232,7 @@ NOW (daily-driver basics): ~~A4. Workspace switching~~ ✅ ~~A5. Alt-Tab cycling~~ ✅ A6. Icon/minimize - A7. Placement (verify) + ~~A7. Placement (verify)~~ ✅ NEXT (visual completeness): B1. App icon rendering (wrlib → pixman) diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 2d3ec5a..2534807 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -7766,7 +7766,7 @@ wl_icon_paint(WIcon *icon) if (fb->tree) wlr_scene_node_set_enabled(&fb->tree->node, true); } -static void wl_noop_appicon_show(WApplication *wapp) { (void)wapp; } +static void wl_appicon_show(WApplication *wapp) { paint_app_icon(wapp); } static void wl_appicon_paint(WAppIcon *aicon) { WIcon *icon = aicon->icon; @@ -8499,7 +8499,7 @@ const WMBackend wl_backend = { .get_command_for_window = wl_get_command_for_window, .icon_update_pixmap = wl_noop_icon_update_pixmap, .icon_paint = wl_icon_paint, - .appicon_show = wl_noop_appicon_show, + .appicon_show = wl_appicon_show, .appicon_paint = wl_appicon_paint, .restore_desktop = wl_noop_restore_desktop, .wipe_desktop = wl_noop_wipe_desktop,