From 8c99398bdf7b73ab8bc50a307e9faadd0353b19d Mon Sep 17 00:00:00 2001 From: malc Date: Sun, 3 Aug 2014 18:04:33 +0400 Subject: [PATCH] GLX changes --- build.ninja | 2 +- link.c | 46 +++++++++++++++++++++++----------------------- wsi.ml | 22 ++++++++++++++-------- 3 files changed, 38 insertions(+), 32 deletions(-) diff --git a/build.ninja b/build.ninja index 549ee4d..cbb3a03 100644 --- a/build.ninja +++ b/build.ninja @@ -10,7 +10,7 @@ cflags =$cflags -Wall -Werror -I$mupdf/include -I$freetype $ rule cc deps = gcc depfile = $out.d - command = $ocamlc -cc $cc -ccopt "$cflags -MMD -MF $out.d -o $out" -c $in + command = $ocamlc -cc "$cc" -ccopt "$cflags -MMD -MF $out.d -o $out" -c $in description = cc $out rule ocamlc diff --git a/link.c b/link.c index ceb6eca..eb8e61e 100644 --- a/link.c +++ b/link.c @@ -3921,25 +3921,27 @@ static struct { XVisualInfo *visual; } glx; +#ifdef SET_SWAP_INTERVAL static void UNUSED_ATTR setswapinterval (int interval) { static PFNGLXSWAPINTERVALSGIPROC swap; if (!swap) { *(void (**) ()) &swap = - glXGetProcAddress ((GLubyte *) "glXSwapIntervalSGI"); + glXGetProcAddress ((GLubyte *) "glXSwapIntervalMESA"); } if (!swap) abort (); if (swap (interval)) abort (); } +#endif -CAMLprim value ml_glxinit (value depth_v) +CAMLprim value ml_glxinit (value display_v, value depth_v) { - CAMLparam1 (depth_v); + CAMLparam2 (display_v, depth_v); int items_return; XVisualInfo template; - glx.dpy = XOpenDisplay (NULL); + glx.dpy = XOpenDisplay (String_val (display_v)); if (!glx.dpy) { caml_failwith ("XOpenDisplay"); } @@ -3973,33 +3975,41 @@ CAMLprim value ml_glxcompleteinit (value unit_v) } XFree (glx.visual); glx.visual = NULL; +#ifdef SET_SWAP_INTERVAL setswapinterval (1); +#endif CAMLreturn (Val_unit); } -CAMLprim value ml_glxcreatewin (value root_v, value parent_v) +CAMLprim value ml_glxcreatewin (value config_v) { - CAMLparam2 (root_v, parent_v); + CAMLparam1 (config_v); Window wid; XSetWindowAttributes attr; unsigned long mask; + int root = Int_val (Field (config_v, 0)); + int parent = Int_val (Field (config_v, 1)); + int x = Int_val (Field (config_v, 2)); + int y = Int_val (Field (config_v, 3)); + int w = Int_val (Field (config_v, 4)); + int h = Int_val (Field (config_v, 5)); /* window attributes */ attr.background_pixel = 0; attr.border_pixel = 0; - attr.colormap = XCreateColormap (glx.dpy, Int_val (root_v), + attr.colormap = XCreateColormap (glx.dpy, root, glx.visual->visual, AllocNone); - mask = CWBackPixel | CWBorderPixel | CWColormap; - wid = XCreateWindow (glx.dpy, Int_val (parent_v), 0, 0, 900, 900, - 0, glx.visual->depth, InputOutput, - glx.visual->visual, mask, &attr ); - XSync (glx.dpy, False); + mask = CWBackPixel | CWBorderPixel | CWColormap; + wid = XCreateWindow (glx.dpy, parent, x, y, w, h, + /*border width*/0, + glx.visual->depth, InputOutput, + glx.visual->visual, mask, &attr); + XSync (glx.dpy, True); glx.wid = wid; CAMLreturn (Val_int (wid)); } - CAMLprim value ml_swapb (value unit_v) { CAMLparam1 (unit_v); @@ -4007,16 +4017,6 @@ CAMLprim value ml_swapb (value unit_v) CAMLreturn (Val_unit); } -CAMLprim value ml_glxsync (value unit_v) -{ - CAMLparam1 (unit_v); - if (glx.dpy && glx.ctx) { - glXWaitX (); - glXWaitGL (); - } - CAMLreturn (Val_unit); -} - #include "keysym2ucs.c" CAMLprim value ml_keysymtoutf8 (value keysym_v) diff --git a/wsi.ml b/wsi.ml index dcdd79f..c9cc61d 100644 --- a/wsi.ml +++ b/wsi.ml @@ -14,10 +14,13 @@ type winstate = | Fullscreen ;; -external glxinit : int -> int = "ml_glxinit";; +type winconfig = (rootwid * parentwid * x * y * w * h) +and rootwid = wid and parentwid = wid and wid = int +and x = int and y = int and w = int and h = int;; + +external glxinit : string -> int -> int = "ml_glxinit";; external glxcompleteinit : unit -> unit = "ml_glxcompleteinit";; -external glxcreatewin : int -> int -> int = "ml_glxcreatewin";; -external glxsync : unit -> unit = "ml_glxsync";; +external glxcreatewin : winconfig -> wid = "ml_glxcreatewin";; external swapb : unit -> unit = "ml_swapb";; let vlog fmt = Format.kprintf ignore fmt;; @@ -544,7 +547,6 @@ let readresp sock = state.x state.y state.w state.h x y w h ; - glxsync (); if w != state.w || h != state.h then ( state.t#reshape w h; @@ -730,7 +732,13 @@ let setup sock screennum w h = vlog "visualid = %#x " (r32 data (pos+32)); vlog "root depth = %d" rootdepth; - let vid = glxinit 32 in + let vid = + let disp = + try Sys.getenv "DISPLAY" + with Not_found -> E.s + in + glxinit disp 32 + in let ndepths = r8 data (pos+39) in let rec finddepth n' pos = if n' = ndepths @@ -753,6 +761,7 @@ let setup sock screennum w h = let fid = state.idbase in state.fid <- fid; + let wid = glxcreatewin (root, root, 0, 0, w, h) in let mask = 0 + 0x00000001 (* KeyPress *) (* + 0x00000002 *) (* KeyRelease *) @@ -780,14 +789,11 @@ let setup sock screennum w h = (* + 0x00800000 *) (* ColormapChange *) (* + 0x01000000 *) (* OwnerGrabButton *) in - - let wid = glxcreatewin root root in let s = String.create 4 in w32 s 0 mask; let s = changewindowattributesreq wid 0x800(*event-mask*) s in sendstr s state.sock; state.wid <- wid; - mapwin (); sendintern sock "WM_PROTOCOLS" false (fun resp -> state.protoatom <- r32 resp 8; -- 2.11.4.GIT