Author: tlsa
Date: Tue Jan 10 16:02:19 2012
New Revision: 13394
URL:
http://source.netsurf-browser.org?rev=13394&view=rev
Log:
Allow drag handlers to inform browser window layer of any pointer range constraints.
Modified:
trunk/netsurf/desktop/browser.c
trunk/netsurf/desktop/browser.h
trunk/netsurf/desktop/frames.c
trunk/netsurf/render/form.c
trunk/netsurf/render/html_interaction.c
trunk/netsurf/render/textplain.c
Modified: trunk/netsurf/desktop/browser.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/desktop/browser.c?rev=133...
==============================================================================
--- trunk/netsurf/desktop/browser.c (original)
+++ trunk/netsurf/desktop/browser.c Tue Jan 10 16:02:19 2012
@@ -380,7 +380,7 @@
/* exported interface, documented in browser.h */
void browser_window_set_drag_type(struct browser_window *bw,
- browser_drag_type type)
+ browser_drag_type type, struct rect *rect)
{
struct browser_window *top_bw = browser_window_get_root(bw);
@@ -390,6 +390,9 @@
top_bw->drag_window = bw;
bw->drag_type = type;
+
+ /* TODO: inform front end that the core is handling drag,
+ * pass rect */
}
/* exported interface, documented in browser.h */
@@ -2583,7 +2586,7 @@
break;
default:
- browser_window_set_drag_type(bw, DRAGGING_NONE);
+ browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
break;
}
}
@@ -2616,7 +2619,7 @@
void browser_window_page_drag_start(struct browser_window *bw, int x, int y)
{
- browser_window_set_drag_type(bw, DRAGGING_PAGE_SCROLL);
+ browser_window_set_drag_type(bw, DRAGGING_PAGE_SCROLL, NULL);
bw->drag_start_x = x;
bw->drag_start_y = y;
Modified: trunk/netsurf/desktop/browser.h
URL:
http://source.netsurf-browser.org/trunk/netsurf/desktop/browser.h?rev=133...
==============================================================================
--- trunk/netsurf/desktop/browser.h (original)
+++ trunk/netsurf/desktop/browser.h Tue Jan 10 16:02:19 2012
@@ -413,9 +413,10 @@
*
* \param bw browser window to set the type of the current drag for
* \param type drag type
+ * \param rect area pointer may be confined to, during drag, or NULL
*/
void browser_window_set_drag_type(struct browser_window *bw,
- browser_drag_type type);
+ browser_drag_type type, struct rect *rect);
/*
* Get the root level browser window
Modified: trunk/netsurf/desktop/frames.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/desktop/frames.c?rev=1339...
==============================================================================
--- trunk/netsurf/desktop/frames.c (original)
+++ trunk/netsurf/desktop/frames.c Tue Jan 10 16:02:19 2012
@@ -75,14 +75,22 @@
}
break;
case SCROLLBAR_MSG_SCROLL_START:
+ {
+ struct rect rect = {
+ .x0 = scrollbar_data->x0,
+ .y0 = scrollbar_data->y0,
+ .x1 = scrollbar_data->x1,
+ .y1 = scrollbar_data->y1
+ };
+
if (scrollbar_is_horizontal(scrollbar_data->scrollbar))
- browser_window_set_drag_type(bw, DRAGGING_SCR_X);
+ browser_window_set_drag_type(bw, DRAGGING_SCR_X, &rect);
else
- browser_window_set_drag_type(bw, DRAGGING_SCR_Y);
-
+ browser_window_set_drag_type(bw, DRAGGING_SCR_Y, &rect);
+ }
break;
case SCROLLBAR_MSG_SCROLL_FINISHED:
- browser_window_set_drag_type(bw, DRAGGING_NONE);
+ browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
browser_window_set_pointer(bw, GUI_POINTER_DEFAULT);
break;
@@ -653,7 +661,8 @@
else if (bw->drag_resize_right)
sibling = &parent->children[row * parent->cols + (col + 1)];
if (sibling)
- change |= browser_window_resolve_frame_dimension(bw, sibling, x, y, true, false);
+ change |= browser_window_resolve_frame_dimension(bw, sibling,
+ x, y, true, false);
sibling = NULL;
if (bw->drag_resize_up)
@@ -661,14 +670,16 @@
else if (bw->drag_resize_down)
sibling = &parent->children[(row + 1) * parent->cols + col];
if (sibling)
- change |= browser_window_resolve_frame_dimension(bw, sibling, x, y, false, true);
+ change |= browser_window_resolve_frame_dimension(bw, sibling,
+ x, y, false, true);
if (change)
browser_window_recalculate_frameset(parent);
}
-bool browser_window_resolve_frame_dimension(struct browser_window *bw, struct
browser_window *sibling,
+bool browser_window_resolve_frame_dimension(struct browser_window *bw,
+ struct browser_window *sibling,
int x, int y, bool width, bool height) {
int bw_dimension, sibling_dimension;
int bw_pixels, sibling_pixels;
@@ -784,8 +795,10 @@
}
-bool browser_window_resize_frames(struct browser_window *bw, browser_mouse_state mouse,
int x, int y,
- gui_pointer_shape *pointer, const char **status, bool *action) {
+bool browser_window_resize_frames(struct browser_window *bw,
+ browser_mouse_state mouse, int x, int y,
+ gui_pointer_shape *pointer, const char **status,
+ bool *action) {
struct browser_window *parent;
bool left, right, up, down;
int i, resize_margin;
@@ -871,8 +884,13 @@
} else {
*pointer = GUI_POINTER_DOWN;
}
- if (mouse & (BROWSER_MOUSE_DRAG_1 | BROWSER_MOUSE_DRAG_2)) {
- browser_window_set_drag_type(bw, DRAGGING_FRAME);
+ if (mouse & (BROWSER_MOUSE_DRAG_1 |
+ BROWSER_MOUSE_DRAG_2)) {
+
+ /* TODO: Pass appropriate rectangle to allow
+ * front end to clamp pointer range */
+ browser_window_set_drag_type(bw,
+ DRAGGING_FRAME, NULL);
bw->drag_start_x = x;
bw->drag_start_y = y;
bw->drag_resize_left = left;
@@ -880,15 +898,6 @@
bw->drag_resize_up = up;
bw->drag_resize_down = down;
- /* TODO: Tell the front end the valid pointer
- * movement range for the drag, so that
- * they can clamp pointer.
- *
- * Probably need a general function for
- * this, to be used by all core-managed
- * drag ops.
- */
-
*status = messages_get("FrameDrag");
*action = true;
}
@@ -898,14 +907,14 @@
if (bw->children) {
for (i = 0; i < (bw->cols * bw->rows); i++)
- if (browser_window_resize_frames(&bw->children[i], mouse, x, y, pointer,
status,
- action))
+ if (browser_window_resize_frames(&bw->children[i],
+ mouse, x, y, pointer, status, action))
return true;
}
if (bw->iframes) {
for (i = 0; i < bw->iframe_count; i++)
- if (browser_window_resize_frames(&bw->iframes[i], mouse, x, y, pointer,
status,
- action))
+ if (browser_window_resize_frames(&bw->iframes[i],
+ mouse, x, y, pointer, status, action))
return true;
}
return false;
Modified: trunk/netsurf/render/form.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/render/form.c?rev=13394&a...
==============================================================================
--- trunk/netsurf/render/form.c (original)
+++ trunk/netsurf/render/form.c Tue Jan 10 16:02:19 2012
@@ -1287,7 +1287,16 @@
menu->height);
break;
case SCROLLBAR_MSG_SCROLL_START:
- browser_window_set_drag_type(html->bw, DRAGGING_OTHER);
+ {
+ struct rect rect = {
+ .x0 = scrollbar_data->x0,
+ .y0 = scrollbar_data->y0,
+ .x1 = scrollbar_data->x1,
+ .y1 = scrollbar_data->y1
+ };
+
+ browser_window_set_drag_type(html->bw, DRAGGING_OTHER,
+ &rect);
menu->scroll_capture = true;
@@ -1295,6 +1304,7 @@
gui_window_box_scroll_start(root_bw->window,
scrollbar_data->x0, scrollbar_data->y0,
scrollbar_data->x1, scrollbar_data->y1);
+ }
break;
case SCROLLBAR_MSG_SCROLL_FINISHED:
menu->scroll_capture = false;
Modified: trunk/netsurf/render/html_interaction.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/render/html_interaction.c...
==============================================================================
--- trunk/netsurf/render/html_interaction.c (original)
+++ trunk/netsurf/render/html_interaction.c Tue Jan 10 16:02:19 2012
@@ -108,7 +108,7 @@
if (idx != 0)
selection_track(&html->sel, mouse, idx);
- browser_window_set_drag_type(bw, DRAGGING_NONE);
+ browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
}
switch (bw->drag_type) {
@@ -255,7 +255,7 @@
}
/* Content related drags handled by now */
- browser_window_set_drag_type(bw, DRAGGING_NONE);
+ browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
/* search the box tree for a link, imagemap, form control, or
* box with scrollbars */
@@ -849,7 +849,15 @@
html_redraw_a_box(html->bw->current_content, box);
break;
case SCROLLBAR_MSG_SCROLL_START:
- browser_window_set_drag_type(html->bw, DRAGGING_OTHER);
+ {
+ struct rect rect = {
+ .x0 = scrollbar_data->x0,
+ .y0 = scrollbar_data->y0,
+ .x1 = scrollbar_data->x1,
+ .y1 = scrollbar_data->y1
+ };
+ browser_window_set_drag_type(html->bw, DRAGGING_OTHER,
+ &rect);
html->scrollbar = scrollbar_data->scrollbar;
@@ -857,6 +865,7 @@
gui_window_box_scroll_start(root_bw->window,
scrollbar_data->x0, scrollbar_data->y0,
scrollbar_data->x1, scrollbar_data->y1);
+ }
break;
case SCROLLBAR_MSG_SCROLL_FINISHED:
html->scrollbar = NULL;
Modified: trunk/netsurf/render/textplain.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/render/textplain.c?rev=13...
==============================================================================
--- trunk/netsurf/render/textplain.c (original)
+++ trunk/netsurf/render/textplain.c Tue Jan 10 16:02:19 2012
@@ -638,7 +638,7 @@
idx = textplain_offset_from_coords(c, x, y, dir);
selection_track(&text->sel, mouse, idx);
- browser_window_set_drag_type(bw, DRAGGING_NONE);
+ browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
}
switch (bw->drag_type) {
@@ -680,7 +680,7 @@
size_t idx;
int dir = 0;
- browser_window_set_drag_type(bw, DRAGGING_NONE);
+ browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
idx = textplain_offset_from_coords(c, x, y, dir);
if (selection_click(&text->sel, mouse, idx)) {