feat(nix): register desktop entry

This commit is contained in:
juve 2026-07-01 19:36:28 +08:00 committed by GitHub
parent 95e3cb6571
commit 63d991db86
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 58 additions and 4 deletions

View File

@ -178,7 +178,7 @@
fetcherVersion = 3;
# Replace with the correct hash after the first failed build:
# nix build .#dbx-desktop 2>&1 | grep 'got:'
hash = "sha256-08cWt9V2co0/Qij1rX380Z+7tp16HdL6aF8YaGcJvyU=";
hash = "sha256-dzGQuZAv+z7+fha7J180bqfFtJhH0DFDZ/nXy8U4ChM=";
};
# ── Step 2: vendor Cargo dependencies ───────────────────────────── #
@ -203,6 +203,7 @@
# Hooks that wire up the vendored deps automatically:
pkgs.rustPlatform.cargoSetupHook # sets CARGO_HOME to cargoDeps
pkgs.pnpmConfigHook # sets up pnpm offline store
pkgs.desktop-file-utils # for `desktop-file-validate`
]
++ pkgs.lib.optionals pkgs.stdenv.isLinux (
with pkgs;
@ -211,6 +212,33 @@
]
);
# ── Desktop entry (freedesktop .desktop file) ────────────────────── #
# Built with `makeDesktopItem` so it is validated against the spec
# at build time. Icon name "dbx" resolves via the hicolor theme
# (the installPhase copies PNGs into share/icons/hicolor/<size>/apps).
desktopItem = pkgs.makeDesktopItem {
name = "dbx";
type = "Application";
exec = "dbx %u";
icon = "dbx";
desktopName = "DBX";
genericName = "Database Management Tool";
comment = "Open-source database management tool for 60+ databases";
categories = [ "Development" "Database" ];
keywords = [
"database"
"sql"
"client"
"mysql"
"postgresql"
"mongodb"
"redis"
];
startupWMClass = "DBX";
terminal = false;
mimeTypes = [ "application/sql" "x-scheme-handler/dbx" ];
};
# ── Linked libraries (present at both build and runtime) ─────────── #
buildInputs =
(with pkgs; [
@ -283,12 +311,33 @@
# tauri build --no-bundle puts the binary at target/release/dbx
cp target/release/dbx $out/bin/dbx
# Copy desktop integration files if present
# Copy desktop integration files if present.
# Install every PNG size Tauri ships so the hicolor theme lookup
# (e.g. panels @ 48px, launchers @ 128px) always succeeds.
if [ -d src-tauri/icons ]; then
mkdir -p $out/share/icons/hicolor/128x128/apps
cp src-tauri/icons/128x128.png $out/share/icons/hicolor/128x128/apps/dbx.png || true
for size in 32 128; do
if [ -f "src-tauri/icons/''${size}x''${size}.png" ]; then
mkdir -p "$out/share/icons/hicolor/''${size}x''${size}/apps"
cp "src-tauri/icons/''${size}x''${size}.png" \
"$out/share/icons/hicolor/''${size}x''${size}/apps/dbx.png"
fi
done
# @2x retina variant for 128px
if [ -f "src-tauri/icons/128x128@2x.png" ]; then
mkdir -p "$out/share/icons/hicolor/256x256/apps"
cp "src-tauri/icons/128x128@2x.png" \
"$out/share/icons/hicolor/256x256/apps/dbx.png"
fi
fi
# Register the freedesktop .desktop file so app launchers (GNOME
# Shell, KDE Plasma, etc.) can discover the application.
mkdir -p $out/share/applications
cp ${finalAttrs.desktopItem}/share/applications/dbx.desktop \
$out/share/applications/dbx.desktop
${pkgs.desktop-file-utils}/bin/desktop-file-validate \
$out/share/applications/dbx.desktop
runHook postInstall
'';
@ -304,6 +353,11 @@
maintainers = [ ];
platforms = platforms.linux; # macOS/Windows need platform-specific adjustments
mainProgram = "dbx";
} // {
# Non-lib meta: absolute path to the installed .desktop file so
# `nix profile install`/home-manager can register it with the
# user's desktop environment.
desktopFile = "${placeholder "out"}/share/applications/dbx.desktop";
};
});
}