make text selection context an opaque interface

This commit is contained in:
Vincent Sanders 2020-05-23 23:33:52 +01:00
parent 6108d210d5
commit 5ce8f0baf1
8 changed files with 61 additions and 54 deletions

View File

@ -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);

View File

@ -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 ==

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -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);

View File

@ -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;

View File

@ -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