diff --git a/src/common/cfgfiles.c b/src/common/cfgfiles.c index 074fcb27..eff6d55c 100644 --- a/src/common/cfgfiles.c +++ b/src/common/cfgfiles.c @@ -447,6 +447,7 @@ const struct prefs vars[] = {"gui_tab_layout", P_OFFINT (hex_gui_tab_layout), TYPE_INT}, {"gui_tab_closebuttons", P_OFFINT (hex_gui_tab_closebuttons), TYPE_BOOL}, {"gui_tab_middleclose", P_OFFINT (hex_gui_tab_middleclose), TYPE_BOOL}, + {"gui_mouse_scroll_speed", P_OFFINT (hex_gui_mouse_scroll_speed), TYPE_INT}, {"gui_tab_newtofront", P_OFFINT (hex_gui_tab_newtofront), TYPE_INT}, {"gui_tab_pos", P_OFFINT (hex_gui_tab_pos), TYPE_INT}, {"gui_tab_scrollchans", P_OFFINT (hex_gui_tab_scrollchans), TYPE_BOOL}, @@ -783,6 +784,7 @@ load_default_config(void) prefs.hex_gui_tab_server = 1; prefs.hex_gui_tab_sort = 1; prefs.hex_gui_tab_scrollchans = 1; + prefs.hex_gui_mouse_scroll_speed = 10; prefs.hex_gui_topicbar = 1; prefs.hex_gui_transparency = 255; prefs.hex_gui_tray = 1; diff --git a/src/common/zoitechat.h b/src/common/zoitechat.h index adf8ca30..b67d1e70 100644 --- a/src/common/zoitechat.h +++ b/src/common/zoitechat.h @@ -267,6 +267,7 @@ struct zoitechatprefs int hex_gui_tab_layout; int hex_gui_tab_closebuttons; int hex_gui_tab_middleclose; + int hex_gui_mouse_scroll_speed; int hex_gui_tab_newtofront; int hex_gui_tab_pos; int hex_gui_tab_small; diff --git a/src/fe-gtk/chanview-tabs.c b/src/fe-gtk/chanview-tabs.c index 1b1eec8d..eafdba46 100644 --- a/src/fe-gtk/chanview-tabs.c +++ b/src/fe-gtk/chanview-tabs.c @@ -305,12 +305,14 @@ static gboolean tab_scroll_cb (GtkWidget *widget, GdkEventScroll *event, gpointer cv) { int direction = cv_scroll_direction (event); + int i; if (prefs.hex_gui_tab_scrollchans) { if (direction != 0) { - mg_switch_page (1, direction); + for (i = 0; i < cv_scroll_step_count (); i++) + mg_switch_page (1, direction); return TRUE; } } @@ -318,12 +320,14 @@ tab_scroll_cb (GtkWidget *widget, GdkEventScroll *event, gpointer cv) { if (direction < 0) { - tab_scroll_left_up_clicked (widget, cv); + for (i = 0; i < cv_scroll_step_count (); i++) + tab_scroll_left_up_clicked (widget, cv); return TRUE; } else if (direction > 0) { - tab_scroll_right_down_clicked (widget, cv); + for (i = 0; i < cv_scroll_step_count (); i++) + tab_scroll_right_down_clicked (widget, cv); return TRUE; } } diff --git a/src/fe-gtk/chanview-tree.c b/src/fe-gtk/chanview-tree.c index 9fa7c86b..10e4ae81 100644 --- a/src/fe-gtk/chanview-tree.c +++ b/src/fe-gtk/chanview-tree.c @@ -112,9 +112,11 @@ cv_tree_scroll_event_cb (GtkWidget *widget, GdkEventScroll *event, gpointer user if (prefs.hex_gui_tab_scrollchans) { int direction = cv_scroll_direction (event); + int i; if (direction != 0) - mg_switch_page (1, direction); + for (i = 0; i < cv_scroll_step_count (); i++) + mg_switch_page (1, direction); return direction != 0; } diff --git a/src/fe-gtk/chanview.c b/src/fe-gtk/chanview.c index 17bf874c..fae743a2 100644 --- a/src/fe-gtk/chanview.c +++ b/src/fe-gtk/chanview.c @@ -126,6 +126,15 @@ cv_scroll_direction (GdkEventScroll *event) } } +static int +cv_scroll_step_count (void) +{ + int speed = prefs.hex_gui_mouse_scroll_speed; + if (speed < 1) + speed = 1; + return (speed + 9) / 10; +} + /* ======= TABS ======= */ diff --git a/src/fe-gtk/setup.c b/src/fe-gtk/setup.c index cff68ad8..3cca789a 100644 --- a/src/fe-gtk/setup.c +++ b/src/fe-gtk/setup.c @@ -193,6 +193,7 @@ static const setting appearance_advanced_settings[] = {ST_HEADER, N_("Advanced"),0,0,0}, {ST_EFILE, N_ ("Background image:"), P_OFFSETNL (hex_text_background), 0, 0, sizeof prefs.hex_text_background}, {ST_HSCALE, N_("Window opacity:"), P_OFFINTNL(hex_gui_transparency),0,0,0}, + {ST_HSCALE, N_("Mouse wheel scroll speed (Slower ← → Faster):"), P_OFFINTNL(hex_gui_mouse_scroll_speed), 0, 0, 100}, {ST_END, 0, 0, 0, 0, 0} }; diff --git a/src/fe-gtk/xtext.c b/src/fe-gtk/xtext.c index 74188b8f..d05e4b48 100644 --- a/src/fe-gtk/xtext.c +++ b/src/fe-gtk/xtext.c @@ -2938,19 +2938,41 @@ gtk_xtext_scroll (GtkWidget *widget, GdkEventScroll *event) { GtkXText *xtext = GTK_XTEXT (widget); gfloat new_value; + gfloat step; + gdouble dx; + gdouble dy; + int direction = 0; + int speed = prefs.hex_gui_mouse_scroll_speed; - if (event->direction == GDK_SCROLL_UP) /* mouse wheel pageUp */ + if (speed < 1) + speed = 1; + step = (xtext_adj_get_page_increment (xtext->adj) * speed) / 100.0f; + + if (event->direction == GDK_SCROLL_SMOOTH && + gdk_event_get_scroll_deltas ((GdkEvent *)event, &dx, &dy)) + { + if (dy > 0) + direction = 1; + else if (dy < 0) + direction = -1; + } + else if (event->direction == GDK_SCROLL_UP) + direction = -1; + else if (event->direction == GDK_SCROLL_DOWN) + direction = 1; + + if (direction < 0) { new_value = xtext_adj_get_value (xtext->adj) - - (xtext_adj_get_page_increment (xtext->adj) / 10); + step; if (new_value < xtext_adj_get_lower (xtext->adj)) new_value = xtext_adj_get_lower (xtext->adj); xtext_adj_set_value (xtext->adj, new_value); } - else if (event->direction == GDK_SCROLL_DOWN) /* mouse wheel pageDn */ + else if (direction > 0) { new_value = xtext_adj_get_value (xtext->adj) + - (xtext_adj_get_page_increment (xtext->adj) / 10); + step; if (new_value > (xtext_adj_get_upper (xtext->adj) - xtext_adj_get_page_size (xtext->adj))) new_value = xtext_adj_get_upper (xtext->adj) - @@ -2958,7 +2980,7 @@ gtk_xtext_scroll (GtkWidget *widget, GdkEventScroll *event) xtext_adj_set_value (xtext->adj, new_value); } - return FALSE; + return direction != 0; } static void