From 109376115bb2ff70517cca79019437501d5e0fe8 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 23 Oct 2025 21:29:16 -0700 Subject: [PATCH] terminal: convert dcs --- src/terminal/Parser.zig | 8 ++++++++ src/terminal/stream.zig | 18 +++++++++--------- src/termio/stream_handler.zig | 3 +++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/terminal/Parser.zig b/src/terminal/Parser.zig index 625591d3f..4a02e2b13 100644 --- a/src/terminal/Parser.zig +++ b/src/terminal/Parser.zig @@ -127,6 +127,14 @@ pub const Action = union(enum) { intermediates: []const u8 = "", params: []const u16 = &.{}, final: u8, + + pub const C = extern struct { + intermediates: [*]const u8, + intermediates_len: usize, + params: [*]const u16, + params_len: usize, + final: u8, + }; }; // Implement formatter for logging. This is mostly copied from the diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index 1a8e983b5..2ef7c256b 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -99,6 +99,9 @@ pub const Action = union(Key) { kitty_keyboard_set: KittyKeyboardFlags, kitty_keyboard_set_or: KittyKeyboardFlags, kitty_keyboard_set_not: KittyKeyboardFlags, + dcs_hook: Parser.Action.DCS, + dcs_put: u8, + dcs_unhook, apc_start, apc_end, apc_put: u8, @@ -180,6 +183,9 @@ pub const Action = union(Key) { "kitty_keyboard_set", "kitty_keyboard_set_or", "kitty_keyboard_set_not", + "dcs_hook", + "dcs_put", + "dcs_unhook", "apc_start", "apc_end", "apc_put", @@ -556,15 +562,9 @@ pub fn Stream(comptime Handler: type) type { .csi_dispatch => |csi_action| try self.csiDispatch(csi_action), .esc_dispatch => |esc| try self.escDispatch(esc), .osc_dispatch => |cmd| try self.oscDispatch(cmd), - .dcs_hook => |dcs| if (@hasDecl(T, "dcsHook")) { - try self.handler.dcsHook(dcs); - } else log.warn("unimplemented DCS hook", .{}), - .dcs_put => |code| if (@hasDecl(T, "dcsPut")) { - try self.handler.dcsPut(code); - } else log.warn("unimplemented DCS put: {x}", .{code}), - .dcs_unhook => if (@hasDecl(T, "dcsUnhook")) { - try self.handler.dcsUnhook(); - } else log.warn("unimplemented DCS unhook", .{}), + .dcs_hook => |dcs| try self.handler.vt(.dcs_hook, dcs), + .dcs_put => |code| try self.handler.vt(.dcs_put, code), + .dcs_unhook => try self.handler.vt(.dcs_unhook, {}), .apc_start => try self.handler.vt(.apc_start, {}), .apc_put => |code| try self.handler.vt(.apc_put, code), .apc_end => try self.handler.vt(.apc_end, {}), diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index dbfa9ddb2..a44522573 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -303,6 +303,9 @@ pub const StreamHandler = struct { .end_hyperlink => try self.endHyperlink(), .active_status_display => self.terminal.status_display = value, .decaln => try self.decaln(), + .dcs_hook => try self.dcsHook(value), + .dcs_put => try self.dcsPut(value), + .dcs_unhook => try self.dcsUnhook(), .apc_start => self.apc.start(), .apc_end => try self.apcEnd(), .apc_put => self.apc.feed(self.alloc, value),