diff --git a/src/Surface.zig b/src/Surface.zig index 4c0877731..dca59c154 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -1114,6 +1114,7 @@ pub fn keyCallback( // We'll need to know these values here on. self.renderer_state.mutex.lock(); const cursor_key_application = self.io.terminal.modes.cursor_keys; + const keypad_key_application = self.io.terminal.modes.keypad_keys; self.renderer_state.mutex.unlock(); // Check if we're processing a function key. @@ -1126,7 +1127,8 @@ pub fn keyCallback( switch (entry.keypad) { .any => {}, - else => {}, // TODO + .normal => if (keypad_key_application) continue, + .application => if (!keypad_key_application) continue, } switch (entry.modify_other_keys) { diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index 15fcc23da..713bcb5dd 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -90,6 +90,7 @@ modes: packed struct { deccolm: bool = false, // 3, deccolm_supported: bool = false, // 40 + keypad_keys: bool = false, // 66 focus_event: bool = false, // 1004 mouse_alternate_scroll: bool = true, // 1007 diff --git a/src/terminal/ansi.zig b/src/terminal/ansi.zig index f7d684018..34b3afd4d 100644 --- a/src/terminal/ansi.zig +++ b/src/terminal/ansi.zig @@ -88,6 +88,9 @@ pub const Mode = enum(u16) { /// mode ?3 is set or unset. enable_mode_3 = 40, + /// DECNKM. Sets application keypad mode if enabled. + keypad_keys = 66, + /// "Normal" mouse events: click/release, scroll mouse_event_normal = 1000, diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index 4164d3ad0..5502e6c30 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -765,6 +765,16 @@ pub fn Stream(comptime Handler: type) type { }, } else log.warn("unimplemented invokeCharset: {}", .{action}), + // Set application keypad mode + '=' => if (@hasDecl(T, "setMode")) { + try self.handler.setMode(.keypad_keys, true); + } else log.warn("unimplemented setMode: {}", .{action}), + + // Reset application keypad mode + '>' => if (@hasDecl(T, "setMode")) { + try self.handler.setMode(.keypad_keys, false); + } else log.warn("unimplemented setMode: {}", .{action}), + else => if (@hasDecl(T, "escUnimplemented")) try self.handler.escUnimplemented(action) else diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig index a3d8a45ab..599f7a8f4 100644 --- a/src/termio/Exec.zig +++ b/src/termio/Exec.zig @@ -1193,6 +1193,10 @@ const StreamHandler = struct { self.terminal.modes.cursor_keys = enabled; }, + .keypad_keys => { + self.terminal.modes.keypad_keys = enabled; + }, + .insert => { self.terminal.modes.insert = enabled; },