Mercurial > molko
annotate libmlk-core/mlk/core/js/js-event.c @ 645:83781cc87fca
core: rework game stack state mechanism
The current model was fundamentally broken as the state could continue its
execution when calling mlk_game_pop from itself (e.g. in update).
The current model uses a sjlj mechanism with mlk_game_push/pop being disallowed
in special state function like end, finish, suspend.
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 04 Feb 2024 15:24:00 +0100 |
parents | 05b585720d3b |
children |
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 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
29 mlk_js_event_poll(duk_context *ctx) |
642
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 { |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
31 union mlk_event ev; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
32 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
33 if (!mlk_event_poll(&ev)) |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
34 return 0; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
35 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
36 return mlk_js_event_push(ctx, &ev); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
37 } |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
38 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
39 static const duk_number_list_entry types[] = { |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
40 { "CLICK_DOWN", MLK_EVENT_CLICKDOWN }, |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
41 { "CLICK_UP", MLK_EVENT_CLICKUP }, |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
42 { "KEY_DOWN", MLK_EVENT_KEYDOWN }, |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
43 { "KEY_UP", MLK_EVENT_KEYUP }, |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
44 { "MOUSE", MLK_EVENT_MOUSE }, |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
45 { "QUIT", MLK_EVENT_QUIT }, |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
46 { NULL, 0 } |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
47 }; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
48 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
49 static const duk_function_list_entry functions[] = { |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
50 { "poll", mlk_js_event_poll, 0 }, |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
51 { NULL, NULL, 0 } |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
52 }; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
53 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
54 duk_ret_t |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
55 mlk_js_event_push(duk_context *ctx, const union mlk_event *ev) |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
56 { |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
57 assert(ctx); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
58 assert(ev); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
642
diff
changeset
|
59 |
642
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 duk_push_object(ctx); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 duk_push_int(ctx, ev->type); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 duk_put_prop_string(ctx, -2, "type"); |
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 switch (ev->type) { |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 case MLK_EVENT_CLICKDOWN: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 case MLK_EVENT_CLICKUP: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 duk_push_int(ctx, ev->click.button); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 duk_put_prop_string(ctx, -2, "button"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 duk_push_int(ctx, ev->click.x); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 duk_put_prop_string(ctx, -2, "x"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 duk_push_int(ctx, ev->click.y); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 duk_put_prop_string(ctx, -2, "y"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 break; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 case MLK_EVENT_KEYDOWN: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 case MLK_EVENT_KEYUP: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 duk_push_int(ctx, ev->key.key); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 duk_put_prop_string(ctx, -2, "key"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 break; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 case MLK_EVENT_MOUSE: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 duk_push_int(ctx, ev->mouse.buttons); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 duk_put_prop_string(ctx, -2, "buttons"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 duk_push_int(ctx, ev->mouse.x); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 duk_put_prop_string(ctx, -2, "x"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 duk_push_int(ctx, ev->mouse.y); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 duk_put_prop_string(ctx, -2, "y"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 break; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 default: |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 break; |
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 return 1; |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 } |
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 void |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 mlk_js_event_load(duk_context *ctx) |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 { |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 assert(ctx); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 duk_push_global_object(ctx); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 duk_get_prop_string(ctx, -1, "Mlk"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 duk_push_object(ctx); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 duk_put_number_list(ctx, -1, types); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 duk_put_function_list(ctx, -1, functions); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 duk_put_prop_string(ctx, -2, "Event"); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 duk_pop_n(ctx, 1); |
05b585720d3b
core: reimplement most of js
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 } |