Remove ui_confirm_deny() as an extraneous abstraction
[clav.git] / clav.c
blobc87d51e296c6fa78e3addca5a3f34804dfae38af
1 /*
2 * Copyright (c) 2016, S. Gilles <sgilles@math.umd.edu>
4 * Permission to use, copy, modify, and/or distribute this software
5 * for any purpose with or without fee is hereby granted, provided
6 * that the above copyright notice and this permission notice appear
7 * in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
13 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
14 * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 #include <locale.h>
19 #include <stdint.h>
20 #include <stdio.h>
22 #include "macros.h"
23 #include "quiver.h"
24 #include "ui.h"
26 /* Quit yet? */
27 static uint_fast8_t should_quit = 0;
29 /* Having received some kind of input, change state accordingly */
30 static int state_transition(struct ui_event *e, struct quiver *q)
32 int ret = 0;
33 const char *errstr = 0;
35 switch (e->type) {
36 case ET_QUIT:
37 should_quit = 1;
38 break;
39 case ET_MUTATE:
41 if (e->idx_1 < q->v_num) {
42 if ((ret = quiver_mutate(q, e->idx_1, 0, &errstr))) {
43 fprintf(stderr, "%s\n", UBSAFES(errstr));
47 ui_respond_quiver_change();
48 break;
49 case ET_NEW_VERTEX:
51 /* XXX: Allow setting name and fatness before creation */
52 if ((ret = quiver_add_vertex(q, 0, "FIXME", 1, e->int_1,
53 e->int_2, &errstr))) {
54 fprintf(stderr, "%s\n", UBSAFES(errstr));
57 ui_respond_quiver_change();
58 break;
59 case ET_NEW_EDGE:
61 if (e->idx_1 < q->v_num &&
62 e->idx_2 < q->v_num) {
63 if ((ret = quiver_add_to_edge(q, e->idx_1, e->idx_2,
64 e->a, e->b, &errstr))) {
65 fprintf(stderr, "%s\n", UBSAFES(errstr));
69 ui_respond_quiver_change();
70 break;
71 case ET_DELETE_VERTEX:
73 if (e->idx_1 < q->v_num) {
74 if ((ret = quiver_delete_vertex(q, e->idx_1,
75 &errstr))) {
76 fprintf(stderr, "%s\n", UBSAFES(errstr));
80 ui_respond_quiver_change();
81 break;
82 case ET_DELETE_EDGE:
84 if (e->idx_1 < q->v_num &&
85 e->idx_2 < q->v_num) {
86 size_t i12 = e->idx_1 * q->v_len + e->idx_2;
87 size_t i21 = e->idx_2 * q->v_len + e->idx_1;
89 q->e[i12] = (struct rational) { .p = 0, .q = 1 };
90 q->e[i21] = (struct rational) { .p = 0, .q = 1 };
93 ui_respond_quiver_change();
94 break;
95 case ET_CHANGE_FATNESS:
97 if (e->idx_1 < q->v_num &&
98 q->v[e->idx_1].fatness + e->int_1 > 0 &&
99 q->v[e->idx_1].fatness + e->int_1 < UINT_FAST8_MAX) {
100 if ((ret = quiver_adjust_fatness(q, e->idx_1, e->int_1,
101 &errstr))) {
102 fprintf(stderr, "%s\n", UBSAFES(errstr));
106 ui_respond_quiver_change();
107 break;
108 case ET_NONE:
109 break;
112 return ret;
115 /* Main loop */
116 int main(int argc, char **argv)
118 int ret;
119 struct quiver q = { 0 };
121 UNUSED(argc);
122 UNUSED(argv);
123 setlocale(LC_ALL, "");
125 if ((ret = ui_init(&q))) {
126 goto done;
130 /* XXX: rem (this is G2 U_{02} G2 */
131 size_t v0, vinf, v1, v2, v3, v4, v1b, v2b, v3b, v4b, v12, v21,
132 v32, v23, v30, v03, v10, v01;
134 /* Q_{G_2} U_{02} Q_{G_2} */
135 quiver_add_vertex(&q, &v0, "0", 1, 55, -229, 0);
136 quiver_add_vertex(&q, &vinf, "\u221e", 3, 47, 197, 0);
137 quiver_add_vertex(&q, &v1, "1", 3, 164, 12, 0);
138 quiver_add_vertex(&q, &v2, "2", 1, 297, 14, 0);
139 quiver_add_vertex(&q, &v3, "3", 3, 170, -131, 0);
140 quiver_add_vertex(&q, &v4, "4", 1, 303, -130, 0);
141 quiver_add_vertex(&q, &v1b, "1*", 3, -112, 1, 0);
142 quiver_add_vertex(&q, &v2b, "2*", 1, -114, -134, 0);
143 quiver_add_vertex(&q, &v3b, "3*", 3, -219, -5, 0);
144 quiver_add_vertex(&q, &v4b, "4*", 1, -222, -134, 0);
145 quiver_add_vertex(&q, &v12, "12", 3, -381, -260, 0);
146 quiver_add_vertex(&q, &v21, "21", 1, -226, -384, 0);
147 quiver_add_vertex(&q, &v32, "32", 1, 390, -230, 0);
148 quiver_add_vertex(&q, &v23, "23", 3, 241, -393, 0);
149 quiver_add_vertex(&q, &v30, "30", 3, 379, 131, 0);
150 quiver_add_vertex(&q, &v03, "03", 1, 238, 371, 0);
151 quiver_add_vertex(&q, &v10, "10", 1, -370, 229, 0);
152 quiver_add_vertex(&q, &v01, "01", 3, -182, 353, 0);
154 /* edges */
155 quiver_add_to_edge(&q, v0, v1b, 1, 1, 0);
156 quiver_add_to_edge(&q, v10, v01, 1, 2, 0);
157 quiver_add_to_edge(&q, v12, v21, 1, 2, 0);
158 quiver_add_to_edge(&q, v23, v32, 1, 2, 0);
159 quiver_add_to_edge(&q, v30, v03, 1, 2, 0);
160 quiver_add_to_edge(&q, v1b, vinf, 1, 1, 0);
161 quiver_add_to_edge(&q, v1b, v2b, 1, 1, 0);
162 quiver_add_to_edge(&q, v2b, v3b, 1, 1, 0);
163 quiver_add_to_edge(&q, v2b, v0, 1, 1, 0);
164 quiver_add_to_edge(&q, v3b, v1b, 1, 1, 0);
165 quiver_add_to_edge(&q, v3b, v4b, 1, 1, 0);
166 quiver_add_to_edge(&q, v4b, v2b, 1, 1, 0);
167 quiver_add_to_edge(&q, v4b, v10, 1, 1, 0);
168 quiver_add_to_edge(&q, v4b, v12, 1, 1, 0);
169 quiver_add_to_edge(&q, v0, v32, 1, 1, 0);
170 quiver_add_to_edge(&q, v1, v2, 1, 1, 0);
171 quiver_add_to_edge(&q, vinf, v1, 1, 1, 0);
172 quiver_add_to_edge(&q, v3, v1, 1, 1, 0);
173 quiver_add_to_edge(&q, v1, v30, 1, 1, 0);
174 quiver_add_to_edge(&q, v2, v3, 1, 1, 0);
175 quiver_add_to_edge(&q, v2, v03, 1, 1, 0);
176 quiver_add_to_edge(&q, v3, v4, 1, 1, 0);
177 quiver_add_to_edge(&q, v4, v2, 1, 1, 0);
178 quiver_add_to_edge(&q, v4, v0, 1, 1, 0);
179 quiver_add_to_edge(&q, v4, v23, 1, 1, 0);
180 quiver_add_to_edge(&q, vinf, v01, 1, 1, 0);
181 quiver_add_to_edge(&q, v01, v1b, 1, 1, 0);
182 quiver_add_to_edge(&q, v10, v21, 1, 1, 0);
183 quiver_add_to_edge(&q, v12, v3b, 1, 1, 0);
184 quiver_add_to_edge(&q, v21, v4b, 1, 1, 0);
185 quiver_add_to_edge(&q, v23, v3, 1, 1, 0);
186 quiver_add_to_edge(&q, v32, v4, 1, 1, 0);
187 quiver_add_to_edge(&q, v30, vinf, 1, 1, 0);
188 quiver_add_to_edge(&q, v03, v1, 1, 1, 0);
190 if ((ret = ui_respond_quiver_change())) {
191 goto done;
195 if ((ret = ui_start_frame())) {
196 goto done;
199 uint_fast8_t more_evs = 0;
200 struct ui_event e = { 0 };
202 while (!should_quit) {
203 /* includes framelimiting delay */
204 if ((ret = ui_finish_frame())) {
205 goto done;
208 more_evs = 1;
210 while (more_evs) {
211 if ((ret = ui_get_event(&e, &more_evs))) {
212 goto done;
215 if (e.type) {
216 state_transition(&e, &q);
220 if ((ret = ui_start_frame())) {
221 goto done;
225 done:
226 ui_teardown();
228 return ret;