tty: use grapheme cache in the tty run method
We only need the grapheme cache when we are parsing input Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
This commit is contained in:
parent
64557bf9ab
commit
f1a9e21a98
3 changed files with 11 additions and 7 deletions
13
src/Tty.zig
13
src/Tty.zig
|
@ -6,6 +6,7 @@ const Vaxis = vaxis.Vaxis;
|
||||||
const Event = @import("event.zig").Event;
|
const Event = @import("event.zig").Event;
|
||||||
const parser = @import("parser.zig");
|
const parser = @import("parser.zig");
|
||||||
const Key = vaxis.Key;
|
const Key = vaxis.Key;
|
||||||
|
const GraphemeCache = @import("GraphemeCache.zig");
|
||||||
|
|
||||||
const log = std.log.scoped(.tty);
|
const log = std.log.scoped(.tty);
|
||||||
|
|
||||||
|
@ -112,6 +113,9 @@ pub fn run(
|
||||||
};
|
};
|
||||||
try WinchHandler.init(vx, self.fd);
|
try WinchHandler.init(vx, self.fd);
|
||||||
|
|
||||||
|
// initialize a grapheme cache
|
||||||
|
var cache: GraphemeCache = .{};
|
||||||
|
|
||||||
// Set up fds for polling
|
// Set up fds for polling
|
||||||
var pollfds: [2]std.os.pollfd = .{
|
var pollfds: [2]std.os.pollfd = .{
|
||||||
.{ .fd = self.fd, .events = std.os.POLL.IN, .revents = undefined },
|
.{ .fd = self.fd, .events = std.os.POLL.IN, .revents = undefined },
|
||||||
|
@ -132,7 +136,7 @@ pub fn run(
|
||||||
var start: usize = 0;
|
var start: usize = 0;
|
||||||
while (start < n) {
|
while (start < n) {
|
||||||
const result = try parser.parse(buf[start..n]);
|
const result = try parser.parse(buf[start..n]);
|
||||||
start = result.n;
|
start += result.n;
|
||||||
// TODO: if we get 0 byte read, copy the remaining bytes to the
|
// TODO: if we get 0 byte read, copy the remaining bytes to the
|
||||||
// beginning of the buffer and read mmore? this should only happen
|
// beginning of the buffer and read mmore? this should only happen
|
||||||
// if we are in the middle of a grapheme at and filled our
|
// if we are in the middle of a grapheme at and filled our
|
||||||
|
@ -143,7 +147,12 @@ pub fn run(
|
||||||
switch (event) {
|
switch (event) {
|
||||||
.key_press => |key| {
|
.key_press => |key| {
|
||||||
if (@hasField(EventType, "key_press")) {
|
if (@hasField(EventType, "key_press")) {
|
||||||
vx.postEvent(.{ .key_press = key });
|
// HACK: yuck. there has to be a better way
|
||||||
|
var mut_key = key;
|
||||||
|
if (key.text) |text| {
|
||||||
|
mut_key.text = cache.put(text);
|
||||||
|
}
|
||||||
|
vx.postEvent(.{ .key_press = mut_key });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.focus_in => {
|
.focus_in => {
|
||||||
|
|
|
@ -79,7 +79,6 @@ pub fn parse(input: []const u8) !Result {
|
||||||
state = .escape;
|
state = .escape;
|
||||||
continue;
|
continue;
|
||||||
},
|
},
|
||||||
// 0x20...0x7E => .{ .codepoint = b },
|
|
||||||
0x7F => .{ .codepoint = Key.backspace },
|
0x7F => .{ .codepoint = Key.backspace },
|
||||||
else => blk: {
|
else => blk: {
|
||||||
var iter: CodePointIterator = .{ .bytes = input[i..] };
|
var iter: CodePointIterator = .{ .bytes = input[i..] };
|
||||||
|
|
|
@ -9,7 +9,6 @@ const Screen = @import("Screen.zig");
|
||||||
const Window = @import("Window.zig");
|
const Window = @import("Window.zig");
|
||||||
const Options = @import("Options.zig");
|
const Options = @import("Options.zig");
|
||||||
const Style = @import("cell.zig").Style;
|
const Style = @import("cell.zig").Style;
|
||||||
const GraphemeCache = @import("GraphemeCache.zig");
|
|
||||||
|
|
||||||
/// Vaxis is the entrypoint for a Vaxis application. The provided type T should
|
/// Vaxis is the entrypoint for a Vaxis application. The provided type T should
|
||||||
/// be a tagged union which contains all of the events the application will
|
/// be a tagged union which contains all of the events the application will
|
||||||
|
@ -47,9 +46,6 @@ pub fn Vaxis(comptime T: type) type {
|
||||||
renders: usize = 0,
|
renders: usize = 0,
|
||||||
render_dur: i128 = 0,
|
render_dur: i128 = 0,
|
||||||
|
|
||||||
// grapheme cache
|
|
||||||
g_cache: GraphemeCache = .{},
|
|
||||||
|
|
||||||
/// Initialize Vaxis with runtime options
|
/// Initialize Vaxis with runtime options
|
||||||
pub fn init(_: Options) !Self {
|
pub fn init(_: Options) !Self {
|
||||||
return Self{
|
return Self{
|
||||||
|
|
Loading…
Reference in a new issue