summaryrefslogtreecommitdiff
path: root/desktop/textinput.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2011-06-14 20:00:18 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2011-06-14 20:00:18 +0000
commit53f4da342088e0fe685034d0582cbf6fa13527ae (patch)
tree063970a74db5d904993cd2cc392f5e07f211b6a4 /desktop/textinput.c
parent6ed9b1de8bb2aa5220c60fbf0b42aea78f889da1 (diff)
downloadnetsurf-53f4da342088e0fe685034d0582cbf6fa13527ae.tar.gz
netsurf-53f4da342088e0fe685034d0582cbf6fa13527ae.tar.bz2
First pass at core iframes. Currently lacking scrollbars.
svn path=/trunk/netsurf/; revision=12474
Diffstat (limited to 'desktop/textinput.c')
-rw-r--r--desktop/textinput.c53
1 files changed, 43 insertions, 10 deletions
diff --git a/desktop/textinput.c b/desktop/textinput.c
index 0a33e545c..f114067f0 100644
--- a/desktop/textinput.c
+++ b/desktop/textinput.c
@@ -1173,7 +1173,29 @@ void browser_window_place_caret(struct browser_window *bw,
browser_move_callback move_cb,
void *p)
{
- gui_window_place_caret(bw->window, x, y, height);
+ struct browser_window *root_bw;
+ int pos_x = 0;
+ int pos_y = 0;
+
+ /* Find top level browser window */
+ root_bw = bw;
+ while (root_bw && !root_bw->window && root_bw->parent) {
+ switch (root_bw->browser_window_type) {
+ default:
+ /* TODO: Frame(set)s */
+ case BROWSER_WINDOW_NORMAL:
+ break;
+ case BROWSER_WINDOW_IFRAME:
+ box_coords(root_bw->box, &pos_x, &pos_y);
+ x += pos_x;
+ y += pos_y;
+ break;
+ }
+
+ root_bw = root_bw->parent;
+ }
+
+ gui_window_place_caret(root_bw->window, x, y, height);
bw->caret_callback = caret_cb;
bw->paste_callback = paste_cb;
bw->move_callback = move_cb;
@@ -1188,7 +1210,16 @@ void browser_window_place_caret(struct browser_window *bw,
*/
void browser_window_remove_caret(struct browser_window *bw)
{
- gui_window_remove_caret(bw->window);
+ struct browser_window *root_bw;
+
+ /* Find top level browser window */
+ root_bw = bw;
+ while (root_bw && !root_bw->window && root_bw->parent) {
+ root_bw = root_bw->parent;
+ }
+
+ gui_window_remove_caret(root_bw->window);
+
bw->caret_callback = NULL;
bw->paste_callback = NULL;
bw->move_callback = NULL;
@@ -1245,29 +1276,31 @@ size_t get_form_offset(struct box* input, struct box* text_box,
/**
* Handle key presses in a browser window.
*
- * \param bw The browser window with input focus
+ * \param bw The root browser window
* \param key The UCS4 character codepoint
* \return true if key handled, false otherwise
*/
bool browser_window_key_press(struct browser_window *bw, uint32_t key)
{
+ struct browser_window *focus = bw->focus;
+
/* keys that take effect wherever the caret is positioned */
switch (key) {
case KEY_SELECT_ALL:
- selection_select_all(bw->sel);
+ selection_select_all(focus->sel);
return true;
case KEY_COPY_SELECTION:
- gui_copy_to_clipboard(bw->sel);
+ gui_copy_to_clipboard(focus->sel);
return true;
case KEY_CLEAR_SELECTION:
- selection_clear(bw->sel, true);
+ selection_clear(focus->sel, true);
return true;
case KEY_ESCAPE:
- if (selection_defined(bw->sel)) {
- selection_clear(bw->sel, true);
+ if (selection_defined(focus->sel)) {
+ selection_clear(focus->sel, true);
return true;
}
/* if there's no selection,
@@ -1276,10 +1309,10 @@ bool browser_window_key_press(struct browser_window *bw, uint32_t key)
}
/* pass on to the appropriate field */
- if (!bw->caret_callback)
+ if (!focus->caret_callback)
return false;
- return bw->caret_callback(bw, key, bw->caret_p);
+ return focus->caret_callback(focus, key, focus->caret_p);
}