pb: copy to the clipboard in the browser

Instead of erroring, the wasm `pb` branch now writes the inner command's data to the
host page's clipboard via navigator.clipboard (new hel_clipboard_write host hook).
Runs inside the Enter-keypress handler, so the clipboard user-gesture requirement is
met. Native pbcopy/xclip path unchanged.
This commit is contained in:
Oleksandr Kozachuk
2026-06-09 23:51:51 +02:00
parent 30fbc1caae
commit 7c651d0bb5
4 changed files with 19 additions and 1 deletions
+13 -1
View File
@@ -14,6 +14,17 @@ use crate::utils::editor::password;
#[cfg_attr(target_arch = "wasm32", allow(unused_imports))]
use crate::utils::{call_cmd_with_input, get_cmd_args_from_command, get_copy_command_from_env, rnd};
// In the browser `pb` copies through the host page's clipboard (navigator.clipboard)
// instead of shelling out to pbcopy/xclip.
#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::wasm_bindgen;
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_name = hel_clipboard_write)]
fn hel_clipboard_write(text: &str);
}
impl<'a> LKEval<'a> {
pub fn get_password(&self, name: &String) -> Option<PasswordRef> {
match self.state.lock().borrow().ls.get(name) {
@@ -218,7 +229,8 @@ impl<'a> LKEval<'a> {
// In the browser the page provides a Copy button instead.
#[cfg(target_arch = "wasm32")]
{
out.e("error: pb (clipboard copy) is not available in the browser; use the Copy button".to_string());
hel_clipboard_write(&data);
out.o(format!("Copied {} characters to the clipboard", data.chars().count()));
}
#[cfg(not(target_arch = "wasm32"))]
{
+3
View File
@@ -221,6 +221,9 @@
};
window.hel_storage_get = (k) => localStorage.getItem("hel:" + k);
window.hel_storage_set = (k, v) => localStorage.setItem("hel:" + k, v);
// `pb` copies to the system clipboard. Fire-and-forget: it runs inside the Enter
// keypress handler, so the user-gesture requirement for clipboard write is met.
window.hel_clipboard_write = (text) => { try { navigator.clipboard.writeText(text); } catch (e) {} };
// ---- helpers ----
const persist = () => hel_command("save " + CATALOG_KEY);
+3
View File
@@ -142,6 +142,9 @@ function __wbg_get_imports() {
const ret = arg0.getTimezoneOffset();
return ret;
},
__wbg_hel_clipboard_write_efa8177dd67c65ec: function(arg0, arg1) {
hel_clipboard_write(getStringFromWasm0(arg0, arg1));
},
__wbg_hel_get_password_271a2beac04c29db: function(arg0, arg1, arg2) {
const ret = hel_get_password(getStringFromWasm0(arg1, arg2));
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
Binary file not shown.