mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 16:56:09 +03:00
terminal: all commands parsed, need tests
This commit is contained in:
@ -112,9 +112,9 @@ pub const CommandParser = struct {
|
|||||||
|
|
||||||
// Determine our action, which is always a single character.
|
// Determine our action, which is always a single character.
|
||||||
const action: u8 = action: {
|
const action: u8 = action: {
|
||||||
const action_idx = self.kv.get("a") orelse break :action 't';
|
const str = self.kv.get("a") orelse break :action 't';
|
||||||
if (action_idx[1] - action_idx[0] != 1) return error.InvalidFormat;
|
if (str.len != 1) return error.InvalidFormat;
|
||||||
break :action self.data.items[action_idx[0]];
|
break :action str[0];
|
||||||
};
|
};
|
||||||
const control: Command.Control = switch (action) {
|
const control: Command.Control = switch (action) {
|
||||||
'q' => .{ .query = try Transmission.parse(self.kv) },
|
'q' => .{ .query = try Transmission.parse(self.kv) },
|
||||||
@ -124,7 +124,7 @@ pub const CommandParser = struct {
|
|||||||
.display = try Display.parse(self.kv),
|
.display = try Display.parse(self.kv),
|
||||||
} },
|
} },
|
||||||
'p' => .{ .display = try Display.parse(self.kv) },
|
'p' => .{ .display = try Display.parse(self.kv) },
|
||||||
//'d' => .{ .delete = try Delete.parse(self.kv) },
|
'd' => .{ .delete = try Delete.parse(self.kv) },
|
||||||
'f' => .{ .transmit_animation_frame = try AnimationFrameLoading.parse(self.kv) },
|
'f' => .{ .transmit_animation_frame = try AnimationFrameLoading.parse(self.kv) },
|
||||||
'a' => .{ .control_animation = try AnimationControl.parse(self.kv) },
|
'a' => .{ .control_animation = try AnimationControl.parse(self.kv) },
|
||||||
'c' => .{ .compose_animation = try AnimationFrameComposition.parse(self.kv) },
|
'c' => .{ .compose_animation = try AnimationFrameComposition.parse(self.kv) },
|
||||||
@ -595,6 +595,102 @@ pub const Delete = union(enum) {
|
|||||||
delete: bool = false, // uppercase
|
delete: bool = false, // uppercase
|
||||||
z: u32 = 0, // z
|
z: u32 = 0, // z
|
||||||
},
|
},
|
||||||
|
|
||||||
|
fn parse(kv: KV) !Delete {
|
||||||
|
const what: u8 = what: {
|
||||||
|
const str = kv.get("d") orelse break :what 'a';
|
||||||
|
if (str.len != 1) return error.InvalidFormat;
|
||||||
|
break :what str[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
return switch (what) {
|
||||||
|
'a', 'A' => .{ .all = what == 'A' },
|
||||||
|
|
||||||
|
'i', 'I' => blk: {
|
||||||
|
var result: Delete = .{ .id = .{ .delete = what == 'I' } };
|
||||||
|
if (kv.get("i")) |str| {
|
||||||
|
result.id.image_id = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
if (kv.get("p")) |str| {
|
||||||
|
result.id.placement_id = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
break :blk result;
|
||||||
|
},
|
||||||
|
|
||||||
|
'n', 'N' => blk: {
|
||||||
|
var result: Delete = .{ .newest = .{ .delete = what == 'N' } };
|
||||||
|
if (kv.get("I")) |str| {
|
||||||
|
result.newest.count = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
if (kv.get("p")) |str| {
|
||||||
|
result.newest.placement_id = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
break :blk result;
|
||||||
|
},
|
||||||
|
|
||||||
|
'c', 'C' => .{ .intersect_cursor = what == 'C' },
|
||||||
|
|
||||||
|
'f', 'F' => .{ .animation_frames = what == 'F' },
|
||||||
|
|
||||||
|
'p', 'P' => blk: {
|
||||||
|
var result: Delete = .{ .intersect_cell = .{ .delete = what == 'P' } };
|
||||||
|
if (kv.get("x")) |str| {
|
||||||
|
result.intersect_cell.x = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
if (kv.get("y")) |str| {
|
||||||
|
result.intersect_cell.y = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
break :blk result;
|
||||||
|
},
|
||||||
|
|
||||||
|
'q', 'Q' => blk: {
|
||||||
|
var result: Delete = .{ .intersect_cell_z = .{ .delete = what == 'Q' } };
|
||||||
|
if (kv.get("x")) |str| {
|
||||||
|
result.intersect_cell_z.x = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
if (kv.get("y")) |str| {
|
||||||
|
result.intersect_cell_z.y = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
if (kv.get("z")) |str| {
|
||||||
|
result.intersect_cell_z.z = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
break :blk result;
|
||||||
|
},
|
||||||
|
|
||||||
|
'x', 'X' => blk: {
|
||||||
|
var result: Delete = .{ .column = .{ .delete = what == 'X' } };
|
||||||
|
if (kv.get("x")) |str| {
|
||||||
|
result.column.x = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
break :blk result;
|
||||||
|
},
|
||||||
|
|
||||||
|
'y', 'Y' => blk: {
|
||||||
|
var result: Delete = .{ .row = .{ .delete = what == 'Y' } };
|
||||||
|
if (kv.get("y")) |str| {
|
||||||
|
result.row.y = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
break :blk result;
|
||||||
|
},
|
||||||
|
|
||||||
|
'z', 'Z' => blk: {
|
||||||
|
var result: Delete = .{ .z = .{ .delete = what == 'Z' } };
|
||||||
|
if (kv.get("z")) |str| {
|
||||||
|
result.z.z = try std.fmt.parseInt(u32, str, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
break :blk result;
|
||||||
|
},
|
||||||
|
|
||||||
|
else => return error.InvalidFormat,
|
||||||
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const CompositionMode = enum {
|
pub const CompositionMode = enum {
|
||||||
|
Reference in New Issue
Block a user