netsurf/content/handlers/html/box_inspect.h

156 lines
4.1 KiB
C

/*
* Copyright 2020 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* NetSurf is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* \file
* HTML Box tree inspection interface.
*/
#ifndef NETSURF_HTML_BOX_INSPECT_H
#define NETSURF_HTML_BOX_INSPECT_H
/**
* Find the absolute coordinates of a box.
*
* \param box the box to calculate coordinates of
* \param x updated to x coordinate
* \param y updated to y coordinate
*/
void box_coords(struct box *box, int *x, int *y);
/**
* Find the bounds of a box.
*
* \param box the box to calculate bounds of
* \param r receives bounds
*/
void box_bounds(struct box *box, struct rect *r);
/**
* Find the boxes at a point.
*
* \param unit_len_ctx CSS length conversion context for document.
* \param box box to search children of
* \param x point to find, in global document coordinates
* \param y point to find, in global document coordinates
* \param box_x position of box, in global document coordinates, updated
* to position of returned box, if any
* \param box_y position of box, in global document coordinates, updated
* to position of returned box, if any
* \return 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:
* \code
* 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
* }
* \endcode
*/
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 a box based upon its id attribute.
*
* \param box box tree to search
* \param id id to look for
* \return the box or 0 if not found
*/
struct box *box_find_by_id(struct box *box, lwc_string *id);
/**
* Determine if a box is visible when the tree is rendered.
*
* \param box box to check
* \return true iff the box is rendered
*/
bool box_visible(struct box *box);
/**
* Print a box tree to a file.
*/
void box_dump(FILE *stream, struct box *box, unsigned int depth, bool style);
/**
* Determine if a box has a vertical scrollbar.
*
* \param box scrolling box
* \return the box has a vertical scrollbar
*/
bool box_vscrollbar_present(const struct box *box);
/**
* Determine if a box has a horizontal scrollbar.
*
* \param box scrolling box
* \return the box has a horizontal scrollbar
*/
bool box_hscrollbar_present(const struct box *box);
/**
* 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.
*
* \param html an HTML content
* \param x coordinate of mouse
* \param y coordinate of mouse
* \param dir direction to search (-1 = above-left, +1 = below-right)
* \param dx receives x ordinate of mouse relative to text box
* \param dy receives y ordinate of mouse relative to text box
*/
struct box *box_pick_text_box(struct html_content *html, int x, int y, int dir, int *dx, int *dy);
/**
* Check if layout box is a first child.
*
* \param[in] b Box to check.
* \return true iff box is first child.
*/
static inline bool box_is_first_child(struct box *b)
{
return (b->parent == NULL || b == b->parent->children);
}
static inline unsigned box_count_children(const struct box *b)
{
const struct box *c = b->children;
unsigned count = 0;
while (c != NULL) {
count++;
c = c->next;
}
return count;
}
#endif