Skip to content

Windows: the taskbar strip and its card, drawn as the notch's - #506

Merged
vinzdg merged 9 commits into
vinzdg:mainfrom
RawJat:fix/windows-taskbar-design
Nov 5, 2026
Merged

vinzdg merged 9 commits into
vinzdg:mainfrom
RawJat:fix/windows-taskbar-design

Conversation

@RawJat

@RawJat RawJat commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

1.24.0 (#459) added a taskbar strip with a look of its own. This makes the strip and its hover card the notch's, and gives both cards the Mac's glide between cells.

Builds on #502. Its first three commits are #502's, because both edit Settings' accounts code. Review from "Windows: the taskbar strip draws the notch's cells".

Strip

  • Each cell is a notch cell on its side: the hole, the track and reading, the weekly ring inside or outside, the stepped activity arc, the glyph dimmed when spent or stale, and the figure beside the ring. It shows the notch's reading (ring_window), providers and order. Antigravity, DeepSeek, Command Code and Qoder get their marks instead of letters.
  • The strip is as wide as its cells, so the Width slider goes. A narrow gap shrinks the row instead of dropping an account.
  • A click presses the ring in while it refreshes, as on the notch.

Card

  • The hover window loads notch.html with only its card showing, so it is the notch's card, in all eight languages, with its tail on the ring. The refresh and close buttons and the footer go; they came from a details window nothing opens.
  • In that mode the page leaves the notch's window alone: no hot rectangles, zoom, folding or hover tracking.
  • The window keeps the tallest card's room, so moving between rings never resizes it. A resized WebView shows a frame of its old layout. Outside the card the window lets clicks through, and the pointer on the card holds it open.

Glide: an open card travels to the next ring or cell over 300 ms (NotchMotion.glide), on the taskbar and on the notch.

Settings: "Display: Original notch / Left side / Before system tray" becomes "Show rings in: Notch / Taskbar, left / Taskbar, right". Dropdown lists follow the chosen appearance.

Overlap: #495 edits the same renderer and model, and #505 the same Settings files, as with #502. Whichever lands first, I'll resolve the conflicts here.

Test plan

  • cargo test -p codenotch: 316 passed. Clippy: nothing new in the changed files. Page tests pass.
  • A test checks the model's figure widths against DirectWrite with tabular figures.
  • Live at 150% on a dark and a light taskbar: strip, card and Settings.
  • Screen captures of a ring switch: one frame used to differ from both cards over 6,500–8,500 px. Now no frame differs by more than 200 px, the tail moving.
  • Click-through above the card, and holding on it, three runs each.
  • The notch card's glide, tracked frame by frame.
  • A taskbar at the top of the screen, where the card hangs below the strip.

…e Mac

1.24.0 gave Claude accounts a block of their own above the provider list:
text boxes, a Save name button, an orange checkbox, the folder path on every
row, and copy in English and Portuguese only. The Mac lists each
~/.claude-<slug> profile as a provider row like any other, so Windows now
does too.

Each account is a row in Connected or Not connected, with the provider's
glyph, its name, a switch and a status line, and a Sign in button on the one
that needs it. The default account keeps the Claude Code notification switch
under it. Switching off the last Claude account takes Claude off the notch,
as the provider's own switch did.

As on the Mac (ClaudeProfile.discover), a folder Claude Code has not signed
in to is not an account. 1.24.0 listed every folder it had registered, so an
abandoned sign-in stayed as a row that could never read anything, and it
renamed the real account beside it. A row after the accounts adds one now:
it creates the next ~/.claude-<n> folder and opens Claude Code's sign-in
there, with nothing to type. The new row shows only while that sign-in runs,
counting down five minutes; if it does not finish, the folder goes again.

Names follow the Mac's ClaudeProfile.displayName and displayNames: the
domain of the address Claude Code records in .claude.json (Claude Gmail,
Claude Acme), the folder until there is one (Claude (2)), plain Claude for a
lone account, and the whole address only where two names would collide. The
file is parsed again only when it changes. The notch and the taskbar take
the same names. The card keeps the provider's title, Claude Usage, and when
there is more than one account says whose it is on the line under it
(someone@gmail.com · Max), where Claude Gmail Usage read as a product that
does not exist.

The new strings are translated into the eight languages Settings has. Names
saved by 1.24.0 are no longer read; the field stays so 1.24.0 can still load
the file.
Switching an account off writes its entry into claude_profiles, and that
entry went out with an empty name. This version never reads the name, but
1.24.0 does: going back to it showed a blank name box, and its Save refused
the blank. The entry now carries the account's display name.
vinzdg#495 adds its translation tables right after RESET_COPY's loop, and a
DeepSeek line right above the Claude hooks switch: the two places this
branch also edited, so whichever of the two merged second would conflict.
The Claude row strings now sit above RESET_COPY, and the hooks switch keeps
its own if line. Nothing changes on screen.
1.24.0's strip had a look of its own: it was always as wide as the Width
slider and split that evenly between its rings, so two rings sat 164 px
apart; it read its own windows (the weekly figure for Claude and Codex),
drew hairline rings with no track until a reading came, and left
Antigravity, DeepSeek, Command Code and Qoder as letters.

Each cell is now the notch's, in the notch's 56-unit box: the hole, the
track and reading, the weekly ring inside or outside, the activity arc
stepping as the notch's does, the glyph dimmed when its window is used up
or the reading is old, and the notch's figure beside the ring. The reading
is ring_window's, as in the notch and the tray. Providers come in the
notch's order, and a click presses the ring in while it refreshes, as on
the notch.

The strip is as wide as its cells. The Width setting goes; a narrower free
space shrinks the whole row instead of dropping an account.
The hover card over the taskbar strip was a page of its own, with a design
of its own: bars and badges, a header with refresh and close buttons, and
a footer link, all carried over from a pinned details window nothing ever
opens, in English and Portuguese only.

The hover window now loads notch.html with only its card showing, so it is
the notch's card, drawn by the same renderCard in all of Settings'
languages, with the notch's tail pointing at the hovered ring. In that mode
the page leaves the notch's own window alone: no hot rectangles, no zoom
or DPR reports, no folding and no hover tracking of its own. The window is
the card's 246 px and sits the notch's tail gap above the strip.
"Display: Original notch, Left side, Before system tray" did not say what
was being chosen. The row is now "Show rings in" Notch, Taskbar left or
Taskbar right, and its help line says what the rings do there: hover for
the card, click to refresh, right-click for Settings.

Dropdown lists also follow the chosen appearance: the page declares its
colour scheme, and options get solid colours of their own instead of black
text on Windows' white list.
Moving from one ring to the next made the card jump three times: it waited
the first hover's 140 ms, came up at a default 360 px because the last
account's height had been dropped, then moved again once the new account
had measured itself.

Now it moves as the Mac's card does between cells (NotchMotion.glide): one
card that travels and resizes, not one leaving and another arriving. An
open card switches at once, keeps its height until the new one is in, and
glides to the new ring over 300 ms, its tail on the same curve. It is
pinned to the strip's side of its window, so a new height moves only its
far edge. A card coming up from hidden waits for the page to measure the
new account, so it never shows the last one's contents for a frame.
Moving between rings of different heights flashed for a frame: the window
resized for the new card, and WebView2 redraws a moment after its window
changes size, so for one frame the card was drawn cut off and out of
place. No timing lines the two up.

The window now keeps the tallest card's room whichever card it holds, as
the notch's own window does. Switching rings is a change inside the page,
which lands in one frame, and a move, which never redraws. The card sits
on the strip's side of that room, and the rest of the window lets clicks
through: Rust follows the pointer against the card the page measured, as
it does for the notch, and the pointer on the card holds it open.
The notch's card jumped to the next cell in one frame. On the Mac it is one
card that travels there (NotchMotion.glide), its tail with it, and so it is
here now: an open card moving to another cell glides over 300 ms on the
taskbar card's curve. A card that opens still appears where it belongs, and
reduced motion turns the glide off.

Rust lets clicks through everything outside the hot rectangles, so while
the card travels they are reported each frame, and once more where it
stops.
@RawJat
RawJat requested a review from vinzdg as a code owner October 29, 2026 20:45
@vinzdg
vinzdg merged commit e2f781a into vinzdg:main Nov 5, 2026
5 checks passed
@RawJat
RawJat deleted the fix/windows-taskbar-design branch November 5, 2026 09:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants