diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2022-07-24 23:14:36 +0200 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2022-07-24 23:15:18 +0200 |
commit | 259d0ac860bfa7f01131d42ab4c1093b092ef9ee (patch) | |
tree | 56f873ad1884974cbc1bd0984eac58ee000f2232 | |
parent | aa985514a6b29d405209ae97cf54958997d821c4 (diff) | |
download | tdv-259d0ac860bfa7f01131d42ab4c1093b092ef9ee.tar.gz tdv-259d0ac860bfa7f01131d42ab4c1093b092ef9ee.tar.xz tdv-259d0ac860bfa7f01131d42ab4c1093b092ef9ee.zip |
sdgui: support touch screen dragging for the view
-rw-r--r-- | src/stardict-view.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/stardict-view.c b/src/stardict-view.c index 2ac02e0..62a4b2b 100644 --- a/src/stardict-view.c +++ b/src/stardict-view.c @@ -223,6 +223,7 @@ struct _StardictView gchar *matched; ///< Highlight common word part of this gint top_offset; ///< Pixel offset into the entry + gdouble drag_last_offset; ///< Last offset when dragging // TODO: think about making it, e.g., a pair of (ViewEntry *, guint) // NOTE: this is the index of a Pango paragraph (a virtual entity) guint selected; ///< Offset to the selected definition @@ -501,6 +502,38 @@ stardict_view_scroll_event (GtkWidget *widget, GdkEventScroll *event) } static void +on_drag_begin (GtkGestureDrag *drag, G_GNUC_UNUSED gdouble start_x, + G_GNUC_UNUSED gdouble start_y, gpointer user_data) +{ + GtkGesture *gesture = GTK_GESTURE (drag); + GdkEventSequence *sequence + = gtk_gesture_get_last_updated_sequence (gesture); + + GdkModifierType state = 0; + const GdkEvent *last_event = gtk_gesture_get_last_event (gesture, sequence); + gdk_event_get_state (last_event, &state); + if (state & gtk_accelerator_get_default_mod_mask ()) + gtk_gesture_set_sequence_state (gesture, sequence, + GTK_EVENT_SEQUENCE_DENIED); + else + { + gtk_gesture_set_sequence_state (gesture, sequence, + GTK_EVENT_SEQUENCE_CLAIMED); + STARDICT_VIEW (user_data)->drag_last_offset = 0; + } +} + +static void +on_drag_update (G_GNUC_UNUSED GtkGestureDrag *drag, + G_GNUC_UNUSED gdouble offset_x, gdouble offset_y, gpointer user_data) +{ + StardictView *self = STARDICT_VIEW (user_data); + self->top_offset += self->drag_last_offset - offset_y; + adjust_for_offset (self); + self->drag_last_offset = offset_y; +} + +static void stardict_view_class_init (StardictViewClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -523,6 +556,15 @@ stardict_view_class_init (StardictViewClass *klass) static void stardict_view_init (G_GNUC_UNUSED StardictView *self) { + GtkGesture *drag = gtk_gesture_drag_new (GTK_WIDGET (self)); + gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (drag), TRUE); + gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (drag), + GTK_PHASE_BUBBLE); + g_object_set_data_full (G_OBJECT (self), "stardict-view-drag-gesture", + drag, g_object_unref); + + g_signal_connect (drag, "drag-begin", G_CALLBACK (on_drag_begin), self); + g_signal_connect (drag, "drag-update", G_CALLBACK (on_drag_update), self); } // --- Public ------------------------------------------------------------------ |