Revert "macos: don't remove ctrl modifier for text input"

This reverts commit 3104b217581a9e580155216a260b1a79135b701a.
This commit is contained in:
Mitchell Hashimoto
2025-02-13 14:20:13 -08:00
parent 710ea1c8d9
commit 9978ea3b9c
2 changed files with 30 additions and 12 deletions

View File

@ -849,8 +849,28 @@ extension Ghostty {
var handled: Bool = false var handled: Bool = false
if let list = keyTextAccumulator, list.count > 0 { if let list = keyTextAccumulator, list.count > 0 {
handled = true handled = true
for text in list {
_ = keyAction(action, event: event, text: text) // This is a hack. libghostty on macOS treats ctrl input as not having
// text because some keyboard layouts generate bogus characters for
// ctrl+key. libghostty can't tell this is from an IM keyboard giving
// us direct values. So, we just remove control.
var modifierFlags = event.modifierFlags
modifierFlags.remove(.control)
if let keyTextEvent = NSEvent.keyEvent(
with: .keyDown,
location: event.locationInWindow,
modifierFlags: modifierFlags,
timestamp: event.timestamp,
windowNumber: event.windowNumber,
context: nil,
characters: event.characters ?? "",
charactersIgnoringModifiers: event.charactersIgnoringModifiers ?? "",
isARepeat: event.isARepeat,
keyCode: event.keyCode
) {
for text in list {
_ = keyAction(action, event: keyTextEvent, text: text)
}
} }
} }

View File

@ -182,9 +182,14 @@ pub const App = struct {
if (strip) translate_mods.alt = false; if (strip) translate_mods.alt = false;
} }
// We strip super on macOS because its not used for translation // On macOS we strip ctrl because UCKeyTranslate
// it results in a bad translation. // converts to the masked values (i.e. ctrl+c becomes 3)
// and we don't want that behavior.
//
// We also strip super because its not used for translation
// on macos and it results in a bad translation.
if (comptime builtin.target.isDarwin()) { if (comptime builtin.target.isDarwin()) {
translate_mods.ctrl = false;
translate_mods.super = false; translate_mods.super = false;
} }
@ -231,14 +236,7 @@ pub const App = struct {
.surface => |surface| &surface.keymap_state, .surface => |surface| &surface.keymap_state,
}, },
@intCast(keycode), @intCast(keycode),
if (comptime builtin.target.isDarwin()) mods: { translate_mods,
// On macOS we strip ctrl because UCKeyTranslate
// converts to the masked values (i.e. ctrl+c becomes 3)
// and we don't want that behavior.
var v = translate_mods;
v.ctrl = false;
break :mods v;
} else translate_mods,
); );
// TODO(mitchellh): I think we can get rid of the above keymap // TODO(mitchellh): I think we can get rid of the above keymap