2026-01-22 21:02:22 +00:00
|
|
|
structure RgfwLoop =
|
|
|
|
|
struct
|
2026-01-23 11:13:33 +00:00
|
|
|
fun yank string =
|
|
|
|
|
Rgfw.writeClipboard (string, String.size string)
|
|
|
|
|
|
|
|
|
|
fun consumeEvent (drawState, window, msg) =
|
|
|
|
|
let
|
|
|
|
|
open DrawMsg
|
|
|
|
|
|
|
|
|
|
val {textVertexBuffer, textProgram, textDrawLength = _, ...} = drawState
|
|
|
|
|
in
|
|
|
|
|
case msg of
|
|
|
|
|
DRAW_TEXT textVec => GlDraw.uploadText (drawState, textVec)
|
|
|
|
|
| YANK str => (yank str; drawState)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
fun consumeEventsLoop (pos, msgVec, drawState, window) =
|
|
|
|
|
if pos = Vector.length msgVec then
|
|
|
|
|
drawState
|
|
|
|
|
else
|
|
|
|
|
let
|
|
|
|
|
val msg = Vector.sub (msgVec, pos)
|
|
|
|
|
val drawState = consumeEvent (drawState, window, msg)
|
|
|
|
|
in
|
|
|
|
|
consumeEventsLoop (pos + 1, msgVec, drawState, window)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
fun consumeEvents (drawState, window) =
|
|
|
|
|
consumeEventsLoop (0, DrawMailbox.getMessagesAndClear (), drawState, window)
|
|
|
|
|
|
|
|
|
|
fun loop (window, app, drawState) =
|
2026-01-22 21:02:22 +00:00
|
|
|
if Rgfw.shouldCloseWindow window then
|
|
|
|
|
Rgfw.closeWindow window
|
|
|
|
|
else
|
2026-01-23 10:04:44 +00:00
|
|
|
let
|
|
|
|
|
val _ = Gles3.clearColor (0.89, 0.89, 0.89, 1.0)
|
|
|
|
|
val _ = Gles3.clear ()
|
2026-01-23 10:55:43 +00:00
|
|
|
|
|
|
|
|
val app = Updater.update app
|
|
|
|
|
|
2026-01-23 11:13:33 +00:00
|
|
|
val () = GlDraw.draw drawState
|
2026-01-22 21:38:15 +00:00
|
|
|
val () = Rgfw.swapBuffers window
|
2026-01-23 10:04:44 +00:00
|
|
|
in
|
2026-01-23 11:13:33 +00:00
|
|
|
loop (window, app, drawState)
|
2026-01-22 21:02:22 +00:00
|
|
|
end
|
|
|
|
|
|
2026-01-23 10:04:44 +00:00
|
|
|
local
|
|
|
|
|
fun loop (io, acc, lastCharWasNewline) =
|
|
|
|
|
case TextIO.inputLine io of
|
|
|
|
|
SOME str =>
|
|
|
|
|
let
|
|
|
|
|
val endsWithNewline =
|
|
|
|
|
String.size str > 0
|
|
|
|
|
andalso String.sub (str, String.size str - 1) = #"\n"
|
|
|
|
|
in
|
|
|
|
|
loop (io, LineGap.append (str, acc), endsWithNewline)
|
|
|
|
|
end
|
|
|
|
|
| NONE =>
|
|
|
|
|
if lastCharWasNewline then
|
|
|
|
|
LineGap.goToStart acc
|
|
|
|
|
else
|
|
|
|
|
let val acc = LineGap.append ("\n", acc)
|
|
|
|
|
in LineGap.goToStart acc
|
|
|
|
|
end
|
|
|
|
|
in
|
|
|
|
|
fun ioToLineGap (io, acc) = loop (io, acc, false)
|
|
|
|
|
end
|
|
|
|
|
|
2026-01-22 21:02:22 +00:00
|
|
|
fun main () =
|
|
|
|
|
let
|
|
|
|
|
val window = Rgfw.createWindow ("shf", 0, 0, 1920, 1080)
|
2026-01-23 10:04:44 +00:00
|
|
|
val () = Gles3.enableDepthTest ()
|
|
|
|
|
|
|
|
|
|
(* load file intol gap buffer and create initial app *)
|
|
|
|
|
val io = TextIO.openIn "temp.txt"
|
|
|
|
|
val lineGap = ioToLineGap (io, LineGap.empty)
|
|
|
|
|
val _ = TextIO.closeIn io
|
2026-01-23 11:13:33 +00:00
|
|
|
|
2026-01-23 10:04:44 +00:00
|
|
|
val app = AppType.init (lineGap, 1920, 1080, Time.now ())
|
2026-01-23 11:13:33 +00:00
|
|
|
val drawState = GlDraw.create ()
|
2026-01-22 21:02:22 +00:00
|
|
|
in
|
2026-01-23 11:13:33 +00:00
|
|
|
loop (window, app, drawState)
|
2026-01-22 21:02:22 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
val _ = RgfwLoop.main ()
|