From 85030ea2de02c16258e3d32a486af3d9fcf23c7b Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sat, 4 May 2013 19:40:11 +0100 Subject: Fix mouse wheel scrolling on gtk3 by implementing the smooth scroll direction Fix mouse wheel scrolling on gtk2 by setting a reasonable default step --- gtk/res/tabcontents.gtk2.ui | 4 +- gtk/window.c | 112 +++++++++++++++++++------------------------- 2 files changed, 51 insertions(+), 65 deletions(-) (limited to 'gtk') diff --git a/gtk/res/tabcontents.gtk2.ui b/gtk/res/tabcontents.gtk2.ui index e87249e74..63e290e8b 100644 --- a/gtk/res/tabcontents.gtk2.ui +++ b/gtk/res/tabcontents.gtk2.ui @@ -79,13 +79,13 @@ 100 - 1 + 30 10 10 100 - 1 + 30 10 10 diff --git a/gtk/window.c b/gtk/window.c index 7642e3b82..663ff32a3 100644 --- a/gtk/window.c +++ b/gtk/window.c @@ -384,105 +384,91 @@ static gboolean nsgtk_window_button_release_event(GtkWidget *widget, return TRUE; } -static gboolean nsgtk_window_scroll_event(GtkWidget *widget, - GdkEventScroll *event, gpointer data) +static gboolean +nsgtk_window_scroll_event(GtkWidget *widget, + GdkEventScroll *event, + gpointer data) { struct gui_window *g = data; double value; + double deltax = 0; + double deltay = 0; GtkAdjustment *vscroll = nsgtk_layout_get_vadjustment(g->layout); GtkAdjustment *hscroll = nsgtk_layout_get_hadjustment(g->layout); GtkAllocation alloc; - LOG(("%d", event->direction)); switch (event->direction) { case GDK_SCROLL_LEFT: - if (browser_window_scroll_at_point(g->bw, - event->x / g->bw->scale, - event->y / g->bw->scale, - -100, 0) != true) { - /* core did not handle event do horizontal scroll */ - - value = gtk_adjustment_get_value(hscroll) - - (nsgtk_adjustment_get_step_increment(hscroll) *2); - - if (value < nsgtk_adjustment_get_lower(hscroll)) { - value = nsgtk_adjustment_get_lower(hscroll); - } - - gtk_adjustment_set_value(hscroll, value); - } + deltax = -1.0; break; case GDK_SCROLL_UP: - if (browser_window_scroll_at_point(g->bw, - event->x / g->bw->scale, - event->y / g->bw->scale, - 0, -100) != true) { - /* core did not handle event change vertical - * adjustment. - */ + deltay = -1.0; + break; - value = gtk_adjustment_get_value(vscroll) - - (nsgtk_adjustment_get_step_increment(vscroll) * 2); + case GDK_SCROLL_RIGHT: + deltax = 1.0; + break; - if (value < nsgtk_adjustment_get_lower(vscroll)) { - value = nsgtk_adjustment_get_lower(vscroll); - } + case GDK_SCROLL_DOWN: + deltay = 1.0; + break; - gtk_adjustment_set_value(vscroll, value); - } +#if GTK_CHECK_VERSION(3,4,0) + case GDK_SCROLL_SMOOTH: + gdk_event_get_scroll_deltas((GdkEvent *)event, &deltax, &deltay); break; +#endif + default: + LOG(("Unhandled mouse scroll direction")); + return TRUE; + } - case GDK_SCROLL_RIGHT: - if (browser_window_scroll_at_point(g->bw, - event->x / g->bw->scale, - event->y / g->bw->scale, - 100, 0) != true) { + deltax *= nsgtk_adjustment_get_step_increment(hscroll); + deltay *= nsgtk_adjustment_get_step_increment(vscroll); + + LOG(("Scrolling %f, %f", deltax, deltay)); - /* core did not handle event change horizontal - * adjustment. - */ + if (browser_window_scroll_at_point(g->bw, + event->x / g->bw->scale, + event->y / g->bw->scale, + deltax, deltay) != true) { - value = gtk_adjustment_get_value(hscroll) + - (nsgtk_adjustment_get_step_increment(hscroll) * 2); + /* core did not handle event so change adjustments */ + + /* Horizontal */ + if (deltax != 0) { + value = gtk_adjustment_get_value(hscroll) + deltax; /* @todo consider gtk_widget_get_allocated_width() */ nsgtk_widget_get_allocation(GTK_WIDGET(g->layout), &alloc); if (value > nsgtk_adjustment_get_upper(hscroll) - alloc.width) { - value = nsgtk_adjustment_get_upper(hscroll) - - alloc.width; + value = nsgtk_adjustment_get_upper(hscroll) - alloc.width; + } + if (value < nsgtk_adjustment_get_lower(hscroll)) { + value = nsgtk_adjustment_get_lower(hscroll); } gtk_adjustment_set_value(hscroll, value); } - break; - case GDK_SCROLL_DOWN: - if (browser_window_scroll_at_point(g->bw, - event->x / g->bw->scale, - event->y / g->bw->scale, - 0, 100) != true) { - /* core did not handle event change vertical - * adjustment. - */ - - value = gtk_adjustment_get_value(vscroll) + - (nsgtk_adjustment_get_step_increment(vscroll) * 2); + /* Vertical */ + if (deltay != 0) { + value = gtk_adjustment_get_value(vscroll) + deltay; + /* @todo consider gtk_widget_get_allocated_height */ nsgtk_widget_get_allocation(GTK_WIDGET(g->layout), &alloc); - if (value > nsgtk_adjustment_get_upper(vscroll) - alloc.height) { - value = nsgtk_adjustment_get_upper(vscroll) - - alloc.height; + if (value > (nsgtk_adjustment_get_upper(vscroll) - alloc.height)) { + value = nsgtk_adjustment_get_upper(vscroll) - alloc.height; + } + if (value < nsgtk_adjustment_get_lower(vscroll)) { + value = nsgtk_adjustment_get_lower(vscroll); } gtk_adjustment_set_value(vscroll, value); } - break; - - default: - break; } return TRUE; -- cgit v1.2.3