annotate src/libmlk-core-js/core/js-window.c @ 338:94828af916bb

js: add more core bindings
author David Demelier <markand@malikania.fr>
date Thu, 14 Oct 2021 21:21:28 +0200
parents 68b9d010e081
children 39f5d932941a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
337
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * js-window.c -- core window binding
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <core/error.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <core/window.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
338
94828af916bb js: add more core bindings
David Demelier <markand@malikania.fr>
parents: 337
diff changeset
24 #include "js-window.h"
94828af916bb js: add more core bindings
David Demelier <markand@malikania.fr>
parents: 337
diff changeset
25
337
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #define SIGNATURE DUK_HIDDEN_SYMBOL("Mlk.Window")
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 static duk_ret_t
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 Window_constructor(duk_context *ctx)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 const char *title = duk_require_string(ctx, 0);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 const unsigned int w = duk_require_uint(ctx, 1);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 const unsigned int h = duk_require_uint(ctx, 2);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 if (window_open(title, w, h) < 0)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 duk_error(ctx, DUK_ERR_ERROR, "%s", error());
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 duk_push_this(ctx);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 duk_push_boolean(ctx, 1);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 duk_put_prop_string(ctx, -2, SIGNATURE);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 duk_pop(ctx);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 return 0;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 static duk_ret_t
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 Window_setCursor(duk_context *ctx)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 const unsigned int cursor = duk_require_uint(ctx, 0);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 if (cursor >= WINDOW_CURSOR_LAST)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 duk_error(ctx, DUK_ERR_RANGE_ERROR, "invalid cursor");
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 window_set_cursor(cursor);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 return 0;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 static duk_ret_t
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 Window_destructor(duk_context *ctx)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 duk_get_prop_string(ctx, 0, SIGNATURE);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 if (duk_to_boolean(ctx, -1))
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 window_finish();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 duk_pop(ctx);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 duk_del_prop_string(ctx, 0, SIGNATURE);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 return 0;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 static const duk_function_list_entry methods[] = {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 { "setCursor", Window_setCursor, 1 },
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 { NULL, NULL, 0 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 };
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 void
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 js_window_bind(duk_context *ctx)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 assert(ctx);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 duk_push_c_function(ctx, Window_constructor, 3);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 duk_push_object(ctx);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 duk_put_function_list(ctx, -1, methods);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 duk_put_prop_string(ctx, -2, "prototype");
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 duk_push_c_function(ctx, Window_destructor, 1);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 duk_set_finalizer(ctx, -2);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 duk_put_global_string(ctx, "Window");
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 }