change browser_window_mouse_track to use unscaled coordinates

This commit is contained in:
Vincent Sanders 2019-08-03 10:49:07 +01:00
parent 0a8ed41a1a
commit 0ebfff259f
9 changed files with 231 additions and 201 deletions

View File

@ -849,10 +849,9 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
(x * scale) - pos_x, (x * scale) - pos_x,
(y * scale) - pos_y); (y * scale) - pos_y);
} else { } else {
pos_x /= scale;
pos_y /= scale;
browser_window_mouse_track(iframe, mouse, browser_window_mouse_track(iframe, mouse,
x - pos_x, y - pos_y); (x * scale) - pos_x,
(y * scale) - pos_y);
} }
} else if (html_object_box) { } else if (html_object_box) {

View File

@ -1617,6 +1617,171 @@ browser_window_mouse_click_internal(struct browser_window *bw,
} }
/**
* Process mouse movement event
*
* \param bw The browsing context receiving the event
* \param mouse The mouse event state
* \param x The scaled x co-ordinate of the event
* \param y The scaled y co-ordinate of the event
*/
static void
browser_window_mouse_track_internal(struct browser_window *bw,
browser_mouse_state mouse,
int x, int y)
{
hlcache_handle *c = bw->current_content;
const char *status = NULL;
browser_pointer_shape pointer = BROWSER_POINTER_DEFAULT;
if (bw->window != NULL && bw->drag.window && bw != bw->drag.window) {
/* This is the root browser window and there's an active drag
* in a sub window.
* Pass the mouse action straight on to that bw. */
struct browser_window *drag_bw = bw->drag.window;
int off_x = 0;
int off_y = 0;
browser_window_get_position(drag_bw, true, &off_x, &off_y);
if (drag_bw->browser_window_type == BROWSER_WINDOW_FRAME) {
browser_window_mouse_track_internal(drag_bw, mouse,
x - off_x, y - off_y);
} else if (drag_bw->browser_window_type ==
BROWSER_WINDOW_IFRAME) {
browser_window_mouse_track_internal(drag_bw, mouse,
x - off_x / bw->scale,
y - off_y / bw->scale);
}
return;
}
if (bw->children) {
/* Browser window has children (frames) */
struct browser_window *child;
int cur_child;
int children = bw->rows * bw->cols;
for (cur_child = 0; cur_child < children; cur_child++) {
child = &bw->children[cur_child];
if ((x < child->x) ||
(y < child->y) ||
(child->x + child->width < x) ||
(child->y + child->height < y)) {
/* Click not in this child */
continue;
}
/* It's this child that contains the mouse; pass
* mouse action on to child */
browser_window_mouse_track_internal(
child,
mouse,
x - child->x + scrollbar_get_offset(child->scroll_x),
y - child->y + scrollbar_get_offset(child->scroll_y));
/* Mouse action was for this child, we're done */
return;
}
/* Odd if we reached here, but nothing else can use the click
* when there are children. */
return;
}
if (c == NULL && bw->drag.type != DRAGGING_FRAME) {
return;
}
if (bw->drag.type != DRAGGING_NONE && !mouse) {
browser_window_mouse_drag_end(bw, mouse, x, y);
}
/* Browser window's horizontal scrollbar */
if (bw->scroll_x != NULL && bw->drag.type != DRAGGING_SCR_Y) {
int scr_x, scr_y;
browser_window_get_scrollbar_pos(bw, true, &scr_x, &scr_y);
scr_x = x - scr_x - scrollbar_get_offset(bw->scroll_x);
scr_y = y - scr_y - scrollbar_get_offset(bw->scroll_y);
if ((bw->drag.type == DRAGGING_SCR_X) ||
(scr_x > 0 &&
scr_x < get_horz_scrollbar_len(bw) &&
scr_y > 0 &&
scr_y < SCROLLBAR_WIDTH &&
bw->drag.type == DRAGGING_NONE)) {
/* Start a scrollbar drag, or continue existing drag */
status = scrollbar_mouse_status_to_message(
scrollbar_mouse_action(
bw->scroll_x, mouse,
scr_x, scr_y));
pointer = BROWSER_POINTER_DEFAULT;
if (status != NULL) {
browser_window_set_status(bw, status);
}
browser_window_set_pointer(bw, pointer);
return;
}
}
/* Browser window's vertical scrollbar */
if (bw->scroll_y != NULL) {
int scr_x, scr_y;
browser_window_get_scrollbar_pos(bw, false, &scr_x, &scr_y);
scr_x = x - scr_x - scrollbar_get_offset(bw->scroll_x);
scr_y = y - scr_y - scrollbar_get_offset(bw->scroll_y);
if ((bw->drag.type == DRAGGING_SCR_Y) ||
(scr_y > 0 &&
scr_y < get_vert_scrollbar_len(bw) &&
scr_x > 0 &&
scr_x < SCROLLBAR_WIDTH &&
bw->drag.type == DRAGGING_NONE)) {
/* Start a scrollbar drag, or continue existing drag */
status = scrollbar_mouse_status_to_message(
scrollbar_mouse_action(
bw->scroll_y, mouse,
scr_x, scr_y));
pointer = BROWSER_POINTER_DEFAULT;
if (status != NULL) {
browser_window_set_status(bw, status);
}
browser_window_set_pointer(bw, pointer);
return;
}
}
if (bw->drag.type == DRAGGING_FRAME) {
browser_window_resize_frame(bw, bw->x + x, bw->y + y);
} else if (bw->drag.type == DRAGGING_PAGE_SCROLL) {
/* mouse movement since drag started */
struct rect rect;
rect.x0 = bw->drag.start_x - x;
rect.y0 = bw->drag.start_y - y;
/* new scroll offsets */
rect.x0 += bw->drag.start_scroll_x;
rect.y0 += bw->drag.start_scroll_y;
bw->drag.start_scroll_x = rect.x1 = rect.x0;
bw->drag.start_scroll_y = rect.y1 = rect.y0;
browser_window_set_scroll(bw, &rect);
} else {
assert(c != NULL);
content_mouse_track(c, bw, mouse, x, y);
}
}
/* exported interface, documented in netsurf/browser_window.h */ /* exported interface, documented in netsurf/browser_window.h */
nserror nserror
browser_window_get_name(struct browser_window *bw, const char **out_name) browser_window_get_name(struct browser_window *bw, const char **out_name)
@ -3292,160 +3457,17 @@ browser_window_find_target(struct browser_window *bw,
/* exported interface documented in netsurf/browser_window.h */ /* exported interface documented in netsurf/browser_window.h */
void browser_window_mouse_track(struct browser_window *bw, void
browser_mouse_state mouse, int x, int y) browser_window_mouse_track(struct browser_window *bw,
browser_mouse_state mouse,
int x, int y)
{ {
hlcache_handle *c = bw->current_content; browser_window_mouse_track_internal(bw,
const char *status = NULL; mouse,
browser_pointer_shape pointer = BROWSER_POINTER_DEFAULT; x / bw->scale,
y / bw->scale);
if (bw->window != NULL && bw->drag.window && bw != bw->drag.window) {
/* This is the root browser window and there's an active drag
* in a sub window.
* Pass the mouse action straight on to that bw. */
struct browser_window *drag_bw = bw->drag.window;
int off_x = 0;
int off_y = 0;
browser_window_get_position(drag_bw, true, &off_x, &off_y);
if (drag_bw->browser_window_type == BROWSER_WINDOW_FRAME) {
browser_window_mouse_track(drag_bw, mouse,
x - off_x, y - off_y);
} else if (drag_bw->browser_window_type ==
BROWSER_WINDOW_IFRAME) {
browser_window_mouse_track(drag_bw, mouse,
x - off_x / bw->scale,
y - off_y / bw->scale);
}
return;
}
if (bw->children) {
/* Browser window has children (frames) */
struct browser_window *child;
int cur_child;
int children = bw->rows * bw->cols;
for (cur_child = 0; cur_child < children; cur_child++) {
child = &bw->children[cur_child];
if (x < child->x || y < child->y ||
child->x + child->width < x ||
child->y + child->height < y) {
/* Click not in this child */
continue;
}
/* It's this child that contains the mouse; pass
* mouse action on to child */
browser_window_mouse_track(child, mouse,
x - child->x + scrollbar_get_offset(
child->scroll_x),
y - child->y + scrollbar_get_offset(
child->scroll_y));
/* Mouse action was for this child, we're done */
return;
}
/* Odd if we reached here, but nothing else can use the click
* when there are children. */
return;
}
if (c == NULL && bw->drag.type != DRAGGING_FRAME) {
return;
}
if (bw->drag.type != DRAGGING_NONE && !mouse) {
browser_window_mouse_drag_end(bw, mouse, x, y);
}
/* Browser window's horizontal scrollbar */
if (bw->scroll_x != NULL && bw->drag.type != DRAGGING_SCR_Y) {
int scr_x, scr_y;
browser_window_get_scrollbar_pos(bw, true, &scr_x, &scr_y);
scr_x = x - scr_x - scrollbar_get_offset(bw->scroll_x);
scr_y = y - scr_y - scrollbar_get_offset(bw->scroll_y);
if ((bw->drag.type == DRAGGING_SCR_X) ||
(scr_x > 0 &&
scr_x < get_horz_scrollbar_len(bw) &&
scr_y > 0 &&
scr_y < SCROLLBAR_WIDTH &&
bw->drag.type == DRAGGING_NONE)) {
/* Start a scrollbar drag, or continue existing drag */
status = scrollbar_mouse_status_to_message(
scrollbar_mouse_action(
bw->scroll_x, mouse,
scr_x, scr_y));
pointer = BROWSER_POINTER_DEFAULT;
if (status != NULL) {
browser_window_set_status(bw, status);
}
browser_window_set_pointer(bw, pointer);
return;
}
}
/* Browser window's vertical scrollbar */
if (bw->scroll_y != NULL) {
int scr_x, scr_y;
browser_window_get_scrollbar_pos(bw, false, &scr_x, &scr_y);
scr_x = x - scr_x - scrollbar_get_offset(bw->scroll_x);
scr_y = y - scr_y - scrollbar_get_offset(bw->scroll_y);
if ((bw->drag.type == DRAGGING_SCR_Y) ||
(scr_y > 0 &&
scr_y < get_vert_scrollbar_len(bw) &&
scr_x > 0 &&
scr_x < SCROLLBAR_WIDTH &&
bw->drag.type == DRAGGING_NONE)) {
/* Start a scrollbar drag, or continue existing drag */
status = scrollbar_mouse_status_to_message(
scrollbar_mouse_action(
bw->scroll_y, mouse,
scr_x, scr_y));
pointer = BROWSER_POINTER_DEFAULT;
if (status != NULL) {
browser_window_set_status(bw, status);
}
browser_window_set_pointer(bw, pointer);
return;
}
}
if (bw->drag.type == DRAGGING_FRAME) {
browser_window_resize_frame(bw, bw->x + x, bw->y + y);
} else if (bw->drag.type == DRAGGING_PAGE_SCROLL) {
/* mouse movement since drag started */
struct rect rect;
rect.x0 = bw->drag.start_x - x;
rect.y0 = bw->drag.start_y - y;
/* new scroll offsets */
rect.x0 += bw->drag.start_scroll_x;
rect.y0 += bw->drag.start_scroll_y;
bw->drag.start_scroll_x = rect.x1 = rect.x0;
bw->drag.start_scroll_y = rect.y1 = rect.y0;
browser_window_set_scroll(bw, &rect);
} else {
assert(c != NULL);
content_mouse_track(c, bw, mouse, x, y);
}
} }
/* exported interface documented in netsurf/browser_window.h */ /* exported interface documented in netsurf/browser_window.h */
void void
browser_window_mouse_click(struct browser_window *bw, browser_window_mouse_click(struct browser_window *bw,
@ -3454,8 +3476,8 @@ browser_window_mouse_click(struct browser_window *bw,
{ {
browser_window_mouse_click_internal(bw, browser_window_mouse_click_internal(bw,
mouse, mouse,
(x / bw->scale), x / bw->scale,
(y / bw->scale)); y / bw->scale);
} }

View File

@ -2438,8 +2438,8 @@ static BOOL ami_gui_event(void *w)
break; break;
} }
x = (ULONG)((gwin->win->MouseX - bbox->Left) / gwin->gw->scale); x = (ULONG)((gwin->win->MouseX - bbox->Left));
y = (ULONG)((gwin->win->MouseY - bbox->Top) / gwin->gw->scale); y = (ULONG)((gwin->win->MouseY - bbox->Top));
ami_get_hscroll_pos(gwin, (ULONG *)&xs); ami_get_hscroll_pos(gwin, (ULONG *)&xs);
ami_get_vscroll_pos(gwin, (ULONG *)&ys); ami_get_vscroll_pos(gwin, (ULONG *)&ys);

View File

@ -518,9 +518,10 @@ void nsbeos_dispatch_event(BMessage *message)
if (gui->mouse.state & BROWSER_MOUSE_MOD_2 && !ctrl) if (gui->mouse.state & BROWSER_MOUSE_MOD_2 && !ctrl)
gui->mouse.state ^= BROWSER_MOUSE_MOD_2; gui->mouse.state ^= BROWSER_MOUSE_MOD_2;
browser_window_mouse_track(gui->bw, (browser_mouse_state)gui->mouse.state, browser_window_mouse_track(gui->bw,
(int)(where.x / gui->scale), (browser_mouse_state)gui->mouse.state,
(int)(where.y / gui->scale)); (int)(where.x),
(int)(where.y));
gui->last_x = (int)where.x; gui->last_x = (int)where.x;
gui->last_y = (int)where.y; gui->last_y = (int)where.y;

View File

@ -702,7 +702,7 @@ fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
gui_drag.state = GUI_DRAG_NONE; gui_drag.state = GUI_DRAG_NONE;
/* Tell core */ /* Tell core */
browser_window_mouse_track(gw->bw, 0, x/scale, y/scale); browser_window_mouse_track(gw->bw, 0, x, y);
break; break;
} }
/* This is a click; /* This is a click;
@ -723,7 +723,7 @@ fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
} }
/* Tell core */ /* Tell core */
browser_window_mouse_track(gw->bw, 0, x/scale, y/scale); browser_window_mouse_track(gw->bw, 0, x, y);
break; break;
} }
/* This is a click; /* This is a click;
@ -781,7 +781,6 @@ fb_browser_window_move(fbtk_widget_t *widget, fbtk_callback_info *cbi)
browser_mouse_state mouse = 0; browser_mouse_state mouse = 0;
struct gui_window *gw = cbi->context; struct gui_window *gw = cbi->context;
struct browser_widget_s *bwidget = fbtk_get_userpw(widget); struct browser_widget_s *bwidget = fbtk_get_userpw(widget);
float scale = browser_window_get_scale(gw->bw);
int x = cbi->x + bwidget->scrollx; int x = cbi->x + bwidget->scrollx;
int y = cbi->y + bwidget->scrolly; int y = cbi->y + bwidget->scrolly;
@ -812,7 +811,7 @@ fb_browser_window_move(fbtk_widget_t *widget, fbtk_callback_info *cbi)
mouse |= BROWSER_MOUSE_HOLDING_2; mouse |= BROWSER_MOUSE_HOLDING_2;
} }
browser_window_mouse_track(gw->bw, mouse, x/scale, y/scale); browser_window_mouse_track(gw->bw, mouse, x, y);
return 0; return 0;
} }

View File

@ -325,9 +325,7 @@ static gboolean nsgtk_window_motion_notify_event(GtkWidget *widget,
if (g->mouse.state & BROWSER_MOUSE_MOD_2 && !ctrl) if (g->mouse.state & BROWSER_MOUSE_MOD_2 && !ctrl)
g->mouse.state ^= BROWSER_MOUSE_MOD_2; g->mouse.state ^= BROWSER_MOUSE_MOD_2;
browser_window_mouse_track(g->bw, g->mouse.state, browser_window_mouse_track(g->bw, g->mouse.state, event->x, event->y);
event->x / browser_window_get_scale(g->bw),
event->y / browser_window_get_scale(g->bw));
return TRUE; return TRUE;
} }
@ -416,13 +414,9 @@ static gboolean nsgtk_window_button_release_event(GtkWidget *widget,
g->mouse.state ^= BROWSER_MOUSE_MOD_2; g->mouse.state ^= BROWSER_MOUSE_MOD_2;
if (g->mouse.state & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) { if (g->mouse.state & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) {
browser_window_mouse_click(g->bw, g->mouse.state, browser_window_mouse_click(g->bw, g->mouse.state, event->x, event->y);
event->x,
event->y);
} else { } else {
browser_window_mouse_track(g->bw, 0, browser_window_mouse_track(g->bw, 0, event->x, event->y);
event->x / browser_window_get_scale(g->bw),
event->y / browser_window_get_scale(g->bw));
} }
g->mouse.state = 0; g->mouse.state = 0;

View File

@ -188,8 +188,9 @@ static void ro_gui_selection_drag_end(wimp_dragged *drag, void *data)
return; return;
} }
if (ro_gui_window_to_window_pos(g, drag->final.x0, drag->final.y0, &pos)) if (ro_gui_window_to_window_pos(g, drag->final.x0, drag->final.y0, &pos)) {
browser_window_mouse_track(g->bw, 0, pos.x, pos.y); browser_window_mouse_track(g->bw, 0, pos.x, pos.y);
}
} }
/** /**

View File

@ -3831,8 +3831,9 @@ static void ro_gui_window_scroll_end(wimp_dragged *drag, void *data)
ro_warn_user("WimpError", error->errmess); ro_warn_user("WimpError", error->errmess);
} }
if (ro_gui_window_to_window_pos(g, drag->final.x0, drag->final.y0, &pos)) if (ro_gui_window_to_window_pos(g, drag->final.x0, drag->final.y0, &pos)) {
browser_window_mouse_track(g->bw, 0, pos.x/g->scale, pos.y/g->scale); browser_window_mouse_track(g->bw, 0, pos.x, pos.y);
}
} }
@ -4388,11 +4389,14 @@ void ro_gui_window_mouse_at(wimp_pointer *pointer, void *data)
os_coord pos; os_coord pos;
struct gui_window *g = (struct gui_window *) data; struct gui_window *g = (struct gui_window *) data;
if (ro_gui_window_to_window_pos(g, pointer->pos.x, pointer->pos.y, &pos)) if (ro_gui_window_to_window_pos(g, pointer->pos.x, pointer->pos.y, &pos)) {
browser_window_mouse_track(g->bw, browser_window_mouse_track(
ro_gui_mouse_drag_state(pointer->buttons, g->bw,
ro_gui_mouse_drag_state(pointer->buttons,
wimp_BUTTON_DOUBLE_CLICK_DRAG), wimp_BUTTON_DOUBLE_CLICK_DRAG),
pos.x/g->scale, pos.y/g->scale); pos.x,
pos.y);
}
} }

View File

@ -378,10 +378,15 @@ nsws_drawable_paint(struct gui_window *gw, HWND hwnd)
clip.x1 = ps.rcPaint.right; clip.x1 = ps.rcPaint.right;
clip.y1 = ps.rcPaint.bottom; clip.y1 = ps.rcPaint.bottom;
/**
* \todo work out why the heck scroll needs scaling
*/
browser_window_redraw(gw->bw, browser_window_redraw(gw->bw,
-gw->scrollx / gw->scale, -gw->scrollx / gw->scale,
-gw->scrolly / gw->scale, -gw->scrolly / gw->scale,
&clip, &ctx); &clip,
&ctx);
} }
EndPaint(hwnd, &ps); EndPaint(hwnd, &ps);
@ -425,19 +430,21 @@ nsws_drawable_mouseup(struct gui_window *gw,
if ((gw->mouse->state & click) != 0) { if ((gw->mouse->state & click) != 0) {
NSLOG(netsurf, INFO, NSLOG(netsurf, INFO,
"mouse click bw %p, state 0x%x, x %f, y %f", gw->bw, "mouse click bw %p, state 0x%x, x %d, y %d",
gw->mouse->state, (x + gw->scrollx) / gw->scale, gw->bw,
(y + gw->scrolly) / gw->scale); gw->mouse->state,
x + gw->scrollx,
y + gw->scrolly);
browser_window_mouse_click(gw->bw, browser_window_mouse_click(gw->bw,
gw->mouse->state, gw->mouse->state,
(x + gw->scrollx), x + gw->scrollx,
(y + gw->scrolly)); y + gw->scrolly);
} else { } else {
browser_window_mouse_track(gw->bw, browser_window_mouse_track(gw->bw,
0, 0,
(x + gw->scrollx) / gw->scale, x + gw->scrollx,
(y + gw->scrolly) / gw->scale); y + gw->scrolly);
} }
gw->mouse->state = 0; gw->mouse->state = 0;
@ -468,16 +475,19 @@ nsws_drawable_mousedown(struct gui_window *gw,
if ((GetKeyState(VK_MENU) & 0x8000) == 0x8000) if ((GetKeyState(VK_MENU) & 0x8000) == 0x8000)
gw->mouse->state |= BROWSER_MOUSE_MOD_3; gw->mouse->state |= BROWSER_MOUSE_MOD_3;
gw->mouse->pressed_x = (x + gw->scrollx) / gw->scale; gw->mouse->pressed_x = x + gw->scrollx;
gw->mouse->pressed_y = (y + gw->scrolly) / gw->scale; gw->mouse->pressed_y = y + gw->scrolly;
NSLOG(netsurf, INFO, "mouse click bw %p, state %x, x %f, y %f", NSLOG(netsurf, INFO, "mouse click bw %p, state %x, x %d, y %d",
gw->bw, gw->mouse->state, (x + gw->scrollx) / gw->scale, gw->bw,
(y + gw->scrolly) / gw->scale); gw->mouse->state,
x + gw->scrollx,
y + gw->scrolly);
browser_window_mouse_click(gw->bw, gw->mouse->state, browser_window_mouse_click(gw->bw,
(x + gw->scrollx), gw->mouse->state,
(y + gw->scrolly)); x + gw->scrollx,
y + gw->scrolly);
return 0; return 0;
} }
@ -496,9 +506,9 @@ nsws_drawable_mousemove(struct gui_window *gw, int x, int y)
if ((gw == NULL) || (gw->mouse == NULL) || (gw->bw == NULL)) if ((gw == NULL) || (gw->mouse == NULL) || (gw->bw == NULL))
return 0; return 0;
/* scale co-ordinates */ /* add scroll offsets */
x = (x + gw->scrollx) ; x = x + gw->scrollx;
y = (y + gw->scrolly); y = y + gw->scrolly;
/* if mouse button held down and pointer moved more than /* if mouse button held down and pointer moved more than
* minimum distance drag is happening */ * minimum distance drag is happening */
@ -535,7 +545,7 @@ nsws_drawable_mousemove(struct gui_window *gw, int x, int y)
gw->mouse->state &= ~BROWSER_MOUSE_MOD_3; gw->mouse->state &= ~BROWSER_MOUSE_MOD_3;
browser_window_mouse_track(gw->bw, gw->mouse->state, x/ gw->scale, y/ gw->scale); browser_window_mouse_track(gw->bw, gw->mouse->state, x, y);
return 0; return 0;
} }