Commits
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Describes the app, code layout, build, test, and packaging steps.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Font size chosen by the user to visually match the notification-area
clock; DISPLAY_FONT_PT in VisualStyle.cpp is the single knob.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Update the plan and spec to describe the work-area clamp as per-monitor
(MonitorFromWindow + GetMonitorInfo) rather than SPI_GETWORKAREA, matching
the shipped code. Fix the plan's description of the one-time reinterpreted
saved-position offset: the window appears one caption height higher, not
lower. Add an accepted side effect to the spec: if SetForegroundWindow is
denied when the window is shown (e.g. the single-instance second-launch
path), the window appears chromeless until clicked.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SPI_GETWORKAREA always returns the primary monitor's work area. On a
secondary monitor above the primary (negative y), r.top < work.top was
always true, so every activation toggle teleported the window down to
the primary monitor, and the move stuck. Clamp against the work area
of the monitor the window is actually on via MonitorFromWindow +
GetMonitorInfo, and skip the clamp if GetMonitorInfo fails instead of
clamping against an uninitialized RECT.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
StartupManager now falls back to the Run registry key when the MSIX StartupTask
API is unavailable, so the tray toggle works in the classic installer build and
stays consistent with the installer-set Run value.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CWindowImpl asserts (m_hWnd must be NULL) if the C++ object is deleted while
its HWND is still alive. On Exit the window was only ever hidden (WM_CLOSE),
never destroyed, so 'delete g_calc' tripped the ATL debug assertion. Destroy
the window first.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The window was sized to the text extent only, so the caption consumed the
whole height and the EDIT was invisible. Use AdjustWindowRectEx on the desired
client size (min 160x28), fill the client with the EDIT, shorten the title.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The TaskbarCalculatorSetup.vdproj (VS Setup & Deployment project) is not
supported in VS2022 and is superseded by the MSIX packaging in Packaging/.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- AppxManifest.xml with windows.startupTask (TaskbarCalculatorStartup)
- MakeAssets/MakeCert/BuildMsix scripts, generated logo assets
- gitignore layout/, *.pfx, *.msix
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Delete COM/DeskBand sources, .def, .rgs, .idl, Guids.h, MFC AboutDialog
- Rewrite vcxproj as Application (v143, SDK 26100, C++17, no MIDL)
- Remove REGISTRY .rgs reference from .rc
- Add stub App.cpp with wWinMain
- CalculatorWindow.cpp excluded from build until Task 10 rework
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- CLAUDE.md: repository guidance
- .gitignore: MSIX/VS build output for the migration
- docs/superpowers/specs/2026-07-14-win11-tray-calculator-design.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Original Windows DeskBand shell-extension implementation, imported as the
starting point before the Windows 11 system-tray migration.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Update the plan and spec to describe the work-area clamp as per-monitor
(MonitorFromWindow + GetMonitorInfo) rather than SPI_GETWORKAREA, matching
the shipped code. Fix the plan's description of the one-time reinterpreted
saved-position offset: the window appears one caption height higher, not
lower. Add an accepted side effect to the spec: if SetForegroundWindow is
denied when the window is shown (e.g. the single-instance second-launch
path), the window appears chromeless until clicked.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SPI_GETWORKAREA always returns the primary monitor's work area. On a
secondary monitor above the primary (negative y), r.top < work.top was
always true, so every activation toggle teleported the window down to
the primary monitor, and the move stuck. Clamp against the work area
of the monitor the window is actually on via MonitorFromWindow +
GetMonitorInfo, and skip the clamp if GetMonitorInfo fails instead of
clamping against an uninitialized RECT.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CWindowImpl asserts (m_hWnd must be NULL) if the C++ object is deleted while
its HWND is still alive. On Exit the window was only ever hidden (WM_CLOSE),
never destroyed, so 'delete g_calc' tripped the ATL debug assertion. Destroy
the window first.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Delete COM/DeskBand sources, .def, .rgs, .idl, Guids.h, MFC AboutDialog
- Rewrite vcxproj as Application (v143, SDK 26100, C++17, no MIDL)
- Remove REGISTRY .rgs reference from .rc
- Add stub App.cpp with wWinMain
- CalculatorWindow.cpp excluded from build until Task 10 rework
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>