From 8cff4b79d602b4437a81f3e008f22caf276d102a Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sat, 3 Aug 2019 15:12:21 +0100 Subject: Corewindow helper: Add helper to scroll to visible rectangle. This takes the algorithm from the GTK front end and puts it in the core, so it doesn't need to be implemented for every front end. --- desktop/cw_helper.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 desktop/cw_helper.c (limited to 'desktop/cw_helper.c') diff --git a/desktop/cw_helper.c b/desktop/cw_helper.c new file mode 100644 index 000000000..5844e88bd --- /dev/null +++ b/desktop/cw_helper.c @@ -0,0 +1,92 @@ +/* + * Copyright 2019 Daniel Silverstone + * Copyright 2019 Michael Drake + * + * 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 . + */ + +/** + * \file + * + * Helpers to simplify core use of corewindow. + */ + +#include "utils/errors.h" +#include "netsurf/browser.h" +#include "netsurf/core_window.h" +#include "netsurf/types.h" +#include "css/utils.h" +#include "desktop/cw_helper.h" + +/* exported interface documented in cw_helper.h */ +nserror cw_helper_scroll_visible( + const struct core_window_callback_table *cw_t, + struct core_window *cw_h, + const struct rect *r) +{ + nserror err; + int height; + int width; + int x0; + int y0; + int x1; + int y1; + + assert(cw_t != NULL); + assert(cw_h != NULL); + assert(cw_t->get_scroll != NULL); + assert(cw_t->set_scroll != NULL); + assert(cw_t->get_window_dimensions != NULL); + + err = cw_t->get_window_dimensions(cw_h, &width, &height); + if (err != NSERROR_OK) { + return err; + } + + cw_t->get_scroll(cw_h, &x0, &y0); + if (err != NSERROR_OK) { + return err; + } + + y1 = y0 + height; + x1 = x0 + width; + + if (r->y1 > y1) { + /* The bottom of the rectangle is off the bottom of the + * window, so scroll down to fit it + */ + y0 = r->y1 - height; + } + if (r->y0 < y0) { + /* The top of the rectangle is off the top of the window, + * so scroll up to fit it + */ + y0 = r->y0; + } + if (r->x1 > x1) { + /* The right of the rectangle is off the right of the window + * so scroll right to fit it + */ + x0 = r->x1 - width; + } + if (r->x0 < x0) { + /* The left of the rectangle is off the left of the window + * so scroll left to fit it + */ + x0 = r->x0; + } + + return cw_t->set_scroll(cw_h, x0, y0); +} -- cgit v1.2.3