From 7e1a303783d341a93cbae51b23bcd6753cf6aafd Mon Sep 17 00:00:00 2001 From: malc Date: Tue, 1 Dec 2015 02:30:16 +0300 Subject: [PATCH] Robustify pgoto This is ugly. --- config.ml | 14 ++++++++++++++ link.c | 18 +++++++++--------- main.ml | 32 +++++++++++++++++--------------- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/config.ml b/config.ml index 6ee7e3c..6247a0b 100644 --- a/config.ml +++ b/config.ml @@ -870,6 +870,20 @@ let getpagedim pageno = f (-1, -1, -1, -1) state.pdims ;; +let getpdimno pageno = + let rec f p l = + let np = succ p in + match l with + | (n, _, _, _) :: rest -> + if n >= pageno + then (if n = pageno then np else p) + else f np rest + + | [] -> p + in + f ~-1 state.pdims +;; + let getpagey pageno = fst (getpageyh pageno);; let getanchor1 l = diff --git a/link.c b/link.c index d98294b..c2df1be 100644 --- a/link.c +++ b/link.c @@ -1969,9 +1969,6 @@ static void * mainloop (void UNUSED_ATTR *unused) else if (!strncmp ("interrupt", p, 9)) { printd ("vmsg interrupted"); } - else if (!strncmp ("pgoto", p, 5)) { - printd ("pgoto %s", p + 6); - } else { errx (1, "unknown command %.*s", len, p); } @@ -4177,23 +4174,25 @@ CAMLprim value ml_unproject (value ptr_v, value x_v, value y_v) CAMLreturn (ret_v); } -CAMLprim value ml_project (value ptr_v, value x_v, value y_v) +CAMLprim value ml_project (value pageno_v, value pdimno_v, + value x_v, value y_v) { - CAMLparam3 (ptr_v, x_v, y_v); + CAMLparam4 (pageno_v, pdimno_v, x_v, y_v); CAMLlocal1 (ret_v); struct page *page; - char *s = String_val (ptr_v); + int pageno = Int_val (pageno_v); + int pdimno = Int_val (pdimno_v); double x = Double_val (x_v), y = Double_val (y_v); struct pagedim *pdim; fz_point p; fz_matrix ctm; - page = parse_pointer (__func__, s); - pdim = &state.pagedims[page->pdimno]; - ret_v = Val_int (0); lock (__func__); + page = loadpage (pageno, pdimno); + pdim = &state.pagedims[pdimno]; + if (pdf_specifics (state.ctx, state.doc)) { trimctm ((pdf_page *) page->fzpage, page->pdimno); ctm = state.pagedims[page->pdimno].tctm; @@ -4211,6 +4210,7 @@ CAMLprim value ml_project (value ptr_v, value x_v, value y_v) Field (ret_v, 0) = caml_copy_double (p.x); Field (ret_v, 1) = caml_copy_double (p.y); + freepage (page); unlock (__func__); CAMLreturn (ret_v); } diff --git a/main.ml b/main.ml index c8bc6e4..cedbf9c 100644 --- a/main.ml +++ b/main.ml @@ -31,7 +31,8 @@ external unmappbo : opaque -> unit = "ml_unmappbo";; external pbousable : unit -> bool = "ml_pbo_usable";; external unproject : opaque -> int -> int -> (int * int) option = "ml_unproject";; -external project : opaque -> float -> float -> (float * float) = "ml_project";; +external project : int -> int -> float -> float -> (float * float) + = "ml_project";; external drawtile : tileparams -> opaque -> unit = "ml_drawtile";; external rectofblock : opaque -> int -> int -> float array option = "ml_rectofblock";; @@ -1578,8 +1579,9 @@ let getpassword () = dolog "%s" s) passcmd; ;; -let pgoto pageno opaque x y = - let x, y = project opaque x y in +let pgoto pageno x y = + let pdimno = getpdimno pageno in + let x, y = project pageno pdimno x y in gotopagexy pageno x y; ;; @@ -1912,13 +1914,6 @@ let act cmds = if emptystr password then error "document is password protected" else opendoc state.path password - - | "pgoto" :: args :: [] -> - let (pageno, x, y) = scan args "%u %f %f" (fun n x y -> (n, x, y)) in - begin match getopaque pageno with - | Some opaque -> pgoto pageno opaque x y - | None -> impmsg "failure to get page information for %d" pageno - end; | _ -> error "unknown cmd `%S'" cmds ;; @@ -6161,11 +6156,18 @@ let ract cmds = | "pgoto" :: args :: [] -> scan args "%u %f %f" (fun pageno x y -> - match getopaque pageno with - | Some opaque -> pgoto pageno opaque x y - | None -> - gotopage pageno 0.0; - wcmd "pgoto %u %f %f" pageno x y + pgoto pageno x y; + let rec fixx = function + | [] -> () + | l :: rest -> + if l.pageno = pageno + then ( + state.x <- state.x - l.pagedispx; + gotoy state.y; + ) + else fixx rest + in + fixx state.layout ) | "activatewin" :: [] -> Wsi.activatewin () | "quit" :: [] -> raise Quit -- 2.11.4.GIT