desktop: one name across all three install channels (issue 2075)
The app answered to three different names depending on how it arrived, and the
part that actually hurt was WM_CLASS. Reading tauri-bundler settles what it is:
the generated .desktop template writes StartupWMClass={{exec}} where exec is
main_binary_name, and tao creates its GtkApplication with a NULL app id
(enableGTKAppId defaults off), so GTK falls back to the program name. WM_CLASS
is the binary name, nothing else.
Which inverts this issue's premise. The rename could not break grouping,
because two channels weren't grouping in the first place: pacman ships
/usr/bin/thoughtsync and the AppImage's AppRun execs thoughtsync-desktop, while
all three hand-written entries hardcoded StartupWMClass=ThoughtSync — a string
no binary in any channel has ever reported. Only the .deb worked, and only
because Tauri generates its entry from the binary and never consulted us.
So: thoughtsync everywhere, carried by the build target itself via Cargo [[bin]]
plus mainBinaryName rather than by the install path, since the target name is
what the desktop reads. The pacman package sheds its -desktop suffix and
declares conflict+replaces so an upgrade retires the old one instead of landing
beside it and fighting over /usr/bin/thoughtsync.
The .deb verifier now asserts binary path, Exec and StartupWMClass all agree,
which is the part that keeps this fixed: the .deb's entry is the one no human
writes, so it's the one that drifts silently.
Package: thought-sync stays. tauri-bundler derives it as kebab-case(productName)
with no override, and rewriting a control archive on every build is a poor trade
for one uninstall command.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,10 @@ version = "0.1.0"
|
||||
description = "ThoughtSync desktop — local-first Keep-style thought capture"
|
||||
authors = ["bvandeusen"]
|
||||
edition = "2021"
|
||||
# The executable is named below, not inferred from this package name. Off so the
|
||||
# inferred `thoughtsync-desktop` target and the explicit one can't both claim
|
||||
# src/main.rs.
|
||||
autobins = false
|
||||
|
||||
# App logic lives in the library (Tauri v2 pattern: a single `run()` entry point
|
||||
# reusable across desktop and any future mobile target); main.rs is a thin shim.
|
||||
@@ -11,6 +15,17 @@ edition = "2021"
|
||||
name = "thoughtsync_desktop_lib"
|
||||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||
|
||||
# The shipped command is `thoughtsync` on every install channel, and the binary's
|
||||
# own name is what the desktop actually keys on: GTK derives the window's WM_CLASS
|
||||
# from it, and Tauri's generated .desktop file writes `StartupWMClass={binary}`.
|
||||
# So the canonical name has to be carried by the build target itself, not just by
|
||||
# the path it gets installed to (issue 2075). The crate stays `thoughtsync-desktop`
|
||||
# — only the executable is renamed. `thoughtsync` is also fixed under kebab-casing,
|
||||
# which the AppImage bundler applies to the binary name on its way in.
|
||||
[[bin]]
|
||||
name = "thoughtsync"
|
||||
path = "src/main.rs"
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2", features = [] }
|
||||
|
||||
|
||||
@@ -85,6 +85,11 @@ pub fn integrate_desktop() -> Result<IntegrationStatus, String> {
|
||||
|
||||
// .desktop launcher -> user applications dir. Icon/Exec are absolute paths, so no
|
||||
// icon-theme lookup is needed.
|
||||
//
|
||||
// StartupWMClass is the exception: it must be the BINARY name, because GTK
|
||||
// derives the window's WM_CLASS from the executable and the desktop matches the
|
||||
// two to group the taskbar icon. Not the product name, and not this AppImage's
|
||||
// filename — AppRun execs `usr/bin/thoughtsync` inside it (issue 2075).
|
||||
let entry = desktop_entry_path().ok_or("Cannot resolve the applications dir.")?;
|
||||
if let Some(parent) = entry.parent() {
|
||||
fs::create_dir_all(parent).map_err(|e| format!("create applications dir: {e}"))?;
|
||||
@@ -98,7 +103,7 @@ pub fn integrate_desktop() -> Result<IntegrationStatus, String> {
|
||||
Icon={icon}\n\
|
||||
Terminal=false\n\
|
||||
Categories=Utility;Office;\n\
|
||||
StartupWMClass=ThoughtSync\n",
|
||||
StartupWMClass=thoughtsync\n",
|
||||
exec = installed.to_string_lossy(),
|
||||
icon = icon.to_string_lossy(),
|
||||
);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "ThoughtSync",
|
||||
"mainBinaryName": "thoughtsync",
|
||||
"version": "0.1.0",
|
||||
"identifier": "com.fabledsword.thoughtsync",
|
||||
"build": {
|
||||
|
||||
Reference in New Issue
Block a user