aboutsummaryrefslogtreecommitdiffstats
path: root/modules/by-name/xd/xdg
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--modules/by-name/xd/xdg/module.nix179
-rwxr-xr-xmodules/by-name/xd/xdg/scripts/lf-wrapper.sh50
-rwxr-xr-xmodules/by-name/xd/xdg/scripts/lf_wrapper.sh79
-rwxr-xr-xmodules/by-name/xd/xdg/scripts/ranger_wrapper.sh68
-rwxr-xr-xmodules/by-name/xd/xdg/scripts/url-handler.sh29
5 files changed, 219 insertions, 186 deletions
diff --git a/modules/by-name/xd/xdg/module.nix b/modules/by-name/xd/xdg/module.nix
index 5140a832..9430d82f 100644
--- a/modules/by-name/xd/xdg/module.nix
+++ b/modules/by-name/xd/xdg/module.nix
@@ -1,58 +1,159 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
{
pkgs,
- nixpkgs_open_prs,
- sysLib,
- system,
+ lib,
+ config,
...
}: let
- pkgs_tfc = nixpkgs_open_prs.nixpkgs-tfc.legacyPackages."${system}";
+ lf-wrapper = pkgs.writeShellApplication {
+ name = "lf-wrapper";
+
+ runtimeInputs = [pkgs.lf pkgs.alacritty];
+ inheritPath = true;
+
+ text = builtins.readFile ./scripts/lf-wrapper.sh;
+ };
+
+ url-handler = pkgs.writeShellApplication {
+ name = "url-handler";
+
+ runtimeInputs = [pkgs.rofi pkgs.libnotify pkgs.zathura pkgs.tskm];
+
+ # We need to run the browser in tskm or nvim and alacritty.
+ inheritPath = true;
+
+ text = builtins.readFile ./scripts/url-handler.sh;
+ };
+
+ tfcConfigFile = (pkgs.formats.ini {}).generate "xdg-desktop-portal-termfilechooser.ini" {
+ filechooser = {
+ default_dir = "/tmp";
+ cmd = "${lib.getExe lf-wrapper}";
+ };
+ };
+
+ cfg = config.soispha.xdg;
+
+ inherit (config.home-manager.users.soispha.home) homeDirectory;
in {
- services.dbus.enable = true;
- xdg = {
- portal = {
+ options.soispha.xdg = {
+ enable = lib.mkEnableOption "xdg";
+ };
+
+ config = lib.mkIf cfg.enable {
+ home-manager.users.soispha.xdg = {
enable = true;
- termfilechooser = {
+
+ configFile."xdg-desktop-portal-termfilechooser/config".source = tfcConfigFile;
+
+ configHome = "${homeDirectory}/.config";
+ dataHome = "${homeDirectory}/.local/share";
+ stateHome = "${homeDirectory}/.local/state";
+ cacheHome = "${homeDirectory}/.cache";
+
+ userDirs = {
enable = true;
- logLevel = "TRACE";
- package = pkgs_tfc.xdg-desktop-portal-termfilechooser;
- settings = {
- filechooser = {
- default_dir = "/tmp";
- cmd = "${sysLib.writeShellScript {
- src = ./scripts/lf_wrapper.sh;
- name = "lf_wrapper";
- keepPath = true;
- dependencies = with pkgs; [
- lf
- alacritty
- bash
- ];
- }}/bin/lf_wrapper";
- };
+
+ # TODO: We shouldn't build on these variables to exist, but currently my config
+ # might expect them. So let's just keep it. See here for a full explanation:
+ # https://github.com/nix-community/home-manager/pull/7937#issuecomment-3372232126
+ # <2026-04-14>
+ setSessionVariables = true;
+
+ createDirectories = true;
+
+ documents = "${homeDirectory}/documents/general";
+ download = "/tmp/download";
+ music = "${homeDirectory}/media/music";
+ pictures = "${homeDirectory}/media/pictures";
+ videos = "${homeDirectory}/media/videos";
+ projects = "${homeDirectory}/repos";
+
+ templates = null;
+ publicShare = null;
+ desktop = null;
+ };
+
+ desktopEntries = {
+ url-handler = {
+ name = "url-handler";
+ genericName = "Web Browser";
+ exec = "${lib.getExe url-handler} %u";
+ terminal = false;
+ categories = [
+ "Application"
+ "Network"
+ "WebBrowser"
+ ];
+ mimeType = [
+ "text/html"
+ "text/xml"
+ "x-scheme-handler/http"
+ "x-scheme-handler/https"
+ "x-scheme-handler/about"
+ "x-scheme-handler/unknown"
+ ];
};
};
- wlr = {
+ };
+
+ xdg = {
+ mime = {
enable = true;
+ defaultApplications = {
+ "application/pdf" = ["url-handler.desktop"];
+ "application/x-pdf" = ["url-handler.desktop"];
+
+ "text/html" = ["url-handler.desktop"];
+ "text/xml" = ["url-handler.desktop"];
+ "x-scheme-handler/http" = ["url-handler.desktop"];
+ "x-scheme-handler/https" = ["url-handler.desktop"];
+ "x-scheme-handler/about" = ["url-handler.desktop"];
+ "x-scheme-handler/unknown" = ["url-handler.desktop"];
+ };
};
- config = {
- common = {
- # NOTE: The next entry is supposedly needed for gtk based apps <2023-08-31>
- default = ["wlr" "gtk"];
- "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
+
+ portal = {
+ enable = true;
+ wlr = {
+ enable = true;
};
- # TODO: Also activate, when on another wlr-based compositor <2023-11-25>
- river = {
- default = ["wlr" "gtk"];
- "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
+ config = {
+ common = {
+ default = ["wlr"];
+ "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
+ };
+
+ # TODO: Also activate, when on another wlr-based compositor <2023-11-25>
+ river = {
+ default = ["wlr"];
+ "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
+ };
};
+
+ extraPortals = [
+ pkgs.xdg-desktop-portal-wlr
+ pkgs.xdg-desktop-portal-termfilechooser
+ ];
};
- extraPortals = [
- pkgs.xdg-desktop-portal-gtk
- pkgs.xdg-desktop-portal-wlr
- pkgs_tfc.xdg-desktop-portal-termfilechooser
+ };
+
+ services.dbus.enable = true;
+
+ systemd.user.services.xdg-desktop-portal-termfilechooser = {
+ serviceConfig.ExecStart = [
+ ""
+ "${pkgs.xdg-desktop-portal-termfilechooser}/libexec/xdg-desktop-portal-termfilechooser --loglevel=TRACE"
];
};
};
- # TODO: mime = {};
}
diff --git a/modules/by-name/xd/xdg/scripts/lf-wrapper.sh b/modules/by-name/xd/xdg/scripts/lf-wrapper.sh
new file mode 100755
index 00000000..6a5c5295
--- /dev/null
+++ b/modules/by-name/xd/xdg/scripts/lf-wrapper.sh
@@ -0,0 +1,50 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# This wrapper script is invoked by xdg-desktop-portal-termfilechooser.
+#
+# For more information about input/output arguments read `xdg-desktop-portal-termfilechooser(5)`
+
+set -ex
+
+multiple="$1"
+directory="$2"
+save="$3"
+path="$4"
+out="$5"
+
+# echo > /tmp/stdout
+# echo > /tmp/stderr
+#
+# exec 1>> /tmp/stdout
+# exec 2>> /tmp/stderr
+
+if [ "$save" = "1" ]; then
+ # save a file
+ set -- -selection-path="$out" -command='set promptfmt "Select the file to write to %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$path"
+elif [ "$directory" = "1" ]; then
+ # upload files from a directory
+ set -- -last-dir-path="$out" -command='set dironly' -command='set promptfmt "Select directory (quit in dir to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$path"
+elif [ "$multiple" = "1" ]; then
+ # upload multiple files
+ set -- -selection-path="$out" -command='set promptfmt "Select file(s) (open file to select it; <Space> to select multiple) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$path"
+else
+ # upload only 1 file
+ set -- -selection-path="$out" -command='set promptfmt "Select file (open file to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$path"
+fi
+
+alacritty --title 'floating please' -e lf "$@"
+
+# Delete the left recommended file, if we did not actually save anything.
+if [ "$save" = "1" ] && ! [ -s "$out" ]; then
+ rm "$path"
+fi
diff --git a/modules/by-name/xd/xdg/scripts/lf_wrapper.sh b/modules/by-name/xd/xdg/scripts/lf_wrapper.sh
deleted file mode 100755
index 16603fe4..00000000
--- a/modules/by-name/xd/xdg/scripts/lf_wrapper.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# This wrapper script is invoked by xdg-desktop-portal-termfilechooser.
-#
-# Inputs:
-# 1. "1" if multiple files can be chosen, "0" otherwise.
-# 2. "1" if a directory should be chosen, "0" otherwise.
-# 3. "0" if opening files was requested, "1" if writing to a file was
-# requested. For example, when uploading files in Firefox, this will be "0".
-# When saving a web page in Firefox, this will be "1".
-# 4. If writing to a file, this is recommended path provided by the caller. For
-# example, when saving a web page in Firefox, this will be the recommended
-# path Firefox provided, such as "~/Downloads/webpage_title.html".
-# Note that if the path already exists, we keep appending "_" to it until we
-# get a path that does not exist.
-# 5. The output path, to which results should be written.
-#
-# Output:
-# The script should print the selected paths to the output path (argument #5),
-# one path per line.
-# If nothing is printed, then the operation is assumed to have been canceled.
-
-multiple="$1"
-directory="$2"
-save="$3"
-recommended_path="$4"
-out="$5"
-
-# echo > /tmp/stdout
-# echo > /tmp/stderr
-#
-# exec 1>> /tmp/stdout
-# exec 2>> /tmp/stderr
-
-cmd="$(command -v lf)"
-termcmd="${TERMINAL:-$(command -v alacritty)}"
-
-if [ "$save" = "1" ]; then
- set -- -selection-path="$out" -command='set promptfmt "Select the file to write to %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$recommended_path"
- cat <<EOF >"$recommended_path"
-xdg-desktop-portal-termfilechooser saving files tutorial
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!! === WARNING! === !!!
-!!! The contents of *whatever* file you open last in !!!
-!!! lf will be *overwritten*! !!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-Instructions:
-1) Move this file wherever you want.
-2) Rename the file if needed.
-3) Confirm your selection by opening the file, for
- example by pressing <Enter>.
-
-Notes:
-1) This file is provided for your convenience. You
- could delete it and choose another file to overwrite
- that, for example.
-2) If you quit lf without opening a file, this file
- will be removed and the save operation aborted.
-EOF
-
-elif [ "$directory" = "1" ]; then
- set -- -selection-path="$out" -command='set dironly' -command='set promptfmt "Select directory (quit in dir to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"'
-elif [ "$multiple" = "1" ]; then
- set -- -selection-path="$out" -command='set promptfmt "Select file(s) (open file to select it; <Space> to select multiple) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"'
-else
- set -- -selection-path="$out" -command='set promptfmt "Select file (open file to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"'
-fi
-
-"$termcmd" --title 'floating please' -e "$cmd" "$@"
-
-if [ "$save" = "1" ] && [ ! -s "$out" ]; then
- rm "$recommended_path"
-fi
-# vim: ft=sh
diff --git a/modules/by-name/xd/xdg/scripts/ranger_wrapper.sh b/modules/by-name/xd/xdg/scripts/ranger_wrapper.sh
deleted file mode 100755
index e148bf19..00000000
--- a/modules/by-name/xd/xdg/scripts/ranger_wrapper.sh
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-# This wrapper script is invoked by xdg-desktop-portal-termfilechooser.
-#
-# Inputs:
-# 1. "1" if multiple files can be chosen, "0" otherwise.
-# 2. "1" if a directory should be chosen, "0" otherwise.
-# 3. "0" if opening files was requested, "1" if writing to a file was
-# requested. For example, when uploading files in Firefox, this will be "0".
-# When saving a web page in Firefox, this will be "1".
-# 4. If writing to a file, this is recommended path provided by the caller. For
-# example, when saving a web page in Firefox, this will be the recommended
-# path Firefox provided, such as "~/Downloads/webpage_title.html".
-# Note that if the path already exists, we keep appending "_" to it until we
-# get a path that does not exist.
-# 5. The output path, to which results should be written.
-#
-# Output:
-# The script should print the selected paths to the output path (argument #5),
-# one path per line.
-# If nothing is printed, then the operation is assumed to have been canceled.
-
-multiple="$1"
-directory="$2"
-save="$3"
-path="$4"
-out="$5"
-
-cmd="$(command -v ranger)"
-termcmd="${TERMCMD:-$(command -v kitty)}"
-
-if [ "$save" = "1" ]; then
- set -- --choosefile="$out" --cmd='echo Select save path (see tutorial in preview pane; try pressing zv or zp if no preview)' "$path"
- printf '%s' 'xdg-desktop-portal-termfilechooser saving files tutorial
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!! === WARNING! === !!!
-!!! The contents of *whatever* file you open last in !!!
-!!! ranger will be *overwritten*! !!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-Instructions:
-1) Move this file wherever you want.
-2) Rename the file if needed.
-3) Confirm your selection by opening the file, for
- example by pressing <Enter>.
-
-Notes:
-1) This file is provided for your convenience. You
- could delete it and choose another file to overwrite
- that, for example.
-2) If you quit ranger without opening a file, this file
- will be removed and the save operation aborted.
-' >"$path"
-elif [ "$directory" = "1" ]; then
- set -- --choosedir="$out" --show-only-dirs --cmd="echo Select directory (quit in dir to select it)"
-elif [ "$multiple" = "1" ]; then
- set -- --choosefiles="$out" --cmd="echo Select file(s) (open file to select it; <Space> to select multiple)"
-else
- set -- --choosefile="$out" --cmd="echo Select file (open file to select it)"
-fi
-
-"$termcmd" -- "$cmd" "$@"
-if [ "$save" = "1" ] && [ ! -s "$out" ]; then
- rm "$path"
-fi
diff --git a/modules/by-name/xd/xdg/scripts/url-handler.sh b/modules/by-name/xd/xdg/scripts/url-handler.sh
new file mode 100755
index 00000000..b3563349
--- /dev/null
+++ b/modules/by-name/xd/xdg/scripts/url-handler.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+project="$({
+ tskm projects list
+ printf "%s\n" nvim zathura
+} | rofi -sep "$(printf "\n")" -dmenu)"
+
+if [ "$project" = "nvim" ]; then
+ "$TERMINAL" -e nvim "$1"
+elif [ "$project" = "zathura" ]; then
+ zathura "$1"
+elif [ "$project" ]; then
+ tskm open project "$project" "$1"
+else
+ notify-send "(URL HANDLER) No project selected"
+ exit 1
+fi
+
+# vim: ft=sh