diff --git a/content/handlers/html/html.c b/content/handlers/html/html.c
index a133d15a9..5b74e42da 100644
--- a/content/handlers/html/html.c
+++ b/content/handlers/html/html.c
@@ -493,7 +493,7 @@ html_create_html_data(html_content *c, const http_parameter *params)
return NSERROR_NOMEM;
}
- selection_prepare(&c->sel, (struct content *)c);
+ c->sel = selection_create((struct content *)c);
nerror = http_parameter_list_find_item(params, corestring_lwc_charset, &charset);
if (nerror == NSERROR_OK) {
@@ -1056,7 +1056,7 @@ static void html_reformat(struct content *c, int width, int height)
if (c->height < layout->y + layout->descendant_y1)
c->height = layout->y + layout->descendant_y1;
- selection_reinit(&htmlc->sel);
+ selection_reinit(htmlc->sel);
htmlc->reflowing = false;
htmlc->had_initial_layout = true;
@@ -1184,6 +1184,8 @@ static void html_destroy(struct content *c)
}
}
+ selection_destroy(html->sel);
+
/* Destroy forms */
for (f = html->forms; f != NULL; f = g) {
g = f->prev;
@@ -1304,7 +1306,7 @@ html_open(struct content *c,
html->drag_owner.no_owner = true;
/* text selection */
- selection_init(&html->sel);
+ selection_init(html->sel);
html->selection_type = HTML_SELECTION_NONE;
html->selection_owner.none = true;
@@ -1323,7 +1325,7 @@ static nserror html_close(struct content *c)
html_content *htmlc = (html_content *) c;
nserror ret = NSERROR_OK;
- selection_clear(&htmlc->sel, false);
+ selection_clear(htmlc->sel, false);
/* clear the html content reference to the browser window */
htmlc->bw = NULL;
@@ -1359,7 +1361,7 @@ static void html_clear_selection(struct content *c)
break;
case HTML_SELECTION_SELF:
assert(html->selection_owner.none == false);
- selection_clear(&html->sel, true);
+ selection_clear(html->sel, true);
break;
case HTML_SELECTION_CONTENT:
content_clear_selection(html->selection_owner.content->object);
@@ -1388,7 +1390,7 @@ static char *html_get_selection(struct content *c)
gadget->data.text.ta);
case HTML_SELECTION_SELF:
assert(html->selection_owner.none == false);
- return selection_get_copy(&html->sel);
+ return selection_get_copy(html->sel);
case HTML_SELECTION_CONTENT:
return content_get_selection(
html->selection_owner.content->object);
diff --git a/content/handlers/html/interaction.c b/content/handlers/html/interaction.c
index 79846ae6a..421535c69 100644
--- a/content/handlers/html/interaction.c
+++ b/content/handlers/html/interaction.c
@@ -401,14 +401,14 @@ mouse_action_drag_selection(html_content *html,
if (!mouse) {
/* End of selection drag */
- if (selection_dragging_start(&html->sel)) {
+ if (selection_dragging_start(html->sel)) {
dir = 1;
}
idx = html_selection_drag_end(html, mouse, x, y, dir);
if (idx != 0) {
- selection_track(&html->sel, mouse, idx);
+ selection_track(html->sel, mouse, idx);
}
drag_owner.no_owner = true;
@@ -417,7 +417,7 @@ mouse_action_drag_selection(html_content *html,
return NSERROR_OK;
}
- if (selection_dragging_start(&html->sel)) {
+ if (selection_dragging_start(html->sel)) {
dir = 1;
}
@@ -432,7 +432,7 @@ mouse_action_drag_selection(html_content *html,
&idx,
&pixel_offset);
- selection_track(&html->sel, mouse, box->byte_offset + idx);
+ selection_track(html->sel, mouse, box->byte_offset + idx);
}
return NSERROR_OK;
}
@@ -1219,7 +1219,7 @@ default_mouse_action(html_content *html,
&idx,
&pixel_offset);
- if (selection_click(&html->sel,
+ if (selection_click(html->sel,
html->bw,
mouse,
mas->text.box->byte_offset + idx)) {
@@ -1229,7 +1229,7 @@ default_mouse_action(html_content *html,
html_drag_type drag_type;
union html_drag_owner drag_owner;
- if (selection_dragging(&html->sel)) {
+ if (selection_dragging(html->sel)) {
drag_type = HTML_DRAG_SELECTION;
drag_owner.no_owner = true;
html_set_drag_type(html,
@@ -1244,10 +1244,10 @@ default_mouse_action(html_content *html,
} else if (mouse & BROWSER_MOUSE_PRESS_1) {
sel_owner.none = true;
- selection_clear(&html->sel, true);
+ selection_clear(html->sel, true);
}
- if (selection_active(&html->sel)) {
+ if (selection_active(html->sel)) {
sel_owner.none = false;
html_set_selection(html,
HTML_SELECTION_SELF,
@@ -1518,7 +1518,7 @@ html_mouse_action(struct content *c,
bool html_keypress(struct content *c, uint32_t key)
{
html_content *html = (html_content *) c;
- struct selection *sel = &html->sel;
+ struct selection *sel = html->sel;
/** \todo
* At the moment, the front end interface for keypress only gives
@@ -1763,7 +1763,7 @@ void html_set_selection(html_content *html, html_selection_type selection_type,
case HTML_SELECTION_SELF:
if (same_type)
break;
- selection_clear(&html->sel, true);
+ selection_clear(html->sel, true);
break;
case HTML_SELECTION_TEXTAREA:
if (same_type && html->selection_owner.textarea ==
diff --git a/content/handlers/html/private.h b/content/handlers/html/private.h
index 43b0e84f2..2bd9cff9d 100644
--- a/content/handlers/html/private.h
+++ b/content/handlers/html/private.h
@@ -28,13 +28,13 @@
#include "netsurf/types.h"
#include "content/content_protected.h"
-#include "desktop/selection.h"
#include "content/handlers/css/utils.h"
struct gui_layout_table;
struct scrollbar_msg_data;
struct content_redraw_data;
+struct selection;
typedef enum {
HTML_DRAG_NONE, /** No drag */
@@ -203,7 +203,7 @@ typedef struct html_content {
union html_focus_owner focus_owner;
/** HTML content's own text selection object */
- struct selection sel;
+ struct selection *sel;
/**
* Open core-handled form SELECT menu, or NULL if none
diff --git a/content/handlers/html/redraw.c b/content/handlers/html/redraw.c
index 08a284b57..9807512b9 100644
--- a/content/handlers/html/redraw.c
+++ b/content/handlers/html/redraw.c
@@ -1148,7 +1148,7 @@ static bool html_redraw_text_box(const html_content *html, struct box *box,
scale,
excluded,
(struct content *)html,
- &html->sel,
+ html->sel,
ctx))
return false;
diff --git a/content/handlers/text/textplain.c b/content/handlers/text/textplain.c
index 8bc05e6d0..c72846998 100644
--- a/content/handlers/text/textplain.c
+++ b/content/handlers/text/textplain.c
@@ -69,7 +69,7 @@ typedef struct textplain_content {
int formatted_width;
struct browser_window *bw;
- struct selection sel; /** Selection state */
+ struct selection *sel; /** Selection state */
} textplain_content;
@@ -168,8 +168,7 @@ textplain_create_internal(textplain_content *c, lwc_string *encoding)
c->physical_line_count = 0;
c->formatted_width = 0;
c->bw = NULL;
-
- selection_prepare(&c->sel, (struct content *)c);
+ c->sel = selection_create((struct content *)c);
return NSERROR_OK;
@@ -538,6 +537,10 @@ static void textplain_destroy(struct content *c)
if (text->utf8_data != NULL) {
free(text->utf8_data);
}
+
+ if (text->sel != NULL) {
+ selection_destroy(text->sel);
+ }
}
@@ -707,9 +710,9 @@ textplain_mouse_action(struct content *c,
browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
idx = textplain_offset_from_coords(c, x, y, dir);
- if (selection_click(&text->sel, text->bw, mouse, idx)) {
+ if (selection_click(text->sel, text->bw, mouse, idx)) {
- if (selection_dragging(&text->sel)) {
+ if (selection_dragging(text->sel)) {
browser_window_set_drag_type(bw,
DRAGGING_SELECTION, NULL);
status = messages_get("Selecting");
@@ -753,11 +756,11 @@ textplain_mouse_track(struct content *c,
int dir = -1;
size_t idx;
- if (selection_dragging_start(&text->sel))
+ if (selection_dragging_start(text->sel))
dir = 1;
idx = textplain_offset_from_coords(c, x, y, dir);
- selection_track(&text->sel, mouse, idx);
+ selection_track(text->sel, mouse, idx);
browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
}
@@ -768,10 +771,10 @@ textplain_mouse_track(struct content *c,
int dir = -1;
size_t idx;
- if (selection_dragging_start(&text->sel)) dir = 1;
+ if (selection_dragging_start(text->sel)) dir = 1;
idx = textplain_offset_from_coords(c, x, y, dir);
- selection_track(&text->sel, mouse, idx);
+ selection_track(text->sel, mouse, idx);
}
break;
@@ -794,7 +797,7 @@ textplain_mouse_track(struct content *c,
static bool textplain_keypress(struct content *c, uint32_t key)
{
textplain_content *text = (textplain_content *) c;
- struct selection *sel = &text->sel;
+ struct selection *sel = text->sel;
switch (key) {
case NS_KEY_COPY_SELECTION:
@@ -1129,7 +1132,7 @@ textplain_redraw(struct content *c,
line_height,
data->scale,
text,
- &text->sel,
+ text->sel,
ctx)) {
return false;
}
@@ -1156,7 +1159,7 @@ textplain_redraw(struct content *c,
if (bw) {
unsigned tab_ofst = line[lineno].start + next_offset;
- struct selection *sel = &text->sel;
+ struct selection *sel = text->sel;
bool highlighted = false;
unsigned start_idx, end_idx;
@@ -1220,7 +1223,7 @@ textplain_open(struct content *c,
text->bw = bw;
/* text selection */
- selection_init(&text->sel);
+ selection_init(text->sel);
return NSERROR_OK;
}
@@ -1246,7 +1249,7 @@ static char *textplain_get_selection(struct content *c)
{
textplain_content *text = (textplain_content *) c;
- return selection_get_copy(&text->sel);
+ return selection_get_copy(text->sel);
}
diff --git a/content/textsearch.c b/content/textsearch.c
index 18f9073dc..802832089 100644
--- a/content/textsearch.c
+++ b/content/textsearch.c
@@ -180,6 +180,7 @@ static void search_show_all(bool all, struct textsearch_context *context)
a->sel = selection_create(context->c);
if (a->sel != NULL) {
+ selection_init(a->sel);
selection_set_position(a->sel,
a->start_idx,
a->end_idx);
diff --git a/desktop/selection.c b/desktop/selection.c
index 06cfdae8f..4d3d335ef 100644
--- a/desktop/selection.c
+++ b/desktop/selection.c
@@ -45,6 +45,26 @@ struct selection_string {
};
+typedef enum {
+ DRAG_NONE,
+ DRAG_START,
+ DRAG_END
+} seln_drag_state;
+
+struct selection {
+ struct content *c;
+ struct box *root;
+
+ unsigned max_idx; /* total bytes in text representation */
+
+ unsigned start_idx; /* offset in bytes within text representation */
+ unsigned end_idx;
+
+ bool defined;
+
+ seln_drag_state drag_state;
+};
+
/**
* Redraws the given range of text.
*
@@ -236,7 +256,6 @@ struct selection *selection_create(struct content *c)
sel = calloc(1, sizeof(struct selection));
if (sel) {
selection_prepare(sel, c);
- selection_init(sel);
}
return sel;
diff --git a/desktop/selection.h b/desktop/selection.h
index 86ff395a1..1b8d91c08 100644
--- a/desktop/selection.h
+++ b/desktop/selection.h
@@ -30,26 +30,8 @@ struct box;
struct browser_window;
struct plot_font_style;
struct selection_string;
-
-typedef enum {
- DRAG_NONE,
- DRAG_START,
- DRAG_END
-} seln_drag_state;
-
-struct selection {
- struct content *c;
- struct box *root;
-
- unsigned max_idx; /* total bytes in text representation */
-
- unsigned start_idx; /* offset in bytes within text representation */
- unsigned end_idx;
-
- bool defined;
-
- seln_drag_state drag_state;
-};
+struct selection;
+struct content;
/**
* determine if a selecion is active