Conversation
Port the macOS menu bar app to Windows as a C#/.NET 10 WPF tray app with the built-in Fluent theme: Acrylic flyout, Quick Settings style mode tiles, and a monochrome tray glyph that reflects mode and volume. Audio goes straight through Windows Core Audio COM interop; the default device is switched via IPolicyConfig. No third-party runtime dependencies. The priority and auto-switch logic lives in a UI-free Core library covered by xUnit tests. Windows-specific behavior beyond the port: - classify headphones by endpoint form factor, so localized device names (e.g. "Fones de ouvido") are detected - on first run, start in the mode of the current output instead of switching away from a headset in use - reordering visible devices keeps the saved rank of unplugged ones - clicking a device in automatic mode promotes it, as documented The original Swift sources stay in AudioPriorityBar/ as reference.
The Windows app replaces it. Drops the Swift sources, Xcode project, build script, macOS screenshot, and the release workflow, which built the Xcode project and would fail without it. The original lives on upstream and in this repo's history.
feat: rebuild as a native Windows 11 tray app
A ContextMenu inherits font properties from its placement target, so menus opened from icon buttons rendered every label in Segoe Fluent Icons (boxes). Menus now set the UI font explicitly. Checked entries are also marked checkable, which the Fluent MenuItem template needs to draw the check.
- Tint the transient Acrylic backdrop with the theme canvas color, as Windows' own flyouts do; raw DWM Acrylic measured #545454 over bright windows, now tobi#26-#2B in dark and #E3-#E8 in light. - Highlight the active device with an accent pill plus a backplate of the Windows accent color (SystemColors.AccentColor), instead of a neutral fill. - Make rows keyboard operable (Enter, Up/Down, Ctrl+Up/Down to reorder, Shift+F10 for actions), keep the row actions button always visible, and restore 2px focus rings on custom templates. - Mode tiles become a radio group; Comfortable density (44px rows, 40px targets); spacing and type on the system's scales; entrance motion on the system curve, skipped when Windows animations are off. - Record the adoption and its exceptions in DESIGN.md.
Builds and tests on every PR and push. Pushes to main replace a rolling "nightly" pre-release; v* tags publish a versioned release with the tag as the app version. Ships framework-dependent single-file exes for win-x64 and win-arm64. Releases use the gh CLI on the runner instead of a third-party action.
feat: adopt Windows Design System, fix menus, add CI releases
Creating a release in the GitHub UI pushes its tag, which triggered a run whose `gh release create` failed because the release existed. The step now uploads to an existing release and only creates one otherwise.
ci: attach assets when the tagged release already exists
- packaging/build.ps1 publishes a self-contained build per architecture and compiles an Inno Setup installer: per-user (no admin), stable AppId for in-place upgrades, optional Start-with-Windows task that writes the same Run value as the app's toggle, removed on uninstall. - With -Msix it packs an unsigned MSIX for Partner Center from AppxManifest.xml (runFullTrust, opt-in startupTask, x.y.z.0 version) using identity values passed in or read from AUDIOPRIORITY_MSIX_*. - Packaged builds can't use the Run key, so the menu opens Windows' Startup apps settings instead. - CI attaches x64/arm64 installers to releases and uploads the MSIX as an artifact when the Store identity repository variables are set. Mirrors the installer and Store packaging used by sniptype and snipvoice.
feat: add a per-user installer and Microsoft Store package
Match the Microsoft Store reservation (Strateo.AudioTray). User-facing names change: window title, tray menu, error dialog, exe description, installer name, Start menu group, default install folder, and release, installer and MSIX file names. Internal identifiers stay: the exe name, mutex, Run value, settings folder and installer AppId, so v1.0.0 installs upgrade in place and keep their settings and start-with-Windows entry. The installer removes the old "Audio Priority" Start menu group and desktop shortcut.
chore: rename the app to AudioTray
The upload and the release job's download are renamed together; the artifact kept the pre-rename name.
ci: rename the build artifact to AudioTray
Speaker and headphone modes shared one microphone order, so ranking the headset mic for headphones also moved it in speaker mode. Each mode now has its own mic order and ignored mics; switching modes re-applies that mode's top mic. Existing settings seed both profiles from the old shared list.
Author
|
Sorry, Claude's fault! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Testing
dotnet build AudioPriorityTray.slnx: 0 warnings.dotnet test --project tests/AudioPriorityTray.Core.Tests: 37/37 pass. Of the 4 new tests, 3 fail against the old code; the legacy-settings migration test passes on both.Risks
headphoneInputPrioritiesandhiddenHeadphoneMics; older app versions ignore them and keep using the speaker-mode list.