diff --git a/content/handlers/html/html.c b/content/handlers/html/html.c
index 1bbb4c699..7280ff66a 100644
--- a/content/handlers/html/html.c
+++ b/content/handlers/html/html.c
@@ -1925,11 +1925,11 @@ html_get_contextual_content(struct content *c, int x, int y,
}
if (box->iframe) {
- browser_window_get_features(
- box->iframe,
- (x - box_x) * browser_window_get_scale(box->iframe),
- (y - box_y) * browser_window_get_scale(box->iframe),
- data);
+ float scale = browser_window_get_scale(box->iframe);
+ browser_window_get_features(box->iframe,
+ (x - box_x) * scale,
+ (y - box_y) * scale,
+ data);
}
if (box->object)
@@ -2004,13 +2004,15 @@ html_scroll_at_point(struct content *c, int x, int y, int scrx, int scry)
continue;
/* Pass into iframe */
- if (box->iframe &&
- browser_window_scroll_at_point(
- box->iframe,
- (x - box_x) * browser_window_get_scale(box->iframe),
- (y - box_y) * browser_window_get_scale(box->iframe),
- scrx, scry) == true)
- return true;
+ if (box->iframe) {
+ float scale = browser_window_get_scale(box->iframe);
+
+ if (browser_window_scroll_at_point(box->iframe,
+ (x - box_x) * scale,
+ (y - box_y) * scale,
+ scrx, scry) == true)
+ return true;
+ }
/* Pass into textarea widget */
if (box->gadget && (box->gadget->type == GADGET_TEXTAREA ||
@@ -2146,15 +2148,21 @@ static bool html_drop_file_at_point(struct content *c, int x, int y, char *file)
&box_x, &box_y)) != NULL) {
box = next;
- if (box->style && css_computed_visibility(box->style) ==
- CSS_VISIBILITY_HIDDEN)
+ if (box->style &&
+ css_computed_visibility(box->style) == CSS_VISIBILITY_HIDDEN)
continue;
- if (box->iframe)
- return browser_window_drop_file_at_point(box->iframe,
- x - box_x, y - box_y, file);
+ if (box->iframe) {
+ float scale = browser_window_get_scale(box->iframe);
+ return browser_window_drop_file_at_point(
+ box->iframe,
+ (x - box_x) * scale,
+ (y - box_y) * scale,
+ file);
+ }
- if (box->object && content_drop_file_at_point(box->object,
+ if (box->object &&
+ content_drop_file_at_point(box->object,
x - box_x, y - box_y, file) == true)
return true;
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index 9d8a5e3d8..f3b173f22 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -1819,6 +1819,13 @@ browser_window_mouse_track_internal(struct browser_window *bw,
}
+/**
+ * perform a scroll operation at a given coordinate
+ *
+ * \param bw The browsing context receiving the event
+ * \param x The scaled x co-ordinate of the event
+ * \param y The scaled y co-ordinate of the event
+ */
static bool
browser_window_scroll_at_point_internal(struct browser_window *bw,
int x, int y,
@@ -1876,6 +1883,60 @@ browser_window_scroll_at_point_internal(struct browser_window *bw,
}
+/**
+ * allows a dragged file to be dropped into a browser window at a position
+ *
+ * \param bw The browsing context receiving the event
+ * \param x The scaled x co-ordinate of the event
+ * \param y The scaled y co-ordinate of the event
+ * \param file filename to be put in the widget
+ */
+static bool
+browser_window_drop_file_at_point_internal(struct browser_window *bw,
+ int x, int y,
+ char *file)
+{
+ assert(bw != NULL);
+
+ /* Handle (i)frame scroll offset (core-managed browser windows only) */
+ x += scrollbar_get_offset(bw->scroll_x);
+ y += scrollbar_get_offset(bw->scroll_y);
+
+ if (bw->children) {
+ /* Browser window has children, so pass request on to
+ * appropriate child */
+ struct browser_window *bwc;
+ int cur_child;
+ int children = bw->rows * bw->cols;
+
+ /* Loop through all children of bw */
+ for (cur_child = 0; cur_child < children; cur_child++) {
+ /* Set current child */
+ bwc = &bw->children[cur_child];
+
+ /* Skip this frame if (x, y) coord lies outside */
+ if (x < bwc->x || bwc->x + bwc->width < x ||
+ y < bwc->y || bwc->y + bwc->height < y)
+ continue;
+
+ /* Pass request into this child */
+ return browser_window_drop_file_at_point_internal(bwc,
+ (x - bwc->x),
+ (y - bwc->y),
+ file);
+ }
+ }
+
+ /* Pass file drop on to any content */
+ if (bw->current_content != NULL) {
+ return content_drop_file_at_point(bw->current_content,
+ x, y, file);
+ }
+
+ return false;
+}
+
+
/* exported interface, documented in netsurf/browser_window.h */
nserror
browser_window_get_name(struct browser_window *bw, const char **out_name)
@@ -2366,44 +2427,10 @@ browser_window_drop_file_at_point(struct browser_window *bw,
int x, int y,
char *file)
{
- assert(bw != NULL);
-
- /* Handle (i)frame scroll offset (core-managed browser windows only) */
- x += scrollbar_get_offset(bw->scroll_x);
- y += scrollbar_get_offset(bw->scroll_y);
-
- if (bw->children) {
- /* Browser window has children, so pass request on to
- * appropriate child */
- struct browser_window *bwc;
- int cur_child;
- int children = bw->rows * bw->cols;
-
- /* Loop through all children of bw */
- for (cur_child = 0; cur_child < children; cur_child++) {
- /* Set current child */
- bwc = &bw->children[cur_child];
-
- /* Skip this frame if (x, y) coord lies outside */
- if (x < bwc->x || bwc->x + bwc->width < x ||
- y < bwc->y || bwc->y + bwc->height < y)
- continue;
-
- /* Pass request into this child */
- return browser_window_drop_file_at_point(bwc,
- (x - bwc->x),
- (y - bwc->y),
- file);
- }
- }
-
- /* Pass file drop on to any content */
- if (bw->current_content != NULL) {
- return content_drop_file_at_point(bw->current_content,
- x, y, file);
- }
-
- return false;
+ return browser_window_drop_file_at_point_internal(bw,
+ x / bw->scale,
+ y / bw->scale,
+ file);
}
diff --git a/frontends/riscos/window.c b/frontends/riscos/window.c
index 5a46529ae..ab46f284f 100644
--- a/frontends/riscos/window.c
+++ b/frontends/riscos/window.c
@@ -4365,7 +4365,7 @@ bool ro_gui_window_dataload(struct gui_window *g, wimp_message *message)
message->data.data_xfer.pos.y, &pos))
return false;
- if (browser_window_drop_file_at_point(g->bw, pos.x/g->scale, pos.y/g->scale,
+ if (browser_window_drop_file_at_point(g->bw, pos.x, pos.y,
message->data.data_xfer.file_name) == false)
return false;