aboutsummaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sys/svcs/xdg/default.nix19
-rwxr-xr-xsys/svcs/xdg/scripts/lf-wrapper.sh73
-rwxr-xr-xsys/svcs/xdg/scripts/ranger-wrapper.sh65
3 files changed, 155 insertions, 2 deletions
diff --git a/sys/svcs/xdg/default.nix b/sys/svcs/xdg/default.nix
index 2de640dd..243c7c9d 100644
--- a/sys/svcs/xdg/default.nix
+++ b/sys/svcs/xdg/default.nix
@@ -1,8 +1,23 @@
-{pkgs, ...}: {
+{
+ pkgs,
+ sysLib,
+ ...
+}: {
services.dbus.enable = true;
xdg = {
portal = {
enable = true;
+ termfilechooser = {
+ enable = true;
+ settings = {
+ cmd = sysLib.writeShellScriptWithLibraryAndKeepPath {
+ name = "lf_wrapper";
+ src = ./scripts/lf_wrapper;
+ dependencies = with pkgs; [
+ ];
+ };
+ };
+ };
config = {
common = {
# NOTE: The next entry is supposedly needed for gtk based apps <2023-08-31>
@@ -17,7 +32,7 @@
extraPortals = with pkgs; [
xdg-desktop-portal-gtk
xdg-desktop-portal-wlr
- # xdg-desktop-portal-termfilechooser
+ xdg-desktop-portal-termfilechooser
];
};
};
diff --git a/sys/svcs/xdg/scripts/lf-wrapper.sh b/sys/svcs/xdg/scripts/lf-wrapper.sh
new file mode 100755
index 00000000..58bc37b6
--- /dev/null
+++ b/sys/svcs/xdg/scripts/lf-wrapper.sh
@@ -0,0 +1,73 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="1.9.0" . %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"
+
+cmd="$(command -v lf)"
+termcmd="${TERMINAL:-$(command -v allacritty)}"
+
+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" -- "$cmd" "$@"
+
+if [ "$save" = "1" ] && [ ! -s "$out" ]; then
+ rm "$recommended_path"
+fi
+# vim: ft=sh
diff --git a/sys/svcs/xdg/scripts/ranger-wrapper.sh b/sys/svcs/xdg/scripts/ranger-wrapper.sh
new file mode 100755
index 00000000..a98cff32
--- /dev/null
+++ b/sys/svcs/xdg/scripts/ranger-wrapper.sh
@@ -0,0 +1,65 @@
+#!/bin/sh
+# 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