From 90f71fe6e455f568f1b0810cda17db56ae1426f6 Mon Sep 17 00:00:00 2001 From: Miciah Dashiel Butler Masters Date: Fri, 14 Apr 2006 21:46:35 +0000 Subject: [PATCH] Highlight links as one enters link prefixes. --- src/viewer/text/link.c | 33 +++++++++++++++++++++++++++++++++ src/viewer/text/link.h | 4 ++++ src/viewer/text/view.c | 7 +++++++ 3 files changed, 44 insertions(+) diff --git a/src/viewer/text/link.c b/src/viewer/text/link.c index 3e10d6fe7..90f48809d 100644 --- a/src/viewer/text/link.c +++ b/src/viewer/text/link.c @@ -11,6 +11,7 @@ #include "bfu/listmenu.h" #include "bfu/menu.h" +#include "bfu/style.h" #include "dialogs/menu.h" #include "dialogs/status.h" #include "document/document.h" @@ -31,6 +32,7 @@ #include "terminal/screen.h" #include "terminal/tab.h" #include "terminal/terminal.h" +#include "util/box.h" #include "util/conv.h" #include "util/error.h" #include "util/memory.h" @@ -320,6 +322,37 @@ clear_link(struct terminal *term, struct document_view *doc_view) } } +void +highlight_links_with_prefixes_that_start_with_n(struct terminal *term, + struct document_view *doc_view, + int n) +{ + struct color_pair *color = get_bfu_color(term, "searched"); + int xoffset = doc_view->box.x - doc_view->vs->x; + int yoffset = doc_view->box.y - doc_view->vs->y; + struct document *document = doc_view->document; + int m; + + for (m = n + 1; n <= document->nlinks; n *= 10, m *= 10) { + int linkn; + + for (linkn = n; linkn < m; ++linkn) { + struct link *link = &document->links[linkn - 1]; + int i; + + if (linkn > document->nlinks) break; + + for (i = 0; i < link->npoints; ++i) { + int x = link->points[i].x + xoffset; + int y = link->points[i].y + yoffset; + + if (is_in_box(&doc_view->box, x, y)) + draw_char_color(term, x, y, color); + } + } + } +} + struct link * get_first_link(struct document_view *doc_view) { diff --git a/src/viewer/text/link.h b/src/viewer/text/link.h index 6014be88b..4cfc54918 100644 --- a/src/viewer/text/link.h +++ b/src/viewer/text/link.h @@ -17,6 +17,10 @@ void free_link(struct document_view *doc_view); void clear_link(struct terminal *term, struct document_view *doc_view); void draw_current_link(struct session *ses, struct document_view *doc_view); +void highlight_links_with_prefixes_that_start_with_n(struct terminal *term, + struct document_view *doc_view, + int n); + void link_menu(struct terminal *term, void *, void *ses); struct link *get_first_link(struct document_view *doc_view); diff --git a/src/viewer/text/view.c b/src/viewer/text/view.c index 24f6606d2..f135528ba 100644 --- a/src/viewer/text/view.c +++ b/src/viewer/text/view.c @@ -689,6 +689,9 @@ try_prefix_key(struct session *ses, struct document_view *doc_view, * the first time by init_session() calloc() call. * When used, it has to be reset to zero. */ + /* Clear the highlighting for the previous partial prefix. */ + if (ses->kbdprefix.repeat_count) draw_formatted(ses, 0); + ses->kbdprefix.repeat_count *= 10; ses->kbdprefix.repeat_count += digit; @@ -696,6 +699,10 @@ try_prefix_key(struct session *ses, struct document_view *doc_view, * '0' six times or more will reset the count. */ if (ses->kbdprefix.repeat_count > 99999) ses->kbdprefix.repeat_count = 0; + else if (ses->kbdprefix.repeat_count) + highlight_links_with_prefixes_that_start_with_n( + ses->tab->term, doc_view, + ses->kbdprefix.repeat_count); return FRAME_EVENT_OK; }