summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md6
-rw-r--r--main.ha97
-rw-r--r--srtplay.1.scd6
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`, `<Ctrl-C>`: exit the program
- `j`: fast-backward by 10 seconds
-- `k`: pause or resume playback
- `l`: fast-forward by 10 seconds
+- `<left arrow>`: fast-backward by 5 seconds
+- `<right arrow>`: fast-forward by 5 seconds
+- `k`, `<space>`: 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*, *<Ctrl-C>*: exit the program
- *j*: fast-backward by 10 seconds
-- *k*: pause or resume playback
- *l*: fast-forward by 10 seconds
+- *<left arrow>*: fast-backward by 5 seconds
+- *<right arrow>*: fast-forward by 5 seconds
+- *k*, *<space>*: pause or resume playback
# COPYRIGHT