Skip to content

Commit e00e2bb

Browse files
feat: implement keyboard and mouse input (#7)
1 parent f07f22f commit e00e2bb

6 files changed

Lines changed: 448 additions & 65 deletions

File tree

examples/2d/solar2d.js

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Application, Vector2, Palette } from "vectorjs";
1+
import { Application, Vector2, Palette, Keyboard } from "vectorjs";
22

33
const screenWidth = 800;
44
const screenHeight = 800;
@@ -16,13 +16,33 @@ const planets = [
1616

1717
const app = new Application(screenWidth, screenHeight, "Solar System Simulation");
1818

19+
// Simulation State
20+
let isRunning = true;
21+
let time = 0;
22+
1923
app.run({
24+
25+
onUpdate(ctx) {
26+
// Toggle running state when Spacebar is pressed (fires once per press)
27+
if (ctx.isKeyPressed(Keyboard.KEY_SPACE)) {
28+
isRunning = !isRunning;
29+
}
30+
31+
// Reset the animation
32+
if (ctx.isKeyPressed(Keyboard.KEY_R)) {
33+
time = 0;
34+
}
35+
36+
// Advance simulation time only while running (assuming ~60 FPS)
37+
if (isRunning) {
38+
time += 1 / 60;
39+
}
40+
},
41+
2042
onDraw(render) {
2143
render.withLayer2D((ctx) => {
2244
ctx.drawFPS(fpsPos);
2345

24-
const time = Date.now() * 0.001;
25-
2646
// 1. Draw the central Sun
2747
ctx.shapes.drawCircle(sunPos, 35, {
2848
color: Palette.YELLOW

src/api/api_context.cpp

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,74 @@ namespace HostApi {
1717
}
1818

1919
JSValue create_update_context_object(JSContext* ctx) {
20-
return JS_NewObject(ctx);
20+
Utils::ScopedJSValue update_obj(ctx, JS_NewObject(ctx));
21+
22+
JS_SetPropertyStr(ctx, update_obj, "isKeyPressed", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int argc, JSValueConst* argv) -> JSValue {
23+
int key;
24+
if (argc < 1 || JS_ToInt32(c, &key, argv[0]) < 0) return JS_ThrowTypeError(c, "isKeyPressed requires a Keyboard key enum");
25+
return JS_NewBool(c, ::IsKeyPressed(key));
26+
}, "isKeyPressed", 1));
27+
28+
JS_SetPropertyStr(ctx, update_obj, "isKeyDown", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int argc, JSValueConst* argv) -> JSValue {
29+
int key;
30+
if (argc < 1 || JS_ToInt32(c, &key, argv[0]) < 0) return JS_ThrowTypeError(c, "isKeyDown requires a Keyboard key enum");
31+
return JS_NewBool(c, ::IsKeyDown(key));
32+
}, "isKeyDown", 1));
33+
34+
JS_SetPropertyStr(ctx, update_obj, "isKeyReleased", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int argc, JSValueConst* argv) -> JSValue {
35+
int key;
36+
if (argc < 1 || JS_ToInt32(c, &key, argv[0]) < 0) return JS_ThrowTypeError(c, "isKeyReleased requires a Keyboard key enum");
37+
return JS_NewBool(c, ::IsKeyReleased(key));
38+
}, "isKeyReleased", 1));
39+
40+
JS_SetPropertyStr(ctx, update_obj, "isKeyUp", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int argc, JSValueConst* argv) -> JSValue {
41+
int key;
42+
if (argc < 1 || JS_ToInt32(c, &key, argv[0]) < 0) return JS_ThrowTypeError(c, "isKeyUp requires a Keyboard key enum");
43+
return JS_NewBool(c, ::IsKeyUp(key));
44+
}, "isKeyUp", 1));
45+
46+
JS_SetPropertyStr(ctx, update_obj, "isMouseButtonPressed", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int argc, JSValueConst* argv) -> JSValue {
47+
int button;
48+
if (argc < 1 || JS_ToInt32(c, &button, argv[0]) < 0) return JS_ThrowTypeError(c, "isMouseButtonPressed requires a MouseButton enum");
49+
return JS_NewBool(c, ::IsMouseButtonPressed(button));
50+
}, "isMouseButtonPressed", 1));
51+
52+
JS_SetPropertyStr(ctx, update_obj, "isMouseButtonDown", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int argc, JSValueConst* argv) -> JSValue {
53+
int button;
54+
if (argc < 1 || JS_ToInt32(c, &button, argv[0]) < 0) return JS_ThrowTypeError(c, "isMouseButtonDown requires a MouseButton enum");
55+
return JS_NewBool(c, ::IsMouseButtonDown(button));
56+
}, "isMouseButtonDown", 1));
57+
58+
JS_SetPropertyStr(ctx, update_obj, "isMouseButtonReleased", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int argc, JSValueConst* argv) -> JSValue {
59+
int button;
60+
if (argc < 1 || JS_ToInt32(c, &button, argv[0]) < 0) return JS_ThrowTypeError(c, "isMouseButtonReleased requires a MouseButton enum");
61+
return JS_NewBool(c, ::IsMouseButtonReleased(button));
62+
}, "isMouseButtonReleased", 1));
63+
64+
JS_SetPropertyStr(ctx, update_obj, "isMouseButtonUp", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int argc, JSValueConst* argv) -> JSValue {
65+
int button;
66+
if (argc < 1 || JS_ToInt32(c, &button, argv[0]) < 0) return JS_ThrowTypeError(c, "isMouseButtonUp requires a MouseButton enum");
67+
return JS_NewBool(c, ::IsMouseButtonUp(button));
68+
}, "isMouseButtonUp", 1));
69+
70+
JS_SetPropertyStr(ctx, update_obj, "getMousePosition", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int, JSValueConst*) -> JSValue {
71+
Vector2 pos = ::GetMousePosition();
72+
return Utils::create_class_instance<JSVector2>(c, js_vector2_class_id, pos.x, pos.y);
73+
}, "getMousePosition", 0));
74+
75+
JS_SetPropertyStr(ctx, update_obj, "getMouseX", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int, JSValueConst*) -> JSValue {
76+
return JS_NewInt32(c, ::GetMouseX());
77+
}, "getMouseX", 0));
78+
79+
JS_SetPropertyStr(ctx, update_obj, "getMouseY", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int, JSValueConst*) -> JSValue {
80+
return JS_NewInt32(c, ::GetMouseY());
81+
}, "getMouseY", 0));
82+
83+
JS_SetPropertyStr(ctx, update_obj, "getMouseWheelMove", JS_NewCFunction(ctx, [](JSContext* c, JSValueConst, int, JSValueConst*) -> JSValue {
84+
return JS_NewFloat64(c, ::GetMouseWheelMove());
85+
}, "getMouseWheelMove", 0));
86+
87+
return update_obj.release();
2188
}
2289

2390
static JSValue create_shapes_object(JSContext* ctx) {

src/api/api_enums.cpp

Lines changed: 196 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -4,73 +4,209 @@
44

55
namespace HostApi {
66

7-
void register_hapi_enums(JSContext* ctx, JSModuleDef* m) {
8-
9-
static auto export_object = []<typename... Pairs>(JSContext* js_context, JSModuleDef* js_module_def, const char* obj_name, Pairs&&... pairs) {
7+
template <typename... Pairs>
8+
static void export_object(JSContext* js_context, JSModuleDef* js_module_def, const char* obj_name, Pairs&&... pairs) {
109
const JSValue obj = JS_NewObject(js_context);
1110
Utils::set_object_properties(js_context, obj, std::forward<Pairs>(pairs)...);
1211
JS_SetModuleExport(js_context, js_module_def, obj_name, obj);
13-
};
12+
}
13+
14+
void register_hapi_enums(JSContext* ctx, JSModuleDef* m) {
15+
16+
// --- Palette Object ---
17+
export_object(ctx, m, "Palette",
18+
std::pair{"LIGHTGRAY", LIGHTGRAY},
19+
std::pair{"GRAY", GRAY},
20+
std::pair{"DARKGRAY", DARKGRAY},
21+
std::pair{"YELLOW", YELLOW},
22+
std::pair{"GOLD", GOLD},
23+
std::pair{"ORANGE", ORANGE},
24+
std::pair{"PINK", PINK},
25+
std::pair{"RED", RED},
26+
std::pair{"MAROON", MAROON},
27+
std::pair{"GREEN", GREEN},
28+
std::pair{"LIME", LIME},
29+
std::pair{"DARKGREEN", DARKGREEN},
30+
std::pair{"SKYBLUE", SKYBLUE},
31+
std::pair{"BLUE", BLUE},
32+
std::pair{"DARKBLUE", DARKBLUE},
33+
std::pair{"PURPLE", PURPLE},
34+
std::pair{"VIOLET", VIOLET},
35+
std::pair{"DARKPURPLE", DARKPURPLE},
36+
std::pair{"BEIGE", BEIGE},
37+
std::pair{"BROWN", BROWN},
38+
std::pair{"DARKBROWN", DARKBROWN},
39+
std::pair{"WHITE", WHITE},
40+
std::pair{"BLACK", BLACK},
41+
std::pair{"BLANK", BLANK},
42+
std::pair{"MAGENTA", MAGENTA},
43+
std::pair{"RAYWHITE", RAYWHITE}
44+
);
45+
46+
// --- Info Object ---
47+
export_object(ctx, m, "Info",
48+
std::pair{"RAYLIB_VERSION", RAYLIB_VERSION_STR},
49+
std::pair{"QUICKJS_VERSION", QUICKJS_VERSION_STR}
50+
);
1451

15-
constexpr static auto P = []<typename V>(const char* name, V&& val) {
16-
return std::pair{name, std::forward<V>(val)};
17-
};
52+
// --- ConfigFlags Object ---
53+
export_object(ctx, m, "ConfigFlags",
54+
std::pair{"FLAG_VSYNC_HINT", FLAG_VSYNC_HINT},
55+
std::pair{"FLAG_FULLSCREEN_MODE", FLAG_FULLSCREEN_MODE},
56+
std::pair{"FLAG_WINDOW_RESIZABLE", FLAG_WINDOW_RESIZABLE},
57+
std::pair{"FLAG_WINDOW_UNDECORATED", FLAG_WINDOW_UNDECORATED},
58+
std::pair{"FLAG_WINDOW_HIDDEN", FLAG_WINDOW_HIDDEN},
59+
std::pair{"FLAG_WINDOW_MINIMIZED", FLAG_WINDOW_MINIMIZED},
60+
std::pair{"FLAG_WINDOW_MAXIMIZED", FLAG_WINDOW_MAXIMIZED},
61+
std::pair{"FLAG_WINDOW_UNFOCUSED", FLAG_WINDOW_UNFOCUSED},
62+
std::pair{"FLAG_WINDOW_TOPMOST", FLAG_WINDOW_TOPMOST},
63+
std::pair{"FLAG_WINDOW_ALWAYS_RUN", FLAG_WINDOW_ALWAYS_RUN},
64+
std::pair{"FLAG_WINDOW_TRANSPARENT", FLAG_WINDOW_TRANSPARENT},
65+
std::pair{"FLAG_WINDOW_HIGHDPI", FLAG_WINDOW_HIGHDPI},
66+
std::pair{"FLAG_WINDOW_MOUSE_PASSTHROUGH", FLAG_WINDOW_MOUSE_PASSTHROUGH},
67+
std::pair{"FLAG_BORDERLESS_WINDOWED_MODE", FLAG_BORDERLESS_WINDOWED_MODE},
68+
std::pair{"FLAG_MSAA_4X_HINT", FLAG_MSAA_4X_HINT},
69+
std::pair{"FLAG_INTERLACED_HINT", FLAG_INTERLACED_HINT}
70+
);
1871

19-
// --- Palette Object ---
20-
export_object(ctx, m, "Palette",
21-
P("LIGHTGRAY", LIGHTGRAY),
22-
P("GRAY", GRAY),
23-
P("DARKGRAY", DARKGRAY),
24-
P("YELLOW", YELLOW),
25-
P("GOLD", GOLD),
26-
P("ORANGE", ORANGE),
27-
P("PINK", PINK),
28-
P("RED", RED),
29-
P("MAROON", MAROON),
30-
P("GREEN", GREEN),
31-
P("LIME", LIME),
32-
P("DARKGREEN", DARKGREEN),
33-
P("SKYBLUE", SKYBLUE),
34-
P("BLUE", BLUE),
35-
P("DARKBLUE", DARKBLUE),
36-
P("PURPLE", PURPLE),
37-
P("VIOLET", VIOLET),
38-
P("DARKPURPLE", DARKPURPLE),
39-
P("BEIGE", BEIGE),
40-
P("BROWN", BROWN),
41-
P("DARKBROWN", DARKBROWN),
42-
P("WHITE", WHITE),
43-
P("BLACK", BLACK),
44-
P("BLANK", BLANK),
45-
P("MAGENTA", MAGENTA),
46-
P("RAYWHITE", RAYWHITE)
47-
);
72+
export_object(ctx, m, "Keyboard",
73+
std::pair{"KEY_NULL", KEY_NULL},
74+
std::pair{"KEY_APOSTROPHE", KEY_APOSTROPHE},
75+
std::pair{"KEY_COMMA", KEY_COMMA},
76+
std::pair{"KEY_MINUS", KEY_MINUS},
77+
std::pair{"KEY_PERIOD", KEY_PERIOD},
78+
std::pair{"KEY_SLASH", KEY_SLASH},
79+
std::pair{"KEY_ZERO", KEY_ZERO},
80+
std::pair{"KEY_ONE", KEY_ONE},
81+
std::pair{"KEY_TWO", KEY_TWO},
82+
std::pair{"KEY_THREE", KEY_THREE},
83+
std::pair{"KEY_FOUR", KEY_FOUR},
84+
std::pair{"KEY_FIVE", KEY_FIVE},
85+
std::pair{"KEY_SIX", KEY_SIX},
86+
std::pair{"KEY_SEVEN", KEY_SEVEN},
87+
std::pair{"KEY_EIGHT", KEY_EIGHT},
88+
std::pair{"KEY_NINE", KEY_NINE},
89+
std::pair{"KEY_SEMICOLON", KEY_SEMICOLON},
90+
std::pair{"KEY_EQUAL", KEY_EQUAL},
91+
std::pair{"KEY_A", KEY_A},
92+
std::pair{"KEY_B", KEY_B},
93+
std::pair{"KEY_C", KEY_C},
94+
std::pair{"KEY_D", KEY_D},
95+
std::pair{"KEY_E", KEY_E},
96+
std::pair{"KEY_F", KEY_F},
97+
std::pair{"KEY_G", KEY_G},
98+
std::pair{"KEY_H", KEY_H},
99+
std::pair{"KEY_I", KEY_I},
100+
std::pair{"KEY_J", KEY_J},
101+
std::pair{"KEY_K", KEY_K},
102+
std::pair{"KEY_L", KEY_L},
103+
std::pair{"KEY_M", KEY_M},
104+
std::pair{"KEY_N", KEY_N},
105+
std::pair{"KEY_O", KEY_O},
106+
std::pair{"KEY_P", KEY_P},
107+
std::pair{"KEY_Q", KEY_Q},
108+
std::pair{"KEY_R", KEY_R},
109+
std::pair{"KEY_S", KEY_S},
110+
std::pair{"KEY_T", KEY_T},
111+
std::pair{"KEY_U", KEY_U},
112+
std::pair{"KEY_V", KEY_V},
113+
std::pair{"KEY_W", KEY_W},
114+
std::pair{"KEY_X", KEY_X},
115+
std::pair{"KEY_Y", KEY_Y},
116+
std::pair{"KEY_Z", KEY_Z},
117+
std::pair{"KEY_LEFT_BRACKET", KEY_LEFT_BRACKET},
118+
std::pair{"KEY_BACKSLASH", KEY_BACKSLASH},
119+
std::pair{"KEY_RIGHT_BRACKET", KEY_RIGHT_BRACKET},
120+
std::pair{"KEY_GRAVE", KEY_GRAVE},
121+
std::pair{"KEY_SPACE", KEY_SPACE},
122+
std::pair{"KEY_ESCAPE", KEY_ESCAPE},
123+
std::pair{"KEY_ENTER", KEY_ENTER},
124+
std::pair{"KEY_TAB", KEY_TAB},
125+
std::pair{"KEY_BACKSPACE", KEY_BACKSPACE},
126+
std::pair{"KEY_INSERT", KEY_INSERT},
127+
std::pair{"KEY_DELETE", KEY_DELETE},
128+
std::pair{"KEY_RIGHT", KEY_RIGHT},
129+
std::pair{"KEY_LEFT", KEY_LEFT},
130+
std::pair{"KEY_DOWN", KEY_DOWN},
131+
std::pair{"KEY_UP", KEY_UP},
132+
std::pair{"KEY_PAGE_UP", KEY_PAGE_UP},
133+
std::pair{"KEY_PAGE_DOWN", KEY_PAGE_DOWN},
134+
std::pair{"KEY_HOME", KEY_HOME},
135+
std::pair{"KEY_END", KEY_END},
136+
std::pair{"KEY_CAPS_LOCK", KEY_CAPS_LOCK},
137+
std::pair{"KEY_SCROLL_LOCK", KEY_SCROLL_LOCK},
138+
std::pair{"KEY_NUM_LOCK", KEY_NUM_LOCK},
139+
std::pair{"KEY_PRINT_SCREEN", KEY_PRINT_SCREEN},
140+
std::pair{"KEY_PAUSE", KEY_PAUSE},
141+
std::pair{"KEY_F1", KEY_F1},
142+
std::pair{"KEY_F2", KEY_F2},
143+
std::pair{"KEY_F3", KEY_F3},
144+
std::pair{"KEY_F4", KEY_F4},
145+
std::pair{"KEY_F5", KEY_F5},
146+
std::pair{"KEY_F6", KEY_F6},
147+
std::pair{"KEY_F7", KEY_F7},
148+
std::pair{"KEY_F8", KEY_F8},
149+
std::pair{"KEY_F9", KEY_F9},
150+
std::pair{"KEY_F10", KEY_F10},
151+
std::pair{"KEY_F11", KEY_F11},
152+
std::pair{"KEY_F12", KEY_F12},
153+
std::pair{"KEY_LEFT_SHIFT", KEY_LEFT_SHIFT},
154+
std::pair{"KEY_LEFT_CONTROL", KEY_LEFT_CONTROL},
155+
std::pair{"KEY_LEFT_ALT", KEY_LEFT_ALT},
156+
std::pair{"KEY_LEFT_SUPER", KEY_LEFT_SUPER},
157+
std::pair{"KEY_RIGHT_SHIFT", KEY_RIGHT_SHIFT},
158+
std::pair{"KEY_RIGHT_CONTROL", KEY_RIGHT_CONTROL},
159+
std::pair{"KEY_RIGHT_ALT", KEY_RIGHT_ALT},
160+
std::pair{"KEY_RIGHT_SUPER", KEY_RIGHT_SUPER},
161+
std::pair{"KEY_KB_MENU", KEY_KB_MENU},
162+
std::pair{"KEY_KP_0", KEY_KP_0},
163+
std::pair{"KEY_KP_1", KEY_KP_1},
164+
std::pair{"KEY_KP_2", KEY_KP_2},
165+
std::pair{"KEY_KP_3", KEY_KP_3},
166+
std::pair{"KEY_KP_4", KEY_KP_4},
167+
std::pair{"KEY_KP_5", KEY_KP_5},
168+
std::pair{"KEY_KP_6", KEY_KP_6},
169+
std::pair{"KEY_KP_7", KEY_KP_7},
170+
std::pair{"KEY_KP_8", KEY_KP_8},
171+
std::pair{"KEY_KP_9", KEY_KP_9},
172+
std::pair{"KEY_KP_DECIMAL", KEY_KP_DECIMAL},
173+
std::pair{"KEY_KP_DIVIDE", KEY_KP_DIVIDE},
174+
std::pair{"KEY_KP_MULTIPLY", KEY_KP_MULTIPLY},
175+
std::pair{"KEY_KP_SUBTRACT", KEY_KP_SUBTRACT},
176+
std::pair{"KEY_KP_ADD", KEY_KP_ADD},
177+
std::pair{"KEY_KP_ENTER", KEY_KP_ENTER},
178+
std::pair{"KEY_KP_EQUAL", KEY_KP_EQUAL},
179+
std::pair{"KEY_BACK", KEY_BACK},
180+
std::pair{"KEY_MENU", KEY_MENU},
181+
std::pair{"KEY_VOLUME_UP", KEY_VOLUME_UP},
182+
std::pair{"KEY_VOLUME_DOWN", KEY_VOLUME_DOWN}
183+
);
48184

49-
// --- Info Object ---
50-
export_object(ctx, m, "Info",
51-
P("RAYLIB_VERSION", RAYLIB_VERSION_STR),
52-
P("QUICKJS_VERSION", QUICKJS_VERSION_STR)
53-
);
185+
// Enum: MouseButton
186+
export_object(ctx, m, "MouseButton",
187+
std::pair{"MOUSE_BUTTON_LEFT", MOUSE_BUTTON_LEFT},
188+
std::pair{"MOUSE_BUTTON_RIGHT", MOUSE_BUTTON_RIGHT},
189+
std::pair{"MOUSE_BUTTON_MIDDLE", MOUSE_BUTTON_MIDDLE},
190+
std::pair{"MOUSE_BUTTON_SIDE", MOUSE_BUTTON_SIDE},
191+
std::pair{"MOUSE_BUTTON_EXTRA", MOUSE_BUTTON_EXTRA},
192+
std::pair{"MOUSE_BUTTON_FORWARD", MOUSE_BUTTON_FORWARD},
193+
std::pair{"MOUSE_BUTTON_BACK", MOUSE_BUTTON_BACK}
194+
);
54195

55-
// --- ConfigFlags Object ---
56-
export_object(ctx, m, "ConfigFlags",
57-
P("FLAG_VSYNC_HINT", FLAG_VSYNC_HINT),
58-
P("FLAG_FULLSCREEN_MODE", FLAG_FULLSCREEN_MODE),
59-
P("FLAG_WINDOW_RESIZABLE", FLAG_WINDOW_RESIZABLE),
60-
P("FLAG_WINDOW_UNDECORATED", FLAG_WINDOW_UNDECORATED),
61-
P("FLAG_WINDOW_HIDDEN", FLAG_WINDOW_HIDDEN),
62-
P("FLAG_WINDOW_MINIMIZED", FLAG_WINDOW_MINIMIZED),
63-
P("FLAG_WINDOW_MAXIMIZED", FLAG_WINDOW_MAXIMIZED),
64-
P("FLAG_WINDOW_UNFOCUSED", FLAG_WINDOW_UNFOCUSED),
65-
P("FLAG_WINDOW_TOPMOST", FLAG_WINDOW_TOPMOST),
66-
P("FLAG_WINDOW_ALWAYS_RUN", FLAG_WINDOW_ALWAYS_RUN),
67-
P("FLAG_WINDOW_TRANSPARENT", FLAG_WINDOW_TRANSPARENT),
68-
P("FLAG_WINDOW_HIGHDPI", FLAG_WINDOW_HIGHDPI),
69-
P("FLAG_WINDOW_MOUSE_PASSTHROUGH", FLAG_WINDOW_MOUSE_PASSTHROUGH),
70-
P("FLAG_BORDERLESS_WINDOWED_MODE", FLAG_BORDERLESS_WINDOWED_MODE),
71-
P("FLAG_MSAA_4X_HINT", FLAG_MSAA_4X_HINT),
72-
P("FLAG_INTERLACED_HINT", FLAG_INTERLACED_HINT)
73-
);
196+
// Enum: MouseCursor
197+
export_object(ctx, m, "MouseCursor",
198+
std::pair{"MOUSE_CURSOR_DEFAULT", MOUSE_CURSOR_DEFAULT},
199+
std::pair{"MOUSE_CURSOR_ARROW", MOUSE_CURSOR_ARROW},
200+
std::pair{"MOUSE_CURSOR_IBEAM", MOUSE_CURSOR_IBEAM},
201+
std::pair{"MOUSE_CURSOR_CROSSHAIR", MOUSE_CURSOR_CROSSHAIR},
202+
std::pair{"MOUSE_CURSOR_POINTING_HAND", MOUSE_CURSOR_POINTING_HAND},
203+
std::pair{"MOUSE_CURSOR_RESIZE_EW", MOUSE_CURSOR_RESIZE_EW},
204+
std::pair{"MOUSE_CURSOR_RESIZE_NS", MOUSE_CURSOR_RESIZE_NS},
205+
std::pair{"MOUSE_CURSOR_RESIZE_NWSE", MOUSE_CURSOR_RESIZE_NWSE},
206+
std::pair{"MOUSE_CURSOR_RESIZE_NESW", MOUSE_CURSOR_RESIZE_NESW},
207+
std::pair{"MOUSE_CURSOR_RESIZE_ALL", MOUSE_CURSOR_RESIZE_ALL},
208+
std::pair{"MOUSE_CURSOR_NOT_ALLOWED", MOUSE_CURSOR_NOT_ALLOWED}
209+
);
74210
}
75211

76212
} // namespace HostApi

src/api/hostapi.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ namespace HostApi {
2323
JS_AddModuleExport(ctx, m, "Vector2");
2424
JS_AddModuleExport(ctx, m, "Rectangle");
2525
JS_AddModuleExport(ctx, m, "Palette");
26+
JS_AddModuleExport(ctx, m, "Keyboard");
27+
JS_AddModuleExport(ctx, m, "MouseButton");
28+
JS_AddModuleExport(ctx, m, "MouseCursor");
2629
JS_AddModuleExport(ctx, m, "Font");
2730
JS_AddModuleExport(ctx, m, "Info");
2831
JS_AddModuleExport(ctx, m, "ConfigFlags");

0 commit comments

Comments
 (0)