From d54b0024dd0f4eb118ce56f830028c5eba82475c Mon Sep 17 00:00:00 2001 From: Daniel Fichtinger Date: Sun, 2 Feb 2025 22:00:03 -0500 Subject: [PATCH] AutoYADM commit: 2025-02-02 22:00:02 --- .../xdg-desktop-portal-termfilechooser/config | 6 +- .../yazi-wrapper.sh | 102 ++++++++++++++++++ 2 files changed, 105 insertions(+), 3 deletions(-) create mode 100755 .config/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh diff --git a/.config/xdg-desktop-portal-termfilechooser/config b/.config/xdg-desktop-portal-termfilechooser/config index f5675e99..f4741d4b 100755 --- a/.config/xdg-desktop-portal-termfilechooser/config +++ b/.config/xdg-desktop-portal-termfilechooser/config @@ -1,5 +1,5 @@ [filechooser] -cmd=yazi-wrapper.sh -default_dir=$HOME/Downloads +cmd=/usr/local/share/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh +default_dir=$HOME ; Uncomment and edit the line below to change the terminal emulator command -; env=TERMCMD=foot +env=TERMCMD=foot diff --git a/.config/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh b/.config/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh new file mode 100755 index 00000000..a8588f35 --- /dev/null +++ b/.config/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash + +set -x + +# 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="yazi" +# "wezterm start --always-new-process" if you use wezterm +termcmd="${TERMCMD:-foot}" +# change this to "/tmp/xxxxxxx/.last_selected" if you only want to save last selected location +# in session (flushed after reset device) +last_selected_path_cfg="${XDG_STATE_HOME:-$HOME/.local/state}/xdg-desktop-portal-termfilechooser/last_selected" +mkdir -p "$(dirname "$last_selected_path_cfg")" +if [ ! -f "$last_selected_path_cfg" ]; then + touch "$last_selected_path_cfg" +fi +last_selected="$(cat "$last_selected_path_cfg")" + +# Restore last selected path +if [ -d "$last_selected" ]; then + save_to_file="" + if [ "$save" = "1" ]; then + save_to_file="$(basename "$path")" + path="${last_selected}/${save_to_file}" + else + path="${last_selected}" + fi +fi +if [[ -z "$path" ]]; then + path="$HOME" +fi + +if [ "$save" = "1" ]; then + # Save/download file + printf '%s' 'xdg-desktop-portal-termfilechooser saving files tutorial + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!! === WARNING! === !!! +!!! The contents of *whatever* file you open last in !!! +!!! yazi 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 . + +Notes: +1) This file is provided for your convenience. You + could delete it and choose another file to overwrite + that. +2) If you quit yazi without opening a file, this file + will be removed and the save operation aborted. +' >"$path" + set -- --chooser-file="$out" --cwd-file="$last_selected_path_cfg" "$path" +elif [ "$directory" = "1" ]; then + # upload files from a directory + set -- --cwd-file="$out" "$path" +elif [ "$multiple" = "1" ]; then + # upload multiple files + set -- --chooser-file="$out" --cwd-file="$last_selected_path_cfg" "$path" +else + # upload only 1 file + set -- --chooser-file="$out" --cwd-file="$last_selected_path_cfg" "$path" +fi + +$termcmd -- $cmd "$@" + +# Save the last selected path for the next time, only upload files from a directory operation is need +# because `--cwd-file` will do the same thing for files(s) upload and download operations +if [ "$save" = "0" ] && [ "$directory" = "1" ]; then + echo "$(head -n 1 <"$out")" >"$last_selected_path_cfg" +fi + +# Remove file if the save operation aborted +if [ "$save" = "1" ] && [ ! -s "$out" ]; then + rm "$path" +fi