summaryrefslogtreecommitdiff
path: root/main.ha
diff options
context:
space:
mode:
authorSam Nystrom <sam@samnystrom.dev>2023-06-27 00:21:31 -0400
committerSam Nystrom <sam@samnystrom.dev>2023-06-27 00:24:22 -0400
commit7e6307c4fe55f9ea80f3985b262990f18f95251a (patch)
tree8f35ee6f0cc83c714940f409cc7aa822efc966c4 /main.ha
parent3828165f48d71f5a4be96204a2af3c02b2b9ee0a (diff)
Add additional keybindings
Add <space>, <ctrl-c>, <left-arrow>, and <right-arrow> bindings using hare-vt.
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));
};
};