From 05344eb6609807399a43fd6339564559d4e50c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rcio?= <32399614+marciobbj@users.noreply.github.com> Date: Fri, 3 Apr 2026 06:00:09 -0300 Subject: [PATCH] Add LocalSend send action in Nautilus (#4946) * Add LocalSend send action in Nautilus * Reuse Nautilus install script in migration * Detect LocalSend via PATH * Verify Flatpak LocalSend is installed * Check Flatpak LocalSend with flatpak info --- .../nautilus-python/extensions/localsend.py | 84 +++++++++++++++++++ install/config/all.sh | 1 + install/config/nautilus-python.sh | 4 + migrations/1773017819.sh | 3 + 4 files changed, 92 insertions(+) create mode 100644 default/nautilus-python/extensions/localsend.py create mode 100644 install/config/nautilus-python.sh create mode 100644 migrations/1773017819.sh diff --git a/default/nautilus-python/extensions/localsend.py b/default/nautilus-python/extensions/localsend.py new file mode 100644 index 00000000..aaf44408 --- /dev/null +++ b/default/nautilus-python/extensions/localsend.py @@ -0,0 +1,84 @@ +import os +import shutil + +from gi import require_version + +require_version("Nautilus", "4.1") + +from gi.repository import GObject, Gio, Nautilus + + +class SendViaLocalSendAction(GObject.GObject, Nautilus.MenuProvider): + def _launch_localsend(self, paths): + command = self._resolve_command() + if not command: + return + + if command[-1] == "@@": + command = command + paths + ["@@"] + else: + command = command + paths + + Gio.Subprocess.new(command, Gio.SubprocessFlags.NONE) + + def _resolve_command(self): + localsend = shutil.which("localsend") + if localsend: + return [localsend, "--headless", "send"] + + flatpak = shutil.which("flatpak") + if flatpak and self._has_flatpak_app(flatpak, "org.localsend.localsend_app"): + return [ + flatpak, + "run", + "--file-forwarding", + "org.localsend.localsend_app", + "@@", + ] + + return None + + def _has_flatpak_app(self, flatpak, app_id): + process = Gio.Subprocess.new( + [flatpak, "info", app_id], + Gio.SubprocessFlags.STDOUT_SILENCE | Gio.SubprocessFlags.STDERR_SILENCE, + ) + return process.wait_check() + + def _selected_paths(self, files): + paths = [] + + for file in files: + location = file.get_location() + if not location: + continue + + path = location.get_path() + if path and path not in paths: + paths.append(path) + + return paths + + def _make_item(self, paths): + label = ( + "Send via LocalSend" if len(paths) == 1 else "Send selected via LocalSend" + ) + item = Nautilus.MenuItem( + name="LocalSendNautilus::send_via_localsend", + label=label, + icon="localsend", + ) + item.connect("activate", self._on_activate, paths) + return item + + def _on_activate(self, _menu, paths): + self._launch_localsend(paths) + + def get_file_items(self, *args): + files = args[0] if len(args) == 1 else args[1] + paths = self._selected_paths(files) + + if not paths or not self._resolve_command(): + return [] + + return [self._make_item(paths)] diff --git a/install/config/all.sh b/install/config/all.sh index 716a1971..79383094 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -14,6 +14,7 @@ run_logged $OMARCHY_INSTALL/config/mise-work.sh run_logged $OMARCHY_INSTALL/config/fix-powerprofilesctl-shebang.sh run_logged $OMARCHY_INSTALL/config/docker.sh run_logged $OMARCHY_INSTALL/config/mimetypes.sh +run_logged $OMARCHY_INSTALL/config/nautilus-python.sh run_logged $OMARCHY_INSTALL/config/remove-fcitx5-autostart.sh run_logged $OMARCHY_INSTALL/config/localdb.sh run_logged $OMARCHY_INSTALL/config/walker-elephant.sh diff --git a/install/config/nautilus-python.sh b/install/config/nautilus-python.sh new file mode 100644 index 00000000..fd2ef0f7 --- /dev/null +++ b/install/config/nautilus-python.sh @@ -0,0 +1,4 @@ +EXTENSIONS_DIR="$HOME/.local/share/nautilus-python/extensions" + +mkdir -p "$EXTENSIONS_DIR" +cp "$OMARCHY_PATH/default/nautilus-python/extensions/localsend.py" "$EXTENSIONS_DIR/" diff --git a/migrations/1773017819.sh b/migrations/1773017819.sh new file mode 100644 index 00000000..b4a1d36e --- /dev/null +++ b/migrations/1773017819.sh @@ -0,0 +1,3 @@ +echo "Add LocalSend entry to Nautilus context menu" + +source $OMARCHY_PATH/install/config/nautilus-python.sh