diff options
-rw-r--r-- | libview/ev-view-private.h | 4 | ||||
-rw-r--r-- | libview/ev-view.c | 68 | ||||
-rw-r--r-- | libview/ev-view.h | 2 |
3 files changed, 64 insertions, 10 deletions
diff --git a/libview/ev-view-private.h b/libview/ev-view-private.h index 8957dad8..6e41d2ad 100644 --- a/libview/ev-view-private.h +++ b/libview/ev-view-private.h @@ -202,6 +202,10 @@ struct _EvView { /* Accessibility */ AtkObject *accessible; + + /* Gestures */ + GtkGesture *zoom_gesture; + gdouble prev_zoom_gesture_scale; }; struct _EvViewClass { diff --git a/libview/ev-view.c b/libview/ev-view.c index 86eef350..77851234 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -3609,7 +3609,10 @@ ev_view_button_press_event (GtkWidget *widget, if (!view->document) return FALSE; - + + if (gtk_gesture_is_recognized (view->zoom_gesture)) + return TRUE; + if (!gtk_widget_has_focus (widget)) { gtk_widget_grab_focus (widget); } @@ -3922,6 +3925,9 @@ ev_view_motion_notify_event (GtkWidget *widget, if (!view->document) return FALSE; + if (gtk_gesture_is_recognized (view->zoom_gesture)) + return TRUE; + bin_window = gtk_widget_get_window (widget); if (event->is_hint || event->window != bin_window) { @@ -4082,6 +4088,9 @@ ev_view_button_release_event (GtkWidget *widget, view->image_dnd_info.in_drag = FALSE; + if (gtk_gesture_is_recognized (view->zoom_gesture)) + return TRUE; + if (view->scroll_info.autoscrolling) { ev_view_autoscroll_stop (view); view->pressed_button = -1; @@ -4567,6 +4576,8 @@ ev_view_finalize (GObject *object) g_object_unref (view->image_dnd_info.image); view->image_dnd_info.image = NULL; + g_object_unref (view->zoom_gesture); + G_OBJECT_CLASS (ev_view_parent_class)->finalize (object); } @@ -4890,6 +4901,33 @@ on_notify_scale_factor (EvView *view, } static void +zoom_gesture_begin_cb (GtkGesture *gesture, + GdkEventSequence *sequence, + EvView *view) +{ + view->prev_zoom_gesture_scale = 1; +} + +static void +zoom_gesture_scale_changed_cb (GtkGestureZoom *gesture, + gdouble scale, + EvView *view) +{ + gdouble factor; + + view->drag_info.in_drag = FALSE; + view->image_dnd_info.in_drag = FALSE; + + factor = scale - view->prev_zoom_gesture_scale + 1; + view->prev_zoom_gesture_scale = scale; + ev_document_model_set_sizing_mode (view->model, EV_SIZING_FREE); + + if ((factor < 1.0 && ev_view_can_zoom_out (view)) || + (factor >= 1.0 && ev_view_can_zoom_in (view))) + ev_view_zoom (view, factor); +} + +static void ev_view_init (EvView *view) { GtkStyleContext *context; @@ -4904,6 +4942,7 @@ ev_view_init (EvView *view) gtk_style_context_add_class (context, "view"); gtk_widget_set_events (GTK_WIDGET (view), + GDK_TOUCH_MASK | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | @@ -4938,6 +4977,15 @@ ev_view_init (EvView *view) g_signal_connect (view, "notify::scale-factor", G_CALLBACK (on_notify_scale_factor), NULL); + + view->zoom_gesture = gtk_gesture_zoom_new (GTK_WIDGET (view)); + gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (view->zoom_gesture), + GTK_PHASE_CAPTURE); + + g_signal_connect (view->zoom_gesture, "begin", + G_CALLBACK (zoom_gesture_begin_cb), view); + g_signal_connect (view->zoom_gesture, "scale-changed", + G_CALLBACK (zoom_gesture_scale_changed_cb), view); } /*** Callbacks ***/ @@ -5447,27 +5495,27 @@ ev_view_can_zoom_out (EvView *view) } void -ev_view_zoom_in (EvView *view) +ev_view_zoom (EvView *view, gdouble factor) { gdouble scale; g_return_if_fail (view->sizing_mode == EV_SIZING_FREE); view->pending_scroll = SCROLL_TO_CENTER; - scale = ev_document_model_get_scale (view->model) * ZOOM_IN_FACTOR; + scale = ev_document_model_get_scale (view->model) * factor; ev_document_model_set_scale (view->model, scale); } void -ev_view_zoom_out (EvView *view) +ev_view_zoom_in (EvView *view) { - gdouble scale; - - g_return_if_fail (view->sizing_mode == EV_SIZING_FREE); + ev_view_zoom (view, ZOOM_IN_FACTOR); +} - view->pending_scroll = SCROLL_TO_CENTER; - scale = ev_document_model_get_scale (view->model) * ZOOM_OUT_FACTOR; - ev_document_model_set_scale (view->model, scale); +void +ev_view_zoom_out (EvView *view) +{ + ev_view_zoom (view, ZOOM_OUT_FACTOR); } static double diff --git a/libview/ev-view.h b/libview/ev-view.h index 85c942df..31a9bf41 100644 --- a/libview/ev-view.h +++ b/libview/ev-view.h @@ -68,6 +68,8 @@ gboolean ev_view_can_zoom_in (EvView *view); void ev_view_zoom_in (EvView *view); gboolean ev_view_can_zoom_out (EvView *view); void ev_view_zoom_out (EvView *view); +void ev_view_zoom (EvView *view, + gdouble factor); /* Find */ void ev_view_find_next (EvView *view); |