diff --git a/README.md b/README.md index dc31360..a7eb8a2 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ nix run .#package # pure store binary nix run .#package-desktop # pure package via its .desktop ``` -`apps.default` / `apps.desktop` use the **devshell toolchain** (`rustc`/`cargo` + egui libs), stage `usage.desktop` + hicolor icons under `.desktop-share/`, then `gtk-launch usage` so the **app icon** applies. Incremental builds go into `./target/`. +`apps.default` / `apps.desktop` cargo-build, install `usage.desktop` + hicolor icons into **`$XDG_DATA_HOME`** (`~/.local/share` by default — required on Wayland/GNOME; a private share dir is invisible to the shell), refresh icon/desktop caches, then `gtk-launch usage`. The binary also embeds the PNG via `vidya::with_app_icon_id` (used on X11; Wayland window icons come from the FreeDesktop entry). Incremental builds go into `./target/`. Optional interactive shell: diff --git a/flake.nix b/flake.nix index bfdcf74..a0efa87 100644 --- a/flake.nix +++ b/flake.nix @@ -59,19 +59,32 @@ fi ''; - # Stage FreeDesktop share tree (icon + .desktop) for gtk-launch (shell, not nix-build). - installDesktopShare = shareDir: execPath: '' - mkdir -p "${shareDir}/applications" - mkdir -p "${shareDir}/icons/hicolor/scalable/apps" - cp assets/usage.svg "${shareDir}/icons/hicolor/scalable/apps/usage.svg" + # Install FreeDesktop entry + hicolor icons under a share root (usually + # $XDG_DATA_HOME). Wayland compositors (GNOME) look up icons by app_id via + # the *session* data dirs — a temporary XDG_DATA_DIRS on the child alone + # is not enough. Absolute Icon= path is the reliable dock/overview path. + # Shell fragment: $1=shareDir $2=execPath (absolute). + installDesktopShareSh = '' + _share="$1" + _exec="$2" + _icon="$_share/icons/hicolor/256x256/apps/usage.png" + mkdir -p "$_share/applications" + mkdir -p "$_share/icons/hicolor/scalable/apps" + cp assets/usage.svg "$_share/icons/hicolor/scalable/apps/usage.svg" for sz in 16 24 32 48 64 128 256; do - mkdir -p "${shareDir}/icons/hicolor/''${sz}x''${sz}/apps" + mkdir -p "$_share/icons/hicolor/''${sz}x''${sz}/apps" rsvg-convert -w "$sz" -h "$sz" assets/usage.svg \ - -o "${shareDir}/icons/hicolor/''${sz}x''${sz}/apps/usage.png" + -o "$_share/icons/hicolor/''${sz}x''${sz}/apps/usage.png" done - # @EXEC@ is a placeholder in usage.desktop (substitute is nix-build only). - sed "s|@EXEC@|${execPath}|g" usage.desktop \ - > "${shareDir}/applications/usage.desktop" + sed -e "s|@EXEC@|''${_exec}|g" -e "s|@ICON@|''${_icon}|g" usage.desktop \ + > "$_share/applications/usage.desktop" + # Help icon themes / menus pick up the new files this session. + if command -v gtk-update-icon-cache >/dev/null 2>&1; then + gtk-update-icon-cache -f "$_share/icons/hicolor" 2>/dev/null || true + fi + if command -v update-desktop-database >/dev/null 2>&1; then + update-desktop-database "$_share/applications" 2>/dev/null || true + fi ''; in { @@ -119,7 +132,8 @@ install -d $out/share/applications substitute ${./usage.desktop} $out/share/applications/usage.desktop \ - --replace-fail '@EXEC@' "$out/bin/usage" + --replace-fail '@EXEC@' "$out/bin/usage" \ + --replace-fail '@ICON@' "$out/share/icons/hicolor/256x256/apps/usage.png" ''; meta = { @@ -131,13 +145,27 @@ }; }; - # gtk-launch the packaged .desktop (store binary + icon). + # Install store .desktop+icons into the user data home, then gtk-launch. + # (GNOME Shell only resolves icons from session-known data dirs.) desktop = pkgs.writeShellApplication { name = "usage-desktop"; - runtimeInputs = [ pkgs.gtk3 ]; + runtimeInputs = [ + pkgs.gtk3 + pkgs.desktop-file-utils + ]; text = '' set -euo pipefail - export XDG_DATA_DIRS="${usage}/share''${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" + DATA_HOME="''${XDG_DATA_HOME:-$HOME/.local/share}" + mkdir -p "$DATA_HOME/applications" "$DATA_HOME/icons/hicolor" + cp -a ${usage}/share/icons/hicolor/. "$DATA_HOME/icons/hicolor/" + ICON="$DATA_HOME/icons/hicolor/256x256/apps/usage.png" + sed -e "s|^Exec=.*|Exec=${usage}/bin/usage|" \ + -e "s|^Icon=.*|Icon=$ICON|" \ + ${usage}/share/applications/usage.desktop \ + > "$DATA_HOME/applications/usage.desktop" + gtk-update-icon-cache -f "$DATA_HOME/icons/hicolor" 2>/dev/null || true + update-desktop-database "$DATA_HOME/applications" 2>/dev/null || true + export XDG_DATA_DIRS="$DATA_HOME''${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" if command -v gtk-launch >/dev/null 2>&1; then exec gtk-launch usage "$@" fi @@ -165,6 +193,7 @@ pkg-config librsvg gtk3 + desktop-file-utils # update-desktop-database ]; # Local cargo build (devshell tools; no pure sandbox / remote upload lock). @@ -192,8 +221,8 @@ ''; }; - # Cargo build + stage .desktop/icons into .desktop-share, then gtk-launch. - # Primary way to "run the .desktop" from a flake app without a pure rebuild. + # Cargo build, install .desktop+icons into XDG_DATA_HOME (so GNOME/Wayland + # can resolve Icon= by app_id), then gtk-launch. desktopApp = pkgs.writeShellApplication { name = "usage-desktop"; runtimeInputs = cargoTools; @@ -202,14 +231,27 @@ echo "→ cargo build --release" cargo build --release - SHARE="''${USAGE_DESKTOP_SHARE:-$PWD/.desktop-share}" EXEC="$PWD/target/release/usage" + # Session-visible FreeDesktop tree (not a private .desktop-share): + # Wayland shells ignore child-only XDG_DATA_DIRS for dock icons. + DATA_HOME="''${XDG_DATA_HOME:-$HOME/.local/share}" + echo "→ install launcher+icon → $DATA_HOME ({applications,icons}/…)" + ( + set -- "$DATA_HOME" "$EXEC" + ${installDesktopShareSh} + ) + # Mirror under .desktop-share for inspection / CI. + SHARE="''${USAGE_DESKTOP_SHARE:-$PWD/.desktop-share}" rm -rf "$SHARE" mkdir -p "$SHARE" - ${installDesktopShare "$SHARE" "$EXEC"} + ( + set -- "$SHARE" "$EXEC" + ${installDesktopShareSh} + ) - export XDG_DATA_DIRS="$SHARE''${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" - echo "→ gtk-launch usage (Icon=usage, Exec=$EXEC)" + export XDG_DATA_DIRS="$DATA_HOME''${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" + ICON="$DATA_HOME/icons/hicolor/256x256/apps/usage.png" + echo "→ gtk-launch usage (Icon=$ICON, Exec=$EXEC, app_id=usage)" if command -v gtk-launch >/dev/null 2>&1; then exec gtk-launch usage "$@" fi diff --git a/usage.desktop b/usage.desktop index 51c7fe1..c15463a 100644 --- a/usage.desktop +++ b/usage.desktop @@ -4,7 +4,7 @@ Name=I/O Usage GenericName=I/O Gauges Comment=Live disk and network throughput gauges Exec=@EXEC@ -Icon=usage +Icon=@ICON@ Categories=System;Monitor; Keywords=io;disk;network;gauge;throughput;vidya;usage; Terminal=false