diff options
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/cw_helper.c | 92 | ||||
-rw-r--r-- | desktop/cw_helper.h | 38 |
2 files changed, 130 insertions, 0 deletions
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 <dsilvers@netsurf-browser.org> + * Copyright 2019 Michael Drake <tlsa@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 + * + * 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); +} diff --git a/desktop/cw_helper.h b/desktop/cw_helper.h new file mode 100644 index 000000000..83a85c1b5 --- /dev/null +++ b/desktop/cw_helper.h @@ -0,0 +1,38 @@ +/* + * Copyright 2019 Michael Drake <tlsa@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 + * + * Helpers to simplify core use of corewindow. + */ + +#ifndef NETSURF_DESKTOP_CW_HELPER_H_ +#define NETSURF_DESKTOP_CW_HELPER_H_ + +struct rect; +struct core_window; +struct core_window_callback_table; + +/* 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); + +#endif |