mirror of
https://github.com/netsurf-browser/netsurf
synced 2025-03-30 19:02:52 +03:00
Reposition caret when browser window reformatted
svn path=/trunk/netsurf/; revision=2839
This commit is contained in:
parent
8405d18361
commit
5295d21743
@ -122,10 +122,11 @@ struct browser_window *browser_window_create(const char *url, struct browser_win
|
||||
bw->gesturer = NULL;
|
||||
else
|
||||
bw->gesturer = gesturer_clone(clone->gesturer);
|
||||
bw->sel = selection_create(bw);
|
||||
bw->sel = selection_create(bw);
|
||||
bw->throbbing = false;
|
||||
bw->caret_callback = NULL;
|
||||
bw->paste_callback = NULL;
|
||||
bw->move_callback = NULL;
|
||||
bw->frag_id = NULL;
|
||||
bw->drag_type = DRAGGING_NONE;
|
||||
bw->scrolling_box = NULL;
|
||||
@ -327,6 +328,7 @@ void browser_window_callback(content_msg msg, struct content *c,
|
||||
bw->loading_content = NULL;
|
||||
bw->caret_callback = NULL;
|
||||
bw->paste_callback = NULL;
|
||||
bw->move_callback = NULL;
|
||||
bw->scrolling_box = NULL;
|
||||
gui_window_new_content(bw->window);
|
||||
if (bw->frag_id)
|
||||
@ -392,6 +394,7 @@ void browser_window_callback(content_msg msg, struct content *c,
|
||||
bw->current_content = 0;
|
||||
bw->caret_callback = NULL;
|
||||
bw->paste_callback = NULL;
|
||||
bw->move_callback = NULL;
|
||||
bw->scrolling_box = NULL;
|
||||
selection_init(bw->sel, NULL);
|
||||
}
|
||||
@ -422,6 +425,8 @@ void browser_window_callback(content_msg msg, struct content *c,
|
||||
/* box tree may have changed, need to relabel */
|
||||
selection_reinit(bw->sel, c->data.html.layout);
|
||||
}
|
||||
if (bw->move_callback)
|
||||
bw->move_callback(bw, bw->caret_p);
|
||||
browser_window_update(bw, false);
|
||||
break;
|
||||
|
||||
@ -442,6 +447,7 @@ void browser_window_callback(content_msg msg, struct content *c,
|
||||
bw->current_content = 0;
|
||||
bw->caret_callback = NULL;
|
||||
bw->paste_callback = NULL;
|
||||
bw->move_callback = NULL;
|
||||
bw->scrolling_box = NULL;
|
||||
selection_init(bw->sel, NULL);
|
||||
}
|
||||
@ -460,6 +466,7 @@ void browser_window_callback(content_msg msg, struct content *c,
|
||||
bw->current_content = 0;
|
||||
bw->caret_callback = NULL;
|
||||
bw->paste_callback = NULL;
|
||||
bw->move_callback = NULL;
|
||||
bw->scrolling_box = NULL;
|
||||
selection_init(bw->sel, NULL);
|
||||
}
|
||||
@ -1138,8 +1145,9 @@ void browser_window_mouse_action_html(struct browser_window *bw,
|
||||
if (selection_click(bw->sel, mouse, text_box->byte_offset + idx)) {
|
||||
/* key presses must be directed at the main browser
|
||||
* window, paste text operations ignored */
|
||||
if (bw->caret_callback) bw->caret_callback = NULL;
|
||||
if (bw->paste_callback) bw->paste_callback = NULL;
|
||||
bw->caret_callback = NULL;
|
||||
bw->paste_callback = NULL;
|
||||
bw->move_callback = NULL;
|
||||
|
||||
if (selection_dragging(bw->sel)) {
|
||||
bw->drag_type = DRAGGING_SELECTION;
|
||||
|
@ -35,6 +35,8 @@ typedef void (*browser_caret_callback)(struct browser_window *bw,
|
||||
wchar_t key, void *p);
|
||||
typedef bool (*browser_paste_callback)(struct browser_window *bw,
|
||||
const char *utf8, unsigned utf8_len, bool last, void *p);
|
||||
typedef void (*browser_move_callback)(struct browser_window *bw,
|
||||
void *p);
|
||||
|
||||
/** Browser window data. */
|
||||
struct browser_window {
|
||||
@ -56,6 +58,8 @@ struct browser_window {
|
||||
browser_caret_callback caret_callback;
|
||||
/** Handler for pasting text, or 0. */
|
||||
browser_paste_callback paste_callback;
|
||||
/** Handler for repositioning caret, or 0. */
|
||||
browser_move_callback move_callback;
|
||||
|
||||
/** User parameter for caret_callback and paste_callback */
|
||||
void *caret_p;
|
||||
|
@ -45,11 +45,14 @@ static void browser_window_place_caret(struct browser_window *bw,
|
||||
int x, int y, int height,
|
||||
browser_caret_callback caret_cb,
|
||||
browser_paste_callback paste_cb,
|
||||
browser_move_callback move_cb,
|
||||
void *p);
|
||||
static bool browser_window_textarea_paste_text(struct browser_window *bw,
|
||||
const char *utf8, unsigned utf8_len, bool last, void *handle);
|
||||
static bool browser_window_input_paste_text(struct browser_window *bw,
|
||||
const char *utf8, unsigned utf8_len, bool last, void *handle);
|
||||
static void browser_window_textarea_move_caret(struct browser_window *bw, void *p);
|
||||
static void browser_window_input_move_caret(struct browser_window *bw, void *p);
|
||||
static void input_update_display(struct browser_window *bw, struct box *input,
|
||||
unsigned form_offset, unsigned box_offset, bool to_textarea,
|
||||
bool redraw);
|
||||
@ -268,6 +271,7 @@ void browser_window_textarea_click(struct browser_window *bw,
|
||||
text_box->height,
|
||||
browser_window_textarea_callback,
|
||||
browser_window_textarea_paste_text,
|
||||
browser_window_textarea_move_caret,
|
||||
textarea);
|
||||
|
||||
if (new_scroll_y != textarea->scroll_y) {
|
||||
@ -687,6 +691,7 @@ void browser_window_textarea_callback(struct browser_window *bw,
|
||||
text_box->height,
|
||||
browser_window_textarea_callback,
|
||||
browser_window_textarea_paste_text,
|
||||
browser_window_textarea_move_caret,
|
||||
textarea);
|
||||
|
||||
if (new_scroll_y != textarea->scroll_y || reflow) {
|
||||
@ -769,6 +774,7 @@ void browser_window_input_click(struct browser_window* bw,
|
||||
text_box->height,
|
||||
browser_window_input_callback,
|
||||
browser_window_input_paste_text,
|
||||
browser_window_input_move_caret,
|
||||
input);
|
||||
|
||||
if (dx)
|
||||
@ -1072,17 +1078,20 @@ void browser_window_input_callback(struct browser_window *bw,
|
||||
* \param height Height of caret
|
||||
* \param caret_cb Callback function for keypresses
|
||||
* \param paste_cb Callback function for pasting text
|
||||
* \param move_cb Callback function for caret movement
|
||||
* \param p Callback private data pointer, passed to callback function
|
||||
*/
|
||||
void browser_window_place_caret(struct browser_window *bw,
|
||||
int x, int y, int height,
|
||||
browser_caret_callback caret_cb,
|
||||
browser_paste_callback paste_cb,
|
||||
browser_move_callback move_cb,
|
||||
void *p)
|
||||
{
|
||||
gui_window_place_caret(bw->window, x, y, height);
|
||||
bw->caret_callback = caret_cb;
|
||||
bw->paste_callback = paste_cb;
|
||||
bw->move_callback = move_cb;
|
||||
bw->caret_p = p;
|
||||
}
|
||||
|
||||
@ -1239,6 +1248,7 @@ bool browser_window_textarea_paste_text(struct browser_window *bw,
|
||||
text_box->height,
|
||||
browser_window_textarea_callback,
|
||||
browser_window_textarea_paste_text,
|
||||
browser_window_textarea_move_caret,
|
||||
textarea);
|
||||
|
||||
textarea->gadget->caret_pixel_offset = pixel_offset;
|
||||
@ -1355,6 +1365,75 @@ bool browser_window_input_paste_text(struct browser_window *bw,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Move caret to new position after reformatting
|
||||
*
|
||||
* \param bw browser window
|
||||
* \param p pointer textarea box
|
||||
* \return none
|
||||
*/
|
||||
|
||||
void browser_window_textarea_move_caret(struct browser_window *bw, void *p)
|
||||
{
|
||||
struct box *textarea = p;
|
||||
struct box *inline_container = textarea->gadget->caret_inline_container;
|
||||
struct box *text_box = textarea->gadget->caret_text_box;
|
||||
size_t char_offset = textarea->gadget->caret_box_offset;
|
||||
int pixel_offset;
|
||||
int box_x, box_y;
|
||||
|
||||
box_coords(textarea, &box_x, &box_y);
|
||||
box_x -= textarea->scroll_x;
|
||||
box_y -= textarea->scroll_y;
|
||||
|
||||
nsfont_width(text_box->style, text_box->text,
|
||||
char_offset, &pixel_offset);
|
||||
|
||||
browser_window_place_caret(bw,
|
||||
box_x + inline_container->x + text_box->x +
|
||||
pixel_offset,
|
||||
box_y + inline_container->y + text_box->y,
|
||||
text_box->height,
|
||||
browser_window_textarea_callback,
|
||||
browser_window_textarea_paste_text,
|
||||
browser_window_textarea_move_caret,
|
||||
textarea);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Move caret to new position after reformatting
|
||||
*
|
||||
* \param bw browser window
|
||||
* \param p pointer to text input box
|
||||
* \return none
|
||||
*/
|
||||
|
||||
void browser_window_input_move_caret(struct browser_window *bw, void *p)
|
||||
{
|
||||
struct box *input = (struct box *)p;
|
||||
struct box *text_box = input->children->children;
|
||||
unsigned int box_offset = input->gadget->caret_box_offset;
|
||||
int pixel_offset;
|
||||
int box_x, box_y;
|
||||
|
||||
box_coords(input, &box_x, &box_y);
|
||||
|
||||
nsfont_width(text_box->style, text_box->text, box_offset,
|
||||
&pixel_offset);
|
||||
|
||||
browser_window_place_caret(bw,
|
||||
box_x + input->children->x +
|
||||
text_box->x + pixel_offset,
|
||||
box_y + input->children->y + text_box->y,
|
||||
text_box->height,
|
||||
browser_window_input_callback,
|
||||
browser_window_input_paste_text,
|
||||
browser_window_input_move_caret,
|
||||
input);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update display to reflect modified input field
|
||||
*
|
||||
@ -1413,6 +1492,8 @@ void input_update_display(struct browser_window *bw, struct box *input,
|
||||
: browser_window_input_callback,
|
||||
to_textarea ? browser_window_textarea_paste_text
|
||||
: browser_window_input_paste_text,
|
||||
to_textarea ? browser_window_textarea_move_caret
|
||||
: browser_window_input_move_caret,
|
||||
input);
|
||||
|
||||
if (dx || redraw)
|
||||
|
Loading…
x
Reference in New Issue
Block a user