checkpoint (seem to have encountered an FFI bug?)
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
mlton -const 'Exn.keepHistory true' -link-opt "-lX11 -lXrandr -lGL" \
|
mlton -const 'Exn.keepHistory true' -link-opt "-lX11 -lXrandr -lGL" \
|
||||||
-export-header ffi/export.h \
|
-export-header ffi/mlton-rgfw-export.h \
|
||||||
shf-rgfw.mlb \
|
shf-rgfw.mlb \
|
||||||
ffi/rgfw-export.c
|
ffi/rgfw-export.c
|
||||||
|
|||||||
169
ffi/mlton-rgfw-export.h
Normal file
169
ffi/mlton-rgfw-export.h
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
#ifndef __SHF_RGFW_ML_H__
|
||||||
|
#define __SHF_RGFW_ML_H__
|
||||||
|
|
||||||
|
/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh
|
||||||
|
* Jagannathan, and Stephen Weeks.
|
||||||
|
*
|
||||||
|
* MLton is released under a HPND-style license.
|
||||||
|
* See the file MLton-LICENSE for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MLTON_MLTYPES_H_
|
||||||
|
#define _MLTON_MLTYPES_H_
|
||||||
|
|
||||||
|
/* We need these because in header files for exported SML functions,
|
||||||
|
* types.h is included without cenv.h.
|
||||||
|
*/
|
||||||
|
#if (defined (_AIX) || defined (__hpux__) || defined (__OpenBSD__))
|
||||||
|
#include <inttypes.h>
|
||||||
|
#elif (defined (__sun__))
|
||||||
|
#include <sys/int_types.h>
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ML types */
|
||||||
|
typedef unsigned char PointerAux __attribute__ ((may_alias));
|
||||||
|
typedef PointerAux* Pointer;
|
||||||
|
#define Array(t) Pointer
|
||||||
|
#define Ref(t) Pointer
|
||||||
|
#define Vector(t) Pointer
|
||||||
|
|
||||||
|
typedef int8_t Int8_t;
|
||||||
|
typedef int8_t Int8;
|
||||||
|
typedef int16_t Int16_t;
|
||||||
|
typedef int16_t Int16;
|
||||||
|
typedef int32_t Int32_t;
|
||||||
|
typedef int32_t Int32;
|
||||||
|
typedef int64_t Int64_t;
|
||||||
|
typedef int64_t Int64;
|
||||||
|
typedef float Real32_t;
|
||||||
|
typedef float Real32;
|
||||||
|
typedef double Real64_t;
|
||||||
|
typedef double Real64;
|
||||||
|
typedef uint8_t Word8_t;
|
||||||
|
typedef uint8_t Word8;
|
||||||
|
typedef uint16_t Word16_t;
|
||||||
|
typedef uint16_t Word16;
|
||||||
|
typedef uint32_t Word32_t;
|
||||||
|
typedef uint32_t Word32;
|
||||||
|
typedef uint64_t Word64_t;
|
||||||
|
typedef uint64_t Word64;
|
||||||
|
|
||||||
|
typedef Int8_t WordS8_t;
|
||||||
|
typedef Int8_t WordS8;
|
||||||
|
typedef Int16_t WordS16_t;
|
||||||
|
typedef Int16_t WordS16;
|
||||||
|
typedef Int32_t WordS32_t;
|
||||||
|
typedef Int32_t WordS32;
|
||||||
|
typedef Int64_t WordS64_t;
|
||||||
|
typedef Int64_t WordS64;
|
||||||
|
|
||||||
|
typedef Word8_t WordU8_t;
|
||||||
|
typedef Word8_t WordU8;
|
||||||
|
typedef Word16_t WordU16_t;
|
||||||
|
typedef Word16_t WordU16;
|
||||||
|
typedef Word32_t WordU32_t;
|
||||||
|
typedef Word32_t WordU32;
|
||||||
|
typedef Word64_t WordU64_t;
|
||||||
|
typedef Word64_t WordU64;
|
||||||
|
|
||||||
|
typedef WordU8_t Char8_t;
|
||||||
|
typedef WordU8_t Char8;
|
||||||
|
typedef WordU16_t Char16_t;
|
||||||
|
typedef WordU16_t Char16;
|
||||||
|
typedef WordU32_t Char32_t;
|
||||||
|
typedef WordU32_t Char32;
|
||||||
|
|
||||||
|
typedef Vector(Char8_t) String8_t;
|
||||||
|
typedef Vector(Char8_t) String8;
|
||||||
|
typedef Vector(Char16_t) String16_t;
|
||||||
|
typedef Vector(Char16_t) String16;
|
||||||
|
typedef Vector(Char32_t) String32_t;
|
||||||
|
typedef Vector(Char32_t) String32;
|
||||||
|
|
||||||
|
typedef Int32_t Bool_t;
|
||||||
|
typedef Int32_t Bool;
|
||||||
|
typedef String8_t NullString8_t;
|
||||||
|
typedef String8_t NullString8;
|
||||||
|
|
||||||
|
typedef void* CPointer;
|
||||||
|
typedef Pointer Objptr;
|
||||||
|
|
||||||
|
#endif /* _MLTON_MLTYPES_H_ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh
|
||||||
|
* Jagannathan, and Stephen Weeks.
|
||||||
|
* Copyright (C) 1997-2000 NEC Research Institute.
|
||||||
|
*
|
||||||
|
* MLton is released under a HPND-style license.
|
||||||
|
* See the file MLton-LICENSE for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MLTON_EXPORT_H_
|
||||||
|
#define _MLTON_EXPORT_H_
|
||||||
|
|
||||||
|
/* ------------------------------------------------- */
|
||||||
|
/* Symbols */
|
||||||
|
/* ------------------------------------------------- */
|
||||||
|
|
||||||
|
/* An external symbol is something not defined by the module
|
||||||
|
* (executable or library) being built. Rather, it is provided
|
||||||
|
* from a library dependency (dll, dylib, or shared object).
|
||||||
|
*
|
||||||
|
* A public symbol is defined in this module as being available
|
||||||
|
* to users outside of this module. If building a library, this
|
||||||
|
* means the symbol will be part of the public interface.
|
||||||
|
*
|
||||||
|
* A private symbol is defined within this module, but will not
|
||||||
|
* be made available outside of it. This is typically used for
|
||||||
|
* internal implementation details that should not be accessible.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
|
||||||
|
#define EXTERNAL __declspec(dllimport)
|
||||||
|
#define PUBLIC __declspec(dllexport)
|
||||||
|
#define PRIVATE
|
||||||
|
#else
|
||||||
|
#define EXTERNAL __attribute__((visibility("default")))
|
||||||
|
#define PUBLIC __attribute__((visibility("default")))
|
||||||
|
#define PRIVATE __attribute__((visibility("hidden")))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _MLTON_EXPORT_H_ */
|
||||||
|
|
||||||
|
#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_RGFW)
|
||||||
|
#define MLLIB_PRIVATE(x) PRIVATE x
|
||||||
|
#define MLLIB_PUBLIC(x) PUBLIC x
|
||||||
|
#elif defined(STATIC_LINK_SHF_RGFW)
|
||||||
|
#define MLLIB_PRIVATE(x)
|
||||||
|
#define MLLIB_PUBLIC(x) PUBLIC x
|
||||||
|
#elif defined(DYNAMIC_LINK_SHF_RGFW)
|
||||||
|
#define MLLIB_PRIVATE(x)
|
||||||
|
#define MLLIB_PUBLIC(x) EXTERNAL x
|
||||||
|
#else
|
||||||
|
#error Must specify linkage for shf_rgfw
|
||||||
|
#define MLLIB_PRIVATE(x)
|
||||||
|
#define MLLIB_PUBLIC(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MLLIB_PUBLIC(void mltonEscape ();)
|
||||||
|
|
||||||
|
#undef MLLIB_PRIVATE
|
||||||
|
#undef MLLIB_PUBLIC
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __SHF_RGFW_ML_H__ */
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "RGFW.h"
|
#include "RGFW.h"
|
||||||
#include <GLES3/gl3.h>
|
#include <GLES3/gl3.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "mlton-rgfw-export.h"
|
||||||
|
|
||||||
RGFW_window* createWindow(char* title, int x, int y, int width, int height) {
|
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);
|
return RGFW_createWindow(title, x, y, width, height, RGFW_windowCenter | RGFW_windowOpenGL);
|
||||||
@@ -16,7 +17,7 @@ void closeWindow(RGFW_window* window) {
|
|||||||
RGFW_window_close(window);
|
RGFW_window_close(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldCloseWindow(RGFW_window* window) {
|
Bool shouldCloseWindow(RGFW_window* window) {
|
||||||
if (RGFW_window_shouldClose(window)) {
|
if (RGFW_window_shouldClose(window)) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
@@ -32,6 +33,22 @@ void writeClipboard(char* string, int stringSize) {
|
|||||||
RGFW_writeClipboard(string, stringSize);
|
RGFW_writeClipboard(string, stringSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void keyCallback(RGFW_window* window, unsigned char key, unsigned char symbol, unsigned char keymod, unsigned char repeated, unsigned char pressed) {
|
||||||
|
if (pressed || repeated) {
|
||||||
|
if (key == RGFW_escape) {
|
||||||
|
mltonEscape();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setKeyCallback() {
|
||||||
|
RGFW_setKeyCallback(keyCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pollEvents() {
|
||||||
|
RGFW_pollEvents();
|
||||||
|
}
|
||||||
|
|
||||||
// OpenGL constants used below
|
// OpenGL constants used below
|
||||||
unsigned int VERTEX_SHADER = GL_VERTEX_SHADER;
|
unsigned int VERTEX_SHADER = GL_VERTEX_SHADER;
|
||||||
unsigned int FRAGMENT_SHADER = GL_FRAGMENT_SHADER;
|
unsigned int FRAGMENT_SHADER = GL_FRAGMENT_SHADER;
|
||||||
|
|||||||
@@ -10,7 +10,15 @@ struct
|
|||||||
val shouldCloseWindow =
|
val shouldCloseWindow =
|
||||||
_import "shouldCloseWindow" public : window -> bool;
|
_import "shouldCloseWindow" public : window -> bool;
|
||||||
val swapBuffers =
|
val swapBuffers =
|
||||||
_import "swapBuffers" public reentrant : window -> unit;
|
_import "swapBuffers" public : window -> unit;
|
||||||
|
val pollEvents =
|
||||||
|
_import "pollEvents" public reentrant : unit -> unit;
|
||||||
|
|
||||||
val writeClipboard =
|
val writeClipboard =
|
||||||
_import "writeClipboard" public : string * int -> unit;
|
_import "writeClipboard" public : string * int -> unit;
|
||||||
|
|
||||||
|
val exportEscapeCallback =
|
||||||
|
_export "mltonEscape" public : (unit -> unit) -> unit;
|
||||||
|
val setKeyCallback =
|
||||||
|
_import "setKeyCallback" public : unit -> unit;
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -33,8 +33,10 @@ struct
|
|||||||
Rgfw.closeWindow window
|
Rgfw.closeWindow window
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
val _ = Gles3.clearColor (0.89, 0.89, 0.89, 1.0)
|
val () = Gles3.clearColor (0.89, 0.89, 0.89, 1.0)
|
||||||
val _ = Gles3.clear ()
|
val () = Gles3.clear ()
|
||||||
|
|
||||||
|
val () = Rgfw.pollEvents ()
|
||||||
|
|
||||||
val app = Updater.update app
|
val app = Updater.update app
|
||||||
|
|
||||||
@@ -66,6 +68,21 @@ struct
|
|||||||
fun ioToLineGap (io, acc) = loop (io, acc, false)
|
fun ioToLineGap (io, acc) = loop (io, acc, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
fun escapeCallback () =
|
||||||
|
let
|
||||||
|
val () = print "73\n"
|
||||||
|
in
|
||||||
|
InputMailbox.append InputMsg.KEY_ESC
|
||||||
|
end
|
||||||
|
|
||||||
|
fun registerCallbacks () =
|
||||||
|
let
|
||||||
|
val () = Rgfw.exportEscapeCallback escapeCallback
|
||||||
|
val () = Rgfw.setKeyCallback ()
|
||||||
|
in
|
||||||
|
()
|
||||||
|
end
|
||||||
|
|
||||||
fun main () =
|
fun main () =
|
||||||
let
|
let
|
||||||
val window = Rgfw.createWindow ("shf", 0, 0, 1920, 1080)
|
val window = Rgfw.createWindow ("shf", 0, 0, 1920, 1080)
|
||||||
@@ -74,7 +91,9 @@ struct
|
|||||||
(* load file intol gap buffer and create initial app *)
|
(* load file intol gap buffer and create initial app *)
|
||||||
val io = TextIO.openIn "temp.txt"
|
val io = TextIO.openIn "temp.txt"
|
||||||
val lineGap = ioToLineGap (io, LineGap.empty)
|
val lineGap = ioToLineGap (io, LineGap.empty)
|
||||||
val _ = TextIO.closeIn io
|
val () = TextIO.closeIn io
|
||||||
|
|
||||||
|
val () = registerCallbacks ()
|
||||||
|
|
||||||
val app = AppType.init (lineGap, 1920, 1080, Time.now ())
|
val app = AppType.init (lineGap, 1920, 1080, Time.now ())
|
||||||
val drawState = GlDraw.create ()
|
val drawState = GlDraw.create ()
|
||||||
|
|||||||
Reference in New Issue
Block a user