summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <michael.drake@codethink.co.uk>2019-08-03 15:12:21 +0100
committerMichael Drake <michael.drake@codethink.co.uk>2019-08-03 15:54:46 +0100
commit8cff4b79d602b4437a81f3e008f22caf276d102a (patch)
treee027a8684daad2fa3daeafca09661158f0ee1cfa
parent641f5fb07204a9deb256557902707cd28182463d (diff)
downloadnetsurf-8cff4b79d602b4437a81f3e008f22caf276d102a.tar.gz
netsurf-8cff4b79d602b4437a81f3e008f22caf276d102a.tar.bz2
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.
-rw-r--r--desktop/cw_helper.c92
-rw-r--r--desktop/cw_helper.h38
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