From 0e4f732c78bc55d74db13281d2c510be5db6fa35 Mon Sep 17 00:00:00 2001 From: malc Date: Tue, 27 Jul 2010 21:15:14 +0400 Subject: [PATCH] Elliminate checklink in favour of getlink This also removes a nasty deadlock case --- link.c | 30 ++---------------------------- main.ml | 56 +++++++++++++++++++++++--------------------------------- 2 files changed, 25 insertions(+), 61 deletions(-) diff --git a/link.c b/link.c index af0f308..dad77f1 100644 --- a/link.c +++ b/link.c @@ -1236,28 +1236,6 @@ CAMLprim value ml_highlightlinks (value ptr_v, value yoff_v) CAMLreturn (Val_unit); } -CAMLprim value ml_checklink (value ptr_v, value x_v, value y_v) -{ - CAMLparam3 (ptr_v, x_v, y_v); - char *s = String_val (ptr_v); - int ret = 0; - - if (!trylock ("ml_checklink")) { - pdf_link *link; - - link = getlink (parse_pointer ("ml_checklink", s), - Int_val (x_v), Int_val (y_v)); - if (link) { - ret = 1; - if (link->kind == PDF_LURI) { - printd (state.sock, "T %s", fz_tostrbuf (link->dest)); - } - } - unlock ("ml_checklink"); - } - CAMLreturn (Val_bool (ret)); -} - CAMLprim value ml_getlink (value ptr_v, value x_v, value y_v) { CAMLparam3 (ptr_v, x_v, y_v); @@ -1311,12 +1289,8 @@ CAMLprim value ml_getlink (value ptr_v, value x_v, value y_v) break; case PDF_LURI: - printf ("%s\n", fz_tostrbuf (link->dest)); - tup_v = caml_alloc_tuple (2); - ret_v = caml_alloc_small (1, 1); - Field (tup_v, 0) = Val_int (-1); - Field (tup_v, 1) = Val_int (0); - Field (ret_v, 0) = tup_v; + ret_v = caml_alloc_small (1, 0); + Field (ret_v, 0) = caml_copy_string (fz_tostrbuf (link->dest)); break; default: diff --git a/main.ml b/main.ml index c343398..6e9e69a 100644 --- a/main.ml +++ b/main.ml @@ -1,3 +1,5 @@ +type link = | LNone | LUri of string | LGoto of (int * int);; + let log fmt = Printf.kprintf prerr_endline fmt;; let dolog fmt = Printf.kprintf prerr_endline fmt;; @@ -5,8 +7,7 @@ external init : Unix.file_descr -> unit = "ml_init";; external draw : int -> int -> int -> int -> string -> unit = "ml_draw";; external gettext : string -> (int * int * int * int) -> int -> bool -> unit = "ml_gettext";; -external checklink : string -> int -> int -> bool = "ml_checklink";; -external getlink : string -> int -> int -> (int * int) option = "ml_getlink";; +external getlink : string -> int -> int -> link = "ml_getlink";; external highlightlinks : string -> int -> unit = "ml_highlightlinks";; external getpagewh : int -> float array = "ml_getpagewh";; @@ -1547,35 +1548,21 @@ let getlink x y = if y > 0 then let y = l.pagey + y in - match getlink opaque x y with - | None -> f rest - | some -> some - else - f rest - | _ -> - f rest - end - | [] -> None - in - f state.layout -;; - -let checklink x y = - let rec f = function - | l :: rest -> - begin match getopaque l.pageno with - | Some opaque when validopaque opaque -> - let y = y - l.pagedispy in - if y > 0 - then - let y = l.pagey + y in - if checklink opaque x y then true else f rest + let link = getlink opaque x y in + match link with + | LNone -> f rest + | LUri text -> + state.text <- text; + link + | LGoto (pageno, y) -> + state.text <- Printf.sprintf "Page %d (y %d)" pageno y; + link else f rest | _ -> f rest end - | [] -> false + | [] -> LNone in f state.layout ;; @@ -1595,14 +1582,17 @@ let mouse ~button ~bstate ~x ~y = gotoy y | Glut.LEFT_BUTTON when state.outline = None -> - let dest = if bstate = Glut.DOWN then getlink x y else None in + let dest = if bstate = Glut.DOWN then getlink x y else LNone in begin match dest with - | Some (pageno, top) -> + | LGoto (pageno, top) -> if pageno >= 0 then gotopage pageno top - | None -> + | LUri s -> + print_endline s + + | LNone -> if bstate = Glut.DOWN then ( Glut.setCursor Glut.CURSOR_CROSSHAIR; @@ -1634,11 +1624,11 @@ let pmotion ~x ~y = if state.outline = None then match state.mstate with - | Mnone when (checklink x y) -> - Glut.setCursor Glut.CURSOR_INFO - | Mnone -> - Glut.setCursor Glut.CURSOR_INHERIT + if getlink x y != LNone + then Glut.setCursor Glut.CURSOR_INFO + else (state.text <- ""; Glut.setCursor Glut.CURSOR_INHERIT); + Glut.postRedisplay () | Msel (a, _) -> () -- 2.11.4.GIT