diff --git a/content/handlers/html/interaction.c b/content/handlers/html/interaction.c index 0a963dd54..79846ae6a 100644 --- a/content/handlers/html/interaction.c +++ b/content/handlers/html/interaction.c @@ -1247,7 +1247,7 @@ default_mouse_action(html_content *html, selection_clear(&html->sel, true); } - if (selection_defined(&html->sel)) { + if (selection_active(&html->sel)) { sel_owner.none = false; html_set_selection(html, HTML_SELECTION_SELF, @@ -1586,13 +1586,8 @@ bool html_keypress(struct content *c, uint32_t key) return true; case NS_KEY_ESCAPE: - if (selection_defined(sel)) { - selection_clear(sel, true); - return true; - } - /* if there's no selection, leave Escape for the caller */ - return false; + return selection_clear(sel, true); } return false; diff --git a/content/handlers/html/redraw.c b/content/handlers/html/redraw.c index 7c96c908a..08a284b57 100644 --- a/content/handlers/html/redraw.c +++ b/content/handlers/html/redraw.c @@ -184,8 +184,7 @@ text_redraw(const char *utf8_text, unsigned end_idx; /* first try the browser window's current selection */ - if (selection_defined(sel) && - selection_highlighted(sel, + if (selection_highlighted(sel, offset, offset + len, &start_idx, diff --git a/content/handlers/text/textplain.c b/content/handlers/text/textplain.c index 6f034669a..8bc05e6d0 100644 --- a/content/handlers/text/textplain.c +++ b/content/handlers/text/textplain.c @@ -810,21 +810,14 @@ static bool textplain_keypress(struct content *c, uint32_t key) return true; case NS_KEY_ESCAPE: - if (selection_defined(sel)) { - selection_clear(sel, true); - return true; - } - /* if there's no selection, leave Escape for the caller */ - return false; + return selection_clear(sel, true); } return false; } - - /** * Redraw a text string with highlighting * (for selection/search) @@ -871,8 +864,7 @@ text_draw(const char *utf8_text, unsigned end_idx; /* first try the browser window's current selection */ - if (selection_defined(sel) && - selection_highlighted(sel, + if (selection_highlighted(sel, offset, offset + len, &start_idx, @@ -1167,16 +1159,16 @@ textplain_redraw(struct content *c, struct selection *sel = &text->sel; bool highlighted = false; - if (selection_defined(sel)) { - unsigned start_idx, end_idx; - if (selection_highlighted(sel, - tab_ofst, - tab_ofst + 1, - &start_idx, - &end_idx)) - highlighted = true; + unsigned start_idx, end_idx; + if (selection_highlighted(sel, + tab_ofst, + tab_ofst + 1, + &start_idx, + &end_idx)) { + highlighted = true; } + if (!highlighted && (c->textsearch.context != NULL)) { unsigned start_idx, end_idx; @@ -1682,9 +1674,3 @@ size_t textplain_size(struct content *c) return text->utf8_data_size; } - - - - - - diff --git a/content/textsearch.c b/content/textsearch.c index 056da2bf6..18f9073dc 100644 --- a/content/textsearch.c +++ b/content/textsearch.c @@ -165,7 +165,6 @@ static void free_matches(struct textsearch_context *textsearch) static void search_show_all(bool all, struct textsearch_context *context) { struct list_entry *a; - nserror res; for (a = context->found->next; a; a = a->next) { bool add = true; @@ -628,7 +627,6 @@ content_textsearch_ishighlighted(struct textsearch_context *textsearch, for (cur = textsearch->found->next; cur != NULL; cur = cur->next) { if (cur->sel && - selection_defined(cur->sel) && selection_highlighted(cur->sel, start_offset, end_offset, diff --git a/desktop/selection.c b/desktop/selection.c index 1fac7e225..06cfdae8f 100644 --- a/desktop/selection.c +++ b/desktop/selection.c @@ -22,32 +22,17 @@ * implementation of text selection within browser windows. */ -#include -#include #include -#include -#include -#include -#include "utils/log.h" -#include "utils/utf8.h" -#include "utils/utils.h" -#include "netsurf/form.h" -#include "html/box.h" -#include "html/box_inspect.h" -#include "html/private.h" -#include "html/font.h" -#include "text/textplain.h" -#include "netsurf/browser_window.h" - -#include "netsurf/mouse.h" -#include "desktop/browser_private.h" -#include "netsurf/plotters.h" -#include "desktop/save_text.h" -#include "desktop/selection.h" #include "netsurf/clipboard.h" +#include "netsurf/browser_window.h" #include "netsurf/window.h" +#include "utils/utils.h" +#include "content/content_protected.h" + +#include "desktop/browser_private.h" #include "desktop/gui_internal.h" +#include "desktop/selection.h" struct selection_string { @@ -334,7 +319,7 @@ selection_click(struct selection *s, top = browser_window_get_root(top); - if (selection_defined(s)) { + if (s->defined) { if (idx > s->start_idx) { if (idx <= s->end_idx) { pos = 0; @@ -376,7 +361,7 @@ selection_click(struct selection *s, } else if (mouse & BROWSER_MOUSE_DRAG_2) { /* adjust selection, but only if there is one */ - if (!selection_defined(s)) { + if (!s->defined) { return false; /* ignore Adjust drags */ } @@ -396,7 +381,7 @@ selection_click(struct selection *s, } else if (mouse & BROWSER_MOUSE_CLICK_2) { /* ignore Adjust clicks when there's no selection */ - if (!selection_defined(s)) { + if (!s->defined) { return false; } @@ -521,7 +506,7 @@ bool selection_copy_to_clipboard(struct selection *s) /* exported interface documented in desktop/selection.h */ -void selection_clear(struct selection *s, bool redraw) +bool selection_clear(struct selection *s, bool redraw) { int old_start, old_end; bool was_defined; @@ -539,6 +524,8 @@ void selection_clear(struct selection *s, bool redraw) if (redraw && was_defined) { selection_redraw(s, old_start, old_end); } + + return was_defined; } @@ -569,9 +556,11 @@ selection_highlighted(const struct selection *s, unsigned *start_idx, unsigned *end_idx) { - /* caller should have checked first for efficiency */ assert(s); - assert(s->defined); + + if (!s->defined) { + return false; + } if ((end <= s->start_idx) || (start >= s->end_idx)) { @@ -583,3 +572,24 @@ selection_highlighted(const struct selection *s, return true; } + +/* exported interface documented in desktop/selection.h */ +bool selection_active(struct selection *s) +{ + return s->defined; +} + +bool selection_dragging(struct selection *s) +{ + return s->drag_state != DRAG_NONE; +} + +bool selection_dragging_start(struct selection *s) +{ + return s->drag_state == DRAG_START; +} + +void selection_drag_end(struct selection *s) +{ + s->drag_state = DRAG_NONE; +} diff --git a/desktop/selection.h b/desktop/selection.h index 4f3e8b002..86ff395a1 100644 --- a/desktop/selection.h +++ b/desktop/selection.h @@ -20,8 +20,8 @@ * Text selection within browser windows (interface). */ -#ifndef _NETSURF_DESKTOP_SELECTION_H_ -#define _NETSURF_DESKTOP_SELECTION_H_ +#ifndef NETSURF_DESKTOP_SELECTION_H_ +#define NETSURF_DESKTOP_SELECTION_H_ #include #include "netsurf/mouse.h" @@ -37,13 +37,7 @@ typedef enum { DRAG_END } seln_drag_state; - -/* this structure should be treated as opaque outside selection.c - (it's defined here to accelerate selection_defined(s) for reduced - impact on redraw code) */ - -struct selection -{ +struct selection { struct content *c; struct box *root; @@ -57,19 +51,19 @@ struct selection seln_drag_state drag_state; }; +/** + * determine if a selecion is active + */ +bool selection_active(struct selection *s); -/* bool selection_defined(struct selection *s); */ -#define selection_defined(s) ((s)->defined) +bool selection_dragging(struct selection *s); -/* bool selection_dragging(struct selection *s); */ -#define selection_dragging(s) ((s)->drag_state != DRAG_NONE) +bool selection_dragging_start(struct selection *s); -/* bool selection_dragging_start(struct selection *s); */ -#define selection_dragging_start(s) ((s)->drag_state == DRAG_START) - -/** Handles completion of a drag operation */ -/* void selection_drag_end(struct selection *s); */ -#define selection_drag_end(s) ((s)->drag_state = DRAG_NONE) +/** + * Handles completion of a drag operation + */ +void selection_drag_end(struct selection *s); /** * Creates a new selection object associated with a browser window. @@ -129,8 +123,9 @@ void selection_reinit(struct selection *s); * \param s selection object * \param redraw true iff the previously selected region of the browser * window should be redrawn + * \return true if selection was cleared false if not */ -void selection_clear(struct selection *s, bool redraw); +bool selection_clear(struct selection *s, bool redraw); /** * Selects all the text within the box subtree controlled by