Reposition caret when browser window reformatted

svn path=/trunk/netsurf/; revision=2839
This commit is contained in:
Adrian Lees 2006-08-13 03:05:55 +00:00
parent 8405d18361
commit 5295d21743
3 changed files with 96 additions and 3 deletions

View File

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

View File

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

View File

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