From 5cbc7de33f4e526b009fd0d9ade8623182ff1bfd Mon Sep 17 00:00:00 2001 From: Moritz Lipp Date: Sun, 27 Jun 2010 09:38:45 +0200 Subject: [PATCH] Smooth scrolling With this commit it is possible to activate a smoother scrolling by setting smooth_scrolling in the zathurarc file to e.g. 2.0. --- config.def.h | 18 ++++++++++-------- zathura.c | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/config.def.h b/config.def.h index 41a64dd..5b5a326 100644 --- a/config.def.h +++ b/config.def.h @@ -1,11 +1,12 @@ /* settings */ -int default_width = 800; -int default_height = 600; -float zoom_step = 10; -float zoom_min = 10; -float zoom_max = 400; -float scroll_step = 40; -float transparency = 0.4; +int default_width = 800; +int default_height = 600; +float zoom_step = 10; +float zoom_min = 10; +float zoom_max = 400; +float scroll_step = 40; +float transparency = 0.4; +float smooth_scrolling = 0.0; /* completion */ static const char FORMAT_COMMAND[] = "%s"; @@ -82,7 +83,6 @@ Shortcut shortcuts[] = { {0, GDK_K, sc_navigate, NORMAL, { PREVIOUS } }, {GDK_MOD1_MASK, GDK_Right, sc_navigate, NORMAL, { NEXT } }, {GDK_MOD1_MASK, GDK_Left, sc_navigate, NORMAL, { PREVIOUS } }, - {0, GDK_space, sc_navigate, NORMAL, { NEXT } }, {0, GDK_Left, sc_navigate, FULLSCREEN, { PREVIOUS } }, {0, GDK_Up, sc_navigate, FULLSCREEN, { PREVIOUS } }, {0, GDK_Down, sc_navigate, FULLSCREEN, { NEXT } }, @@ -111,6 +111,7 @@ Shortcut shortcuts[] = { {GDK_CONTROL_MASK, GDK_u, sc_scroll, NORMAL, { HALF_UP } }, {GDK_CONTROL_MASK, GDK_f, sc_scroll, NORMAL, { FULL_DOWN } }, {GDK_CONTROL_MASK, GDK_b, sc_scroll, NORMAL, { FULL_UP } }, + {0, GDK_space, sc_scroll, NORMAL, { FULL_DOWN } }, {0, GDK_O, sc_switch_goto_mode, NORMAL, {0} }, {0, GDK_F5, sc_toggle_fullscreen, NORMAL | FULLSCREEN, {0} }, {0, GDK_Tab, sc_toggle_index, NORMAL | INDEX, {0} }, @@ -220,6 +221,7 @@ Setting settings[] = { {"show_inputbar", &(Zathura.Global.show_inputbar), 'b', FALSE, TRUE, "Show inputbar"}, {"search_highlight", &(search_highlight), 's', FALSE, TRUE, "Highlighted results"}, {"select_text", &(select_text), 's', FALSE, TRUE, "Rectangle of the selected text"}, + {"smooth_scrolling", &(smooth_scrolling), 'f', FALSE, TRUE, "Show scrollbars"}, {"statusbar_bgcolor", &(statusbar_bgcolor), 's', FALSE, TRUE, "Statusbar background color"}, {"statusbar_fgcolor", &(statusbar_fgcolor), 's', FALSE, TRUE, "Statusbar foreground color"}, {"transparency", &(transparency), 'f', FALSE, FALSE, "Transparency of rectangles"}, diff --git a/zathura.c b/zathura.c index 1dfd4a5..2f1285f 100644 --- a/zathura.c +++ b/zathura.c @@ -1866,6 +1866,8 @@ sc_scroll(Argument* argument) gdouble view_size = gtk_adjustment_get_page_size(adjustment); gdouble value = gtk_adjustment_get_value(adjustment); gdouble max = gtk_adjustment_get_upper(adjustment) - view_size; + gdouble new_value = value; + gboolean static ss = FALSE; if((argument->n == UP || argument->n == HALF_UP || argument->n == FULL_UP) && value == 0) { @@ -1873,30 +1875,48 @@ sc_scroll(Argument* argument) arg.n = PREVIOUS; sc_navigate(&arg); arg.n = BOTTOM; + ss = TRUE; sc_scroll(&arg); + return; } else if((argument->n == DOWN || argument->n == HALF_DOWN || argument->n == FULL_DOWN) && value == max) { Argument arg; arg.n = NEXT; + ss = TRUE; sc_navigate(&arg); + return; } else if(argument->n == FULL_UP) - gtk_adjustment_set_value(adjustment, (value - view_size) < 0 ? 0 : (value - view_size)); + new_value = (value - view_size) < 0 ? 0 : (value - view_size); else if(argument->n == FULL_DOWN) - gtk_adjustment_set_value(adjustment, (value + view_size) > max ? max : (value + view_size)); + new_value = (value + view_size) > max ? max : (value + view_size); else if(argument->n == HALF_UP) - gtk_adjustment_set_value(adjustment, (value - (view_size / 2)) < 0 ? 0 : (value - (view_size / 2))); + new_value = (value - (view_size / 2)) < 0 ? 0 : (value - (view_size / 2)); else if(argument->n == HALF_DOWN) - gtk_adjustment_set_value(adjustment, (value + (view_size / 2)) > max ? max : (value + (view_size / 2))); + new_value = (value + (view_size / 2)) > max ? max : (value + (view_size / 2)); else if((argument->n == LEFT) || (argument->n == UP)) - gtk_adjustment_set_value(adjustment, (value - scroll_step) < 0 ? 0 : (value - scroll_step)); + new_value = (value - scroll_step) < 0 ? 0 : (value - scroll_step); else if(argument->n == TOP) - gtk_adjustment_set_value(adjustment, 0); + new_value = 0; else if(argument->n == BOTTOM) - gtk_adjustment_set_value(adjustment, max); + new_value = max; else - gtk_adjustment_set_value(adjustment, (value + scroll_step) > max ? max : (value + scroll_step)); + new_value = (value + scroll_step) > max ? max : (value + scroll_step); + + if(smooth_scrolling && !ss) + { + gdouble i; + if(new_value > value) + for(i = value; (i + smooth_scrolling) < new_value; i += smooth_scrolling) + gtk_adjustment_set_value(adjustment, i); + else + for(i = value; (i + smooth_scrolling) > new_value; i -= smooth_scrolling) + gtk_adjustment_set_value(adjustment, i); + } + + gtk_adjustment_set_value(adjustment, new_value); + ss = FALSE; update_status(); }