input: "ignore" binding action are still be processed by the OS/GUI (#7474)

Related to #7468

This changes the behavior of "ignore". Previously, Ghostty would
consider "ignore" actions consumed but do nothing. They were like a
black hole. Now, Ghostty returns `ignored` which lets the apprt forward
the event to the OS/GUI.

This enables keys that would otherwise be pty-encoded to be processed
later, such as for GTK to show the GTK inspector.
pull/7483/head
Mitchell Hashimoto 2025-05-29 16:34:03 -07:00 committed by GitHub
commit 9b45638c15
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 8 deletions

View File

@ -2069,14 +2069,20 @@ fn maybeHandleBinding(
break :performed try self.performBindingAction(action);
};
if (performed) {
// If we performed an action and it was a closing action,
// our "self" pointer is not safe to use anymore so we need to
// just exit immediately.
if (performed and closingAction(action)) {
if (closingAction(action)) {
log.debug("key binding is a closing binding, halting key event processing", .{});
return .closed;
}
// If our action was "ignore" then we return the special input
// effect of "ignored".
if (action == .ignore) return .ignored;
}
// If we have the performable flag and the action was not performed,
// then we act as though a binding didn't exist.
if (leaf.flags.performable and !performed) {

View File

@ -222,13 +222,20 @@ pub fn lessThan(_: void, lhs: Binding, rhs: Binding) bool {
/// The set of actions that a keybinding can take.
pub const Action = union(enum) {
/// Ignore this key combination, don't send it to the child process, just
/// black hole it.
/// Ignore this key combination, don't send it to the child process,
/// pretend that it never happened at the Ghostty level. The key
/// combination may still be processed by the OS or other
/// applications.
ignore,
/// This action is used to flag that the binding should be removed from
/// the set. This should never exist in an active set and `set.put` has an
/// assertion to verify this.
///
/// This is only able to unbind bindings that were previously
/// bound to Ghostty. This cannot unbind bindings that were not
/// bound by Ghostty (e.g. bindings set by the OS or some other
/// application).
unbind,
/// Send a CSI sequence. The value should be the CSI sequence without the