From 0d37b9eee4791cfbf5960f1a0f9dad0cc84724aa Mon Sep 17 00:00:00 2001 From: malc Date: Mon, 13 Feb 2012 01:47:11 +0400 Subject: [PATCH] Simplify --- link.c | 83 +++++++++++++++++++++++++++-------------------------------------- main.ml | 24 +++++++++++-------- 2 files changed, 48 insertions(+), 59 deletions(-) diff --git a/link.c b/link.c index b7d764b..df3ec39 100644 --- a/link.c +++ b/link.c @@ -249,8 +249,6 @@ struct { #else pthread_t thread; #endif - FILE *selpipe; - FT_Face face; void (*closedoc) (void); @@ -2231,6 +2229,7 @@ CAMLprim value ml_copysel (value command_v, value ptr_v) CAMLparam1 (ptr_v); FILE *f; struct page *page; + fz_text_span *span; char *s = String_val (ptr_v); char *command = String_val (command_v); @@ -2238,64 +2237,50 @@ CAMLprim value ml_copysel (value command_v, value ptr_v) goto done; } - if (!*s) { - close: - if (state.selpipe) { - int ret = pclose (state.selpipe); - if (ret == -1) { - if (errno != ECHILD) { - fprintf (stderr, "failed to close sel pipe: %s\n", - strerror (errno)); - } - } - state.selpipe = NULL; - } - } - else { - fz_text_span *span; - page = parse_pointer ("ml_sopysel", s); + page = parse_pointer ("ml_sopysel", s); - if (!page->fmark.span || !page->lmark.span) { - fprintf (stderr, "nothing to copy"); - goto unlock; - } + if (!page->fmark.span || !page->lmark.span) { + fprintf (stderr, "nothing to copy"); + goto unlock; + } + f = popen (command, "w"); + if (!f) { + fprintf (stderr, "failed to open sel pipe: %s\n", + strerror (errno)); f = stdout; - if (!state.selpipe) { - state.selpipe = popen (command, "w"); - if (!state.selpipe) { - fprintf (stderr, "failed to open sel pipe: %s\n", + } + + for (span = page->fmark.span; + span && span != page->lmark.span->next; + span = span->next) { + int a = span == page->fmark.span ? page->fmark.i : 0; + int b = span == page->lmark.span ? page->lmark.i : span->len - 1; + if (pipespan (f, span, a, b)) { + goto close; + } + if (span->eol) { + if (putc ('\n', f) == EOF) { + fprintf (stderr, "failed break line on sel pipe: %s\n", strerror (errno)); - } - else { - f = state.selpipe; + goto close; } } - else { - f = state.selpipe; - } + } + page->lmark.span = NULL; + page->fmark.span = NULL; - for (span = page->fmark.span; - span && span != page->lmark.span->next; - span = span->next) { - int a = span == page->fmark.span ? page->fmark.i : 0; - int b = span == page->lmark.span ? page->lmark.i : span->len - 1; - if (pipespan (f, span, a, b)) { - goto close; - } - if (span->eol) { - if (putc ('\n', f) == EOF) { - fprintf (stderr, "failed break line on sel pipe: %s\n", - strerror (errno)); - goto close; - } + close: + if (f != stdout) { + int ret = pclose (f); + if (ret == -1) { + if (errno != ECHILD) { + fprintf (stderr, "failed to close sel pipe: %s\n", + strerror (errno)); } } - page->lmark.span = NULL; - page->fmark.span = NULL; } - unlock: unlock ("ml_copysel"); diff --git a/main.ml b/main.ml index 4db79bb..dc5ef70 100644 --- a/main.ml +++ b/main.ml @@ -4926,17 +4926,21 @@ let viewmouse button bstate x y = state.mstate <- Mnone | Msel ((_, y0), (_, y1)) -> - let f l = - if (y0 >= l.pagedispy && y0 <= (l.pagedispy + l.pagevh)) - || ((y1 >= l.pagedispy && y1 <= (l.pagedispy + l.pagevh))) - then - match getopaque l.pageno with - | Some opaque -> - copysel conf.selcmd opaque - | _ -> () + let rec loop = function + | [] -> () + | l :: rest -> + if (y0 >= l.pagedispy && y0 <= (l.pagedispy + l.pagevh)) + || ((y1 >= l.pagedispy + && y1 <= (l.pagedispy + l.pagevh))) + then + match getopaque l.pageno with + | Some opaque -> + copysel conf.selcmd opaque; + G.postRedisplay "copysel" + | _ -> () + else loop rest in - List.iter f state.layout; - copysel "" ""; (* ugly *) + loop state.layout; Glut.setCursor Glut.CURSOR_INHERIT; state.mstate <- Mnone; ) -- 2.11.4.GIT