Mercurial > molko
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 } |