open X11
-let onfocus focused = ()
-let onkeypress mods rune = ()
-let onmousebtn mods btn x y pressed = ()
-let onmousedrag mods x y = ()
-let onupdate width height = ()
-let onshutdown = ()
+let onfocus focused =
+ print_endline "onfocus"
+
+let onkeypress mods rune =
+ print_endline "onkeypress"
+
+let onmousebtn mods btn x y pressed =
+ print_endline "onmousebtn"
+
+let onmousemove mods x y =
+ print_endline "onmousemove"
+
+let onupdate width height =
+ print_endline "onupdate"
+
+let onshutdown =
+ print_endline "onshutdown"
+
+let onevent = function
+ | Focus state -> onfocus state
+ | KeyPress e -> onkeypress e.mods e.rune
+ | MouseClick e -> onmousebtn e.mods e.btn e.x e.y true
+ | MouseRelease e -> onmousebtn e.mods e.btn e.x e.y false
+ | MouseMove e -> onmousedrag e.mods e.x e.y
+ | Paste e -> print_endline "paste"
+ | Command e -> print_endline "command"
+ | PipeClosed e -> print_endline "pipeclosed"
+ | PipeWriteReady e -> print_endline "pipewriteready"
+ | PipeReadReady e -> print_endline "pipereadready"
+ | Update e -> onupdate e.width e.height
+ | Shutdown -> print_endline "shutdown"
let () =
let win = make_window 640 480 in
show_window win true;
+ event_loop 50 onevent
+(*
event_loop 50 (function
| Focus state -> onfocus state
| KeyPress e -> onkeypress e.mods e.rune
| Update e -> onupdate e.width e.height
| Shutdown -> onshutdown
)
-
+*)
(*
let server = Tide.start_server () in
let nargs = Array.length Sys.argv in
| KeyPress of { mods: int; rune: int }
| MouseClick of { mods: int; btn: int; x: int; y: int }
| MouseRelease of { mods: int; btn: int; x: int; y: int }
- | MouseDrag of { mods: int; x: int; y: int }
+ | MouseMove of { mods: int; x: int; y: int }
| Paste of { text: string }
| Command of { commands: string array }
| PipeClosed of { fd: int }
TKeyPress,
TMouseClick,
TMouseRelease,
- TMouseDrag,
+ TMouseMove,
TPaste,
TCommand,
TPipeClosed,
XTimeCoord* coords = XGetMotionEvents(X.display, X.self, CurrentTime, CurrentTime, &nevents);
if (coords) XFree(coords);
+ /* Update the mouse posistion and simulate a mosuemove event for it */
+ // XQueryPointer
+ //caml_callback(cbfn, mkrecord(TMouseMove, 3, mods, x, y));
+
/* now take the events, convert them, and call the callback */
for (XEvent e; XPending(X.display);) {
XNextEvent(X.display, &e);
if (XFilterEvent(&e, None)) continue;
if (!EventHandlers[e.type]) continue;
event = EventHandlers[e.type](&e);
- if (event != Val_unit)
+ if (event != Val_unit) {
+ puts("B event");
+ printf("event: %#x\n", event);
caml_callback(cbfn, event);
+ puts("A event");
+ }
}
if (X.running) {
+ puts("B event");
caml_callback(cbfn, mkrecord(TUpdate, 2, X.width, X.height));
+ puts("A event");
XCopyArea(X.display, X.pixmap, X.self, X.gc, 0, 0, X.width, X.height, 0, 0);
}
}
}
static value ev_clientmsg(XEvent* e) {
- value event = Val_unit;
Atom wmDeleteMessage = XInternAtom(X.display, "WM_DELETE_WINDOW", False);
if (e->xclient.data.l[0] == wmDeleteMessage)
- event = mkrecord(TShutdown, 0);
- return event;
+ return mkrecord(TShutdown, 1, 0);
+ return Val_unit;
}
static value ev_configure(XEvent* e) {