const std = @import("std"); const RawMode = @This(); const termios = std.os.termios; orig: termios, pub fn init() !RawMode { const orig = try std.os.tcgetattr(std.os.STDIN_FILENO); const self = RawMode{ .orig = orig }; errdefer self.deinit(); var raw = orig; raw.iflag.BRKINT = false; raw.iflag.ICRNL = false; raw.iflag.INPCK = false; raw.iflag.ISTRIP = false; raw.iflag.IXON = false; raw.lflag.ECHO = false; raw.lflag.ICANON = false; raw.lflag.IEXTEN = false; raw.lflag.ISIG = false; raw.oflag.OPOST = false; raw.cflag.CSIZE = .CS8; raw.cc[@intFromEnum(std.posix.V.MIN)] = 0; raw.cc[@intFromEnum(std.posix.V.TIME)] = 1; try std.os.tcsetattr(std.os.STDIN_FILENO, .FLUSH, raw); return self; } pub fn deinit(self: RawMode) void { std.os.tcsetattr(std.os.STDIN_FILENO, .FLUSH, self.orig) catch |err| { std.log.err("Failed to reset termios: {}", .{err}); }; }