B1: fix appicon_show for Wayland (was no-op, icons never placed)

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.
This commit is contained in:
lkn 2026-05-23 13:29:12 +02:00
parent 1e4caddb9f
commit 57a6497137
2 changed files with 7 additions and 5 deletions

View File

@ -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)

View File

@ -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,