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. --- README.md | 6 ++-- main.ha | 97 ++++++++++++++++++++++++++++++++++++----------------------- srtplay.1.scd | 6 ++-- 3 files changed, 67 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 28ed234..20a13e9 100644 --- a/README.md +++ b/README.md @@ -43,10 +43,12 @@ for further information. ### TUI key bindings -- `q`: exit the program +- `q`, ``: exit the program - `j`: fast-backward by 10 seconds -- `k`: pause or resume playback - `l`: fast-forward by 10 seconds +- ``: fast-backward by 5 seconds +- ``: fast-forward by 5 seconds +- `k`, ``: pause or resume playback ## Contributing 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)); }; }; diff --git a/srtplay.1.scd b/srtplay.1.scd index d4740cc..e9aa643 100644 --- a/srtplay.1.scd +++ b/srtplay.1.scd @@ -20,10 +20,12 @@ underlined, respectively. The following keys may be pressed at any time. -- *q*: exit the program +- *q*, **: exit the program - *j*: fast-backward by 10 seconds -- *k*: pause or resume playback - *l*: fast-forward by 10 seconds +- **: fast-backward by 5 seconds +- **: fast-forward by 5 seconds +- *k*, **: pause or resume playback # COPYRIGHT -- cgit v1.2.3