summaryrefslogtreecommitdiff
path: root/gtksourceview
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2022-09-21 21:14:55 -0700
committerChristian Hergert <chergert@redhat.com>2022-09-21 21:14:55 -0700
commitae049441243ec838af7869c0d55390f4f5420f92 (patch)
tree6c8edef001ee544d07df97536633cd3ff1bc6100 /gtksourceview
parent248fb66737ec5af18844cffe725be998d83c972b (diff)
downloadgtksourceview-ae049441243ec838af7869c0d55390f4f5420f92.tar.gz
hover: don't dismiss hover request from click movement
If we click, and that causes the insertion mark to move, we don't want to cancel our request to potentially show hover information at that position or the user would have to wiggle to get it to show up.
Diffstat (limited to 'gtksourceview')
-rw-r--r--gtksourceview/gtksourcehover.c48
1 files changed, 47 insertions, 1 deletions
diff --git a/gtksourceview/gtksourcehover.c b/gtksourceview/gtksourcehover.c
index 21b46b66..8d1dfe8a 100644
--- a/gtksourceview/gtksourcehover.c
+++ b/gtksourceview/gtksourcehover.c
@@ -66,6 +66,8 @@ struct _GtkSourceHover
guint hover_delay;
GSource *settle_source;
+
+ guint in_click : 1;
};
G_DEFINE_TYPE (GtkSourceHover, gtk_source_hover, G_TYPE_OBJECT)
@@ -98,7 +100,10 @@ cursor_moved_cb (GtkSourceHover *self,
g_assert (GTK_SOURCE_IS_HOVER (self));
g_assert (GTK_SOURCE_IS_BUFFER (buffer));
- gtk_source_hover_dismiss (self);
+ if (!self->in_click)
+ {
+ gtk_source_hover_dismiss (self);
+ }
}
static void
@@ -416,6 +421,32 @@ gtk_source_hover_init (GtkSourceHover *self)
self->hover_delay = DEFAULT_HOVER_DELAY;
}
+static void
+gtk_source_hover_click_pressed_cb (GtkSourceHover *self,
+ int n_press,
+ double x,
+ double y,
+ GtkGestureClick *click)
+{
+ g_assert (GTK_SOURCE_IS_HOVER (self));
+ g_assert (GTK_IS_GESTURE_CLICK (click));
+
+ self->in_click = TRUE;
+}
+
+static void
+gtk_source_hover_click_released_cb (GtkSourceHover *self,
+ int n_press,
+ double x,
+ double y,
+ GtkGestureClick *click)
+{
+ g_assert (GTK_SOURCE_IS_HOVER (self));
+ g_assert (GTK_IS_GESTURE_CLICK (click));
+
+ self->in_click = FALSE;
+}
+
GtkSourceHover *
_gtk_source_hover_new (GtkSourceView *view)
{
@@ -423,6 +454,7 @@ _gtk_source_hover_new (GtkSourceView *view)
GtkEventController *key;
GtkEventController *motion;
GtkEventController *scroll;
+ GtkEventController *click;
g_return_val_if_fail (GTK_SOURCE_IS_VIEW (view), NULL);
@@ -452,6 +484,20 @@ _gtk_source_hover_new (GtkSourceView *view)
G_CONNECT_SWAPPED);
gtk_widget_add_controller (GTK_WIDGET (view), motion);
+ click = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ());
+ g_signal_connect_object (click,
+ "pressed",
+ G_CALLBACK (gtk_source_hover_click_pressed_cb),
+ self,
+ G_CONNECT_SWAPPED);
+ g_signal_connect_object (click,
+ "released",
+ G_CALLBACK (gtk_source_hover_click_released_cb),
+ self,
+ G_CONNECT_SWAPPED);
+ gtk_event_controller_set_propagation_phase (click, GTK_PHASE_CAPTURE);
+ gtk_widget_add_controller (GTK_WIDGET (view), click);
+
scroll = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES);
g_signal_connect_object (scroll,
"scroll",