starting to work on glfw3 native module
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 5 Dec 2021 20:43:06 +0000 (14:43 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 5 Dec 2021 20:43:06 +0000 (14:43 -0600)
include/onyx_library.h
modules/glfw3/build.sh [new file with mode: 0755]
modules/glfw3/module.onyx [new file with mode: 0644]
modules/glfw3/onyx_glfw3.c [new file with mode: 0644]
modules/glfw3/onyx_glfw3.so [new file with mode: 0755]
src/wasm_runtime.c

index d19a8209097caee9c960aa4f7c84fac1faa1b48f..dd755043af95a5b1a4869cb39b6c16544a389140 100644 (file)
@@ -49,6 +49,7 @@ typedef struct WasmFuncDefinition {
     struct WasmFuncDefinition *ONYX_MODULE_NAME_GEN(ONYX_LIBRARY_NAME)[] =
 
 // Shorter names
+#define BOOL WASM_I32
 #define INT WASM_I32
 #define LONG WASM_I64
 #define FLOAT WASM_F32
diff --git a/modules/glfw3/build.sh b/modules/glfw3/build.sh
new file mode 100755 (executable)
index 0000000..2b09837
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+# To be run from the project root
+
+gcc -O2 -shared -fPIC ./modules/glfw3/onyx_glfw3.c -I include -I lib/linux_x86_64/include -lglfw -o modules/glfw3/onyx_glfw3.so
\ No newline at end of file
diff --git a/modules/glfw3/module.onyx b/modules/glfw3/module.onyx
new file mode 100644 (file)
index 0000000..efc7ade
--- /dev/null
@@ -0,0 +1,338 @@
+package glfw3
+
+// Temporary path
+#library "./modules/glfw3/onyx_glfw3"
+
+// Opaque types that are only used by pointer
+GLFWmonitor_p :: #distinct u64
+GLFWwindow_p  :: #distinct u64
+
+GLFWimage :: struct #size 16 {
+    width, height: i32;
+    pixels: ^u8;
+}
+
+glfwInit         :: () -> bool #foreign "onyx_glfw3" "glfwInit" ---
+glfwTerminate    :: () -> void #foreign "onyx_glfw3" "glfwTerminate" ---
+glfwGetVersion   :: (major, minor, rev: ^i32) -> void #foreign "onyx_glfw3" "glfwGetVersion" ---
+// glfwSetErrorCallback :: (f: (i32, cstr) -> void) -> void #foreign "onyx_glfw3" "glfwSetErrorCallback" ---
+
+glfwCreateWindow :: (width, height: i32, title: cstr, monitor: GLFWmonitor_p = 0, share: GLFWwindow_p = 0) -> GLFWwindow_p #foreign "onyx_glfw3" "glfwCreateWindow" ---
+glfwDestroyWindow :: (window: GLFWwindow_p) -> void #foreign "onyx_glfw3" "glfwDestroyWindow" ---
+glfwWindowShouldClose :: (window: GLFWwindow_p) -> bool #foreign "onyx_glfw3" "glfwWindowShouldClose" ---
+glfwSetWindowShouldClose :: (window: GLFWwindow_p, value: i32) -> void #foreign "onyx_glfw3" "glfwSetWindowShouldClose" ---
+glfwDefaultWindowHints :: () -> void #foreign "onyx_glfw3" "glfwDefaultWindowHints" ---
+glfwWindowHint :: (hint: i32, value: i32) -> void #foreign "onyx_glfw3" "glfwWindowHint" ---
+glfwSetWindowTitle :: (window: GLFWwindow_p, title: cstr) -> void #foreign "onyx_glfw3" "glfwSetWindowTitle" ---
+glfwGetWindowPos :: (window: GLFWwindow_p, xpos, ypos: ^i32) -> void #foreign "onyx_glfw3" "glfwGetWindowPos" ---
+glfwSetWindowPos :: (window: GLFWwindow_p, xpos, ypos: i32) -> void #foreign "onyx_glfw3" "glfwSetWindowPos" ---
+// ...
+glfwPollEvents :: () -> void #foreign "onyx_glfw3" "glfwPollEvents" ---
+glfwWaitEvents :: () -> void #foreign "onyx_glfw3" "glfwWaitEvents" ---
+glfwWaitEventsTimeout :: (timeout: f64) -> void #foreign "onyx_glfw3" "glfwWaitEventsTimeout" ---
+glfwPostEmptyEvent :: () -> void #foreign "onyx_glfw3" "glfwPostEmptyEvent" ---
+glfwSwapBuffers :: (window: GLFWwindow_p) -> void #foreign "onyx_glfw3" "glfwSwapBuffers" ---
+
+GLFW_FOCUSED   :: 0x00020001;
+GLFW_ICONIFIED :: 0x00020002;
+GLFW_RESIZABLE :: 0x00020003;
+GLFW_VISIBLE   :: 0x00020004;
+GLFW_DECORATED :: 0x00020005;
+GLFW_AUTO_ICONIFY :: 0x00020006;
+GLFW_FLOATING :: 0x00020007;
+GLFW_MAXIMIZED :: 0x00020008;
+GLFW_CENTER_CURSOR :: 0x00020009;
+GLFW_TRANSPARENT_FRAMEBUFFER :: 0x0002000A;
+GLFW_HOVERED :: 0x0002000B;
+GLFW_FOCUS_ON_SHOW :: 0x0002000C;
+GLFW_RED_BITS :: 0x00021001;
+GLFW_GREEN_BITS :: 0x00021002;
+GLFW_BLUE_BITS :: 0x00021003;
+GLFW_ALPHA_BITS :: 0x00021004;
+GLFW_DEPTH_BITS :: 0x00021005;
+GLFW_STENCIL_BITS :: 0x00021006;
+GLFW_ACCUM_RED_BITS :: 0x00021007;
+GLFW_ACCUM_GREEN_BITS :: 0x00021008;
+GLFW_ACCUM_BLUE_BITS :: 0x00021009;
+GLFW_ACCUM_ALPHA_BITS :: 0x0002100A;
+GLFW_AUX_BUFFERS :: 0x0002100B;
+GLFW_STEREO :: 0x0002100C;
+GLFW_SAMPLES :: 0x0002100D;
+GLFW_SRGB_CAPABLE :: 0x0002100E;
+GLFW_REFRESH_RATE :: 0x0002100F;
+GLFW_DOUBLEBUFFER :: 0x00021010;
+GLFW_CLIENT_API   :: 0x00022001;
+GLFW_CONTEXT_VERSION_MAJOR :: 0x00022002;
+GLFW_CONTEXT_VERSION_MINOR :: 0x00022003;
+GLFW_CONTEXT_REVISION :: 0x00022004;
+GLFW_CONTEXT_ROBUSTNESS :: 0x00022005;
+GLFW_OPENGL_FORWARD_COMPAT :: 0x00022006;
+GLFW_OPENGL_DEBUG_CONTEXT :: 0x00022007;
+GLFW_OPENGL_PROFILE :: 0x00022008;
+GLFW_CONTEXT_RELEASE_BEHAVIOR :: 0x00022009;
+
+GLFW_NO_API                 ::          0;
+GLFW_OPENGL_API             :: 0x00030001;
+GLFW_OPENGL_ES_API          :: 0x00030002;
+
+GLFW_NO_ROBUSTNESS          ::          0;
+GLFW_NO_RESET_NOTIFICATION  :: 0x00031001;
+GLFW_LOSE_CONTEXT_ON_RESET  :: 0x00031002;
+
+GLFW_OPENGL_ANY_PROFILE     ::          0;
+GLFW_OPENGL_CORE_PROFILE    :: 0x00032001;
+GLFW_OPENGL_COMPAT_PROFILE  :: 0x00032002;
+
+GLFW_CURSOR                 :: 0x00033001;
+GLFW_STICKY_KEYS            :: 0x00033002;
+GLFW_STICKY_MOUSE_BUTTONS   :: 0x00033003;
+GLFW_LOCK_KEY_MODS          :: 0x00033004;
+GLFW_RAW_MOUSE_MOTION       :: 0x00033005;
+
+GLFW_CURSOR_NORMAL          :: 0x00034001;
+GLFW_CURSOR_HIDDEN          :: 0x00034002;
+GLFW_CURSOR_DISABLED        :: 0x00034003;
+
+GLFW_ANY_RELEASE_BEHAVIOR   ::          0;
+GLFW_RELEASE_BEHAVIOR_FLUSH :: 0x00035001;
+GLFW_RELEASE_BEHAVIOR_NONE  :: 0x00035002;
+
+GLFW_NATIVE_CONTEXT_API     :: 0x00036001;
+GLFW_EGL_CONTEXT_API        :: 0x00036002;
+GLFW_OSMESA_CONTEXT_API     :: 0x00036003;
+
+GLFW_ARROW_CURSOR           :: 0x00036001
+GLFW_IBEAM_CURSOR           :: 0x00036002
+GLFW_CROSSHAIR_CURSOR       :: 0x00036003
+GLFW_HAND_CURSOR            :: 0x00036004
+GLFW_HRESIZE_CURSOR         :: 0x00036005
+GLFW_VRESIZE_CURSOR         :: 0x00036006
+GLFW_CONNECTED              :: 0x00040001
+GLFW_DISCONNECTED           :: 0x00040002
+GLFW_JOYSTICK_HAT_BUTTONS   :: 0x00050001
+GLFW_COCOA_CHDIR_RESOURCES  :: 0x00051001
+GLFW_COCOA_MENUBAR          :: 0x00051002
+GLFW_DONT_CARE              :: -1
+
+GLFW_VERSION_MAJOR          :: 3
+GLFW_VERSION_MINOR          :: 3
+GLFW_VERSION_REVISION       :: 5
+GLFW_TRUE                   :: 1
+GLFW_FALSE                  :: 0
+
+GLFW_RELEASE                :: 0
+GLFW_PRESS                  :: 1
+GLFW_REPEAT                 :: 2
+
+GLFW_HAT_CENTERED           :: 0
+GLFW_HAT_UP                 :: 1
+GLFW_HAT_RIGHT              :: 2
+GLFW_HAT_DOWN               :: 4
+GLFW_HAT_LEFT               :: 8
+GLFW_HAT_RIGHT_UP           :: GLFW_HAT_RIGHT | GLFW_HAT_UP
+GLFW_HAT_RIGHT_DOWN         :: GLFW_HAT_RIGHT | GLFW_HAT_DOWN
+GLFW_HAT_LEFT_UP            :: GLFW_HAT_LEFT  | GLFW_HAT_UP
+GLFW_HAT_LEFT_DOWN          :: GLFW_HAT_LEFT  | GLFW_HAT_DOWN
+
+GLFW_KEY_UNKNOWN            :: -1
+
+GLFW_KEY_SPACE              :: 32
+GLFW_KEY_APOSTROPHE         :: 39  /* ' */
+GLFW_KEY_COMMA              :: 44  /* , */
+GLFW_KEY_MINUS              :: 45  /* - */
+GLFW_KEY_PERIOD             :: 46  /* . */
+GLFW_KEY_SLASH              :: 47  /* / */
+GLFW_KEY_0                  :: 48
+GLFW_KEY_1                  :: 49
+GLFW_KEY_2                  :: 50
+GLFW_KEY_3                  :: 51
+GLFW_KEY_4                  :: 52
+GLFW_KEY_5                  :: 53
+GLFW_KEY_6                  :: 54
+GLFW_KEY_7                  :: 55
+GLFW_KEY_8                  :: 56
+GLFW_KEY_9                  :: 57
+GLFW_KEY_SEMICOLON          :: 59  /* ; */
+GLFW_KEY_EQUAL              :: 61  /* = */
+GLFW_KEY_A                  :: 65
+GLFW_KEY_B                  :: 66
+GLFW_KEY_C                  :: 67
+GLFW_KEY_D                  :: 68
+GLFW_KEY_E                  :: 69
+GLFW_KEY_F                  :: 70
+GLFW_KEY_G                  :: 71
+GLFW_KEY_H                  :: 72
+GLFW_KEY_I                  :: 73
+GLFW_KEY_J                  :: 74
+GLFW_KEY_K                  :: 75
+GLFW_KEY_L                  :: 76
+GLFW_KEY_M                  :: 77
+GLFW_KEY_N                  :: 78
+GLFW_KEY_O                  :: 79
+GLFW_KEY_P                  :: 80
+GLFW_KEY_Q                  :: 81
+GLFW_KEY_R                  :: 82
+GLFW_KEY_S                  :: 83
+GLFW_KEY_T                  :: 84
+GLFW_KEY_U                  :: 85
+GLFW_KEY_V                  :: 86
+GLFW_KEY_W                  :: 87
+GLFW_KEY_X                  :: 88
+GLFW_KEY_Y                  :: 89
+GLFW_KEY_Z                  :: 90
+GLFW_KEY_LEFT_BRACKET       :: 91  /* [ */
+GLFW_KEY_BACKSLASH          :: 92  /* \ */
+GLFW_KEY_RIGHT_BRACKET      :: 93  /* ] */
+GLFW_KEY_GRAVE_ACCENT       :: 96  /* ` */
+GLFW_KEY_WORLD_1            :: 161 /* non-US #1 */
+GLFW_KEY_WORLD_2            :: 162 /* non-US #2 */
+
+GLFW_KEY_ESCAPE             :: 256
+GLFW_KEY_ENTER              :: 257
+GLFW_KEY_TAB                :: 258
+GLFW_KEY_BACKSPACE          :: 259
+GLFW_KEY_INSERT             :: 260
+GLFW_KEY_DELETE             :: 261
+GLFW_KEY_RIGHT              :: 262
+GLFW_KEY_LEFT               :: 263
+GLFW_KEY_DOWN               :: 264
+GLFW_KEY_UP                 :: 265
+GLFW_KEY_PAGE_UP            :: 266
+GLFW_KEY_PAGE_DOWN          :: 267
+GLFW_KEY_HOME               :: 268
+GLFW_KEY_END                :: 269
+GLFW_KEY_CAPS_LOCK          :: 280
+GLFW_KEY_SCROLL_LOCK        :: 281
+GLFW_KEY_NUM_LOCK           :: 282
+GLFW_KEY_PRINT_SCREEN       :: 283
+GLFW_KEY_PAUSE              :: 284
+GLFW_KEY_F1                 :: 290
+GLFW_KEY_F2                 :: 291
+GLFW_KEY_F3                 :: 292
+GLFW_KEY_F4                 :: 293
+GLFW_KEY_F5                 :: 294
+GLFW_KEY_F6                 :: 295
+GLFW_KEY_F7                 :: 296
+GLFW_KEY_F8                 :: 297
+GLFW_KEY_F9                 :: 298
+GLFW_KEY_F10                :: 299
+GLFW_KEY_F11                :: 300
+GLFW_KEY_F12                :: 301
+GLFW_KEY_F13                :: 302
+GLFW_KEY_F14                :: 303
+GLFW_KEY_F15                :: 304
+GLFW_KEY_F16                :: 305
+GLFW_KEY_F17                :: 306
+GLFW_KEY_F18                :: 307
+GLFW_KEY_F19                :: 308
+GLFW_KEY_F20                :: 309
+GLFW_KEY_F21                :: 310
+GLFW_KEY_F22                :: 311
+GLFW_KEY_F23                :: 312
+GLFW_KEY_F24                :: 313
+GLFW_KEY_F25                :: 314
+GLFW_KEY_KP_0               :: 320
+GLFW_KEY_KP_1               :: 321
+GLFW_KEY_KP_2               :: 322
+GLFW_KEY_KP_3               :: 323
+GLFW_KEY_KP_4               :: 324
+GLFW_KEY_KP_5               :: 325
+GLFW_KEY_KP_6               :: 326
+GLFW_KEY_KP_7               :: 327
+GLFW_KEY_KP_8               :: 328
+GLFW_KEY_KP_9               :: 329
+GLFW_KEY_KP_DECIMAL         :: 330
+GLFW_KEY_KP_DIVIDE          :: 331
+GLFW_KEY_KP_MULTIPLY        :: 332
+GLFW_KEY_KP_SUBTRACT        :: 333
+GLFW_KEY_KP_ADD             :: 334
+GLFW_KEY_KP_ENTER           :: 335
+GLFW_KEY_KP_EQUAL           :: 336
+GLFW_KEY_LEFT_SHIFT         :: 340
+GLFW_KEY_LEFT_CONTROL       :: 341
+GLFW_KEY_LEFT_ALT           :: 342
+GLFW_KEY_LEFT_SUPER         :: 343
+GLFW_KEY_RIGHT_SHIFT        :: 344
+GLFW_KEY_RIGHT_CONTROL      :: 345
+GLFW_KEY_RIGHT_ALT          :: 346
+GLFW_KEY_RIGHT_SUPER        :: 347
+GLFW_KEY_MENU               :: 348
+
+GLFW_KEY_LAST               :: GLFW_KEY_MENU
+GLFW_MOD_SHIFT              :: 0x0001
+GLFW_MOD_CONTROL            :: 0x0002
+GLFW_MOD_ALT                :: 0x0004
+GLFW_MOD_SUPER              :: 0x0008
+GLFW_MOD_CAPS_LOCK          :: 0x0010
+GLFW_MOD_NUM_LOCK           :: 0x0020
+
+GLFW_MOUSE_BUTTON_1         :: 0
+GLFW_MOUSE_BUTTON_2         :: 1
+GLFW_MOUSE_BUTTON_3         :: 2
+GLFW_MOUSE_BUTTON_4         :: 3
+GLFW_MOUSE_BUTTON_5         :: 4
+GLFW_MOUSE_BUTTON_6         :: 5
+GLFW_MOUSE_BUTTON_7         :: 6
+GLFW_MOUSE_BUTTON_8         :: 7
+GLFW_MOUSE_BUTTON_LAST      :: GLFW_MOUSE_BUTTON_8
+GLFW_MOUSE_BUTTON_LEFT      :: GLFW_MOUSE_BUTTON_1
+GLFW_MOUSE_BUTTON_RIGHT     :: GLFW_MOUSE_BUTTON_2
+GLFW_MOUSE_BUTTON_MIDDLE    :: GLFW_MOUSE_BUTTON_3
+GLFW_JOYSTICK_1             :: 0
+GLFW_JOYSTICK_2             :: 1
+GLFW_JOYSTICK_3             :: 2
+GLFW_JOYSTICK_4             :: 3
+GLFW_JOYSTICK_5             :: 4
+GLFW_JOYSTICK_6             :: 5
+GLFW_JOYSTICK_7             :: 6
+GLFW_JOYSTICK_8             :: 7
+GLFW_JOYSTICK_9             :: 8
+GLFW_JOYSTICK_10            :: 9
+GLFW_JOYSTICK_11            :: 10
+GLFW_JOYSTICK_12            :: 11
+GLFW_JOYSTICK_13            :: 12
+GLFW_JOYSTICK_14            :: 13
+GLFW_JOYSTICK_15            :: 14
+GLFW_JOYSTICK_16            :: 15
+GLFW_JOYSTICK_LAST          :: GLFW_JOYSTICK_16
+GLFW_GAMEPAD_BUTTON_A               :: 0
+GLFW_GAMEPAD_BUTTON_B               :: 1
+GLFW_GAMEPAD_BUTTON_X               :: 2
+GLFW_GAMEPAD_BUTTON_Y               :: 3
+GLFW_GAMEPAD_BUTTON_LEFT_BUMPER     :: 4
+GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER    :: 5
+GLFW_GAMEPAD_BUTTON_BACK            :: 6
+GLFW_GAMEPAD_BUTTON_START           :: 7
+GLFW_GAMEPAD_BUTTON_GUIDE           :: 8
+GLFW_GAMEPAD_BUTTON_LEFT_THUMB      :: 9
+GLFW_GAMEPAD_BUTTON_RIGHT_THUMB     :: 10
+GLFW_GAMEPAD_BUTTON_DPAD_UP         :: 11
+GLFW_GAMEPAD_BUTTON_DPAD_RIGHT      :: 12
+GLFW_GAMEPAD_BUTTON_DPAD_DOWN       :: 13
+GLFW_GAMEPAD_BUTTON_DPAD_LEFT       :: 14
+GLFW_GAMEPAD_BUTTON_LAST            :: GLFW_GAMEPAD_BUTTON_DPAD_LEFT
+
+GLFW_GAMEPAD_BUTTON_CROSS       :: GLFW_GAMEPAD_BUTTON_A
+GLFW_GAMEPAD_BUTTON_CIRCLE      :: GLFW_GAMEPAD_BUTTON_B
+GLFW_GAMEPAD_BUTTON_SQUARE      :: GLFW_GAMEPAD_BUTTON_X
+GLFW_GAMEPAD_BUTTON_TRIANGLE    :: GLFW_GAMEPAD_BUTTON_Y
+GLFW_GAMEPAD_AXIS_LEFT_X        :: 0
+GLFW_GAMEPAD_AXIS_LEFT_Y        :: 1
+GLFW_GAMEPAD_AXIS_RIGHT_X       :: 2
+GLFW_GAMEPAD_AXIS_RIGHT_Y       :: 3
+GLFW_GAMEPAD_AXIS_LEFT_TRIGGER  :: 4
+GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER :: 5
+GLFW_GAMEPAD_AXIS_LAST          :: GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER
+
+GLFW_NO_ERROR               :: 0
+GLFW_NOT_INITIALIZED        :: 0x00010001
+GLFW_NO_CURRENT_CONTEXT     :: 0x00010002
+GLFW_INVALID_ENUM           :: 0x00010003
+GLFW_INVALID_VALUE          :: 0x00010004
+GLFW_OUT_OF_MEMORY          :: 0x00010005
+GLFW_API_UNAVAILABLE        :: 0x00010006
+GLFW_VERSION_UNAVAILABLE    :: 0x00010007
+GLFW_PLATFORM_ERROR         :: 0x00010008
+GLFW_FORMAT_UNAVAILABLE     :: 0x00010009
+GLFW_NO_WINDOW_CONTEXT      :: 0x0001000A
+
diff --git a/modules/glfw3/onyx_glfw3.c b/modules/glfw3/onyx_glfw3.c
new file mode 100644 (file)
index 0000000..e2c785b
--- /dev/null
@@ -0,0 +1,127 @@
+#include "onyx_library.h"
+#include <GLFW/glfw3.h>
+
+#define ONYX_LIBRARY_NAME onyx_glfw3
+
+ONYX_DEF(glfwInit, (), (INT)) {
+    results->data[0] = WASM_I32_VAL(glfwInit());
+    return NULL;
+}
+
+ONYX_DEF(glfwTerminate, (), ()) {
+    glfwTerminate();
+    return NULL;
+}
+
+ONYX_DEF(glfwGetVersion, (PTR, PTR, PTR), ()) {
+    glfwGetVersion((int *) ONYX_PTR(params->data[0].of.i32),
+                   (int *) ONYX_PTR(params->data[1].of.i32),
+                   (int *) ONYX_PTR(params->data[2].of.i32));
+    return NULL;
+}
+
+ONYX_DEF(glfwCreateWindow, (INT, INT, PTR, LONG, LONG), (LONG)) {
+    GLFWwindow* window = glfwCreateWindow(
+                     params->data[0].of.i32, params->data[1].of.i32,
+                     ONYX_PTR(params->data[2].of.i32),
+                     (GLFWmonitor *) params->data[3].of.i64,
+                     (GLFWwindow  *) params->data[4].of.i64);
+
+    wasm_val_init_ptr(&results->data[0], window);
+    return NULL;
+}
+
+ONYX_DEF(glfwDestroyWindow, (LONG), ()) {
+    GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64;
+    glfwDestroyWindow(window);
+    return NULL;
+}
+
+ONYX_DEF(glfwWindowShouldClose, (LONG), (BOOL)) {
+    GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64;
+    results->data[0] = WASM_I32_VAL(glfwWindowShouldClose(window) == GLFW_TRUE);
+    return NULL;
+}
+
+ONYX_DEF(glfwSetWindowShouldClose, (LONG, BOOL), ()) {
+    GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64;
+    glfwSetWindowShouldClose(window, params->data[1].of.i32);
+    return NULL;
+}
+
+ONYX_DEF(glfwDefaultWindowHints, (), ()) {
+    glfwDefaultWindowHints();
+    return NULL;
+}
+
+ONYX_DEF(glfwWindowHint, (INT, INT), ()) {
+    glfwWindowHint(params->data[0].of.i32, params->data[1].of.i32);
+    return NULL;
+}
+
+ONYX_DEF(glfwSetWindowTitle, (LONG, PTR), ()) {
+    GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64;
+    glfwSetWindowTitle(window, ONYX_PTR(params->data[1].of.i32));
+    return NULL;
+}
+
+ONYX_DEF(glfwGetWindowPos, (LONG, PTR, PTR), ()) {
+    GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64;
+    glfwGetWindowPos(window, (int *) ONYX_PTR(params->data[1].of.i32), (int *) ONYX_PTR(params->data[2].of.i32));
+    return NULL;
+}
+
+ONYX_DEF(glfwSetWindowPos, (LONG, INT, INT), ()) {
+    GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64;
+    glfwSetWindowPos(window, params->data[1].of.i32, params->data[2].of.i32);
+    return NULL;
+}
+
+// ...
+ONYX_DEF(glfwPollEvents, (), ()) {
+    glfwPollEvents();
+    return NULL;
+}
+
+ONYX_DEF(glfwWaitEvents, (), ()) {
+    glfwWaitEvents();
+    return NULL;
+}
+
+ONYX_DEF(glfwWaitEventsTimeout, (DOUBLE), ()) {
+    glfwWaitEventsTimeout(params->data[0].of.f64);
+    return NULL;
+}
+
+ONYX_DEF(glfwPostEmptyEvent, (), ()) {
+    glfwPostEmptyEvent();
+    return NULL;
+}
+
+ONYX_DEF(glfwSwapBuffers, (LONG), ()) {
+    GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64;
+    glfwSwapBuffers(window);
+    return NULL;
+}
+
+ONYX_LIBRARY {
+    ONYX_FUNC(glfwInit)
+    ONYX_FUNC(glfwTerminate)
+    ONYX_FUNC(glfwGetVersion)
+    ONYX_FUNC(glfwCreateWindow)
+    ONYX_FUNC(glfwDestroyWindow)
+    ONYX_FUNC(glfwWindowShouldClose)
+    ONYX_FUNC(glfwSetWindowShouldClose)
+    ONYX_FUNC(glfwDefaultWindowHints)
+    ONYX_FUNC(glfwWindowHint)
+    ONYX_FUNC(glfwSetWindowTitle)
+    ONYX_FUNC(glfwGetWindowPos)
+    ONYX_FUNC(glfwSetWindowPos)
+    ONYX_FUNC(glfwPollEvents)
+    ONYX_FUNC(glfwWaitEvents)
+    ONYX_FUNC(glfwWaitEventsTimeout)
+    ONYX_FUNC(glfwPostEmptyEvent)
+    ONYX_FUNC(glfwSwapBuffers)
+
+    NULL
+};
\ No newline at end of file
diff --git a/modules/glfw3/onyx_glfw3.so b/modules/glfw3/onyx_glfw3.so
new file mode 100755 (executable)
index 0000000..c438dd4
Binary files /dev/null and b/modules/glfw3/onyx_glfw3.so differ
index 3eda2b283c73f368cf24b59b90beec6f5556f032..db2207ea98002cd5ad36d4898a404a4903b6b64b 100644 (file)
@@ -502,7 +502,19 @@ typedef void *(*LibraryLinker)();
 static bh_arr(WasmFuncDefinition **) linkable_functions = NULL;
 
 static void onyx_load_library(char *name) {
-    char *library_load_name = bh_aprintf(global_scratch_allocator, "onyx_library_%s", name);
+    #ifdef _BH_LINUX
+        #define DIR_SEPARATOR '/'
+    #endif
+    #ifdef _BH_WINDOWS
+        #define DIR_SEPARATOR '\\'
+    #endif
+
+    char *library = name;
+    fori (i, 0, (i32) strlen(name)) {
+        if (name[i] == DIR_SEPARATOR) library = &name[i + 1];
+    }
+
+    char *library_load_name = bh_aprintf(global_scratch_allocator, "onyx_library_%s", library);
     LibraryLinker library_load;
 
     #ifdef _BH_LINUX