Mercurial > molko
annotate libmlk-core/mlk/core/js/js-event.c @ 642:05b585720d3b
core: reimplement most of js
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 17 Dec 2023 09:50:36 +0100 |
parents | |
children | 83781cc87fca |
rev | line source |
---|---|
642
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * js-event.c -- event management (Javascript bindings) |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <duktape.h> |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <mlk/core/event.h> |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include "js-event.h" |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include "js.h" |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 static duk_ret_t |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 push(duk_context *ctx, const union mlk_event *ev) |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 { |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 duk_push_object(ctx); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 duk_push_int(ctx, ev->type); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 duk_put_prop_string(ctx, -2, "type"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 switch (ev->type) { |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 case MLK_EVENT_CLICKDOWN: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 case MLK_EVENT_CLICKUP: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 duk_push_int(ctx, ev->click.button); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 duk_put_prop_string(ctx, -2, "button"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 duk_push_int(ctx, ev->click.x); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 duk_put_prop_string(ctx, -2, "x"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 duk_push_int(ctx, ev->click.y); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 duk_put_prop_string(ctx, -2, "y"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 break; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 case MLK_EVENT_KEYDOWN: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 case MLK_EVENT_KEYUP: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 duk_push_int(ctx, ev->key.key); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 duk_put_prop_string(ctx, -2, "key"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 break; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 case MLK_EVENT_MOUSE: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 duk_push_int(ctx, ev->mouse.buttons); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 duk_put_prop_string(ctx, -2, "buttons"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 duk_push_int(ctx, ev->mouse.x); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 duk_put_prop_string(ctx, -2, "x"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 duk_push_int(ctx, ev->mouse.y); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 duk_put_prop_string(ctx, -2, "y"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 break; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 default: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 break; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 } |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 return 1; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 } |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 static duk_ret_t |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 mlk_js_event_poll(duk_context *ctx) |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 { |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 union mlk_event ev; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 if (!mlk_event_poll(&ev)) |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 return 0; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 return push(ctx, &ev); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 } |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 static const duk_number_list_entry types[] = { |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 { "CLICK_DOWN", MLK_EVENT_CLICKDOWN }, |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 { "CLICK_UP", MLK_EVENT_CLICKUP }, |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 { "KEY_DOWN", MLK_EVENT_KEYDOWN }, |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 { "KEY_UP", MLK_EVENT_KEYUP }, |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 { "MOUSE", MLK_EVENT_MOUSE }, |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 { "QUIT", MLK_EVENT_QUIT }, |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 { NULL, 0 } |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 }; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 static const duk_function_list_entry functions[] = { |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 { "poll", mlk_js_event_poll, 0 }, |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 { NULL, NULL, 0 } |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 }; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 void |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 mlk_js_event_load(duk_context *ctx) |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 { |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 assert(ctx); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 duk_push_global_object(ctx); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 duk_get_prop_string(ctx, -1, "Mlk"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 duk_push_object(ctx); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 duk_put_number_list(ctx, -1, types); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 duk_put_function_list(ctx, -1, functions); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 duk_put_prop_string(ctx, -2, "Event"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 duk_pop_n(ctx, 1); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 } |