From 5295d21743fd0a1c968f6c53125fe61101b155a4 Mon Sep 17 00:00:00 2001 From: Adrian Lees Date: Sun, 13 Aug 2006 03:05:55 +0000 Subject: Reposition caret when browser window reformatted svn path=/trunk/netsurf/; revision=2839 --- desktop/browser.c | 14 +++++++-- desktop/browser.h | 4 +++ desktop/textinput.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 3 deletions(-) (limited to 'desktop') diff --git a/desktop/browser.c b/desktop/browser.c index 9a983d644..ba78f272a 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -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; diff --git a/desktop/browser.h b/desktop/browser.h index 7bc985a40..cb7246e91 100644 --- a/desktop/browser.h +++ b/desktop/browser.h @@ -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; diff --git a/desktop/textinput.c b/desktop/textinput.c index 32d36d9dc..0aaaa3d65 100644 --- a/desktop/textinput.c +++ b/desktop/textinput.c @@ -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) -- cgit v1.2.3