From 7e6307c4fe55f9ea80f3985b262990f18f95251a Mon Sep 17 00:00:00 2001 From: Sam Nystrom Date: Tue, 27 Jun 2023 00:21:31 -0400 Subject: Add additional keybindings Add , , , and bindings using hare-vt. --- main.ha | 97 +++++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 38 deletions(-) (limited to 'main.ha') diff --git a/main.ha b/main.ha index a33db83..953e917 100644 --- a/main.ha +++ b/main.ha @@ -159,61 +159,82 @@ fn run(state: state) (void | vt::error) = { let pollfds = [poll::pollfd { fd = os::stdin_file, - events = poll::event::POLLIN, + events = poll::event::POLLIN | poll::event::POLLHUP, ... }]; match (poll::poll(pollfds, timeout)) { - case uint => void; + case let x: uint => + if (x == 0) continue; case let err: poll::error => fmt::errorln("Error polling for user input:", poll::strerror(err))!; }; - if (pollfds[0].revents & poll::event::POLLIN == 0) { - continue; - }; - static let buf: [os::BUFSIZ]u8 = [0...]; - let input = match (io::read(os::stdin_file, buf)) { - case let x: size => - yield buf[..x]; + let ev = match (vt::pollevent(state.term)?) { + case void => + continue; + case let ev: vt::event => + yield ev; case io::EOF => break; - case let err: io::error => - fmt::errorln("Error reading user input:", io::strerror(err))!; - continue; }; - let quit = false; - let now = time::now(time::clock::REALTIME); - for (let i = 0z; i < len(input); i += 1) { - switch (input[i]) { + + match (ev.value) { + case let key: rune => + switch (key) { case 'q' => - quit = true; + break; + case 'c' => + if (ev.mods & vt::modflag::CTRL != 0) break; case 'j' => - state.start = time::add(state.start, time::SECOND * 10); - match (state.pause_start) { - case void => - if (time::diff(state.start, now) < 0) { - state.start = now; - }; - case let inst: time::instant => - if (time::diff(state.start, inst) < 0) { - state.start = inst; - }; - }; + fast_backward(&state, time::SECOND * 10); case 'l' => - state.start = time::add(state.start, -time::SECOND * 10); + fast_forward(&state, time::SECOND * 10); case 'k' => - match (state.pause_start) { - case void => - state.pause_start = now; - case let inst: time::instant => - state.pause_start = void; - state.start = time::add(state.start, time::diff(inst, now)); - }; - + pause(&state); + case ' ' => + pause(&state); case => void; }; + case let key: vt::specialkey => + switch (key) { + case vt::specialkey::LEFT => + fast_backward(&state, time::SECOND * 5); + case vt::specialkey::RIGHT => + fast_forward(&state, time::SECOND * 5); + }; + case vt::functionkey => void; }; - if (quit) break; + }; +}; + +fn fast_forward(state: *state, dur: time::duration) void = { + state.start = time::add(state.start, -dur); +}; + +fn fast_backward(state: *state, dur: time::duration) void = { + let now = time::now(time::clock::REALTIME); + state.start = time::add(state.start, dur); + match (state.pause_start) { + case void => + if (time::diff(state.start, now) < 0) { + state.start = now; + }; + case let inst: time::instant => + if (time::diff(state.start, inst) < 0) { + state.start = inst; + }; + }; + +}; + +fn pause(state: *state) void = { + let now = time::now(time::clock::REALTIME); + match (state.pause_start) { + case void => + state.pause_start = now; + case let inst: time::instant => + state.pause_start = void; + state.start = time::add(state.start, time::diff(inst, now)); }; }; -- cgit v1.2.3