terminal: simple esc dispatch

pull/9342/head
Mitchell Hashimoto 2025-10-23 21:17:49 -07:00
parent 9cd4594356
commit b91149f0fe
No known key found for this signature in database
GPG Key ID: 523D5DC389D273BC
2 changed files with 32 additions and 18 deletions

View File

@ -69,6 +69,10 @@ pub const Action = union(Key) {
tab_clear_all, tab_clear_all,
tab_set, tab_set,
tab_reset, tab_reset,
index,
next_line,
reverse_index,
full_reset,
set_mode: Mode, set_mode: Mode,
reset_mode: Mode, reset_mode: Mode,
save_mode: Mode, save_mode: Mode,
@ -143,6 +147,10 @@ pub const Action = union(Key) {
"tab_clear_all", "tab_clear_all",
"tab_set", "tab_set",
"tab_reset", "tab_reset",
"index",
"next_line",
"reverse_index",
"full_reset",
"set_mode", "set_mode",
"reset_mode", "reset_mode",
"save_mode", "save_mode",
@ -1889,22 +1897,22 @@ pub fn Stream(comptime Handler: type) type {
}, },
// IND - Index // IND - Index
'D' => if (@hasDecl(T, "index")) switch (action.intermediates.len) { 'D' => switch (action.intermediates.len) {
0 => try self.handler.index(), 0 => try self.handler.vt(.index, {}),
else => { else => {
log.warn("invalid index command: {f}", .{action}); log.warn("invalid index command: {f}", .{action});
return; return;
}, },
} else log.warn("unimplemented ESC callback: {f}", .{action}), },
// NEL - Next Line // NEL - Next Line
'E' => if (@hasDecl(T, "nextLine")) switch (action.intermediates.len) { 'E' => switch (action.intermediates.len) {
0 => try self.handler.nextLine(), 0 => try self.handler.vt(.next_line, {}),
else => { else => {
log.warn("invalid next line command: {f}", .{action}); log.warn("invalid next line command: {f}", .{action});
return; return;
}, },
} else log.warn("unimplemented ESC callback: {f}", .{action}), },
// HTS - Horizontal Tab Set // HTS - Horizontal Tab Set
'H' => switch (action.intermediates.len) { 'H' => switch (action.intermediates.len) {
@ -1916,13 +1924,13 @@ pub fn Stream(comptime Handler: type) type {
}, },
// RI - Reverse Index // RI - Reverse Index
'M' => if (@hasDecl(T, "reverseIndex")) switch (action.intermediates.len) { 'M' => switch (action.intermediates.len) {
0 => try self.handler.reverseIndex(), 0 => try self.handler.vt(.reverse_index, {}),
else => { else => {
log.warn("invalid reverse index command: {f}", .{action}); log.warn("invalid reverse index command: {f}", .{action});
return; return;
}, },
} else log.warn("unimplemented ESC callback: {f}", .{action}), },
// SS2 - Single Shift 2 // SS2 - Single Shift 2
'N' => if (@hasDecl(T, "invokeCharset")) switch (action.intermediates.len) { 'N' => if (@hasDecl(T, "invokeCharset")) switch (action.intermediates.len) {
@ -1960,13 +1968,13 @@ pub fn Stream(comptime Handler: type) type {
} else log.warn("unimplemented ESC callback: {f}", .{action}), } else log.warn("unimplemented ESC callback: {f}", .{action}),
// RIS - Full Reset // RIS - Full Reset
'c' => if (@hasDecl(T, "fullReset")) switch (action.intermediates.len) { 'c' => switch (action.intermediates.len) {
0 => try self.handler.fullReset(), 0 => try self.handler.vt(.full_reset, {}),
else => { else => {
log.warn("invalid full reset command: {f}", .{action}); log.warn("invalid full reset command: {f}", .{action});
return; return;
}, },
} else log.warn("unimplemented ESC callback: {f}", .{action}), },
// LS2 - Locking Shift 2 // LS2 - Locking Shift 2
'n' => if (@hasDecl(T, "invokeCharset")) switch (action.intermediates.len) { 'n' => if (@hasDecl(T, "invokeCharset")) switch (action.intermediates.len) {
@ -2014,14 +2022,16 @@ pub fn Stream(comptime Handler: type) type {
} else log.warn("unimplemented invokeCharset: {f}", .{action}), } else log.warn("unimplemented invokeCharset: {f}", .{action}),
// Set application keypad mode // Set application keypad mode
'=' => if (@hasDecl(T, "setMode") and action.intermediates.len == 0) { '=' => switch (action.intermediates.len) {
try self.handler.setMode(.keypad_keys, true); 0 => try self.handler.vt(.set_mode, .{ .mode = .keypad_keys }),
} else log.warn("unimplemented setMode: {f}", .{action}), else => log.warn("unimplemented setMode: {f}", .{action}),
},
// Reset application keypad mode // Reset application keypad mode
'>' => if (@hasDecl(T, "setMode") and action.intermediates.len == 0) { '>' => switch (action.intermediates.len) {
try self.handler.setMode(.keypad_keys, false); 0 => try self.handler.vt(.reset_mode, .{ .mode = .keypad_keys }),
} else log.warn("unimplemented setMode: {f}", .{action}), else => log.warn("unimplemented setMode: {f}", .{action}),
},
else => if (@hasDecl(T, "escUnimplemented")) else => if (@hasDecl(T, "escUnimplemented"))
try self.handler.escUnimplemented(action) try self.handler.escUnimplemented(action)

View File

@ -243,6 +243,10 @@ pub const StreamHandler = struct {
.tab_clear_all => self.terminal.tabClear(.all), .tab_clear_all => self.terminal.tabClear(.all),
.tab_set => self.terminal.tabSet(), .tab_set => self.terminal.tabSet(),
.tab_reset => self.terminal.tabReset(), .tab_reset => self.terminal.tabReset(),
.index => try self.index(),
.next_line => try self.nextLine(),
.reverse_index => try self.reverseIndex(),
.full_reset => try self.fullReset(),
.set_mode => try self.setMode(value.mode, true), .set_mode => try self.setMode(value.mode, true),
.reset_mode => try self.setMode(value.mode, false), .reset_mode => try self.setMode(value.mode, false),
.save_mode => self.terminal.modes.save(value.mode), .save_mode => self.terminal.modes.save(value.mode),