diff options
author | Vincent Sanders <vince@kyllikki.org> | 2019-08-03 14:26:55 +0100 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2019-08-03 15:50:43 +0100 |
commit | 402e16e5d1e88a3844b900c485d9fc7c4093f2ab (patch) | |
tree | 7a46b3159c1edeba5f178134539b2c564c6095fe /desktop | |
parent | d4c01894c21559cd4199c0f15b9e8b7bec4b692c (diff) | |
download | netsurf-402e16e5d1e88a3844b900c485d9fc7c4093f2ab.tar.gz netsurf-402e16e5d1e88a3844b900c485d9fc7c4093f2ab.tar.bz2 |
improve browser_window_set_scale
Allow scale setting to use an absolute value or a relative value. This
also imposes sanity limits on the scale range (currently 0.2 to 10.0)
and removes the old junk "all" parameter.
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/browser_window.c | 81 |
1 files changed, 59 insertions, 22 deletions
diff --git a/desktop/browser_window.c b/desktop/browser_window.c index 00de0bef6..56b9477f9 100644 --- a/desktop/browser_window.c +++ b/desktop/browser_window.c @@ -28,6 +28,11 @@ * Browser window creation and manipulation implementation. */ +/** smallest scale that can be applied to a browser window*/ +#define SCALE_MINIMUM 0.2 +/** largests scale that can be applied to a browser window*/ +#define SCALE_MAXIMUM 10.0 + #include "utils/config.h" #include <assert.h> @@ -1337,32 +1342,40 @@ static bool frag_scroll(struct browser_window *bw) * Set browser window scale. * * \param bw Browser window. - * \param scale value. + * \param absolute scale value. + * \return NSERROR_OK on success else error code */ -static void +static nserror browser_window_set_scale_internal(struct browser_window *bw, float scale) { int i; - hlcache_handle *c; + nserror res = NSERROR_OK; - if (fabs(bw->scale-scale) < 0.0001) - return; + /* do not apply tiny changes in scale */ + if (fabs(bw->scale - scale) < 0.0001) + return res; bw->scale = scale; - c = bw->current_content; - if (c != NULL) { - if (content_can_reformat(c) == false) { + if (bw->current_content != NULL) { + if (content_can_reformat(bw->current_content) == false) { browser_window_update(bw, false); } else { - browser_window_schedule_reformat(bw); + res = browser_window_schedule_reformat(bw); } } - for (i = 0; i < (bw->cols * bw->rows); i++) - browser_window_set_scale_internal(&bw->children[i], scale); - for (i = 0; i < bw->iframe_count; i++) - browser_window_set_scale_internal(&bw->iframes[i], scale); + /* scale frames */ + for (i = 0; i < (bw->cols * bw->rows); i++) { + res = browser_window_set_scale_internal(&bw->children[i], scale); + } + + /* sale iframes */ + for (i = 0; i < bw->iframe_count; i++) { + res = browser_window_set_scale_internal(&bw->iframes[i], scale); + } + + return res; } @@ -3269,9 +3282,7 @@ nserror browser_window_schedule_reformat(struct browser_window *bw) return NSERROR_BAD_PARAMETER; } - guit->misc->schedule(0, scheduled_reformat, bw); - - return NSERROR_OK; + return guit->misc->schedule(0, scheduled_reformat, bw); } @@ -3304,18 +3315,44 @@ void browser_window_reformat(struct browser_window *bw, bool background, /* exported interface documented in netsurf/browser_window.h */ -void browser_window_set_scale(struct browser_window *bw, float scale, bool all) +nserror +browser_window_set_scale(struct browser_window *bw, float scale, bool absolute) { - while (bw->parent && all) { + nserror res; + + /* get top browser window */ + while (bw->parent) { bw = bw->parent; } - browser_window_set_scale_internal(bw, scale); + if (absolute) { + /* ensure "close" to 1 is treated as 1 */ + if (scale > 0.95 && scale < 1.05) { + scale = 1.0; + } + } else { + /* ensure "close" to 1 is treated as 1 */ + if ((scale + bw->scale) > (1.01 - scale) && + (scale + bw->scale) < (0.99 + scale)) { + scale = 1.0; + } else { + scale += bw->scale; + } + } + + /* clamp range between 0.1 and 10 (10% and 1000%) */ + if (scale < SCALE_MINIMUM) { + scale = SCALE_MINIMUM; + } else if (scale > SCALE_MAXIMUM) { + scale = SCALE_MAXIMUM; + } - if (bw->parent) - bw = bw->parent; + res = browser_window_set_scale_internal(bw, scale); + if (res == NSERROR_OK) { + browser_window_recalculate_frameset(bw); + } - browser_window_recalculate_frameset(bw); + return res; } |