terminal: add device_attributes module

Introduce a dedicated device_attributes.zig module that consolidates
all device attribute types and encoding logic. This moves
DeviceAttributeReq out of ansi.zig and adds structured response
types for DA1 (primary), DA2 (secondary), and DA3 (tertiary) with
self-encoding methods.

Primary DA uses a ConformanceLevel enum covering VT100-series
per-model values and VT200+ conformance levels, plus a Feature
enum with all known xterm DA1 attribute codes (132-col, printer,
sixel, color, clipboard, etc.) as a simple slice. Secondary DA
uses a DeviceType enum matching the xterm decTerminalID values.
Tertiary DA encodes the DECRPTUI unit ID as a u32 formatted to
8 hex digits.

This is preparatory work for exposing device attributes through
the stream_terminal Effects callback system.
This commit is contained in:
Mitchell Hashimoto
2026-03-23 14:35:22 -07:00
parent 2e7aa047af
commit b31dcf9a4c
4 changed files with 221 additions and 13 deletions

View File

@@ -9,6 +9,7 @@ const lib = @import("../lib/main.zig");
const Parser = @import("Parser.zig");
const ansi = @import("ansi.zig");
const charsets = @import("charsets.zig");
const device_attributes = @import("device_attributes.zig");
const device_status = @import("device_status.zig");
const csi = @import("csi.zig");
const kitty = @import("kitty.zig");
@@ -97,7 +98,7 @@ pub const Action = union(Key) {
title_push: u16,
title_pop: u16,
xtversion,
device_attributes: ansi.DeviceAttributeReq,
device_attributes: device_attributes.Req,
device_status: DeviceStatus,
kitty_keyboard_query,
kitty_keyboard_push: KittyKeyboardFlags,
@@ -1282,7 +1283,7 @@ pub fn Stream(comptime H: type) type {
// c - Device Attributes (DA1)
'c' => {
const req: ?ansi.DeviceAttributeReq = switch (input.intermediates.len) {
const req: ?device_attributes.Req = switch (input.intermediates.len) {
0 => .primary,
1 => switch (input.intermediates[0]) {
'>' => .secondary,