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:
+13
-1
@@ -14,6 +14,17 @@ use crate::utils::editor::password;
|
|||||||
#[cfg_attr(target_arch = "wasm32", allow(unused_imports))]
|
#[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};
|
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> {
|
impl<'a> LKEval<'a> {
|
||||||
pub fn get_password(&self, name: &String) -> Option<PasswordRef> {
|
pub fn get_password(&self, name: &String) -> Option<PasswordRef> {
|
||||||
match self.state.lock().borrow().ls.get(name) {
|
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.
|
// In the browser the page provides a Copy button instead.
|
||||||
#[cfg(target_arch = "wasm32")]
|
#[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"))]
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -221,6 +221,9 @@
|
|||||||
};
|
};
|
||||||
window.hel_storage_get = (k) => localStorage.getItem("hel:" + k);
|
window.hel_storage_get = (k) => localStorage.getItem("hel:" + k);
|
||||||
window.hel_storage_set = (k, v) => localStorage.setItem("hel:" + k, v);
|
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 ----
|
// ---- helpers ----
|
||||||
const persist = () => hel_command("save " + CATALOG_KEY);
|
const persist = () => hel_command("save " + CATALOG_KEY);
|
||||||
|
|||||||
@@ -142,6 +142,9 @@ function __wbg_get_imports() {
|
|||||||
const ret = arg0.getTimezoneOffset();
|
const ret = arg0.getTimezoneOffset();
|
||||||
return ret;
|
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) {
|
__wbg_hel_get_password_271a2beac04c29db: function(arg0, arg1, arg2) {
|
||||||
const ret = hel_get_password(getStringFromWasm0(arg1, arg2));
|
const ret = hel_get_password(getStringFromWasm0(arg1, arg2));
|
||||||
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user