annotate molko-js/src/js-window.c @ 189:a5436e15898d

molko-js: start Javascript bindings, continue #2503 @4h - Added basic API for the libcore library, - Added a window example.
author David Demelier <markand@malikania.fr>
date Fri, 06 Nov 2020 15:15:01 +0100
parents
children 633a25df450e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
189
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * js-window.c -- basic window management (Javascript bindings)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <duktape.h>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <core/error.h>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <core/window.h>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include "js.h"
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include "js-window.h"
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 static duk_ret_t
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 js_window_new(duk_context *ctx)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 if (!duk_is_constructor_call(ctx))
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 duk_error(ctx, DUK_ERR_TYPE_ERROR, "Window must be new-constructed");
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 const char *str = duk_require_string(ctx, 0);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 unsigned int w = duk_require_int(ctx, 1);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 unsigned int h = duk_require_int(ctx, 2);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 if (!window_open(str, w, h))
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 duk_error(ctx, DUK_ERR_ERROR, "%s", error());
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 return 0;
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 static duk_ret_t
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 js_window_setCursor(duk_context *ctx)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 enum window_cursor cursor = duk_require_int(ctx, 0);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 if (cursor < 0 || cursor > WINDOW_CURSOR_LAST)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 duk_error(ctx, DUK_ERR_TYPE_ERROR, "invalid cursor type: %d", cursor);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 window_set_cursor(cursor);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 return 0;
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 static const duk_number_list_entry cursors[] = {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 { "ARROW", WINDOW_CURSOR_ARROW },
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 { "EDIT", WINDOW_CURSOR_EDIT },
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 { "WAIT", WINDOW_CURSOR_WAIT },
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 { "CROSS_HAIR", WINDOW_CURSOR_CROSSHAIR },
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 { "SIZE", WINDOW_CURSOR_SIZE },
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 { "NO", WINDOW_CURSOR_NO },
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 { "HAND", WINDOW_CURSOR_HAND },
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 { NULL, 0 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 };
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 static const duk_function_list_entry methods[] = {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 { "setCursor", js_window_setCursor, 1 },
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 { NULL, NULL, 0 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 };
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 void
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 js_window_load(struct js *js)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 assert(js);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 duk_push_global_object(js->handle);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 duk_get_prop_string(js->handle, -1, "Molko");
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 duk_push_c_function(js->handle, js_window_new, 3);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 duk_push_object(js->handle);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 duk_put_function_list(js->handle, -1, methods);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 duk_put_prop_string(js->handle, -2, "prototype");
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 duk_push_object(js->handle);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 duk_put_number_list(js->handle, -1, cursors);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 duk_put_prop_string(js->handle, -1, "Cursor");
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 duk_put_prop_string(js->handle, -2, "Window");
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 duk_pop_n(js->handle, 2);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 }