apprt/embedded: proper consumed modifier state for ctrl keys

This commit is contained in:
Mitchell Hashimoto
2025-02-13 14:45:31 -08:00
parent 9978ea3b9c
commit b44b1086d3
4 changed files with 32 additions and 42 deletions

View File

@@ -50,10 +50,13 @@ pub const State = struct {
pub const Translation = struct {
/// The translation result. If this is a dead key state, then this will
/// be pre-edit text that can be displayed but will ultimately be replaced.
text: []const u8,
text: []const u8 = "",
/// Whether the text is still composing, i.e. this is a dead key state.
composing: bool,
composing: bool = false,
/// The mods that were consumed to produce this translation
mods: Mods = .{},
};
pub fn init() !Keymap {
@@ -122,8 +125,18 @@ pub fn translate(
out: []u8,
state: *State,
code: u16,
mods: Mods,
input_mods: Mods,
) !Translation {
// 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 in Ghostty ever. This makes
// this file not a general-purpose keymap implementation.
const mods: Mods = mods: {
var v = input_mods;
v.ctrl = false;
break :mods v;
};
// Get the keycode for the space key, using comptime.
const code_space: u16 = comptime space: for (codes) |entry| {
if (std.mem.eql(u8, entry.code, "Space"))
@@ -183,7 +196,11 @@ pub fn translate(
// Convert the utf16 to utf8
const len = try std.unicode.utf16leToUtf8(out, char[0..char_count]);
return .{ .text = out[0..len], .composing = composing };
return .{
.text = out[0..len],
.composing = composing,
.mods = mods,
};
}
/// Map to the modifiers format used by the UCKeyTranslate function.