From 4c898a1f455d07ca002725775e61068388025407 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Thu, 10 Feb 2022 12:10:24 +0100 Subject: CrystFELImageView: Handle smooth scrolling events Fixes: https://gitlab.desy.de/thomas.white/crystfel/-/issues/58 --- src/crystfelimageview.c | 61 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 20 deletions(-) (limited to 'src/crystfelimageview.c') diff --git a/src/crystfelimageview.c b/src/crystfelimageview.c index 05e4f7c8..74d8cca5 100644 --- a/src/crystfelimageview.c +++ b/src/crystfelimageview.c @@ -127,33 +127,20 @@ static void configure_scroll_adjustments(CrystFELImageView *iv) } -static gint scroll_sig(GtkWidget *window, GdkEventScroll *event, - CrystFELImageView *iv) +static void handle_scroll_click(double zoom_scale, + CrystFELImageView *iv, + GdkEventScroll *event) { - double zoom_scale, ratio; - int claim = FALSE; + double ratio; int zoom_allowed = 1; - if ( iv->image == NULL ) return FALSE; - - if ( event->direction == GDK_SCROLL_UP ) { - zoom_scale = 1.1; - claim = TRUE; - } - if ( event->direction == GDK_SCROLL_DOWN ) { - zoom_scale = 0.9; - claim = TRUE; - } - if ( event->direction == GDK_SCROLL_LEFT ) return TRUE; - if ( event->direction == GDK_SCROLL_RIGHT ) return TRUE; - /* Size of a detector pixel in screen pixels */ ratio = iv->zoom * iv->image->detgeom->panels[0].pixel_pitch; if ( (ratio < 0.05) && (zoom_scale < 1.0) ) zoom_allowed = 0; if ( (ratio > 100.0) && (zoom_scale > 1.0) ) zoom_allowed = 0; - if ( claim && zoom_allowed ) { + if ( zoom_allowed ) { double shift_x, shift_y; double scr_x, scr_y; @@ -173,8 +160,42 @@ static gint scroll_sig(GtkWidget *window, GdkEventScroll *event, redraw(iv); } +} + + +static gint scroll_sig(GtkWidget *window, GdkEventScroll *event, + CrystFELImageView *iv) +{ + double xs, ys; + + if ( iv->image == NULL ) return FALSE; + + switch ( event->direction ) { + + case GDK_SCROLL_SMOOTH: + if ( gdk_event_get_scroll_deltas((GdkEvent *)event, &xs, &ys) ) { + handle_scroll_click(1.0-ys*0.1, iv, event); + } + return TRUE; + + case GDK_SCROLL_UP: + handle_scroll_click(1.1, iv, event); + return TRUE; + + case GDK_SCROLL_DOWN: + handle_scroll_click(0.9, iv, event); + return TRUE; - return claim; + case GDK_SCROLL_LEFT: + return TRUE; /* Do not propagate further */ + + case GDK_SCROLL_RIGHT: + return TRUE; /* Do not propagate further */ + + default: + printf("Unhandled scroll direction %i\n", event->direction); + return FALSE; + } } @@ -848,7 +869,7 @@ GtkWidget *crystfel_image_view_new() | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK - | GDK_SCROLL_MASK); + | GDK_SCROLL_MASK | GDK_SMOOTH_SCROLL_MASK); gtk_widget_grab_focus(GTK_WIDGET(iv)); -- cgit v1.2.3