diff --git a/dotscape b/dotscape index 3ce5387..ce4b4db 100755 Binary files a/dotscape and b/dotscape differ diff --git a/ffi/export.h b/ffi/export.h index a18c4d2..a697dec 100644 --- a/ffi/export.h +++ b/ffi/export.h @@ -159,6 +159,7 @@ extern "C" { MLLIB_PUBLIC(void mltonMouseMoveCallback (Real32 x0, Real32 x1);) MLLIB_PUBLIC(void mltonMouseClickCallback (Int32 x0, Int32 x1);) +MLLIB_PUBLIC(void mltonFramebufferSizeCallback (Int32 x0, Int32 x1);) #undef MLLIB_PRIVATE #undef MLLIB_PUBLIC diff --git a/ffi/glfw-input.c b/ffi/glfw-input.c index 296bf10..b42ab21 100644 --- a/ffi/glfw-input.c +++ b/ffi/glfw-input.c @@ -10,16 +10,21 @@ void mouseMoveCallback(GLFWwindow *window, double xpos, double ypos) { mltonMouseMoveCallback((float)xpos, (float)ypos); } -void mouseClickCallback(GLFWwindow *window, int button, int action, int mods) { - mltonMouseClickCallback(button, action); -} - -// Call this from MLton to register key callback with GLFW. +// Call this from MLton to register callback with GLFW. void setMouseMoveCallback(GLFWwindow *window) { glfwSetCursorPosCallback(window, mouseMoveCallback); } +void mouseClickCallback(GLFWwindow *window, int button, int action, int mods) { + mltonMouseClickCallback(button, action); +} void setMouseClickCallback(GLFWwindow *window) { glfwSetMouseButtonCallback(window, mouseClickCallback); } +void framebufferSizeCallback(GLFWwindow *window, int width, int height) { + mltonFramebufferSizeCallback(width, height); +} +void setFramebufferSizeCallback(GLFWwindow *window, int width, int height) { + glfwSetFramebufferSizeCallback(window, framebufferSizeCallback); +} diff --git a/ffi/glfw-input.sml b/ffi/glfw-input.sml index 87b7126..72ddb5e 100644 --- a/ffi/glfw-input.sml +++ b/ffi/glfw-input.sml @@ -11,9 +11,13 @@ struct val exportMouseClickCallback = _export "mltonMouseClickCallback" public : (int * int -> unit) -> unit; - val setMouseClickCallback = _import "setMouseClickCallback" public reentrant : window -> unit; + val exportFramebufferSizeCallback = + _export "mltonFramebufferSizeCallback" public : (int * int -> unit) -> unit; + val setFramebufferSizeCallback = + _import "setFramebufferSizeCallback" public reentrant : window -> unit; + (* Constants for mouse input. *) val (MOUSE_PRESSED, _) = _symbol "MOUSE_PRESSED" public : ( unit -> int ) * ( int -> unit ); diff --git a/functional-core/app-update.sml b/functional-core/app-update.sml index f423464..c97678c 100644 --- a/functional-core/app-update.sml +++ b/functional-core/app-update.sml @@ -161,7 +161,7 @@ struct in (model, drawMsg, mouseX, mouseY) end - | MUSE_LEFT_CLICK => + | MOUSE_LEFT_CLICK => let val (buttonVec, hpos, vpos) = getClickPos (#clickPoints model, mouseX, mouseY, 0.0, 0.0, 1.0) @@ -205,5 +205,11 @@ struct else (model, NO_DRAW, mouseX, mouseY) end + | RESIZE_WINDOW {width, height} => + let + val _ = print "resized window \n" + in + (model, NO_DRAW, mouseX, mouseY) + end end end diff --git a/imperative-shell/input-callbacks.sml b/imperative-shell/input-callbacks.sml index d1bfbb5..d516970 100644 --- a/imperative-shell/input-callbacks.sml +++ b/imperative-shell/input-callbacks.sml @@ -15,6 +15,11 @@ struct else () + fun framebufferSizeCallback mailbox (width, height) = + let val _ = Gles3.viewport (width, height) + in Mailbox.send (mailbox, RESIZE_WINDOW {width = width, height = height}) + end + fun registerCallbacks (window, inputMailbox) = let val mouseMoveCallback = mouseMoveCallback inputMailbox @@ -24,6 +29,10 @@ struct val mouseClickCallback = mouseClickCallback inputMailbox val _ = Input.exportMouseClickCallback mouseClickCallback val _ = Input.setMouseClickCallback window + + val resizeCallback = framebufferSizeCallback inputMailbox + val _ = Input.exportFramebufferSizeCallback resizeCallback + val _ = Input.setFramebufferSizeCallback window in () end diff --git a/message-types/input-msg.sml b/message-types/input-msg.sml index 7b2ebac..a73eaef 100644 --- a/message-types/input-msg.sml +++ b/message-types/input-msg.sml @@ -4,6 +4,7 @@ sig MOUSE_MOVE of {x: Real32.real, y: Real32.real} | MOUSE_LEFT_CLICK | MOUSE_LEFT_RELEASE + | RESIZE_WINDOW of {width: int, height: int} end structure InputMessage :> INPUT_MESSAGE = @@ -12,4 +13,5 @@ struct MOUSE_MOVE of {x: Real32.real, y: Real32.real} | MOUSE_LEFT_CLICK | MOUSE_LEFT_RELEASE + | RESIZE_WINDOW of {width: int, height: int} end