diff --git a/src/main.zig b/src/main.zig index 7cb18e3..258c28a 100644 --- a/src/main.zig +++ b/src/main.zig @@ -3,7 +3,6 @@ const builtin = @import("builtin"); const vaxis = @import("vaxis"); const xev = @import("xev"); -const Cell = vaxis.Cell; const networking = @import("./networking.zig"); const rotctl = @import("./rotctl.zig"); @@ -206,6 +205,62 @@ pub const RotInt = struct { try self.vx.render(self.termbuffer.writer().any()); try self.termbuffer.flush(); } + + fn terminalEvent( + self_: ?*RotInt, + loop: *xev.Loop, + watcher: *vaxis.xev.TtyWatcher(RotInt), + event: vaxis.xev.Event, + ) xev.CallbackAction { + const self = self_.?; + switch (event) { + .key_press => |key| keyp: { + var mods = key.mods; + mods.caps_lock = false; + mods.num_lock = false; + const scale: f64 = if (std.meta.eql(mods, .{ .shift = true })) 1 else 10; + + const delta: AzEl = switch (key.codepoint) { + vaxis.Key.left, vaxis.Key.kp_left => .{ .az = -0.1 * scale, .el = 0 }, + vaxis.Key.right, vaxis.Key.kp_right => .{ .az = 0.1 * scale, .el = 0 }, + vaxis.Key.up, vaxis.Key.kp_up => .{ .az = 0, .el = 0.1 * scale }, + vaxis.Key.down, vaxis.Key.kp_down => .{ .az = 0 * scale, .el = -0.1 * scale }, + 'l' => { + if (std.meta.eql(mods, .{ .ctrl = true })) + self.vx.queueRefresh(); + break :keyp; + }, + 'c' => { + if (std.meta.eql(mods, .{ .ctrl = true })) { + loop.stop(); + return .disarm; + } + break :keyp; + }, + 'q' => { + if (std.meta.eql(mods, .{})) { + loop.stop(); + return .disarm; + } + break :keyp; + }, + else => break :keyp, + }; + + self.offsets.az += delta.az; + self.offsets.el += delta.el; + self.draw() catch { + self.warn("draw failure", .{}); + }; + }, + .winsize => |ws| { + watcher.vx.resize(self.allocator, watcher.tty.anyWriter(), ws) catch + return .disarm; + }, + else => {}, + } + return .rearm; + } }; pub fn main() !void { @@ -236,7 +291,7 @@ pub fn main() !void { try app.initInPlace(); var vx_loop: vaxis.xev.TtyWatcher(RotInt) = undefined; - try vx_loop.init(&tty, &vx, &loop, &app, eventCallback); + try vx_loop.init(&tty, &vx, &loop, &app, RotInt.terminalEvent); try vx.enterAltScreen(tty.anyWriter()); try vx.queryTerminalSend(tty.anyWriter()); @@ -247,75 +302,3 @@ pub fn main() !void { try loop.run(.until_done); } - -fn eventCallback( - self_: ?*RotInt, - loop: *xev.Loop, - watcher: *vaxis.xev.TtyWatcher(RotInt), - event: vaxis.xev.Event, -) xev.CallbackAction { - const self = self_.?; - switch (event) { - .key_press => |key| keyp: { - var mods = key.mods; - mods.caps_lock = false; - mods.num_lock = false; - const scale: f64 = if (std.meta.eql(mods, .{ .shift = true })) 1 else 10; - - const delta: AzEl = switch (key.codepoint) { - vaxis.Key.left, vaxis.Key.kp_left => .{ .az = -0.1 * scale, .el = 0 }, - vaxis.Key.right, vaxis.Key.kp_right => .{ .az = 0.1 * scale, .el = 0 }, - vaxis.Key.up, vaxis.Key.kp_up => .{ .az = 0, .el = 0.1 * scale }, - vaxis.Key.down, vaxis.Key.kp_down => .{ .az = 0 * scale, .el = -0.1 * scale }, - 'l' => { - if (std.meta.eql(mods, .{ .ctrl = true })) - self.vx.queueRefresh(); - break :keyp; - }, - 'c' => { - if (std.meta.eql(mods, .{ .ctrl = true })) { - loop.stop(); - return .disarm; - } - break :keyp; - }, - 'q' => { - if (std.meta.eql(mods, .{})) { - loop.stop(); - return .disarm; - } - break :keyp; - }, - else => break :keyp, - }; - - self.offsets.az += delta.az; - self.offsets.el += delta.el; - self.draw() catch { - self.warn("draw failure", .{}); - }; - }, - .winsize => |ws| { - watcher.vx.resize(self.allocator, watcher.tty.anyWriter(), ws) catch - return .disarm; - }, - else => {}, - } - return .rearm; -} - -fn timerCallback( - ud: ?*RotInt, - loop: *xev.Loop, - completion: *xev.Completion, - err: xev.Timer.RunError!void, -) xev.CallbackAction { - _ = err catch @panic("timer error"); - - var app = ud orelse return .disarm; - app.draw() catch @panic("couldn't draw"); - - const timer = xev.Timer.init() catch unreachable; - timer.run(loop, completion, 8, RotInt, app, timerCallback); - return .disarm; -}