r2606 bursa - in /trunk/netsurf: desktop/browser.c render/box.c
by netsurf@semichrome.net
Author: bursa
Date: Wed May 24 23:55:37 2006
New Revision: 2606
URL: http://svn.semichrome.net?rev=2606&view=rev
Log:
Fix box_at_point() for certain cases involving floats (solves unclickable links on Wikipedia). Fix text-selection code that assumed that text boxes would be returned last by box_at_point().
Modified:
trunk/netsurf/desktop/browser.c
trunk/netsurf/render/box.c
Modified: trunk/netsurf/desktop/browser.c
URL: http://svn.semichrome.net/trunk/netsurf/desktop/browser.c?rev=2606&r1=260...
==============================================================================
--- trunk/netsurf/desktop/browser.c (original)
+++ trunk/netsurf/desktop/browser.c Wed May 24 23:55:37 2006
@@ -830,6 +830,7 @@
int box_x = 0, box_y = 0;
int gadget_box_x = 0, gadget_box_y = 0;
int scroll_box_x = 0, scroll_box_y = 0;
+ int text_box_x = 0, text_box_y = 0;
struct box *gadget_box = 0;
struct box *scroll_box = 0;
struct box *text_box = 0;
@@ -907,9 +908,15 @@
scroll_box_y = box_y + box->scroll_y;
}
- if (box->text && !box->object)
+ if (box->text && !box->object) {
text_box = box;
- }
+ text_box_x = box_x;
+ text_box_y = box_y;
+ }
+ }
+
+ /* use of box_x, box_y, or content below this point is probably a
+ * mistake; they will refer to the last box returned by box_at_point */
if (scroll_box) {
status = browser_window_scrollbar_click(bw, mouse, scroll_box,
@@ -984,7 +991,7 @@
nsfont_position_in_string(text_box->style,
text_box->text,
text_box->length,
- x - box_x,
+ x - text_box_x,
&idx,
&pixel_offset);
@@ -1021,7 +1028,7 @@
nsfont_position_in_string(text_box->style,
text_box->text,
text_box->length,
- x - box_x,
+ x - text_box_x,
&idx,
&pixel_offset);
@@ -1109,7 +1116,7 @@
nsfont_position_in_string(text_box->style,
text_box->text,
text_box->length,
- x - box_x,
+ x - text_box_x,
&idx,
&pixel_offset);
@@ -1667,8 +1674,6 @@
if (c) {
union content_msg_data data;
-LOG(("REDRAW %d,%d,%d,%d", x, y, width, height));
-
data.redraw.x = x;
data.redraw.y = y;
data.redraw.width = width;
@@ -2040,8 +2045,10 @@
NULL) {
box = next_box;
- if (box->text && !box->object)
+ if (box->text && !box->object) {
text_box = box;
+ break;
+ }
}
if (!text_box) {
Modified: trunk/netsurf/render/box.c
URL: http://svn.semichrome.net/trunk/netsurf/render/box.c?rev=2606&r1=2605&r2=...
==============================================================================
--- trunk/netsurf/render/box.c (original)
+++ trunk/netsurf/render/box.c Wed May 24 23:55:37 2006
@@ -18,6 +18,7 @@
#include "netsurf/css/css.h"
#include "netsurf/render/box.h"
#include "netsurf/render/form.h"
+#include "netsurf/utils/log.h"
#include "netsurf/utils/talloc.h"
@@ -303,19 +304,20 @@
/* consider floats first, since they will often overlap other boxes */
for (child = box->float_children; child; child = child->next_float) {
if (box_contains_point(child, x - bx, y - by)) {
- *box_x += child->x - child->scroll_x;
- *box_y += child->y - child->scroll_y;
+ *box_x = bx + child->x - child->scroll_x;
+ *box_y = by + child->y - child->scroll_y;
return child;
}
}
+non_float_children:
/* non-float children */
for (child = box->children; child; child = child->next) {
if (box_is_float(child))
continue;
if (box_contains_point(child, x - bx, y - by)) {
- *box_x += child->x - child->scroll_x;
- *box_y += child->y - child->scroll_y;
+ *box_x = bx + child->x - child->scroll_x;
+ *box_y = by + child->y - child->scroll_y;
return child;
}
}
@@ -323,7 +325,28 @@
siblings:
/* siblings and siblings of ancestors */
while (box) {
- if (!box_is_float(box)) {
+ if (box_is_float(box)) {
+ bx -= box->x - box->scroll_x;
+ by -= box->y - box->scroll_y;
+ for (sibling = box->next_float; sibling;
+ sibling = sibling->next_float) {
+ if (box_contains_point(sibling,
+ x - bx, y - by)) {
+ *box_x = bx + sibling->x -
+ sibling->scroll_x;
+ *box_y = by + sibling->y -
+ sibling->scroll_y;
+ return sibling;
+ }
+ }
+ /* ascend to float's parent */
+ do {
+ box = box->parent;
+ } while (!box->float_children);
+ /* process non-float children of float's parent */
+ goto non_float_children;
+
+ } else {
bx -= box->x - box->scroll_x;
by -= box->y - box->scroll_y;
for (sibling = box->next; sibling;
@@ -340,23 +363,6 @@
}
}
box = box->parent;
- } else {
- bx -= box->x - box->scroll_x;
- by -= box->y - box->scroll_y;
- for (sibling = box->next_float; sibling;
- sibling = sibling->next_float) {
- if (box_contains_point(sibling,
- x - bx, y - by)) {
- *box_x = bx + sibling->x -
- sibling->scroll_x;
- *box_y = by + sibling->y -
- sibling->scroll_y;
- return sibling;
- }
- }
- do {
- box = box->parent;
- } while (!box->float_children);
}
}
@@ -492,9 +498,9 @@
default: fprintf(stderr, "Unknown box type ");
}
- fprintf(stderr, "ofst %d", box->byte_offset);
if (box->text)
- fprintf(stderr, "'%.*s' ", (int) box->length, box->text);
+ fprintf(stderr, "%u '%.*s' ", box->byte_offset,
+ (int) box->length, box->text);
if (box->space)
fprintf(stderr, "space ");
if (box->object)