NetSurf
Macros | Enumerations | Functions
box_inspect.c File Reference

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"
Include dependency graph for box_inspect.c:

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 boxbox_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 boxbox_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 boxbox_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 boxbox_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 boxbox_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...
 

Detailed Description

implementation of box tree inspection.

Definition in file box_inspect.c.

Macro Definition Documentation

◆ box_is_float

#define box_is_float (   box)
Value:
box->type == BOX_FLOAT_RIGHT)
@ BOX_FLOAT_LEFT
Definition: box.h:63
@ BOX_FLOAT_RIGHT
Definition: box.h:64
Node in box tree.
Definition: box.h:177
box_type type
Type of box.
Definition: box.h:181

Definition at line 54 of file box_inspect.c.

Enumeration Type Documentation

◆ 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.

Function Documentation

◆ box_at_point()

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.

Parameters
unit_len_ctxCSS length conversion context for document.
boxbox to search children of
xpoint to find, in global document coordinates
ypoint to find, in global document coordinates
box_xposition of box, in global document coordinates, updated to position of returned box, if any
box_yposition of box, in global document coordinates, updated to position of returned box, if any
Returns
box at given point, or 0 if none found

To find all the boxes in the hierarchy at a certain point, use code like this:

struct box *box = top_of_document_to_search;
int box_x = 0, box_y = 0;
while ((box = box_at_point(unit_len_ctx, box, x, y, &box_x, &box_y))) {
// process box
}
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.
Definition: box_inspect.c:583
int x
Coordinate of left padding edge relative to parent box, or relative to ancestor that contains this bo...
Definition: box.h:280
int y
Coordinate of top padding edge, relative as for x.
Definition: box.h:284

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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ box_bounds()

void box_bounds ( struct box box,
struct rect r 
)

Find the bounds of a box.

Parameters
boxthe box to calculate bounds of
rreceives 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ box_contains_point()

static bool box_contains_point ( const css_unit_ctx *  unit_len_ctx,
const struct box box,
int  x,
int  y,
bool *  physically 
)
static

Determine if a point lies within a box.

Parameters
[in]unit_len_ctxCSS length conversion context to use.
[in]boxBox to consider
[in]xCoordinate relative to box
[in]yCoordinate relative to box
[out]physicallyIf 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.
Returns
true if the point is within the box or a descendant box

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().

Here is the caller graph for this function:

◆ box_coords()

void box_coords ( struct box box,
int *  x,
int *  y 
)

Find the absolute coordinates of a box.

Parameters
boxthe box to calculate coordinates of
xupdated to x coordinate
yupdated 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ box_dump()

void box_dump ( FILE *  stream,
struct box box,
unsigned int  depth,
bool  style 
)

◆ box_find_by_id()

struct box * box_find_by_id ( struct box box,
lwc_string *  id 
)

Find a box based upon its id attribute.

Parameters
boxbox tree to search
idid to look for
Returns
the box or 0 if not found

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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ box_hscrollbar_present()

bool box_hscrollbar_present ( const struct box box)

Determine if a box has a horizontal scrollbar.

Parameters
boxscrolling box
Returns
the box has a horizontal scrollbar

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().

Here is the caller graph for this function:

◆ box_move_xy()

static struct box * box_move_xy ( struct box b,
enum box_walk_dir  dir,
int *  x,
int *  y 
)
inlinestatic

Move from box to next box in given direction, adjusting for box coord change.

Parameters
bbox to move from from
dirdirection to move in
xbox's global x-coord, updated to position of next box
ybox'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().

Here is the caller graph for this function:

◆ box_nearer_text_box()

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 
)
static

Check whether box is nearer mouse coordinates than current nearest box.

Parameters
boxbox to test
bxposition of box, in global document coordinates
byposition of box, in global document coordinates
xmouse point, in global document coordinates
ymouse point, in global document coordinates
dirdirection in which to search (-1 = above-left, +1 = below-right)
nearestnearest text box found, or NULL if none updated if box is nearer than existing nearest
txposition of text_box, in global document coordinates updated if box is nearer than existing nearest
typosition of text_box, in global document coordinates updated if box is nearer than existing nearest
nr_xddistance to nearest text box found updated if box is nearer than existing nearest
nr_yddistance to nearest text box found updated if box is nearer than existing nearest
Returns
true if mouse point is inside box

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().

Here is the caller graph for this function:

◆ box_nearest_text_box()

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 
)
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'.

Parameters
boxparent box
bxposition of box, in global document coordinates
byposition of box, in global document coordinates
fxposition of float parent, in global document coordinates
fyposition of float parent, in global document coordinates
xmouse point, in global document coordinates
ymouse point, in global document coordinates
dirdirection in which to search (-1 = above-left, +1 = below-right)
nearestnearest text box found, or NULL if none updated if a descendant of box is nearer than old nearest
txposition of nearest, in global document coordinates updated if a descendant of box is nearer than old nearest
typosition of nearest, in global document coordinates updated if a descendant of box is nearer than old nearest
nr_xddistance to nearest text box found updated if a descendant of box is nearer than old nearest
nr_yddistance to nearest text box found updated if a descendant of box is nearer than old nearest
Returns
true if mouse point is inside text_box

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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ box_next_xy()

static struct box * box_next_xy ( struct box b,
int *  x,
int *  y,
bool  skip_children 
)
inlinestatic

Itterator for walking to next box in interaction order.

Parameters
bbox to find next box from
xbox's global x-coord, updated to position of next box
ybox's global y-coord, updated to position of next box
skip_childrenwhether 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ box_pick_text_box()

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.

Parameters
htmlan HTML content
xcoordinate of mouse
ycoordinate of mouse
dirdirection to search (-1 = above-left, +1 = below-right)
dxreceives x ordinate of mouse relative to text box
dyreceives 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ box_visible()

bool box_visible ( struct box box)

Determine if a box is visible when the tree is rendered.

Parameters
boxbox to check
Returns
true iff the box is rendered

Definition at line 636 of file box_inspect.c.

References box::style.

Referenced by html_object_callback().

Here is the caller graph for this function:

◆ box_vscrollbar_present()

bool box_vscrollbar_present ( const struct box box)

Determine if a box has a vertical scrollbar.

Parameters
boxscrolling box
Returns
the box has a vertical scrollbar

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().

Here is the caller graph for this function: