Mercurial > molko
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 |
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 } |