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
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.
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
)
33 const char *errstr
= 0;
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();
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();
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();
71 case ET_DELETE_VERTEX
:
73 if (e
->idx_1
< q
->v_num
) {
74 if ((ret
= quiver_delete_vertex(q
, e
->idx_1
,
76 fprintf(stderr
, "%s\n", UBSAFES(errstr
));
80 ui_respond_quiver_change();
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();
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
,
102 fprintf(stderr
, "%s\n", UBSAFES(errstr
));
106 ui_respond_quiver_change();
116 int main(int argc
, char **argv
)
119 struct quiver q
= { 0 };
123 setlocale(LC_ALL
, "");
125 if ((ret
= ui_init(&q
))) {
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);
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())) {
195 if ((ret
= ui_start_frame())) {
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())) {
211 if ((ret
= ui_get_event(&e
, &more_evs
))) {
216 state_transition(&e
, &q
);
220 if ((ret
= ui_start_frame())) {