comparison src/libmlk-core-js/core/js-event.c @ 338:94828af916bb

js: add more core bindings
author David Demelier <markand@malikania.fr>
date Thu, 14 Oct 2021 21:21:28 +0200
parents
children 323d13f49233
comparison
equal deleted inserted replaced
337:68b9d010e081 338:94828af916bb
1 /*
2 * js-event.c -- core event binding
3 *
4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr>
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <assert.h>
20
21 #include <core/event.h>
22
23 #include "js-event.h"
24
25 static void
26 push_click(duk_context *ctx, const union event *ev)
27 {
28 duk_push_int(ctx, ev->click.button);
29 duk_put_prop_string(ctx, -2, "button");
30 duk_push_int(ctx, ev->click.x);
31 duk_put_prop_string(ctx, -2, "x");
32 duk_push_int(ctx, ev->click.y);
33 duk_put_prop_string(ctx, -2, "y");
34 duk_push_int(ctx, ev->click.clicks);
35 duk_put_prop_string(ctx, -2, "clicks");
36 }
37
38 static void
39 push_key(duk_context *ctx, const union event *ev)
40 {
41 duk_push_int(ctx, ev->key.key);
42 duk_put_prop_string(ctx, -2, "key");
43 }
44
45 static void
46 push_mouse(duk_context *ctx, const union event *ev)
47 {
48 duk_push_int(ctx, ev->mouse.buttons);
49 duk_put_prop_string(ctx, -2, "buttons");
50 duk_push_int(ctx, ev->mouse.x);
51 duk_put_prop_string(ctx, -2, "x");
52 duk_push_int(ctx, ev->mouse.y);
53 duk_put_prop_string(ctx, -2, "y");
54 }
55
56 static void
57 push_quit(duk_context *ctx, const union event *ev)
58 {
59 (void)ctx;
60 (void)ev;
61 }
62
63 static void (*push[])(duk_context *, const union event *) = {
64 [EVENT_CLICKDOWN] = push_click,
65 [EVENT_CLICKUP] = push_click,
66 [EVENT_KEYDOWN] = push_key,
67 [EVENT_KEYUP] = push_key,
68 [EVENT_MOUSE] = push_mouse,
69 [EVENT_QUIT] = push_quit,
70 };
71
72 static duk_ret_t
73 Event_poll(duk_context *ctx)
74 {
75 (void)ctx;
76
77 union event ev;
78
79 if (!event_poll(&ev))
80 duk_push_null(ctx);
81 else {
82 duk_push_object(ctx);
83 duk_push_int(ctx, ev.type);
84 duk_put_prop_string(ctx, -2, "type");
85 push[ev.type](ctx, &ev);
86 }
87
88 return 1;
89 }
90
91 static const duk_function_list_entry functions[] = {
92 { "poll", Event_poll, 0 },
93 { NULL, NULL, 0 }
94 };
95
96 static const duk_number_list_entry types[] = {
97 { "CLICKDOWN", EVENT_CLICKDOWN },
98 { "CLICKUP", EVENT_CLICKUP },
99 { "KEYDOWN", EVENT_KEYDOWN },
100 { "KEYUP", EVENT_KEYUP },
101 { "MOUSE", EVENT_MOUSE },
102 { "QUIT", EVENT_QUIT },
103 { NULL, 0 }
104 };
105
106 static const duk_number_list_entry keys[] = {
107 { "UNKNOWN", KEY_UNKNOWN },
108 { "ENTER", KEY_ENTER },
109 { "ESCAPE", KEY_ESCAPE },
110 { "BACKSPACE", KEY_BACKSPACE },
111 { "TAB", KEY_TAB },
112 { "SPACE", KEY_SPACE },
113 { "EXCLAIM", KEY_EXCLAIM },
114 { "DOUBLE_QUOTE", KEY_DOUBLE_QUOTE },
115 { "HASH", KEY_HASH },
116 { "PERCENT", KEY_PERCENT },
117 { "DOLLAR", KEY_DOLLAR },
118 { "AMPERSAND", KEY_AMPERSAND },
119 { "QUOTE", KEY_QUOTE },
120 { "LEFT_PAREN", KEY_LEFT_PAREN },
121 { "RIGHT_PAREN", KEY_RIGHT_PAREN },
122 { "ASTERISK", KEY_ASTERISK },
123 { "PLUS", KEY_PLUS },
124 { "COMMA", KEY_COMMA },
125 { "MINUS", KEY_MINUS },
126 { "PERIOD", KEY_PERIOD },
127 { "SLASH", KEY_SLASH },
128 { "0", KEY_0 },
129 { "1", KEY_1 },
130 { "2", KEY_2 },
131 { "3", KEY_3 },
132 { "4", KEY_4 },
133 { "5", KEY_5 },
134 { "6", KEY_6 },
135 { "7", KEY_7 },
136 { "8", KEY_8 },
137 { "9", KEY_9 },
138 { "COLON", KEY_COLON },
139 { "SEMICOLON", KEY_SEMICOLON },
140 { "LESS", KEY_LESS },
141 { "EQUALS", KEY_EQUALS },
142 { "GREATER", KEY_GREATER },
143 { "QUESTION", KEY_QUESTION },
144 { "AT", KEY_AT },
145 { "LEFT_BRACKET", KEY_LEFT_BRACKET },
146 { "BACKSLASH", KEY_BACKSLASH },
147 { "RIGHT_BRACKET", KEY_RIGHT_BRACKET },
148 { "CARET", KEY_CARET },
149 { "UNDERSCORE", KEY_UNDERSCORE },
150 { "BACKQUOTE", KEY_BACKQUOTE },
151 { "a", KEY_a },
152 { "b", KEY_b },
153 { "c", KEY_c },
154 { "d", KEY_d },
155 { "e", KEY_e },
156 { "f", KEY_f },
157 { "g", KEY_g },
158 { "h", KEY_h },
159 { "i", KEY_i },
160 { "j", KEY_j },
161 { "k", KEY_k },
162 { "l", KEY_l },
163 { "m", KEY_m },
164 { "n", KEY_n },
165 { "o", KEY_o },
166 { "p", KEY_p },
167 { "q", KEY_q },
168 { "r", KEY_r },
169 { "s", KEY_s },
170 { "t", KEY_t },
171 { "u", KEY_u },
172 { "v", KEY_v },
173 { "w", KEY_w },
174 { "x", KEY_x },
175 { "y", KEY_y },
176 { "z", KEY_z },
177 { "CAPSLOCK", KEY_CAPSLOCK },
178 { "F1", KEY_F1 },
179 { "F2", KEY_F2 },
180 { "F3", KEY_F3 },
181 { "F4", KEY_F4 },
182 { "F5", KEY_F5 },
183 { "F6", KEY_F6 },
184 { "F7", KEY_F7 },
185 { "F8", KEY_F8 },
186 { "F9", KEY_F9 },
187 { "F10", KEY_F10 },
188 { "F11", KEY_F11 },
189 { "F12", KEY_F12 },
190 { "F13", KEY_F13 },
191 { "F14", KEY_F14 },
192 { "F15", KEY_F15 },
193 { "F16", KEY_F16 },
194 { "F17", KEY_F17 },
195 { "F18", KEY_F18 },
196 { "F19", KEY_F19 },
197 { "F20", KEY_F20 },
198 { "F21", KEY_F21 },
199 { "F22", KEY_F22 },
200 { "F23", KEY_F23 },
201 { "F24", KEY_F24 },
202 { "PRINTSCREEN", KEY_PRINTSCREEN },
203 { "SCROLL_LOCK", KEY_SCROLL_LOCK },
204 { "PAUSE", KEY_PAUSE },
205 { "INSERT", KEY_INSERT },
206 { "HOME", KEY_HOME },
207 { "PAGEUP", KEY_PAGEUP },
208 { "DELETE", KEY_DELETE },
209 { "END", KEY_END },
210 { "PAGEDOWN", KEY_PAGEDOWN },
211 { "RIGHT", KEY_RIGHT },
212 { "LEFT", KEY_LEFT },
213 { "DOWN", KEY_DOWN },
214 { "UP", KEY_UP },
215 { "NUMLOCKCLEAR", KEY_NUMLOCKCLEAR },
216 { "KP_DIVIDE", KEY_KP_DIVIDE },
217 { "KP_MULTIPLY", KEY_KP_MULTIPLY },
218 { "KP_MINUS", KEY_KP_MINUS },
219 { "KP_PLUS", KEY_KP_PLUS },
220 { "KP_ENTER", KEY_KP_ENTER },
221 { "KP_00", KEY_KP_00 },
222 { "KP_000", KEY_KP_000 },
223 { "KP_1", KEY_KP_1 },
224 { "KP_2", KEY_KP_2 },
225 { "KP_3", KEY_KP_3 },
226 { "KP_4", KEY_KP_4 },
227 { "KP_5", KEY_KP_5 },
228 { "KP_6", KEY_KP_6 },
229 { "KP_7", KEY_KP_7 },
230 { "KP_8", KEY_KP_8 },
231 { "KP_9", KEY_KP_9 },
232 { "KP_0", KEY_KP_0 },
233 { "KP_PERIOD", KEY_KP_PERIOD },
234 { "KP_COMMA", KEY_KP_COMMA },
235 { "MENU", KEY_MENU },
236 { "MUTE", KEY_MUTE },
237 { "VOLUME_UP", KEY_VOLUME_UP },
238 { "VOLUME_DOWN", KEY_VOLUME_DOWN },
239 { "LCTRL", KEY_LCTRL },
240 { "LSHIFT", KEY_LSHIFT },
241 { "LALT", KEY_LALT },
242 { "LSUPER", KEY_LSUPER },
243 { "RCTRL", KEY_RCTRL },
244 { "RSHIFT", KEY_RSHIFT },
245 { "RALT", KEY_RALT },
246 { "RSUPER", KEY_RSUPER },
247 { NULL, 0 }
248 };
249
250 static const duk_number_list_entry keymods[] = {
251 { "LSHIFT", KEYMOD_LSHIFT },
252 { "LCTRL", KEYMOD_LCTRL },
253 { "LALT", KEYMOD_LALT },
254 { "LSUPER", KEYMOD_LSUPER },
255 { "RSHIFT", KEYMOD_RSHIFT },
256 { "RTCRL", KEYMOD_RCTRL },
257 { "RALT", KEYMOD_RALT },
258 { "RSUPER", KEYMOD_RSUPER },
259 { NULL, 0 }
260 };
261
262 static const duk_number_list_entry buttons[] = {
263 { "LEFT", MOUSE_BUTTON_LEFT },
264 { "MIDDLE", MOUSE_BUTTON_MIDDLE },
265 { "RIGHT", MOUSE_BUTTON_RIGHT },
266 { NULL, 0 }
267 };
268
269 void
270 js_event_bind(duk_context *ctx)
271 {
272 assert(ctx);
273
274 duk_push_global_object(ctx);
275 duk_push_object(ctx);
276 duk_put_function_list(ctx, -1, functions);
277 duk_push_object(ctx);
278 duk_put_number_list(ctx, -1, types);
279 duk_put_prop_string(ctx, -2, "type");
280 duk_push_object(ctx);
281 duk_put_number_list(ctx, -1, keys);
282 duk_put_prop_string(ctx, -2, "key");
283 duk_push_object(ctx);
284 duk_put_number_list(ctx, -1, keymods);
285 duk_put_prop_string(ctx, -2, "keymod");
286 duk_push_object(ctx);
287 duk_put_number_list(ctx, -1, buttons);
288 duk_put_prop_string(ctx, -2, "button");
289 duk_put_prop_string(ctx, -2, "Event");
290 duk_pop(ctx);
291 }