diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 6081f60..e946bf3 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -16,7 +16,7 @@ body:
attributes:
label: QuickPlay version
description: From the settings page (gear in the title bar) or `waveflow-quickplay --version`.
- placeholder: "1.1.0"
+ placeholder: "1.2.0"
validations:
required: true
@@ -84,7 +84,7 @@ body:
label: Steps to reproduce
description: Numbered steps a stranger could follow on a fresh install.
placeholder: |
- 1. Install QuickPlay 1.1.0 with the Windows installer.
+ 1. Install QuickPlay 1.2.0 with the Windows installer.
2. Right-click a 24-bit FLAC → "Play with QuickPlay".
3. Observe the status line.
validations:
diff --git a/Cargo.lock b/Cargo.lock
index 5ce0687..7b9b55e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4782,7 +4782,7 @@ dependencies = [
[[package]]
name = "waveflow-quickplay"
-version = "1.1.0"
+version = "1.2.0"
dependencies = [
"cpal",
"crossbeam-channel",
diff --git a/Cargo.toml b/Cargo.toml
index aa578d4..d812493 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "waveflow-quickplay"
-version = "1.1.0"
+version = "1.2.0"
description = "WaveFlow QuickPlay — a standalone, lightweight egui/eframe audio player built on WaveFlow's Rust audio infrastructure."
authors = ["InstaZDLL "]
edition = "2021"
diff --git a/README.md b/README.md
index 512a241..ae96ad9 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
-
+
@@ -157,7 +157,7 @@ They are complementary, not two sizes of the same thing: QuickPlay deliberately
Artwork · the cover edge to edge, window freely resizable |
-  |
+  |
| Settings · language and about, in the same 154 points |
diff --git a/assets/icon-128.png b/assets/icon-128.png
index db42c5d..35b4739 100644
Binary files a/assets/icon-128.png and b/assets/icon-128.png differ
diff --git a/assets/icon.icns b/assets/icon.icns
index d800bac..9c971b3 100644
Binary files a/assets/icon.icns and b/assets/icon.icns differ
diff --git a/assets/icon.ico b/assets/icon.ico
index d8321ac..f1d8fb8 100644
Binary files a/assets/icon.ico and b/assets/icon.ico differ
diff --git a/docs/releases/v1.2.0.md b/docs/releases/v1.2.0.md
new file mode 100644
index 0000000..2434460
--- /dev/null
+++ b/docs/releases/v1.2.0.md
@@ -0,0 +1,56 @@
+
+
+
+
+# WaveFlow QuickPlay 1.2.0
+
+QuickPlay now keeps itself up to date, pinning works from a Wayland session through XWayland, it takes WaveFlow's new logo, and a full code review brings a round of fixes to playback, the playlist and hand-offs between launches.
+
+## New
+
+- **Automatic updates**: at launch, QuickPlay looks for a newer release. The Windows installer's copy, the macOS app and the AppImage download it in the background, check it against QuickPlay's release key and install it when you close QuickPlay. The next launch is the new version, and nothing that plays is cut. A `.deb` or an `.rpm` only says that the new version is out, with a link to it in the settings, and your package manager installs it. *Check for updates at launch*, at the bottom of the settings page, turns the check off.
+- **Pinning works through XWayland in Wayland sessions**: only the compositor may keep a window on top there, so the pin did nothing. Pinning QuickPlay in a Wayland session now restarts it under XWayland, where the pin works (GNOME, KDE) and the playlist docks to the player again. The queue, the track, the position and the play or pause state carry over. Unpinning goes back to Wayland. The pin's tooltip says what a click will do, or why a session without XWayland cannot pin.
+- **WaveFlow's new logo**: the W of its name drawn as a wave replaces the three bars, in the title bar, the settings, the *Continue in WaveFlow* button and the app icon on every system.
+
+## Fixed
+
+- **Headphones in or out no longer stop playback on macOS.** A change of the default output was taken for a lost device: the engine was released and the track stopped. Playback now follows the new output.
+- **Next after deleting the current track** plays the track that moved up into its place. It skipped it, and shuffle skipped it too.
+- **Stop, Clear and removing the playing track stay that way.** The end of the previous track, or an error, arriving at the same moment could start another one.
+- **A device that cannot be opened** shows the reason instead of leaving the player stuck on Loading.
+- **Resuming a track paused in its last second** after more than five seconds no longer cuts what was left of it.
+- **The spectrum keeps moving** on mono and low-rate output devices, where it froze for the whole track.
+- **Steady playlist scrolling**: the list no longer jumps while scrolling, nor stops short of the bottom of a tall window.
+- **The settings header fits** a 320-point window: the language picker no longer runs over the title.
+- **A launch no longer hangs** behind another program that connects to QuickPlay and sends nothing. A file name that is not valid Unicode or holds a line break opens in a window of its own instead of being mangled.
+- **Lyrics**: a damaged `.lrc` can no longer freeze the window, an invalid `[offset:]` no longer resets the timing, and a sidecar named `.LRC` is found on Linux.
+- **Linux packages** declare the system libraries they need, so an older distribution refuses the package at install instead of QuickPlay failing at launch.
+- **`SHA256SUMS-windows.txt`** now has Unix line ends, so `sha256sum -c` checks the installer on Linux and macOS.
+
+## Changed
+
+- The licence is **GPL-3.0-only**, as `Cargo.toml` and the packages already said; the README no longer offers "any later version".
+- An unknown `--option` on the command line is logged and ignored instead of being opened as a file.
+
+## Install
+
+- **Windows**: download `waveflow-quickplay_1.2.0_x64-setup.exe`. It installs for the current user without administrator rights and registers the context-menu entries. Run it over 1.1.0 to upgrade; your settings live in their own file and are kept.
+- **Linux**: the `.deb` for Debian and Ubuntu, the `.rpm` for Fedora, RHEL and openSUSE, or the `.AppImage` for any distribution (make it executable and run it). All three carry the desktop entry, so QuickPlay appears in "Open with" for audio files.
+- **macOS**: download `waveflow-quickplay_1.2.0_macos-universal.dmg`, open it and drag *WaveFlow QuickPlay* to Applications. The app is signed ad hoc, not by an Apple Developer ID, so macOS blocks the first launch: open System Settings › Privacy & Security and choose *Open Anyway* (on macOS 14 and earlier, right-click the app and choose *Open*).
+
+1.0.0 and 1.1.0 do not look for updates, so this version is installed by hand once. From 1.2.0 on, the Windows, macOS and AppImage copies update themselves.
+
+SHA-256 checksums are in `SHA256SUMS-windows.txt`, `SHA256SUMS-linux.txt` and `SHA256SUMS-macos.txt`. `latest.json` is what the updater reads: it lists each package with its signature.
+
+> [!NOTE]
+> The Windows installer is signed with WaveFlow's self-signed certificate, so Windows may still show a SmartScreen warning on first launch.
+
+## Known limitations
+
+- **Pinned on Wayland**, QuickPlay runs under XWayland, which can look softer at fractional scaling unless the compositor scales X11 windows natively. A session without XWayland cannot pin.
+- A `.deb`, an `.rpm` and a copy run from a read-only place (the disk image itself, or an app macOS runs from a translocated copy because it was not moved to Applications) are never replaced by QuickPlay: they only say that a new version is out.
+- On macOS, Finder has no per-app menu entries, so there is no *Add to QuickPlay playlist* there; *Open With* replaces the queue, as *Play with* does on Windows.
+- **Continue in WaveFlow** needs WaveFlow Desktop 2.0.0-beta.1 or later, read from the install's metadata. The button stays hidden for an older WaveFlow, for one whose version cannot be read (such as an AppImage put on `PATH` by hand), and for the Flatpak build, whose sandbox cannot see the hand-over file.
+- The output device is the system default, opened in shared mode.
+
+**Full changelog**: https://github.com/InstaZDLL/waveflow-quickplay/compare/v1.1.0...v1.2.0
diff --git a/docs/screenshots/player-and-playlist.png b/docs/screenshots/player-and-playlist.png
index 5998b72..4338b49 100644
Binary files a/docs/screenshots/player-and-playlist.png and b/docs/screenshots/player-and-playlist.png differ
diff --git a/docs/screenshots/player-compact.png b/docs/screenshots/player-compact.png
index c6950bf..cc7b5c9 100644
Binary files a/docs/screenshots/player-compact.png and b/docs/screenshots/player-compact.png differ
diff --git a/docs/screenshots/player-expanded.png b/docs/screenshots/player-expanded.png
index ebd2afd..149e509 100644
Binary files a/docs/screenshots/player-expanded.png and b/docs/screenshots/player-expanded.png differ
diff --git a/docs/screenshots/settings.png b/docs/screenshots/settings.png
index ad82c65..daa23c3 100644
Binary files a/docs/screenshots/settings.png and b/docs/screenshots/settings.png differ
diff --git a/src/ui/icons.rs b/src/ui/icons.rs
index 4693072..36eb334 100644
--- a/src/ui/icons.rs
+++ b/src/ui/icons.rs
@@ -25,7 +25,7 @@ pub enum Icon {
Close,
/// A gear.
Settings,
- /// WaveFlow's three bars.
+ /// WaveFlow's mark: the W of its name drawn as a wave.
Logo,
/// Two arrows chasing each other round a circle.
Repeat,
@@ -218,13 +218,23 @@ pub fn paint(painter: &Painter, rect: Rect, icon: Icon, color: Color32) {
painter.circle_stroke(c, u(0.10), stroke);
}
Icon::Logo => {
- for (x, h) in [(-0.30_f32, 0.30_f32), (0.0, 0.46), (0.30, 0.22)] {
- painter.rect_filled(
- Rect::from_center_size(p(x, 0.0), vec2(u(0.16), u(2.0 * h))),
- 1.0,
- color,
- );
- }
+ // WaveFlow's small-size symbol, in its 256 box: one and a half
+ // periods of a sine from x 35 to 221 about y 124 (4 above the
+ // middle, the optical centre), amplitude 60, stroked at 46 with
+ // round ends. Its ends sit on the inflection points, so it
+ // reads W and not M.
+ let at = |x: f32, y: f32| p((x - 128.0) / 256.0, (y - 128.0) / 256.0);
+ let points: Vec = (0..=48)
+ .map(|i| {
+ let x = 35.0 + 186.0 * i as f32 / 48.0;
+ let y = 124.0 + 60.0 * (std::f32::consts::PI * (x - 35.0) / 62.0).sin();
+ at(x, y)
+ })
+ .collect();
+ let width = u(46.0 / 256.0);
+ painter.circle_filled(points[0], width / 2.0, color);
+ painter.circle_filled(points[points.len() - 1], width / 2.0, color);
+ painter.add(Shape::line(points, Stroke::new(width, color)));
}
Icon::Warning => {
painter.add(Shape::convex_polygon(