Rudimentary event handling
[clav.git] / clav.c
blobdb25b5624b14646c864ee587a15d303d749aee44
1 #include <locale.h>
2 #include <stdint.h>
3 #include <stdio.h>
5 #include "macros.h"
6 #include "ui.h"
8 /* The general state of the application */
9 static enum {
10 ST_DEFAULT = 0,
11 ST_ASKING_QUIT,
12 ST_SHOULD_QUIT
13 } state;
15 /* Having received some kind of input, change state accordingly */
16 static int state_transition(struct ui_event *e)
18 int ret = 0;
20 switch (state) {
21 case ST_SHOULD_QUIT:
22 break;
23 case ST_DEFAULT:
25 switch (e->type) {
26 case ET_INITIAL_QUIT:
27 ret = ui_confirm_deny("Quit?");
28 state = ST_ASKING_QUIT;
29 break;
30 case ET_FORCE_QUIT:
31 state = ST_SHOULD_QUIT;
32 break;
33 case ET_NONE:
34 case ET_CONFIRM:
35 case ET_DENY:
36 break;
39 break;
40 case ST_ASKING_QUIT:
42 switch (e->type) {
43 case ET_CONFIRM:
44 case ET_FORCE_QUIT:
45 state = ST_SHOULD_QUIT;
46 break;
47 case ET_DENY:
48 state = ST_DEFAULT;
49 break;
50 case ET_NONE:
51 case ET_INITIAL_QUIT:
52 break;
55 break;
58 if (ret) {
59 state = ST_SHOULD_QUIT;
62 return ret;
65 /* Main loop */
66 int main(int argc, char **argv)
68 int ret;
69 uint_fast8_t more_evs = 0;
70 struct ui_event e = { 0 };
72 UNUSED(argc);
73 UNUSED(argv);
74 setlocale(LC_ALL, "");
76 if ((ret = ui_init())) {
77 goto done;
80 if ((ret = ui_start_frame())) {
81 goto done;
84 while (state != ST_SHOULD_QUIT) {
85 /* includes framelimiting delay */
86 if ((ret = ui_finish_frame())) {
87 goto done;
90 more_evs = 1;
92 while (more_evs) {
93 if ((ret = ui_get_event(&e, &more_evs))) {
94 goto done;
97 if (e.type) {
98 state_transition(&e);
102 if ((ret = ui_start_frame())) {
103 goto done;
107 done:
108 ui_teardown();
110 return ret;