Commits
Field 4 of VERSIONINFO becomes a committed, progressive build counter
that increments on every build, for granular build-to-build comparison.
Fields 1-3 (3.0.1) stay manual and remain the only part shown in About.
- version.h: semantic version (single source of truth) + counter include
- TaskbarCalculator.rc2: entire VS_VERSION_INFO, macro-driven, editor-safe
- TaskbarCalculator.rc: version block removed, .rc2 wired via TEXTINCLUDE 3
and the #ifndef APSTUDIO_INVOKED region
- TaskbarCalculator.vcxproj: IncrementBuildCounter target (pre-ResourceCompile)
- BuildCounter.txt: committed counter (seed 1); version_build.h generated + gitignored
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Single-task, single-commit plan: version.h + .rc2 + committed
BuildCounter.txt + MSBuild IncrementBuildCounter target, with .rc
rewiring and double-build verification.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Editor-safe (.rc2 isolation) VERSIONINFO whose 4th field is a
committed, progressive build counter incremented by a pre-build
MSBuild target. Persists across machines via git.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Read the executable's FILEVERSION at runtime (GetFileVersionInfo /
VerQueryValue) and display it in the About dialog instead of a
hardcoded string, so the version has a single source of truth.
- resource.h: add IDC_VERSION control id for the version label
- TaskbarCalculator.rc: give the About version LTEXT the IDC_VERSION id
- AboutDialog.cpp: fill the label in WM_INITDIALOG from VERSIONINFO;
link version.lib
Also carries the pending version bump 3.0.0.0 -> 3.0.1.1.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PlaceInitial() restored the saved window position from the registry without
checking that it still landed on a connected monitor. After detaching an
external display the window ended up off-screen and invisible (ToggleVisible
shows it with SWP_NOMOVE). Validate the target rect with MonitorFromRect
(MONITOR_DEFAULTTONULL); if it intersects no active monitor, discard the
saved position and fall through to the first-run bottom-right anchoring.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
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>
Field 4 of VERSIONINFO becomes a committed, progressive build counter
that increments on every build, for granular build-to-build comparison.
Fields 1-3 (3.0.1) stay manual and remain the only part shown in About.
- version.h: semantic version (single source of truth) + counter include
- TaskbarCalculator.rc2: entire VS_VERSION_INFO, macro-driven, editor-safe
- TaskbarCalculator.rc: version block removed, .rc2 wired via TEXTINCLUDE 3
and the #ifndef APSTUDIO_INVOKED region
- TaskbarCalculator.vcxproj: IncrementBuildCounter target (pre-ResourceCompile)
- BuildCounter.txt: committed counter (seed 1); version_build.h generated + gitignored
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Read the executable's FILEVERSION at runtime (GetFileVersionInfo /
VerQueryValue) and display it in the About dialog instead of a
hardcoded string, so the version has a single source of truth.
- resource.h: add IDC_VERSION control id for the version label
- TaskbarCalculator.rc: give the About version LTEXT the IDC_VERSION id
- AboutDialog.cpp: fill the label in WM_INITDIALOG from VERSIONINFO;
link version.lib
Also carries the pending version bump 3.0.0.0 -> 3.0.1.1.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PlaceInitial() restored the saved window position from the registry without
checking that it still landed on a connected monitor. After detaching an
external display the window ended up off-screen and invisible (ToggleVisible
shows it with SWP_NOMOVE). Validate the target rect with MonitorFromRect
(MONITOR_DEFAULTTONULL); if it intersects no active monitor, discard the
saved position and fall through to the first-run bottom-right anchoring.
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>
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>