mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 00:36:07 +03:00
terminal: parse OSC 22
This commit is contained in:
@ -83,6 +83,14 @@ pub const Command = union(enum) {
|
|||||||
/// be a file URL but it is up to the caller to utilize this value.
|
/// be a file URL but it is up to the caller to utilize this value.
|
||||||
value: []const u8,
|
value: []const u8,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/// OSC 22. Set the cursor shape. There doesn't seem to be a standard
|
||||||
|
/// naming scheme for cursors but it looks like terminals such as Foot
|
||||||
|
/// are moving towards using the W3C CSS cursor names. For OSC parsing,
|
||||||
|
/// we just parse whatever string is given.
|
||||||
|
pointer_cursor: struct {
|
||||||
|
value: []const u8,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Parser = struct {
|
pub const Parser = struct {
|
||||||
@ -130,6 +138,7 @@ pub const Parser = struct {
|
|||||||
@"13",
|
@"13",
|
||||||
@"133",
|
@"133",
|
||||||
@"2",
|
@"2",
|
||||||
|
@"22",
|
||||||
@"5",
|
@"5",
|
||||||
@"52",
|
@"52",
|
||||||
@"7",
|
@"7",
|
||||||
@ -226,6 +235,7 @@ pub const Parser = struct {
|
|||||||
},
|
},
|
||||||
|
|
||||||
.@"2" => switch (c) {
|
.@"2" => switch (c) {
|
||||||
|
'2' => self.state = .@"22",
|
||||||
';' => {
|
';' => {
|
||||||
self.command = .{ .change_window_title = undefined };
|
self.command = .{ .change_window_title = undefined };
|
||||||
|
|
||||||
@ -236,6 +246,17 @@ pub const Parser = struct {
|
|||||||
else => self.state = .invalid,
|
else => self.state = .invalid,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
.@"22" => switch (c) {
|
||||||
|
';' => {
|
||||||
|
self.command = .{ .pointer_cursor = undefined };
|
||||||
|
|
||||||
|
self.state = .string;
|
||||||
|
self.temp_state = .{ .str = &self.command.pointer_cursor.value };
|
||||||
|
self.buf_start = self.buf_idx;
|
||||||
|
},
|
||||||
|
else => self.state = .invalid,
|
||||||
|
},
|
||||||
|
|
||||||
.@"5" => switch (c) {
|
.@"5" => switch (c) {
|
||||||
'2' => self.state = .@"52",
|
'2' => self.state = .@"52",
|
||||||
else => self.state = .invalid,
|
else => self.state = .invalid,
|
||||||
@ -642,6 +663,19 @@ test "OSC: report pwd" {
|
|||||||
try testing.expect(std.mem.eql(u8, "file:///tmp/example", cmd.report_pwd.value));
|
try testing.expect(std.mem.eql(u8, "file:///tmp/example", cmd.report_pwd.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "OSC: pointer cursor" {
|
||||||
|
const testing = std.testing;
|
||||||
|
|
||||||
|
var p: Parser = .{};
|
||||||
|
|
||||||
|
const input = "22;pointer";
|
||||||
|
for (input) |ch| p.next(ch);
|
||||||
|
|
||||||
|
const cmd = p.end().?;
|
||||||
|
try testing.expect(cmd == .pointer_cursor);
|
||||||
|
try testing.expect(std.mem.eql(u8, "pointer", cmd.pointer_cursor.value));
|
||||||
|
}
|
||||||
|
|
||||||
test "OSC: report pwd empty" {
|
test "OSC: report pwd empty" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user