From c256d7ded50eeeebde4f5c7754f1399866132c91 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 15 Dec 2023 20:52:47 +0000 Subject: [PATCH] koreader: implement copy-to-clipboard --- .../2-02-colin-impl-clipboard-ops.lua | 40 +++++++++++++++++++ hosts/common/programs/koreader/default.nix | 6 ++- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 hosts/common/programs/koreader/2-02-colin-impl-clipboard-ops.lua diff --git a/hosts/common/programs/koreader/2-02-colin-impl-clipboard-ops.lua b/hosts/common/programs/koreader/2-02-colin-impl-clipboard-ops.lua new file mode 100644 index 00000000..12343933 --- /dev/null +++ b/hosts/common/programs/koreader/2-02-colin-impl-clipboard-ops.lua @@ -0,0 +1,40 @@ +local logger = require("logger") +logger.info("applying colin patch colin-impl-clipboard") + +-- source: +local function shescape(arg) + if arg:match("[^A-Za-z0-9_/:=-]") then + arg = "'"..arg:gsub("'", "'\\''").."'" + end + return arg +end + +-- 2023/12/15: the default setClipboardText doesn't do anything +-- frontend/device/sdl/device.lua calls frontend/device/input.lua is noop +local input = require("ffi/input") +input.setClipboardText = function(text) + logger.info("input.setClipboardText") + local cmd = "wl-copy " .. shescape(text) + logger.info("invoke: " .. cmd) + os.execute(cmd) +end + +-- 2023/12/15: the default ReaderLink "Copy" option (when clicking a URL) doesn't do anything +-- patch so it calls `setClipboardText` +local ReaderLink = require("apps/reader/modules/readerlink") +local UIManager = require("ui/uimanager") +local _ = require("gettext") +local orig_ReaderLink_init = ReaderLink.init; +ReaderLink.init = function(self) + orig_ReaderLink_init(self) + self._external_link_buttons["10_copy"] = function(this, link_url) + return { + text = _("Copy"), + callback = function() + UIManager:close(this.external_link_dialog) + input.setClipboardText(link_url) + end, + } + end +end + diff --git a/hosts/common/programs/koreader/default.nix b/hosts/common/programs/koreader/default.nix index bbf7e5b7..f55d5872 100644 --- a/hosts/common/programs/koreader/default.nix +++ b/hosts/common/programs/koreader/default.nix @@ -38,9 +38,13 @@ in { package = pkgs.koreader-from-src; # koreader applies these lua "patches" at boot: # - - # - 2023/10/29: koreader code hasn't changed, but somehow FTP browser seems usable even without the isConnected patch now. + # the naming is IMPORTANT. these must start with a `2-` in order to be invoked during the right initialization phase + # + # 2023/10/29: koreader code hasn't changed, but somehow FTP browser seems usable even without the isConnected patch now. # fs.".config/koreader/patches/2-colin-NetworkManager-isConnected.lua".symlink.target = "${./2-colin-NetworkManager-isConnected.lua}"; + fs.".config/koreader/patches/2-02-colin-impl-clipboard-ops.lua".symlink.target = "${./2-02-colin-impl-clipboard-ops.lua}"; + # koreader news plugin, enabled by default. file format described here: # - fs.".config/koreader/news/feed_config.lua".symlink.text = ''