Hopefully fix some copy-paste stuff.

This commit is contained in:
Greyson Parrelli
2026-08-25 16:48:34 -04:00
parent 198258c181
commit 44619293c3
2 changed files with 37 additions and 5 deletions
+30 -5
View File
@@ -1995,6 +1995,16 @@ fn focusedReview(self: *Window) ?*Review {
return tab.view.focusedReview();
}
/// Whether the keyboard focus sits on `widget` or on something inside it.
///
/// Finer-grained than the `focused*` lookups above, which answer at the
/// granularity of a pane: a pane is one of these even while the focus is in a
/// bar it draws around its content rather than in the content itself.
fn focusIsIn(self: *Window, widget: *gtk.Widget) bool {
const focus = self.window.as(gtk.Window).getFocus() orelse return false;
return focus == widget or focus.isAncestor(widget) != 0;
}
/// Split the visible tab's focused pane, adding a pane of the given kind.
fn addPane(self: *Window, kind: View.Kind) void {
const tab = self.activeTab() orelse return;
@@ -2244,12 +2254,27 @@ fn perform(self: *Window, action: shortcuts.Action) bool {
.toggle_sidebar => self.toggleSidebar(),
.open_settings => self.openSettings(),
// Only a terminal needs us to encode a paste for it. A web pane has its
// own clipboard handling, so the key is left alone rather than
// swallowed here.
// Ctrl+Shift+V is the terminal's paste chord, and this window means it
// to be *the* paste chord — but nothing below us binds the shifted
// form. GTK's entries and WebKit's pages both paste on plain Ctrl+V
// and neither has a binding for Ctrl+Shift+V, so leaving the key alone
// over a web pane doesn't hand the paste to the page, it drops it. A
// pane that isn't a terminal has to be handed the paste explicitly.
//
// Only when the page itself holds the focus, though: a web pane's
// address bar is an ordinary GTK entry sitting above the view, and
// pasting into the page while the caret is in the address bar would
// put the text somewhere the user isn't looking.
.paste => {
const terminal = self.focusedTerminal() orelse return false;
terminal.pasteFrom(.standard);
if (self.focusedTerminal()) |terminal| {
terminal.pasteFrom(.standard);
} else if (self.focusedBrowser()) |browser| {
if (!self.focusIsIn(browser.view.as(gtk.Widget))) return false;
browser.view.executeEditingCommand("Paste");
} else if (self.focusedReview()) |pane| {
if (!self.focusIsIn(pane.view.as(gtk.Widget))) return false;
pane.view.executeEditingCommand("Paste");
} else return false;
},
// With nothing selected the key is declined rather than swallowed, so a
+7
View File
@@ -67,6 +67,13 @@ pub const WebView = opaque {
extern fn webkit_web_view_stop_loading(*WebView) void;
pub const stopLoading = webkit_web_view_stop_loading;
/// Run one of WebKit's editing commands — "Paste", "Copy", "Cut" and the
/// rest — against whatever the page has focused, as if the page's own key
/// binding for it had fired. A command with nothing to act on, such as a
/// paste with no editable field focused, does nothing.
extern fn webkit_web_view_execute_editing_command(*WebView, [*:0]const u8) void;
pub const executeEditingCommand = webkit_web_view_execute_editing_command;
/// The view's find controller, created on first use and owned by the view,
/// so this hands back the same object every time and it does not outlive
/// the view it came from.