summaryrefslogtreecommitdiff
path: root/main.ha
diff options
context:
space:
mode:
Diffstat (limited to 'main.ha')
-rw-r--r--main.ha97
1 files changed, 59 insertions, 38 deletions
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));
};
};