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