aboutsummaryrefslogtreecommitdiff
path: root/vendor/libghostty-vt/src/input/keyboard.zig
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-04-04 19:22:04 +0300
committerCan Celik <ogulcancelik@gmail.com>2026-04-05 01:23:06 +0300
commit41dd733ca7123c9ac4bfc6c781697a660e95b052 (patch)
tree3fc91815ca139ef2e0b281bba0abda4ef15175f4 /vendor/libghostty-vt/src/input/keyboard.zig
parent55c138263e190a1e79d4b997bfb9397306c0ec1f (diff)
feat: finish ghostty pane backend integration
Diffstat (limited to 'vendor/libghostty-vt/src/input/keyboard.zig')
-rw-r--r--vendor/libghostty-vt/src/input/keyboard.zig58
1 files changed, 58 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/src/input/keyboard.zig b/vendor/libghostty-vt/src/input/keyboard.zig
new file mode 100644
index 00000000..d2882a23
--- /dev/null
+++ b/vendor/libghostty-vt/src/input/keyboard.zig
@@ -0,0 +1,58 @@
+const std = @import("std");
+const OptionAsAlt = @import("config.zig").OptionAsAlt;
+
+/// Keyboard layouts.
+///
+/// These aren't heavily used in Ghostty and having a fully comprehensive
+/// list is not important. We only need to distinguish between a few
+/// different layouts for some nice-to-have features, such as setting a default
+/// value for "macos-option-as-alt".
+pub const Layout = enum {
+ // Unknown, unmapped layout. Ghostty should not make any assumptions
+ // about the layout of the keyboard.
+ unknown,
+
+ // The remaining should be fairly self-explanatory:
+ us_standard,
+ us_international,
+
+ /// Map an Apple keyboard layout ID to a value in this enum. The layout
+ /// ID can be retrieved using Carbon's TIKeyboardLayoutGetInputSourceProperty
+ /// function.
+ ///
+ /// Even though our layout supports "unknown", we return null if we don't
+ /// recognize the layout ID so callers can detect this scenario.
+ pub fn mapAppleId(id: []const u8) ?Layout {
+ if (std.mem.eql(u8, id, "com.apple.keylayout.US")) {
+ return .us_standard;
+ } else if (std.mem.eql(u8, id, "com.apple.keylayout.USInternational")) {
+ return .us_international;
+ }
+
+ return null;
+ }
+
+ /// Returns the default macos-option-as-alt value for this layout.
+ ///
+ /// We apply some heuristics to change the default based on the keyboard
+ /// layout if "macos-option-as-alt" is unset. We do this because on some
+ /// keyboard layouts such as US standard layouts, users generally expect
+ /// an input such as option-b to map to alt-b but macOS by default will
+ /// convert it to the codepoint "∫".
+ ///
+ /// This behavior however is desired on international layout where the
+ /// option key is used for important, regularly used inputs.
+ pub fn detectOptionAsAlt(self: Layout) OptionAsAlt {
+ return switch (self) {
+ // On US standard, the option key is typically used as alt
+ // and not as a modifier for other codepoints. For example,
+ // option-B = ∫ but usually the user wants alt-B.
+ .us_standard,
+ .us_international,
+ => .true,
+
+ .unknown,
+ => .false,
+ };
+ }
+};