Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,6 @@ jobs:
export PATH="$PUB_BIN:$PATH"
npm run setup:flutter

- name: Install Flutter dependencies
run: fvm flutter pub get

- name: Check formatting
run: npm run format:check

Expand Down Expand Up @@ -138,9 +135,6 @@ jobs:
sudo apt-get update
sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev libepoxy-dev libmpv-dev mpv libayatana-appindicator3-dev libunwind-dev

- name: Flutter pub get
run: fvm flutter pub get

- name: Build smoke
shell: bash
env:
Expand Down
5 changes: 3 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@
"UDZO",
"volname",
"xcrun"
]
}
],
"dart.flutterSdkPath": ".fvm/flutter_sdk"
}
23 changes: 16 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
<!-- > [!NOTE]
> 🅱️ This is a Beta build. -->
> [!NOTE]
> 🅱️ This is a Beta build.

# ⬇️ Downloads

| <img height="20" src="https://raw.githubusercontent.com/BurntToasters/bcls/main/media/windows.png" /> Windows | <img height="20" src="https://raw.githubusercontent.com/BurntToasters/bcls/main/media/mac.png" /> macOS | <img height="20" src="https://raw.githubusercontent.com/BurntToasters/bcls/main/media/linux.png" /> Linux |
| :--- | :--- | :--- |
| **MSI:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Windows-x64.msi) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Windows-arm64.msi) --> | **[Universal DMG](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-macOS.dmg)** | **AppImage:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Linux-x86_64.AppImage) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Linux-arm64.AppImage) --> |
| | **[Universal ZIP](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-macOS.zip)** | **DEB:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Linux-amd64.deb) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Linux-arm64.deb) --> |
| | | **RPM:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Linux-x86_64.rpm) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Linux-aarch64.rpm) --> |
| | | **Flatpak:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Linux-x86_64.flatpak) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Linux-aarch64.flatpak) --> |
| | | **TAR (Generic Linux):** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.0/Dacx-Linux-x86_64.tar.gz) |
| **MSI:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Windows-x64.msi) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Windows-arm64.msi) --> | **[Universal DMG](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-macOS.dmg)** | **AppImage:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Linux-x86_64.AppImage) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Linux-arm64.AppImage) --> |
| | **[Universal ZIP](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-macOS.zip)** | **DEB:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Linux-amd64.deb) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Linux-arm64.deb) --> |
| | | **RPM:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Linux-x86_64.rpm) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Linux-aarch64.rpm) --> |
| | | **Flatpak:** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Linux-x86_64.flatpak) <!-- / [arm64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Linux-aarch64.flatpak) --> |
| | | **TAR (Generic Linux):** [x64](https://github.com/BurntToasters/Dacx/releases/download/v0.11.1-beta.1/Dacx-Linux-x86_64.tar.gz) |

> [!IMPORTANT]
> The `.asc` files are my normal GPG signatures which you can verify using my GPG Public Key: https://tuxedo.rosie.run/GPG/BurntToasters_0xF2FBC20F_public.asc.
Expand All @@ -18,6 +18,15 @@

### ℹ️ Enjoying Dacx? Consider [❤️ Supporting Me! ❤️](https://rosie.run/support)

## Changes in `v0.11.1-beta.1:`

- **Fix - Windows tray:** Minimize-to-tray left an empty notification-area slot because the tray API requires a multi-size `.ico`, not a PNG; tray and bundled assets now use `assets/icon/icon.ico` generated from `assets/icon/icon.png`.
- **Fix - macOS tray:** The menu bar tray icon uses a monochrome template PNG (`tray_icon_template.png`) so it renders correctly in light and dark menu bars.
- **Codebase:** `npm run icons:normalize` builds `assets/icon/icon.ico` and copies the same bytes to `windows/runner/resources/app_icon.ico` for the executable and MSI.
- **Codebase:** `npm run setup:flutter` repairs a broken global `fvm` CLI, reinstalls the pinned SDK when kernel checks fail, and runs `flutter pub get` plus `gen-l10n`. VM sync (`npm run vi`, `b`, `r`) and `setup.js` call it after `npm ci` / `npm install`.
- **PKG:** `npm run u2` runs `fvm flutter gen-l10n` after dependency updates so committed l10n outputs stay in sync.
- **PKG:** Updated packages.

## Changes in `v0.11.0:`
- **NEW - Windows code signing:** WOO HOO!! Windows Codesigning is here!
- After a good while of not having it, Windows Binaries are now signed by Azure Artifact Signing!
Expand Down
7 changes: 4 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ Thanks for helping improve Dacx.
## Development setup

1. Install Node.js 22+, Dart (for FVM), and platform build deps per [README.md](README.md).
2. `npm ci && npm run setup:flutter`
3. `fvm flutter pub get`
4. Run locally: `npm run dev` (or `dev:win` / `dev:mac` / `dev:linux`)
2. `npm ci && npm run setup:flutter` — installs or repairs the global `fvm` CLI, pins the Flutter SDK from `.fvmrc`, runs `flutter pub get`, and regenerates l10n (`gen-l10n`). Re-run this if you see `Invalid kernel binary format version` from FVM.
3. Run locally: `npm run dev` (or `dev:win` / `dev:mac` / `dev:linux`)

Run every project Flutter or Dart command through FVM: `fvm flutter ...` or
`fvm dart ...`. Never call the system `flutter` or `dart` directly.

VS Code / Cursor uses `"dart.flutterSdkPath": ".fvm/flutter_sdk"` (see `.vscode/settings.json`). That symlink is recreated when you bump `.fvmrc` and run `npm run setup:flutter` or `fvm use`; you do not edit the version number in settings by hand.

## Quality gates (run before opening a PR)

```bash
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ Dacx is a desktop music and video player focused on speed and low overhead, with
# Install Node.js dependencies (build scripts)
npm install

# Install Flutter dependencies through FVM
fvm flutter pub get
# Install / repair FVM and Flutter (.fvmrc), then fetch packages and l10n
npm run setup:flutter

# Run in development mode
npm run dev
Expand Down
Binary file added assets/icon/icon.ico
Binary file not shown.
Binary file added assets/icon/tray_icon_template.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion docs/QA.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Tick items as you go before a stable cut. Fix failures as they surface rather th
- [ ] Windows: Jump List recents + taskbar progress while playing
- [ ] macOS: File menu + Dock menu New Window / Open; Open Recent → Clear Menu
- [ ] Linux AppImage: Check for Updates mentions AppManager and/or replacing the AppImage; deb/rpm shows package guidance (not “portable”)
- [ ] Minimize to tray (Appearance, off by default): close hides; tray Show restores; tray Quit exits
- [ ] Minimize to tray (Appearance, off by default): close hides; tray icon is visible on Windows and macOS; tray Show restores; tray Quit exits

## Settings / updates

Expand Down
2 changes: 1 addition & 1 deletion flatpak/run.rosie.dacx.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# x-version: 0.11.0
# x-version: 0.11.1-beta.1
app-id: run.rosie.dacx
runtime: org.freedesktop.Platform
runtime-version: "25.08"
Expand Down
37 changes: 20 additions & 17 deletions lib/services/tray_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ import 'dart:async';
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:path/path.dart' as p;
import 'package:tray_manager/tray_manager.dart';
import 'package:window_manager/window_manager.dart';

Expand All @@ -19,26 +17,27 @@ class TrayService with TrayListener {
bool _initialized = false;
String _showLabel = 'Show Dacx';
String _quitLabel = 'Quit';
String? _cachedIconPath;

static bool get isSupported =>
!kIsWeb && (Platform.isWindows || Platform.isMacOS || Platform.isLinux);

bool get isInitialized => _initialized;

/// Materialize the bundled PNG into a temp file (tray APIs need a disk path).
Future<String> _resolveIconPath() async {
if (_cachedIconPath != null && File(_cachedIconPath!).existsSync()) {
return _cachedIconPath!;
/// Bundled asset path passed to [trayManager.setIcon] (relative to flutter_assets).
///
/// Windows loads icons via `LoadImage` with [IMAGE_ICON], so a multi-size `.ico`
/// is required. macOS uses a monochrome template PNG for the menu bar.
@visibleForTesting
static String trayIconAssetPath({bool? isWindows, bool? isMacOS}) {
final onWindows = isWindows ?? Platform.isWindows;
final onMacOS = isMacOS ?? Platform.isMacOS;
if (onWindows) {
return 'assets/icon/icon.ico';
}
final data = await rootBundle.load('assets/icon/icon.png');
final out = File(p.join(Directory.systemTemp.path, 'dacx_tray_icon.png'));
await out.writeAsBytes(
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes),
flush: true,
);
_cachedIconPath = out.path;
return out.path;
if (onMacOS) {
return 'assets/icon/tray_icon_template.png';
}
return 'assets/icon/icon.png';
}

Future<void> init({
Expand All @@ -53,8 +52,12 @@ class TrayService with TrayListener {
return;
}
try {
final icon = await _resolveIconPath();
await trayManager.setIcon(icon);
final iconPath = trayIconAssetPath();
if (Platform.isMacOS) {
await trayManager.setIcon(iconPath, isTemplate: true, iconSize: 22);
} else {
await trayManager.setIcon(iconPath);
}
await trayManager.setToolTip('Dacx');
await _applyMenu();
trayManager.addListener(this);
Expand Down
2 changes: 1 addition & 1 deletion linux/packaging/control.template
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Package: dacx
Version: 0.11.0
Version: 0.11.1~beta.1
Section: sound
Priority: optional
Architecture: amd64
Expand Down
Binary file modified linux/packaging/icons/hicolor/128x128/apps/dacx.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified linux/packaging/icons/hicolor/16x16/apps/dacx.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified linux/packaging/icons/hicolor/256x256/apps/dacx.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified linux/packaging/icons/hicolor/32x32/apps/dacx.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified linux/packaging/icons/hicolor/48x48/apps/dacx.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified linux/packaging/icons/hicolor/512x512/apps/dacx.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified linux/packaging/icons/hicolor/64x64/apps/dacx.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dacx",
"version": "0.11.0",
"version": "0.11.1-beta.1",
"private": true,
"description": "Fast, lightweight cross-platform music and video player for Windows, macOS, and Linux.",
"license": "GPL-3.0-only",
Expand Down Expand Up @@ -74,7 +74,7 @@
"//_r": "WARNING: r resets the current git branch, deletes unstaged files, switches to main and resets it.",
"r": "git fetch origin && git reset --hard && git clean -fd && git switch -C main origin/main && git reset --hard origin/main && git clean -fd && npm run vi && npm run gitprune:force",
"u": "npm update && fvm flutter pub upgrade && npm run sync-version && node scripts/update-metainfo.js && npm run format && npm run test:all",
"u2": "npm update && fvm flutter pub upgrade && npm run sync-version",
"u2": "npm update && fvm flutter pub upgrade && npm run sync-version && fvm flutter gen-l10n",
"win-compiler:x64": "powershell -NoProfile -ExecutionPolicy Bypass -NoExit -Command \"& 'C:\\Program Files\\Microsoft Visual Studio\\18\\Community\\Common7\\Tools\\Launch-VsDevShell.ps1' -SkipAutomaticLocation\"",
"win-compiler:arm64": "powershell -NoProfile -ExecutionPolicy Bypass -NoExit -Command \"& 'C:\\Program Files\\Microsoft Visual Studio\\18\\Community\\Common7\\Tools\\Launch-VsDevShell.ps1' -SkipAutomaticLocation -Arch arm64 -HostArch amd64\"",
"flatpak:bundle": "node scripts/flatpak-bundle.js",
Expand Down
28 changes: 14 additions & 14 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -361,10 +361,10 @@ packages:
dependency: "direct main"
description:
name: package_info_plus
sha256: f5c435dc0e0d461e5b32471a870f769b6a1cc46930637efe24fbc535314e78ad
sha256: "127e1751e37ffb2ff4658beeaca77bad0c27bf5f932bd3a501c2296926d4b481"
url: "https://pub.dev"
source: hosted
version: "10.2.0"
version: "10.2.1"
package_info_plus_platform_interface:
dependency: transitive
description:
Expand Down Expand Up @@ -433,18 +433,18 @@ packages:
dependency: transitive
description:
name: posix
sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07"
sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e
url: "https://pub.dev"
source: hosted
version: "6.5.0"
version: "6.5.2"
safe_local_storage:
dependency: transitive
description:
name: safe_local_storage
sha256: "7483b3d5e8976f0bd263647c03b96131ee8e43f48b56fa8a8ec459e8515d74b0"
sha256: "494b982d5edb71030650ea463d939670e91b232b588323dc75229d2c5f23e7b7"
url: "https://pub.dev"
source: hosted
version: "2.0.4"
version: "2.0.6"
screen_retriever:
dependency: transitive
description:
Expand Down Expand Up @@ -590,10 +590,10 @@ packages:
dependency: transitive
description:
name: synchronized
sha256: "93b153dcb6a26dcddee6ca087dd634b53e38c10b5aa163e8e49501a776456153"
sha256: "61894a1956de6b4fc1aefd0892e109514a1a706cbece3ac59decd90ff5a7a423"
url: "https://pub.dev"
source: hosted
version: "3.4.1"
version: "3.4.1+1"
term_glyph:
dependency: transitive
description:
Expand Down Expand Up @@ -710,10 +710,10 @@ packages:
dependency: transitive
description:
name: uuid
sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489"
sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd"
url: "https://pub.dev"
source: hosted
version: "4.5.3"
version: "4.6.0"
vector_math:
dependency: transitive
description:
Expand All @@ -734,18 +734,18 @@ packages:
dependency: transitive
description:
name: wakelock_plus
sha256: "824c5bba0f800e86d32e57d3d1843c531f090005cc89d9a837933e6601093d53"
sha256: "7253bca0fcf40d8413ddfcf4d2a1fa0a82475e79be25a4f2c564b695c9351486"
url: "https://pub.dev"
source: hosted
version: "1.6.1"
version: "1.7.0"
wakelock_plus_platform_interface:
dependency: transitive
description:
name: wakelock_plus_platform_interface
sha256: b13f99e992e7ae6a152e16c5559d3c07ff445b13330192662494e614ca3e7d7b
sha256: "0618d1799f0b28bcf98255b4ee8313e6fc4d38589dc4ee5fe5840d57d1aff6da"
url: "https://pub.dev"
source: hosted
version: "1.5.1"
version: "1.6.0"
web:
dependency: transitive
description:
Expand Down
5 changes: 3 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: dacx
description: "Quick, lightweight cross-platform media player."
publish_to: 'none'
version: 0.11.0+1100
version: 0.11.1-beta.1+1101

environment:
sdk: ^3.10.7
Expand Down Expand Up @@ -49,4 +49,5 @@ flutter:
assets:
- assets/cacert.pem
- assets/icon/icon.png
- windows/runner/resources/app_icon.ico
- assets/icon/icon.ico
- assets/icon/tray_icon_template.png
5 changes: 5 additions & 0 deletions run.rosie.dacx.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@
<mediatype>application/pls+xml</mediatype>
</provides>
<releases>
<release version="0.11.1-beta.1" date="2026-07-29">
<description>
<p>Fix Windows system tray icon (multi-size ICO). macOS menu bar tray template icon. Unified Windows icon.ico from icon.png. FVM setup repairs SDK and regenerates l10n.</p>
</description>
</release>
<release version="0.11.0" date="2026-07-15"/>
<release version="0.11.0-beta.6" date="2026-07-12"/>
<release version="0.11.0-beta.5" date="2026-07-12"/>
Expand Down
Loading
Loading