Skip to the content.

Windows taskbar overlay badges — measured shell behavior & test matrix

Weavero badges each Zotero window’s (merged) taskbar button with the window’s identity color, per monitor. Getting this stable on Windows 11 required measuring how the shell actually treats ITaskbarList3::SetOverlayIcon across merged buttons and monitors — facts that are not documented anywhere and that any developer badging a multi-window app will hit. They are published here, with the situation matrix used to test Weavero’s implementation.

Measured shell facts (Windows 11, screen-capture verified, 2026-07)

The algorithm these facts force (“poison ledger”)

Situation matrix

Windows in play: A = anchor main window (primary monitor M2), B = second main window, R = reader window (monitor M3).

# Situation Expected behavior
S1 Focus switch between two windows on the same monitor (B ↔ R on M3) M3 badge follows the focused window; M2 untouched; no flash
S2 Focus switch across monitors (A ↔ R) Each monitor keeps its own last-focused badge; no cross-monitor change
S3 Repeated focus of the same window Zero overlay sets (skip path); nothing changes
S4 Window moves M3 → M2 and stays M2 shows the moved window’s badge; M3 shows its remaining top window
S5 Window moves back M2 → M3 (departure from a button it badged — the poison case) M3 shows the moved window; M2 reverts to its own top (the chase corrects the sticky repaint)
S6 Drag across and back without dropping No badge changes anywhere (drag-clear; nothing to repair) — needs a real mouse
S7 New window opens Gets its badge on first focus; other monitors untouched
S8 Window closes Its monitor’s button falls back to the remaining top window’s badge
S9 All windows on one monitor Classic single-button behavior: badge = focused member
S10 Plugin reload Badges re-asserted once; no bursts, no duplicates
S11 Explorer restart All shell state purged (including the ledger’s target); badges may stay blank until the next per-monitor top change — rare, self-heals on focus change
S12 Mutual poisoning (no clean setter left on a monitor) Adaptive degrade (see algorithm): coherent follow-the-focus on the affected buttons, no flicker, recovers at next reboot
S13 Cold start / session restore No badge until the settle gate passes; first-set guard re-asserts the primary
S14 Shell misplaces a group button entirely (no button on a monitor that has windows) Not badge-related; recovers when a window on that monitor is activated — known Windows 11 flakiness, outside plugin control

Situations S6, S7, S11 are inherently manual (real mouse, real Explorer restart); the rest can be driven programmatically (focus switches, moveTo, plugin reload) with log assertions.

Testing rules