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

View File

@ -243,6 +243,10 @@ pub const StreamHandler = struct {
.tab_clear_all => self.terminal.tabClear(.all),
.tab_set => self.terminal.tabSet(),
.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),
.reset_mode => try self.setMode(value.mode, false),
.save_mode => self.terminal.modes.save(value.mode),