diff --git a/build-unix-rgfw-debug-.sh b/build-unix-rgfw-debug-.sh index dd6b815..c642bf3 100755 --- a/build-unix-rgfw-debug-.sh +++ b/build-unix-rgfw-debug-.sh @@ -1,5 +1,5 @@ #!/bin/sh -mlton -const 'Exn.keepHistory true' -link-opt "-lX11 -lXrandr -lGL -lm" \ +mlton -const 'Exn.keepHistory true' -link-opt "-lX11 -lXrandr -lGL" \ -export-header ffi/export.h \ - shf-tests.mlb \ + shf-rgfw.mlb \ ffi/rgfw-export.c diff --git a/ffi/export.h b/ffi/export.h index f09f8a4..d896f08 100644 --- a/ffi/export.h +++ b/ffi/export.h @@ -1,5 +1,5 @@ -#ifndef __SHF_ML_H__ -#define __SHF_ML_H__ +#ifndef __SHF_RGFW_ML_H__ +#define __SHF_RGFW_ML_H__ /* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. @@ -132,23 +132,23 @@ typedef Pointer Objptr; #endif /* _MLTON_EXPORT_H_ */ -#if !defined(PART_OF_SHF) && \ - !defined(STATIC_LINK_SHF) && \ - !defined(DYNAMIC_LINK_SHF) -#define PART_OF_SHF +#if !defined(PART_OF_SHF_RGFW) && \ + !defined(STATIC_LINK_SHF_RGFW) && \ + !defined(DYNAMIC_LINK_SHF_RGFW) +#define PART_OF_SHF_RGFW #endif -#if defined(PART_OF_SHF) +#if defined(PART_OF_SHF_RGFW) #define MLLIB_PRIVATE(x) PRIVATE x #define MLLIB_PUBLIC(x) PUBLIC x -#elif defined(STATIC_LINK_SHF) +#elif defined(STATIC_LINK_SHF_RGFW) #define MLLIB_PRIVATE(x) #define MLLIB_PUBLIC(x) PUBLIC x -#elif defined(DYNAMIC_LINK_SHF) +#elif defined(DYNAMIC_LINK_SHF_RGFW) #define MLLIB_PRIVATE(x) #define MLLIB_PUBLIC(x) EXTERNAL x #else -#error Must specify linkage for shf +#error Must specify linkage for shf_rgfw #define MLLIB_PRIVATE(x) #define MLLIB_PUBLIC(x) #endif @@ -157,9 +157,6 @@ typedef Pointer Objptr; extern "C" { #endif -MLLIB_PUBLIC(void mltonFramebufferSizeCallback (Int32 x0, Int32 x1);) -MLLIB_PUBLIC(void mltonCharCallback (Word32 x0);) -MLLIB_PUBLIC(void mltonKeyCallback (Int32 x0, Int32 x1, Int32 x2, Int32 x3);) #undef MLLIB_PRIVATE #undef MLLIB_PUBLIC @@ -168,4 +165,4 @@ MLLIB_PUBLIC(void mltonKeyCallback (Int32 x0, Int32 x1, Int32 x2, Int32 x3);) } #endif -#endif /* __SHF_ML_H__ */ +#endif /* __SHF_RGFW_ML_H__ */ diff --git a/ffi/rgfw-export.c b/ffi/rgfw-export.c index 84fa245..75aab91 100644 --- a/ffi/rgfw-export.c +++ b/ffi/rgfw-export.c @@ -1,16 +1,25 @@ -#include +#define RGFW_OPENGL +#define RGFW_ALLOC_DROPFILES #define RGFW_IMPLEMENTATION -#define RGFW_OPENGL /* if this line is not added, OpenGL functions will not be included */ +#define RGFW_PRINT_ERRORS +#define RGFW_DEBUG +#define GL_SILENCE_DEPRECATION #include "RGFW.h" +#include +#include -#ifdef RGFW_MACOS -#include /* why does macOS do this */ -#else -#include -#endif - -RGFW_windowFlags OPENGL_WINDOW = RGFW_windowOpenGL; - -RGFW_window* createWindow(char* title, int x, int y, int width, int height, RGFW_windowFlags options) { - return RGFW_createWindow(title, x, y, width, height, options); +RGFW_window* createWindow(char* title, int x, int y, int width, int height) { + return RGFW_createWindow(title, x, y, width, height, RGFW_windowCenter | RGFW_windowOpenGL); +} + +void closeWindow(RGFW_window* window) { + RGFW_window_close(window); +} + +bool shouldCloseWindow(RGFW_window* window) { + return RGFW_window_shouldClose(window) != 0; +} + +void swapBuffers(RGFW_window* window) { + RGFW_window_swapBuffers_OpenGL(window); } diff --git a/ffi/rgfw-export.sml b/ffi/rgfw-export.sml new file mode 100644 index 0000000..a60275a --- /dev/null +++ b/ffi/rgfw-export.sml @@ -0,0 +1,14 @@ +structure Rgfw = +struct + type window = MLton.Pointer.t + + (* RGFW functions. *) + val createWindow = + _import "createWindow" public : string * int * int * int * int -> window; + val closeWindow = + _import "closeWindow" public : window -> unit; + val shouldCloseWindow = + _import "shouldCloseWindow" public : window -> bool; + val swapBuffers = + _import "swapBuffers" public : window -> unit; +end diff --git a/shell/rgfw-loop.sml b/shell/rgfw-loop.sml new file mode 100644 index 0000000..434ba1d --- /dev/null +++ b/shell/rgfw-loop.sml @@ -0,0 +1,21 @@ +structure RgfwLoop = +struct + fun loop (counter, window) = + if Rgfw.shouldCloseWindow window then + Rgfw.closeWindow window + else + let val () = print ("counter = " ^ Int.toString counter ^ "\n") + in loop (counter + 1, window) + end + + fun main () = + let + val () = print "15\n" + val window = Rgfw.createWindow ("shf", 0, 0, 1920, 1080) + val () = print "17\n" + in + loop (0, window) + end +end + +val _ = RgfwLoop.main () diff --git a/shf-rgfw b/shf-rgfw new file mode 100755 index 0000000..2edbdc8 Binary files /dev/null and b/shf-rgfw differ diff --git a/shf-rgfw.mlb b/shf-rgfw.mlb new file mode 100644 index 0000000..cc6957e --- /dev/null +++ b/shf-rgfw.mlb @@ -0,0 +1,10 @@ +$(SML_LIB)/basis/basis.mlb + +(* IMPERATIVE SHELL *) +$(SML_LIB)/basis/mlton.mlb +ann + "allowFFI true" +in + ffi/rgfw-export.sml +end +shell/rgfw-loop.sml diff --git a/todo.md b/todo.md index a2c49df..3b7f5dc 100644 --- a/todo.md +++ b/todo.md @@ -1,4 +1,5 @@ # To-do list +- Bind functions from RGFW (alternative back-end/window library) and have an option to use it - Bind gamepad functions from GLFW - I have bindings for alpha letters, shift, enter and escape. - I should learn layout next.