NetSurf
|
implementation of box tree inspection. More...
#include <stdio.h>
#include <dom/dom.h>
#include "utils/utils.h"
#include "utils/nsurl.h"
#include "utils/errors.h"
#include "netsurf/types.h"
#include "netsurf/content.h"
#include "netsurf/mouse.h"
#include "css/utils.h"
#include "css/dump.h"
#include "desktop/scrollbar.h"
#include "html/private.h"
#include "html/box.h"
#include "html/box_inspect.h"
Go to the source code of this file.
Macros | |
#define | box_is_float(box) |
Enumerations | |
enum | box_walk_dir { BOX_WALK_CHILDREN , BOX_WALK_PARENT , BOX_WALK_NEXT_SIBLING , BOX_WALK_FLOAT_CHILDREN , BOX_WALK_NEXT_FLOAT_SIBLING , BOX_WALK_FLOAT_CONTAINER } |
Direction to move in a box-tree walk. More... | |
Functions | |
static bool | box_contains_point (const css_unit_ctx *unit_len_ctx, const struct box *box, int x, int y, bool *physically) |
Determine if a point lies within a box. More... | |
static struct box * | box_move_xy (struct box *b, enum box_walk_dir dir, int *x, int *y) |
Move from box to next box in given direction, adjusting for box coord change. More... | |
static struct box * | box_next_xy (struct box *b, int *x, int *y, bool skip_children) |
Itterator for walking to next box in interaction order. More... | |
static bool | box_nearer_text_box (struct box *box, int bx, int by, int x, int y, int dir, struct box **nearest, int *tx, int *ty, int *nr_xd, int *nr_yd) |
Check whether box is nearer mouse coordinates than current nearest box. More... | |
static bool | box_nearest_text_box (struct box *box, int bx, int by, int fx, int fy, int x, int y, int dir, struct box **nearest, int *tx, int *ty, int *nr_xd, int *nr_yd) |
Pick the text box child of 'box' that is closest to and above-left (dir -ve) or below-right (dir +ve) of the point 'x,y'. More... | |
void | box_coords (struct box *box, int *x, int *y) |
Find the absolute coordinates of a box. More... | |
void | box_bounds (struct box *box, struct rect *r) |
Find the bounds of a box. More... | |
struct box * | box_at_point (const css_unit_ctx *unit_len_ctx, struct box *box, const int x, const int y, int *box_x, int *box_y) |
Find the boxes at a point. More... | |
struct box * | box_find_by_id (struct box *box, lwc_string *id) |
Find a box based upon its id attribute. More... | |
bool | box_visible (struct box *box) |
Determine if a box is visible when the tree is rendered. More... | |
void | box_dump (FILE *stream, struct box *box, unsigned int depth, bool style) |
Print a box tree to a file. More... | |
bool | box_vscrollbar_present (const struct box *const box) |
Determine if a box has a vertical scrollbar. More... | |
bool | box_hscrollbar_present (const struct box *const box) |
Determine if a box has a horizontal scrollbar. More... | |
struct box * | box_pick_text_box (struct html_content *html, int x, int y, int dir, int *dx, int *dy) |
Peform pick text on browser window contents to locate the box under the mouse pointer, or nearest in the given direction if the pointer is not over a text box. More... | |
implementation of box tree inspection.
Definition in file box_inspect.c.
#define box_is_float | ( | box | ) |
Definition at line 54 of file box_inspect.c.
enum box_walk_dir |
Direction to move in a box-tree walk.
Enumerator | |
---|---|
BOX_WALK_CHILDREN | |
BOX_WALK_PARENT | |
BOX_WALK_NEXT_SIBLING | |
BOX_WALK_FLOAT_CHILDREN | |
BOX_WALK_NEXT_FLOAT_SIBLING | |
BOX_WALK_FLOAT_CONTAINER |
Definition at line 45 of file box_inspect.c.
struct box * box_at_point | ( | const css_unit_ctx * | unit_len_ctx, |
struct box * | box, | ||
const int | x, | ||
const int | y, | ||
int * | box_x, | ||
int * | box_y | ||
) |
Find the boxes at a point.
unit_len_ctx | CSS length conversion context for document. |
box | box to search children of |
x | point to find, in global document coordinates |
y | point to find, in global document coordinates |
box_x | position of box, in global document coordinates, updated to position of returned box, if any |
box_y | position of box, in global document coordinates, updated to position of returned box, if any |
To find all the boxes in the hierarchy at a certain point, use code like this:
Definition at line 583 of file box_inspect.c.
References box_contains_point(), box_next_xy(), box::scroll_x, box::scroll_y, scrollbar_get_offset(), box::x, and box::y.
Referenced by get_mouse_action_node(), html_drop_file_at_point(), html_get_contextual_content(), and html_scroll_at_point().
Find the bounds of a box.
box | the box to calculate bounds of |
r | receives bounds |
Definition at line 567 of file box_inspect.c.
References BOTTOM, box_coords(), box::height, height, LEFT, box::padding, RIGHT, TOP, box::width, width, rect::x0, rect::x1, rect::y0, and rect::y1.
Referenced by browser_window_create_iframes(), and form_control_bounding_rect().
|
static |
Determine if a point lies within a box.
[in] | unit_len_ctx | CSS length conversion context to use. |
[in] | box | Box to consider |
[in] | x | Coordinate relative to box |
[in] | y | Coordinate relative to box |
[out] | physically | If function returning true, physically is set true iff point is within the box's physical dimensions and false if the point is not within the box's physical dimensions but is in the area defined by the box's descendants. If function returns false, physically is undefined. |
This is a helper function for box_at_point().
Definition at line 75 of file box_inspect.c.
References box::border, BOTTOM, box::descendant_x0, box::descendant_y0, box::height, LEFT, box::list_marker, box::padding, RIGHT, box::style, TOP, box_border::width, box::width, box::x, rect::x0, rect::x1, box::y, rect::y0, and rect::y1.
Referenced by box_at_point().
void box_coords | ( | struct box * | box, |
int * | x, | ||
int * | y | ||
) |
Find the absolute coordinates of a box.
box | the box to calculate coordinates of |
x | updated to x coordinate |
y | updated to y coordinate |
Definition at line 549 of file box_inspect.c.
References box_is_float, box::float_container, box::parent, box::scroll_x, box::scroll_y, scrollbar_get_offset(), box::x, and box::y.
Referenced by box_bounds(), box_textarea_callback(), coords_from_range(), form_select_menu_callback(), form_select_mouse_drag_end(), html__redraw_a_box(), html_box_drag_start(), html_drop_file_at_point(), html_get_id_offset(), html_object_callback(), html_overflow_scroll_drag_end(), html_redraw(), html_redraw_a_box(), html_set_focus(), html_textsearch_bounds(), layout_calculate_descendant_bboxes(), mouse_action_drag_content(), mouse_action_drag_scrollbar(), mouse_action_drag_textarea(), and mouse_action_select_menu().
void box_dump | ( | FILE * | stream, |
struct box * | box, | ||
unsigned int | depth, | ||
bool | style | ||
) |
Print a box tree to a file.
Definition at line 649 of file box_inspect.c.
References BOTTOM, BOX_BLOCK, BOX_BR, box_dump(), BOX_FLEX, BOX_FLOAT_LEFT, BOX_FLOAT_RIGHT, BOX_INLINE, BOX_INLINE_BLOCK, BOX_INLINE_CONTAINER, BOX_INLINE_END, BOX_INLINE_FLEX, BOX_TABLE, BOX_TABLE_CELL, BOX_TABLE_ROW, BOX_TABLE_ROW_GROUP, BOX_TEXT, box::byte_offset, box::children, box::col, box::columns, box::descendant_x0, box::descendant_x1, box::descendant_y0, box::descendant_y1, box::float_children, box::float_container, box::gadget, box::height, hlcache_handle_get_url(), box::href, box::id, box::iframe, box::inline_end, box::last, LEFT, box::length, box::list_marker, box::margin, column::max, box::max_width, column::min, box::min_width, box::next, box::next_float, box::node, nscss_dump_computed_style(), nsurl_access(), box::object, box::parent, column::positioned, box::prev, RIGHT, box::rows, box::space, box::start_column, box::style, box::target, box::text, box::title, TOP, column::type, box::type, UNKNOWN_MAX_WIDTH, column::width, box::width, box::x, and box::y.
Referenced by box_dump(), html_box_convert_done(), html_debug_dump(), layout_minmax_block(), and layout_minmax_table().
Find a box based upon its id attribute.
box | box tree to search |
id | id to look for |
Definition at line 614 of file box_inspect.c.
References box_find_by_id(), box::children, box::id, and box::next.
Referenced by box_find_by_id(), and html_get_id_offset().
bool box_hscrollbar_present | ( | const struct box * | box | ) |
Determine if a box has a horizontal scrollbar.
box | scrolling box |
Definition at line 839 of file box_inspect.c.
References box::border, box::descendant_x1, LEFT, box::padding, RIGHT, box_border::width, and box::width.
Referenced by html_redraw_box(), and layout_block_add_scrollbar().
|
inlinestatic |
Move from box to next box in given direction, adjusting for box coord change.
b | box to move from from |
dir | direction to move in |
x | box's global x-coord, updated to position of next box |
y | box's global y-coord, updated to position of next box |
If no box can be found in given direction, NULL is returned.
Definition at line 201 of file box_inspect.c.
References box_is_float, BOX_WALK_CHILDREN, BOX_WALK_FLOAT_CHILDREN, BOX_WALK_FLOAT_CONTAINER, BOX_WALK_NEXT_FLOAT_SIBLING, BOX_WALK_NEXT_SIBLING, BOX_WALK_PARENT, box::children, fallthrough, box::float_children, box::float_container, box::next, box::next_float, box::parent, box::x, and box::y.
Referenced by box_next_xy().
|
static |
Check whether box is nearer mouse coordinates than current nearest box.
box | box to test |
bx | position of box, in global document coordinates |
by | position of box, in global document coordinates |
x | mouse point, in global document coordinates |
y | mouse point, in global document coordinates |
dir | direction in which to search (-1 = above-left, +1 = below-right) |
nearest | nearest text box found, or NULL if none updated if box is nearer than existing nearest |
tx | position of text_box, in global document coordinates updated if box is nearer than existing nearest |
ty | position of text_box, in global document coordinates updated if box is nearer than existing nearest |
nr_xd | distance to nearest text box found updated if box is nearer than existing nearest |
nr_yd | distance to nearest text box found updated if box is nearer than existing nearest |
Definition at line 396 of file box_inspect.c.
References BOTTOM, box::height, LEFT, box::list_marker, box::padding, box::parent, RIGHT, TOP, box::width, box::x, and box::y.
Referenced by box_nearest_text_box().
|
static |
Pick the text box child of 'box' that is closest to and above-left (dir -ve) or below-right (dir +ve) of the point 'x,y'.
box | parent box |
bx | position of box, in global document coordinates |
by | position of box, in global document coordinates |
fx | position of float parent, in global document coordinates |
fy | position of float parent, in global document coordinates |
x | mouse point, in global document coordinates |
y | mouse point, in global document coordinates |
dir | direction in which to search (-1 = above-left, +1 = below-right) |
nearest | nearest text box found, or NULL if none updated if a descendant of box is nearer than old nearest |
tx | position of nearest, in global document coordinates updated if a descendant of box is nearer than old nearest |
ty | position of nearest, in global document coordinates updated if a descendant of box is nearer than old nearest |
nr_xd | distance to nearest text box found updated if a descendant of box is nearer than old nearest |
nr_yd | distance to nearest text box found updated if a descendant of box is nearer than old nearest |
Definition at line 472 of file box_inspect.c.
References BOTTOM, BOX_FLOAT_LEFT, BOX_FLOAT_RIGHT, BOX_INLINE_CONTAINER, box_nearer_text_box(), box_nearest_text_box(), box::children, box::float_children, box::height, LEFT, box::list_marker, box::next, box::object, box::padding, RIGHT, box::scroll_x, box::scroll_y, scrollbar_get_offset(), box::text, TOP, box::type, box::width, box::x, and box::y.
Referenced by box_nearest_text_box(), and box_pick_text_box().
|
inlinestatic |
Itterator for walking to next box in interaction order.
b | box to find next box from |
x | box's global x-coord, updated to position of next box |
y | box's global y-coord, updated to position of next box |
skip_children | whether to skip box's children |
This walks to a boxes float children before its children. When walking children, floating boxes are skipped.
Definition at line 283 of file box_inspect.c.
References box_is_float, box_move_xy(), BOX_WALK_CHILDREN, BOX_WALK_FLOAT_CHILDREN, BOX_WALK_FLOAT_CONTAINER, BOX_WALK_NEXT_FLOAT_SIBLING, BOX_WALK_NEXT_SIBLING, BOX_WALK_PARENT, box::next, box::parent, box::x, and box::y.
Referenced by box_at_point().
struct box * box_pick_text_box | ( | struct html_content * | html, |
int | x, | ||
int | y, | ||
int | dir, | ||
int * | dx, | ||
int * | dy | ||
) |
Peform pick text on browser window contents to locate the box under the mouse pointer, or nearest in the given direction if the pointer is not over a text box.
html | an HTML content |
x | coordinate of mouse |
y | coordinate of mouse |
dir | direction to search (-1 = above-left, +1 = below-right) |
dx | receives x ordinate of mouse relative to text box |
dy | receives y ordinate of mouse relative to text box |
Definition at line 850 of file box_inspect.c.
References BOTTOM, box_nearest_text_box(), box::height, html_content::layout, LEFT, box::margin, box::object, box::padding, RIGHT, box::text, TOP, box::width, box::x, and box::y.
Referenced by html_selection_drag_end(), and mouse_action_drag_selection().
bool box_visible | ( | struct box * | box | ) |
Determine if a box is visible when the tree is rendered.
box | box to check |
Definition at line 636 of file box_inspect.c.
References box::style.
Referenced by html_object_callback().
bool box_vscrollbar_present | ( | const struct box * | box | ) |
Determine if a box has a vertical scrollbar.
box | scrolling box |
Definition at line 829 of file box_inspect.c.
References box::border, BOTTOM, box::descendant_y1, box::height, box::padding, TOP, and box_border::width.
Referenced by html_redraw_box(), and layout_block_add_scrollbar().