Mercurial > molko
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/libmlk-core-js/core/js-event.c Thu Oct 14 21:21:28 2021 +0200 @@ -0,0 +1,291 @@ +/* + * js-event.c -- core event binding + * + * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <assert.h> + +#include <core/event.h> + +#include "js-event.h" + +static void +push_click(duk_context *ctx, const union event *ev) +{ + duk_push_int(ctx, ev->click.button); + duk_put_prop_string(ctx, -2, "button"); + duk_push_int(ctx, ev->click.x); + duk_put_prop_string(ctx, -2, "x"); + duk_push_int(ctx, ev->click.y); + duk_put_prop_string(ctx, -2, "y"); + duk_push_int(ctx, ev->click.clicks); + duk_put_prop_string(ctx, -2, "clicks"); +} + +static void +push_key(duk_context *ctx, const union event *ev) +{ + duk_push_int(ctx, ev->key.key); + duk_put_prop_string(ctx, -2, "key"); +} + +static void +push_mouse(duk_context *ctx, const union event *ev) +{ + duk_push_int(ctx, ev->mouse.buttons); + duk_put_prop_string(ctx, -2, "buttons"); + duk_push_int(ctx, ev->mouse.x); + duk_put_prop_string(ctx, -2, "x"); + duk_push_int(ctx, ev->mouse.y); + duk_put_prop_string(ctx, -2, "y"); +} + +static void +push_quit(duk_context *ctx, const union event *ev) +{ + (void)ctx; + (void)ev; +} + +static void (*push[])(duk_context *, const union event *) = { + [EVENT_CLICKDOWN] = push_click, + [EVENT_CLICKUP] = push_click, + [EVENT_KEYDOWN] = push_key, + [EVENT_KEYUP] = push_key, + [EVENT_MOUSE] = push_mouse, + [EVENT_QUIT] = push_quit, +}; + +static duk_ret_t +Event_poll(duk_context *ctx) +{ + (void)ctx; + + union event ev; + + if (!event_poll(&ev)) + duk_push_null(ctx); + else { + duk_push_object(ctx); + duk_push_int(ctx, ev.type); + duk_put_prop_string(ctx, -2, "type"); + push[ev.type](ctx, &ev); + } + + return 1; +} + +static const duk_function_list_entry functions[] = { + { "poll", Event_poll, 0 }, + { NULL, NULL, 0 } +}; + +static const duk_number_list_entry types[] = { + { "CLICKDOWN", EVENT_CLICKDOWN }, + { "CLICKUP", EVENT_CLICKUP }, + { "KEYDOWN", EVENT_KEYDOWN }, + { "KEYUP", EVENT_KEYUP }, + { "MOUSE", EVENT_MOUSE }, + { "QUIT", EVENT_QUIT }, + { NULL, 0 } +}; + +static const duk_number_list_entry keys[] = { + { "UNKNOWN", KEY_UNKNOWN }, + { "ENTER", KEY_ENTER }, + { "ESCAPE", KEY_ESCAPE }, + { "BACKSPACE", KEY_BACKSPACE }, + { "TAB", KEY_TAB }, + { "SPACE", KEY_SPACE }, + { "EXCLAIM", KEY_EXCLAIM }, + { "DOUBLE_QUOTE", KEY_DOUBLE_QUOTE }, + { "HASH", KEY_HASH }, + { "PERCENT", KEY_PERCENT }, + { "DOLLAR", KEY_DOLLAR }, + { "AMPERSAND", KEY_AMPERSAND }, + { "QUOTE", KEY_QUOTE }, + { "LEFT_PAREN", KEY_LEFT_PAREN }, + { "RIGHT_PAREN", KEY_RIGHT_PAREN }, + { "ASTERISK", KEY_ASTERISK }, + { "PLUS", KEY_PLUS }, + { "COMMA", KEY_COMMA }, + { "MINUS", KEY_MINUS }, + { "PERIOD", KEY_PERIOD }, + { "SLASH", KEY_SLASH }, + { "0", KEY_0 }, + { "1", KEY_1 }, + { "2", KEY_2 }, + { "3", KEY_3 }, + { "4", KEY_4 }, + { "5", KEY_5 }, + { "6", KEY_6 }, + { "7", KEY_7 }, + { "8", KEY_8 }, + { "9", KEY_9 }, + { "COLON", KEY_COLON }, + { "SEMICOLON", KEY_SEMICOLON }, + { "LESS", KEY_LESS }, + { "EQUALS", KEY_EQUALS }, + { "GREATER", KEY_GREATER }, + { "QUESTION", KEY_QUESTION }, + { "AT", KEY_AT }, + { "LEFT_BRACKET", KEY_LEFT_BRACKET }, + { "BACKSLASH", KEY_BACKSLASH }, + { "RIGHT_BRACKET", KEY_RIGHT_BRACKET }, + { "CARET", KEY_CARET }, + { "UNDERSCORE", KEY_UNDERSCORE }, + { "BACKQUOTE", KEY_BACKQUOTE }, + { "a", KEY_a }, + { "b", KEY_b }, + { "c", KEY_c }, + { "d", KEY_d }, + { "e", KEY_e }, + { "f", KEY_f }, + { "g", KEY_g }, + { "h", KEY_h }, + { "i", KEY_i }, + { "j", KEY_j }, + { "k", KEY_k }, + { "l", KEY_l }, + { "m", KEY_m }, + { "n", KEY_n }, + { "o", KEY_o }, + { "p", KEY_p }, + { "q", KEY_q }, + { "r", KEY_r }, + { "s", KEY_s }, + { "t", KEY_t }, + { "u", KEY_u }, + { "v", KEY_v }, + { "w", KEY_w }, + { "x", KEY_x }, + { "y", KEY_y }, + { "z", KEY_z }, + { "CAPSLOCK", KEY_CAPSLOCK }, + { "F1", KEY_F1 }, + { "F2", KEY_F2 }, + { "F3", KEY_F3 }, + { "F4", KEY_F4 }, + { "F5", KEY_F5 }, + { "F6", KEY_F6 }, + { "F7", KEY_F7 }, + { "F8", KEY_F8 }, + { "F9", KEY_F9 }, + { "F10", KEY_F10 }, + { "F11", KEY_F11 }, + { "F12", KEY_F12 }, + { "F13", KEY_F13 }, + { "F14", KEY_F14 }, + { "F15", KEY_F15 }, + { "F16", KEY_F16 }, + { "F17", KEY_F17 }, + { "F18", KEY_F18 }, + { "F19", KEY_F19 }, + { "F20", KEY_F20 }, + { "F21", KEY_F21 }, + { "F22", KEY_F22 }, + { "F23", KEY_F23 }, + { "F24", KEY_F24 }, + { "PRINTSCREEN", KEY_PRINTSCREEN }, + { "SCROLL_LOCK", KEY_SCROLL_LOCK }, + { "PAUSE", KEY_PAUSE }, + { "INSERT", KEY_INSERT }, + { "HOME", KEY_HOME }, + { "PAGEUP", KEY_PAGEUP }, + { "DELETE", KEY_DELETE }, + { "END", KEY_END }, + { "PAGEDOWN", KEY_PAGEDOWN }, + { "RIGHT", KEY_RIGHT }, + { "LEFT", KEY_LEFT }, + { "DOWN", KEY_DOWN }, + { "UP", KEY_UP }, + { "NUMLOCKCLEAR", KEY_NUMLOCKCLEAR }, + { "KP_DIVIDE", KEY_KP_DIVIDE }, + { "KP_MULTIPLY", KEY_KP_MULTIPLY }, + { "KP_MINUS", KEY_KP_MINUS }, + { "KP_PLUS", KEY_KP_PLUS }, + { "KP_ENTER", KEY_KP_ENTER }, + { "KP_00", KEY_KP_00 }, + { "KP_000", KEY_KP_000 }, + { "KP_1", KEY_KP_1 }, + { "KP_2", KEY_KP_2 }, + { "KP_3", KEY_KP_3 }, + { "KP_4", KEY_KP_4 }, + { "KP_5", KEY_KP_5 }, + { "KP_6", KEY_KP_6 }, + { "KP_7", KEY_KP_7 }, + { "KP_8", KEY_KP_8 }, + { "KP_9", KEY_KP_9 }, + { "KP_0", KEY_KP_0 }, + { "KP_PERIOD", KEY_KP_PERIOD }, + { "KP_COMMA", KEY_KP_COMMA }, + { "MENU", KEY_MENU }, + { "MUTE", KEY_MUTE }, + { "VOLUME_UP", KEY_VOLUME_UP }, + { "VOLUME_DOWN", KEY_VOLUME_DOWN }, + { "LCTRL", KEY_LCTRL }, + { "LSHIFT", KEY_LSHIFT }, + { "LALT", KEY_LALT }, + { "LSUPER", KEY_LSUPER }, + { "RCTRL", KEY_RCTRL }, + { "RSHIFT", KEY_RSHIFT }, + { "RALT", KEY_RALT }, + { "RSUPER", KEY_RSUPER }, + { NULL, 0 } +}; + +static const duk_number_list_entry keymods[] = { + { "LSHIFT", KEYMOD_LSHIFT }, + { "LCTRL", KEYMOD_LCTRL }, + { "LALT", KEYMOD_LALT }, + { "LSUPER", KEYMOD_LSUPER }, + { "RSHIFT", KEYMOD_RSHIFT }, + { "RTCRL", KEYMOD_RCTRL }, + { "RALT", KEYMOD_RALT }, + { "RSUPER", KEYMOD_RSUPER }, + { NULL, 0 } +}; + +static const duk_number_list_entry buttons[] = { + { "LEFT", MOUSE_BUTTON_LEFT }, + { "MIDDLE", MOUSE_BUTTON_MIDDLE }, + { "RIGHT", MOUSE_BUTTON_RIGHT }, + { NULL, 0 } +}; + +void +js_event_bind(duk_context *ctx) +{ + assert(ctx); + + duk_push_global_object(ctx); + duk_push_object(ctx); + duk_put_function_list(ctx, -1, functions); + duk_push_object(ctx); + duk_put_number_list(ctx, -1, types); + duk_put_prop_string(ctx, -2, "type"); + duk_push_object(ctx); + duk_put_number_list(ctx, -1, keys); + duk_put_prop_string(ctx, -2, "key"); + duk_push_object(ctx); + duk_put_number_list(ctx, -1, keymods); + duk_put_prop_string(ctx, -2, "keymod"); + duk_push_object(ctx); + duk_put_number_list(ctx, -1, buttons); + duk_put_prop_string(ctx, -2, "button"); + duk_put_prop_string(ctx, -2, "Event"); + duk_pop(ctx); +}