diff --git a/build.zig b/build.zig index c50932b63..f93e18b7b 100644 --- a/build.zig +++ b/build.zig @@ -98,6 +98,12 @@ pub fn build(b: *std.Build) !void { "Enables the use of Adwaita when using the GTK rendering backend.", ) orelse true; + const pie = b.option( + bool, + "pie", + "Build a Position Independent Executable", + ) orelse false; + const conformance = b.option( []const u8, "conformance", @@ -282,6 +288,9 @@ pub fn build(b: *std.Build) !void { // Exe if (exe_) |exe| { + // Set PIE if requested + if (pie) exe.pie = true; + // Add the shared dependencies _ = try addDeps(b, exe, config); diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index d5227d00d..c49f7905e 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -704,12 +704,6 @@ extension Ghostty { /// Special case handling for some control keys override func performKeyEquivalent(with event: NSEvent) -> Bool { - // Only process keys when Control is the only modifier - if (!event.modifierFlags.contains(.control) || - !event.modifierFlags.isDisjoint(with: [.shift, .command, .option])) { - return false - } - // Only process key down events if (event.type != .keyDown) { return false @@ -722,11 +716,23 @@ extension Ghostty { return false } + // Only process keys when Control is active. All known issues we're + // resolving happen only in this scenario. This probably isn't fully robust + // but we can broaden the scope as we find more cases. + if (!event.modifierFlags.contains(.control)) { + return false + } + let equivalent: String switch (event.charactersIgnoringModifiers) { case "/": // Treat C-/ as C-_. We do this because C-/ makes macOS make a beep // sound and we don't like the beep sound. + if (!event.modifierFlags.contains(.control) || + !event.modifierFlags.isDisjoint(with: [.shift, .command, .option])) { + return false + } + equivalent = "_" case "\r": @@ -742,7 +748,7 @@ extension Ghostty { let newEvent = NSEvent.keyEvent( with: .keyDown, location: event.locationInWindow, - modifierFlags: .control, + modifierFlags: event.modifierFlags, timestamp: event.timestamp, windowNumber: event.windowNumber, context: nil,