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