let onupdate width height =
print_endline "onupdate"
-let onshutdown =
+let onshutdown () =
print_endline "onshutdown"
let onevent = function
| PipeWriteReady e -> print_endline "pipewriteready"
| PipeReadReady e -> print_endline "pipereadready"
| Update e -> onupdate e.width e.height
- | Shutdown -> print_endline "shutdown"
+ | Shutdown -> onshutdown ()
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
- | MouseClick e -> onmousebtn e.mods e.btn e.x e.y true
- | MouseRelease e -> onmousebtn e.mods e.btn e.x e.y false
- | MouseDrag 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 -> onshutdown
- )
-*)
+
(*
let server = Tide.start_server () in
let nargs = Array.length Sys.argv in
Each group's tags increment, starting at 0, in the order the appear in the
type definition */
enum {
- TShutdown = 0,
TFocus = 0,
TKeyPress,
TMouseClick,
TPipeClosed,
TPipeWriteReady,
TPipeReadReady,
- TUpdate
+ TUpdate,
+ TShutdown = 0,
+ TNone = -1
};
enum Keys {
XEvent e; XPeekEvent(X.display, &e);
bool pending = false; //pollfds(Int_val(ms), cbfn);
int nevents = XEventsQueued(X.display, QueuedAfterFlush);
+
+ /* Update the mouse posistion and simulate a mosuemove event for it */
+ //Window xw; int _, x, y; unsigned int mods;
+ //XQueryPointer(X.display, X.self, &xw, &xw, &_, &_, &x, &y, &mods);
+ //caml_callback(cbfn, mkrecord(TMouseMove, 3, mods, x, y));
+
if (pending || nevents) {
/* pare down irrelevant mouse drag events to just the latest */
- XTimeCoord* coords = XGetMotionEvents(X.display, X.self, CurrentTime, CurrentTime, &nevents);
+ 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_int(TNone))
caml_callback(cbfn, event);
}
}
static value ev_selclear(XEvent* e) {
- return Val_unit;
+ return Val_int(TNone);
}
static value ev_selnotify(XEvent* e) {
- value event = Val_unit;
+ value event = Val_int(TNone);
if (e->xselection.property == None) {
char* propdata = readprop(X.self, e->xselection.selection);
event = mkrecord(TPaste, 1, caml_copy_string(propdata));
}
static value ev_selrequest(XEvent* e) {
- return Val_unit;
+ return Val_int(TNone);
}
static value ev_propnotify(XEvent* e) {
- return Val_unit;
+ return Val_int(TNone);
}
static value ev_clientmsg(XEvent* e) {
Atom wmDeleteMessage = XInternAtom(X.display, "WM_DELETE_WINDOW", False);
if (e->xclient.data.l[0] == wmDeleteMessage)
return mkrecord(TShutdown, 0);
- return Val_unit;
+ return Val_int(TNone);
}
static value ev_configure(XEvent* e) {
- value event = Val_unit;
+ value event = Val_int(TNone);
if (e->xconfigure.width != X.width || e->xconfigure.height != X.height) {
X.width = e->xconfigure.width;
X.height = e->xconfigure.height;