Allow drag handlers to inform browser window layer of any pointer range constraints.

svn path=/trunk/netsurf/; revision=13394
This commit is contained in:
Michael Drake 2012-01-10 22:02:19 +00:00
parent 411a707e3e
commit c08ee82076
6 changed files with 67 additions and 35 deletions

View File

@ -380,7 +380,7 @@ void browser_window_set_position(struct browser_window *bw, int x, int y)
/* 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 @@ void browser_window_set_drag_type(struct browser_window *bw,
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 @@ void browser_window_mouse_drag_end(struct browser_window *bw,
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_redraw_rect(struct browser_window *bw, int x, int y,
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;

View File

@ -413,9 +413,10 @@ void browser_window_set_scroll(struct browser_window *bw, int x, int y);
*
* \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

View File

@ -75,14 +75,22 @@ void browser_window_scroll_callback(void *client_data,
}
break;
case SCROLLBAR_MSG_SCROLL_START:
if (scrollbar_is_horizontal(scrollbar_data->scrollbar))
browser_window_set_drag_type(bw, DRAGGING_SCR_X);
else
browser_window_set_drag_type(bw, DRAGGING_SCR_Y);
{
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, &rect);
else
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 @@ void browser_window_resize_frame(struct browser_window *bw, int x, int y) {
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 @@ void browser_window_resize_frame(struct browser_window *bw, int x, int y) {
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_resolve_frame_dimension(struct browser_window *bw, struct br
}
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 @@ bool browser_window_resize_frames(struct browser_window *bw, browser_mouse_state
} 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 @@ bool browser_window_resize_frames(struct browser_window *bw, browser_mouse_state
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 @@ bool browser_window_resize_frames(struct browser_window *bw, browser_mouse_state
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;

View File

@ -1287,7 +1287,16 @@ void form_select_menu_scroll_callback(void *client_data,
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 @@ void form_select_menu_scroll_callback(void *client_data,
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;

View File

@ -108,7 +108,7 @@ void html_mouse_track(struct content *c, struct browser_window *bw,
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 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
}
/* 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 @@ void html_overflow_scroll_callback(void *client_data,
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 @@ void html_overflow_scroll_callback(void *client_data,
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;

View File

@ -638,7 +638,7 @@ void textplain_mouse_track(struct content *c, struct browser_window *bw,
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 @@ void textplain_mouse_action(struct content *c, struct browser_window *bw,
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)) {