From 984ac9763efd91556ddb31a502f5f26e9b58b677 Mon Sep 17 00:00:00 2001 From: deepend-tildeclub Date: Wed, 6 May 2026 13:10:30 -0600 Subject: [PATCH] Fix and Enable mouse wheel channel switching by default --- src/common/cfgfiles.c | 1 + src/fe-gtk/chanview-tabs.c | 22 +++++++++++++++------- src/fe-gtk/chanview-tree.c | 12 +++++++----- src/fe-gtk/chanview.c | 31 +++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/common/cfgfiles.c b/src/common/cfgfiles.c index 7437cc00..257625aa 100644 --- a/src/common/cfgfiles.c +++ b/src/common/cfgfiles.c @@ -782,6 +782,7 @@ load_default_config(void) prefs.hex_gui_tab_middleclose = 1; prefs.hex_gui_tab_server = 1; prefs.hex_gui_tab_sort = 1; + prefs.hex_gui_tab_scrollchans = 1; prefs.hex_gui_topicbar = 1; prefs.hex_gui_transparency = 255; prefs.hex_gui_tray = 1; diff --git a/src/fe-gtk/chanview-tabs.c b/src/fe-gtk/chanview-tabs.c index 1c49640b..1e6f670b 100644 --- a/src/fe-gtk/chanview-tabs.c +++ b/src/fe-gtk/chanview-tabs.c @@ -306,17 +306,18 @@ tab_scroll_cb (GtkWidget *widget, GdkEventScroll *event, gpointer cv) { if (prefs.hex_gui_tab_scrollchans) { - if (event->direction == GDK_SCROLL_DOWN) - mg_switch_page (1, 1); - else if (event->direction == GDK_SCROLL_UP) - mg_switch_page (1, -1); + int direction = cv_scroll_direction (event); + + if (direction != 0) + mg_switch_page (1, direction); } else { - /* mouse wheel scrolling */ - if (event->direction == GDK_SCROLL_UP) + int direction = cv_scroll_direction (event); + + if (direction < 0) tab_scroll_left_up_clicked (widget, cv); - else if (event->direction == GDK_SCROLL_DOWN) + else if (direction > 0) tab_scroll_right_down_clicked (widget, cv); } @@ -356,6 +357,7 @@ cv_tabs_init (chanview *cv) gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (viewport), 1); gtk_widget_set_hexpand (viewport, TRUE); gtk_widget_set_vexpand (viewport, TRUE); + cv_add_scroll_events (viewport); g_signal_connect (G_OBJECT (viewport), "scroll-event", G_CALLBACK (tab_scroll_cb), cv); gtk_box_pack_start (GTK_BOX (outer), viewport, 1, 1, 0); @@ -677,9 +679,11 @@ cv_tabs_add (chanview *cv, chan *ch, char *name, GtkTreeIter *parent) gtk_widget_set_name (but, "zoitechat-tab"); gtk_widget_set_size_request (but, -1, 14); gtk_widget_add_events (but, GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); + cv_add_scroll_events (but); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); label = gtk_label_new (name); close_button = gtk_button_new (); + cv_add_scroll_events (close_button); gtk_style_context_add_class (gtk_widget_get_style_context (close_button), "flat"); close_icon = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_MENU); gtk_image_set_pixel_size (GTK_IMAGE (close_icon), 8); @@ -695,6 +699,10 @@ cv_tabs_add (chanview *cv, chan *ch, char *name, GtkTreeIter *parent) /* used to trap right-clicks */ g_signal_connect (G_OBJECT (but), "button-press-event", G_CALLBACK (tab_click_cb), ch); + g_signal_connect (G_OBJECT (but), "scroll-event", + G_CALLBACK (tab_scroll_cb), cv); + g_signal_connect (G_OBJECT (close_button), "scroll-event", + G_CALLBACK (tab_scroll_cb), cv); g_signal_connect (G_OBJECT (but), "motion-notify-event", G_CALLBACK (tab_close_motion_cb), ch); g_signal_connect (G_OBJECT (but), "leave-notify-event", diff --git a/src/fe-gtk/chanview-tree.c b/src/fe-gtk/chanview-tree.c index d6083469..9fa7c86b 100644 --- a/src/fe-gtk/chanview-tree.c +++ b/src/fe-gtk/chanview-tree.c @@ -111,12 +111,12 @@ cv_tree_scroll_event_cb (GtkWidget *widget, GdkEventScroll *event, gpointer user { if (prefs.hex_gui_tab_scrollchans) { - if (event->direction == GDK_SCROLL_DOWN) - mg_switch_page (1, 1); - else if (event->direction == GDK_SCROLL_UP) - mg_switch_page (1, -1); + int direction = cv_scroll_direction (event); - return TRUE; + if (direction != 0) + mg_switch_page (1, direction); + + return direction != 0; } return FALSE; @@ -141,6 +141,7 @@ cv_tree_init (chanview *cv) win = gtk_scrolled_window_new (0, 0); gtk_widget_set_hexpand (win, TRUE); gtk_widget_set_vexpand (win, TRUE); + cv_add_scroll_events (win); /*gtk_container_set_border_width (GTK_CONTAINER (win), 1);*/ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (win), @@ -154,6 +155,7 @@ cv_tree_init (chanview *cv) view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (cv->store)); gtk_widget_set_hexpand (view, TRUE); gtk_widget_set_vexpand (view, TRUE); + cv_add_scroll_events (view); gtk_widget_set_name (view, "zoitechat-tree"); { ThemeWidgetStyleValues style_values; diff --git a/src/fe-gtk/chanview.c b/src/fe-gtk/chanview.c index 6c43b546..17bf874c 100644 --- a/src/fe-gtk/chanview.c +++ b/src/fe-gtk/chanview.c @@ -95,6 +95,37 @@ static chan *cv_find_chan_by_number (chanview *cv, int num); static int cv_find_number_of_chan (chanview *cv, chan *find_ch); static void cv_find_neighbors_for_removal (chanview *cv, chan *find_ch, chan **left_ch, chan **first_ch); +static void +cv_add_scroll_events (GtkWidget *widget) +{ + gtk_widget_add_events (widget, GDK_SCROLL_MASK | GDK_SMOOTH_SCROLL_MASK); +} + +static int +cv_scroll_direction (GdkEventScroll *event) +{ + gdouble dx; + gdouble dy; + + if (event->direction == GDK_SCROLL_SMOOTH && gdk_event_get_scroll_deltas ((GdkEvent *) event, &dx, &dy)) + { + if (dy > 0) + return 1; + if (dy < 0) + return -1; + } + + switch (event->direction) + { + case GDK_SCROLL_DOWN: + return 1; + case GDK_SCROLL_UP: + return -1; + default: + return 0; + } +} + /* ======= TABS ======= */