widgets(terminal): improve logging
This commit is contained in:
parent
d36be9048c
commit
78508b76bd
2 changed files with 47 additions and 7 deletions
|
@ -109,15 +109,14 @@ pub fn spawn(self: *Terminal) !void {
|
||||||
self.thread = try std.Thread.spawn(.{}, Terminal.run, .{self});
|
self.thread = try std.Thread.spawn(.{}, Terminal.run, .{self});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// resize the screen. Locks access to the back screen. Should only be called from the main thread
|
/// resize the screen. Locks access to the back screen. Should only be called from the main thread.
|
||||||
|
/// This is safe to call every render cycle: there is a guard to only perform a resize if the size
|
||||||
|
/// of the window has changed.
|
||||||
pub fn resize(self: *Terminal, ws: Winsize) !void {
|
pub fn resize(self: *Terminal, ws: Winsize) !void {
|
||||||
// don't deinit with no size change
|
// don't deinit with no size change
|
||||||
if (ws.cols == self.front_screen.width and
|
if (ws.cols == self.front_screen.width and
|
||||||
ws.rows == self.front_screen.height)
|
ws.rows == self.front_screen.height)
|
||||||
{
|
|
||||||
std.log.debug("resize requested but no change", .{});
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
self.back_mutex.lock();
|
self.back_mutex.lock();
|
||||||
defer self.back_mutex.unlock();
|
defer self.back_mutex.unlock();
|
||||||
|
@ -181,9 +180,9 @@ fn run(self: *Terminal) !void {
|
||||||
const event = try parser.parseReader(reader);
|
const event = try parser.parseReader(reader);
|
||||||
self.back_mutex.lock();
|
self.back_mutex.lock();
|
||||||
defer self.back_mutex.unlock();
|
defer self.back_mutex.unlock();
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
.print => |str| {
|
.print => |str| {
|
||||||
std.log.err("print: {s}", .{str});
|
|
||||||
var iter = grapheme.Iterator.init(str, &self.unicode.grapheme_data);
|
var iter = grapheme.Iterator.init(str, &self.unicode.grapheme_data);
|
||||||
while (iter.next()) |g| {
|
while (iter.next()) |g| {
|
||||||
const bytes = g.bytes(str);
|
const bytes = g.bytes(str);
|
||||||
|
@ -192,6 +191,9 @@ fn run(self: *Terminal) !void {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.c0 => |b| try self.handleC0(b),
|
.c0 => |b| try self.handleC0(b),
|
||||||
|
.escape => |str| std.log.err("unhandled escape: {s}", .{str}),
|
||||||
|
.ss2 => |ss2| std.log.err("unhandled ss2: {c}", .{ss2}),
|
||||||
|
.ss3 => |ss3| std.log.err("unhandled ss3: {c}", .{ss3}),
|
||||||
.csi => |seq| {
|
.csi => |seq| {
|
||||||
switch (seq.final) {
|
switch (seq.final) {
|
||||||
'B' => { // CUD
|
'B' => { // CUD
|
||||||
|
@ -219,10 +221,11 @@ fn run(self: *Terminal) !void {
|
||||||
self.back_screen.sgr(seq);
|
self.back_screen.sgr(seq);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
else => {},
|
else => std.log.err("unhandled CSI: {}", .{seq}),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
else => {},
|
.osc => |osc| std.log.err("unhandled osc: {s}", .{osc}),
|
||||||
|
.apc => |apc| std.log.err("unhandled apc: {s}", .{apc}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -230,6 +233,7 @@ fn run(self: *Terminal) !void {
|
||||||
inline fn handleC0(self: *Terminal, b: ansi.C0) !void {
|
inline fn handleC0(self: *Terminal, b: ansi.C0) !void {
|
||||||
switch (b) {
|
switch (b) {
|
||||||
.NUL, .SOH, .STX => {},
|
.NUL, .SOH, .STX => {},
|
||||||
|
.EOT => {}, // we send EOT to quit the read thread
|
||||||
.ENQ => {},
|
.ENQ => {},
|
||||||
.BEL => self.pending_events.bell.store(true, .unordered),
|
.BEL => self.pending_events.bell.store(true, .unordered),
|
||||||
.BS => self.back_screen.cursorLeft(1),
|
.BS => self.back_screen.cursorLeft(1),
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
/// Control bytes. See man 7 ascii
|
/// Control bytes. See man 7 ascii
|
||||||
pub const C0 = enum(u8) {
|
pub const C0 = enum(u8) {
|
||||||
NUL = 0x00,
|
NUL = 0x00,
|
||||||
|
@ -52,6 +54,40 @@ pub const CSI = struct {
|
||||||
pub fn iterator(self: CSI, comptime T: type) ParamIterator(T) {
|
pub fn iterator(self: CSI, comptime T: type) ParamIterator(T) {
|
||||||
return .{ .bytes = self.params };
|
return .{ .bytes = self.params };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn format(
|
||||||
|
self: CSI,
|
||||||
|
comptime layout: []const u8,
|
||||||
|
opts: std.fmt.FormatOptions,
|
||||||
|
writer: anytype,
|
||||||
|
) !void {
|
||||||
|
_ = layout;
|
||||||
|
_ = opts;
|
||||||
|
if (self.private_marker == null and self.intermediate == null)
|
||||||
|
try std.fmt.format(writer, "CSI {s} {c}", .{
|
||||||
|
self.params,
|
||||||
|
self.final,
|
||||||
|
})
|
||||||
|
else if (self.private_marker != null and self.intermediate == null)
|
||||||
|
try std.fmt.format(writer, "CSI {c} {s} {c}", .{
|
||||||
|
self.private_marker.?,
|
||||||
|
self.params,
|
||||||
|
self.final,
|
||||||
|
})
|
||||||
|
else if (self.private_marker == null and self.intermediate != null)
|
||||||
|
try std.fmt.format(writer, "CSI {s} {c} {c}", .{
|
||||||
|
self.params,
|
||||||
|
self.intermediate.?,
|
||||||
|
self.final,
|
||||||
|
})
|
||||||
|
else
|
||||||
|
try std.fmt.format(writer, "CSI {c} {s} {c} {c}", .{
|
||||||
|
self.private_marker.?,
|
||||||
|
self.params,
|
||||||
|
self.intermediate.?,
|
||||||
|
self.final,
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn ParamIterator(T: type) type {
|
pub fn ParamIterator(T: type) type {
|
||||||
|
|
Loading…
Reference in a new issue