Mercurial > molko
annotate libmlk-core/mlk/core/action-stack.c @ 646:7e1eb7f6c049 default tip @
misc: remove .clang
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 04 Feb 2024 15:24:37 +0100 |
parents | 4349b591c3ac |
children |
rev | line source |
---|---|
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * action-stack.h -- convenient stack of actions |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
445
773a082f0b91
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
442
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <string.h> |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
422
b0579ae033ed
core: use err.h in (action|drawable)-stack
David Demelier <markand@malikania.fr>
parents:
392
diff
changeset
|
22 #include "action-stack.h" |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include "action.h" |
586 | 24 #include "core_p.h" |
422
b0579ae033ed
core: use err.h in (action|drawable)-stack
David Demelier <markand@malikania.fr>
parents:
392
diff
changeset
|
25 #include "err.h" |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
442
9c3b3935f0aa
core: rework allocations
David Demelier <markand@malikania.fr>
parents:
441
diff
changeset
|
27 #define FOREACH(st, iter) \ |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
28 for (size_t i = 0; i < (st)->actionsz && ((iter) = (st)->actions[i], 1); ++i) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 void |
514 | 31 mlk_action_stack_init(struct mlk_action_stack *st) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
35 for (size_t i = 0; i < st->actionsz; ++i) |
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
36 st->actions[i] = NULL; |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 int |
442
9c3b3935f0aa
core: rework allocations
David Demelier <markand@malikania.fr>
parents:
441
diff
changeset
|
40 mlk_action_stack_add(struct mlk_action_stack *st, struct mlk_action *act) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 assert(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
45 for (size_t i = 0; i < st->actionsz; ++i) { |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 if (!st->actions[i]) { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 st->actions[i] = act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 return 0; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 |
586 | 52 return mlk_errf(_("no space in action stack")); |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 |
509
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
55 int |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
56 mlk_action_stack_completed(const struct mlk_action_stack *st) |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
57 { |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
58 assert(st); |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
59 |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
60 struct mlk_action *act; |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
61 |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
62 FOREACH(st, act) |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
63 if (act) |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
64 return 0; |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
65 |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
66 return 1; |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
67 } |
a11cd7ea3a37
core: doxygenize action
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
68 |
480
c1f64d451230
core: mlk_action has a start callback
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
69 void |
518
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
70 mlk_action_stack_start(struct mlk_action_stack *st) |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
71 { |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
72 assert(st); |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
73 |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
74 struct mlk_action *act; |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
75 |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
76 FOREACH(st, act) |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
77 if (act) |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
78 mlk_action_start(act); |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
79 } |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
80 |
47f0fe6f6581
core: doxygenize drawable-stack
David Demelier <markand@malikania.fr>
parents:
514
diff
changeset
|
81 void |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
82 mlk_action_stack_handle(struct mlk_action_stack *st, const union mlk_event *ev) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 assert(ev); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
441
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
87 struct mlk_action *act; |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 |
442
9c3b3935f0aa
core: rework allocations
David Demelier <markand@malikania.fr>
parents:
441
diff
changeset
|
89 FOREACH(st, act) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 if (act) |
441
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
91 mlk_action_handle(act, ev); |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 int |
442
9c3b3935f0aa
core: rework allocations
David Demelier <markand@malikania.fr>
parents:
441
diff
changeset
|
95 mlk_action_stack_update(struct mlk_action_stack *st, unsigned int ticks) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 |
441
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
99 struct mlk_action *act; |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
101 for (size_t i = 0; i < st->actionsz; ++i) { |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 act = st->actions[i]; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 |
441
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
104 if (act && mlk_action_update(act, ticks)) { |
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
105 mlk_action_end(act); |
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
106 mlk_action_finish(act); |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 st->actions[i] = NULL; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 /* |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 * We process all actions again in case the user modified the stack |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 * within their update function. |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 */ |
442
9c3b3935f0aa
core: rework allocations
David Demelier <markand@malikania.fr>
parents:
441
diff
changeset
|
115 return mlk_action_stack_completed(st); |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 void |
442
9c3b3935f0aa
core: rework allocations
David Demelier <markand@malikania.fr>
parents:
441
diff
changeset
|
119 mlk_action_stack_draw(const struct mlk_action_stack *st) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 |
441
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
123 struct mlk_action *act; |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 |
442
9c3b3935f0aa
core: rework allocations
David Demelier <markand@malikania.fr>
parents:
441
diff
changeset
|
125 FOREACH(st, act) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 if (act) |
441
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
127 mlk_action_draw(act); |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 void |
442
9c3b3935f0aa
core: rework allocations
David Demelier <markand@malikania.fr>
parents:
441
diff
changeset
|
131 mlk_action_stack_finish(struct mlk_action_stack *st) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 assert(st); |
422
b0579ae033ed
core: use err.h in (action|drawable)-stack
David Demelier <markand@malikania.fr>
parents:
392
diff
changeset
|
134 |
441
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
135 struct mlk_action *act; |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 |
442
9c3b3935f0aa
core: rework allocations
David Demelier <markand@malikania.fr>
parents:
441
diff
changeset
|
137 FOREACH(st, act) { |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 if (act) { |
441
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
139 mlk_action_end(act); |
31c1bbc33813
man: document mlk-action
David Demelier <markand@malikania.fr>
parents:
437
diff
changeset
|
140 mlk_action_finish(act); |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 |
508
7f7602bae0bd
examples: minor touches
David Demelier <markand@malikania.fr>
parents:
480
diff
changeset
|
144 for (size_t i = 0; i < st->actionsz; ++i) |
7f7602bae0bd
examples: minor touches
David Demelier <markand@malikania.fr>
parents:
480
diff
changeset
|
145 st->actions[i] = NULL; |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 } |