parse and respect mode 1036

This commit is contained in:
Mitchell Hashimoto
2023-08-13 15:12:13 -07:00
parent 2ed6e6a40a
commit 4a384aa272
5 changed files with 27 additions and 10 deletions

View File

@ -1006,7 +1006,9 @@ pub fn charCallback(
}
// Critical area
{
const critical: struct {
alt_esc_prefix: bool,
} = critical: {
self.renderer_state.mutex.lock();
defer self.renderer_state.mutex.unlock();
@ -1019,17 +1021,31 @@ pub fn charCallback(
// We want to scroll to the bottom
// TODO: detect if we're at the bottom to avoid the render call here.
try self.io.terminal.scrollViewport(.{ .bottom = {} });
}
break :critical .{
.alt_esc_prefix = self.io.terminal.modes.alt_esc_prefix,
};
};
var data: termio.Message.WriteReq.Small.Array = undefined;
// Prefix our data with ESC if we have alt pressed.
var i: u8 = 0;
if (mods.alt) alt: {
// If the terminal explicitly disabled this feature using mode 1036,
// then we don't send the prefix.
if (!critical.alt_esc_prefix) {
log.debug("alt_esc_prefix disabled with mode, not sending esc prefix", .{});
break :alt;
}
// On macOS, we have to opt-in to using alt because option
// by default is a unicode character sequence.
if (comptime builtin.target.isDarwin()) {
if (!self.config.macos_option_as_alt) break :alt;
if (!self.config.macos_option_as_alt) {
log.debug("macos_option_as_alt disabled, not sending esc prefix", .{});
break :alt;
}
}
data[i] = 0x1b;

View File

@ -611,16 +611,12 @@ pub const Surface = struct {
glfw_action: glfw.Action,
glfw_mods: glfw.Mods,
) void {
const tracy = trace(@src());
defer tracy.end();
_ = scancode;
const core_win = window.getUserPointer(CoreSurface) orelse return;
// Reset our consumption state
core_win.rt_surface.key_consumed = false;
const tracy = trace(@src());
defer tracy.end();
// Convert our glfw types into our input types
const mods: input.Mods = @bitCast(glfw_mods);
const action: input.Action = switch (glfw_action) {
@ -756,6 +752,7 @@ pub const Surface = struct {
// TODO: we need to do mapped keybindings
core_win.rt_surface.key_mods = mods;
core_win.rt_surface.key_consumed = core_win.keyCallback(
action,
key,

View File

@ -91,6 +91,7 @@ modes: packed struct {
deccolm: bool = false, // 3,
deccolm_supported: bool = false, // 40
keypad_keys: bool = false, // 66
alt_esc_prefix: bool = true, // 1036
focus_event: bool = false, // 1004
mouse_alternate_scroll: bool = true, // 1007

View File

@ -121,6 +121,9 @@ pub const Mode = enum(u16) {
/// Report mouse position in the SGR format as pixels, instead of cells.
mouse_format_sgr_pixels = 1016,
/// The alt key sends esc as a prefix before any character. On by default.
alt_esc_prefix = 1036,
/// Alternate screen mode with save cursor and clear on enter.
alt_screen_save_cursor_clear_enter = 1049,

View File

@ -1274,8 +1274,8 @@ const StreamHandler = struct {
.mouse_format_sgr_pixels => self.terminal.modes.mouse_format = if (enabled) .sgr_pixels else .x10,
.mouse_alternate_scroll => self.terminal.modes.mouse_alternate_scroll = enabled,
.focus_event => self.terminal.modes.focus_event = enabled,
.alt_esc_prefix => self.terminal.modes.alt_esc_prefix = enabled,
else => if (enabled) log.warn("unimplemented mode: {}", .{mode}),
}