annotate libcore/core/script.c @ 121:789b23e01f52

misc: reorganize hierarchy, closes #2490
author David Demelier <markand@malikania.fr>
date Mon, 05 Oct 2020 13:25:06 +0200
parents src/core/script.c@b49d8475a611
children 30b68089ae70
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
65
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * script.c -- convenient sequence of actions
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdlib.h>
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <string.h>
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include "script.h"
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "util.h"
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 static void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 script_action_finish(struct action *a)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 script_finish(a->data);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 free(a->data);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 static void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 script_action_handle(struct action *a, const union event *ev)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 assert(ev);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 script_handle(a->data, ev);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 static bool
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 script_action_update(struct action *a, unsigned int ticks)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 return script_update(a->data, ticks);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 static void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 script_action_draw(struct action *a)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 script_draw(a->data);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 script_init(struct script *s)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 memset(s, 0, sizeof (struct script));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 s->tail = &s->head;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 script_start(struct script *s)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 s->iter = s->head;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 script_append(struct script *s, const struct action *a)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 assert(a->update);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 struct script_action *iter = ecalloc(1, sizeof (struct script_action));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 memcpy(&iter->action, a, sizeof (struct action));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 *s->tail = iter;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 s->tail = &iter->next;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 script_handle(struct script *s, const union event *ev)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 assert(ev);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
73
b49d8475a611 molko: avoid double painter_present call
David Demelier <markand@malikania.fr>
parents: 69
diff changeset
97 if (s->iter && s->iter->action.handle)
65
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 s->iter->action.handle(&s->iter->action, ev);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 bool
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 script_update(struct script *s, unsigned int ticks)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105
69
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
106 if (!s->iter)
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
107 return true;
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
108
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
109 struct action *a = &s->iter->action;
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
110
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
111 if (a->update(a, ticks)) {
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
112 if (a->end)
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
113 a->end(a);
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
114 if (a->finish)
5da49274e5fb core: add new action.end callback for user
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
115 a->finish(a);
65
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 s->iter = s->iter->next;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 return s->iter == NULL;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 script_draw(struct script *s)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 if (s->iter && s->iter->action.draw)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 s->iter->action.draw(&s->iter->action);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 script_action(const struct script *s, struct action *action)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 assert(action);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 memset(action, 0, sizeof (struct action));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 action->data = ememdup(s, sizeof (struct script));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 action->handle = script_action_handle;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 action->update = script_action_update;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 action->draw = script_action_draw;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 action->finish = script_action_finish;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 script_finish(struct script *s)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 struct script_action *iter, *next;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 for (iter = s->head; iter; iter = next) {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 next = iter->next;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 free(iter);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 memset(s, 0, sizeof (struct script));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 }