mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-11-22 06:21:45 +03:00
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.
This commit is contained in:
parent
641f5fb072
commit
8cff4b79d6
92
desktop/cw_helper.c
Normal file
92
desktop/cw_helper.c
Normal file
@ -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);
|
||||
}
|
38
desktop/cw_helper.h
Normal file
38
desktop/cw_helper.h
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user