summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorAdrian Lees <adrian@aemulor.com>2006-08-13 03:05:55 +0000
committerAdrian Lees <adrian@aemulor.com>2006-08-13 03:05:55 +0000
commit5295d21743fd0a1c968f6c53125fe61101b155a4 (patch)
tree9b97a3564f845bbaa146d923cea779ca8838853a /desktop
parent8405d183614aa8b9d9a4bcba8df1c42c19cda471 (diff)
downloadnetsurf-5295d21743fd0a1c968f6c53125fe61101b155a4.tar.gz
netsurf-5295d21743fd0a1c968f6c53125fe61101b155a4.tar.bz2
Reposition caret when browser window reformatted
svn path=/trunk/netsurf/; revision=2839
Diffstat (limited to 'desktop')
-rw-r--r--desktop/browser.c14
-rw-r--r--desktop/browser.h4
-rw-r--r--desktop/textinput.c81
3 files changed, 96 insertions, 3 deletions
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;
@@ -1356,6 +1366,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
*
* \param bw browser window
@@ -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)