diff options
author | Christian Hergert <chergert@redhat.com> | 2022-04-27 17:59:54 -0700 |
---|---|---|
committer | Christian Hergert <chergert@redhat.com> | 2022-04-27 18:00:22 -0700 |
commit | e9192e12482993937708072acae57a9bee97220d (patch) | |
tree | 46c40ce4240f4210bbe3abfb8fe8bab0b82ffefc | |
parent | 544ff4c9bd6a84ef7629fd4fb648cd0d65faf714 (diff) | |
download | gtksourceview-e9192e12482993937708072acae57a9bee97220d.tar.gz |
hover: dismiss hover when cursor moves
This will dismiss a pending hover if the user moves the cursor first.
-rw-r--r-- | gtksourceview/gtksourcehover.c | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/gtksourceview/gtksourcehover.c b/gtksourceview/gtksourcehover.c index 6ee59ba0..09fa09c9 100644 --- a/gtksourceview/gtksourcehover.c +++ b/gtksourceview/gtksourcehover.c @@ -22,6 +22,7 @@ #include "config.h" #include "gtksourceassistant-private.h" +#include "gtksourcebuffer.h" #include "gtksourcehover-private.h" #include "gtksourcehoverassistant-private.h" #include "gtksourcehovercontext.h" @@ -34,7 +35,7 @@ /** * GtkSourceHover: - * + * * Interactive tooltips. * * `GtkSourceHover` allows a [class@View] to provide contextual information. @@ -56,6 +57,7 @@ struct _GtkSourceHover GtkSourceView *view; GtkSourceAssistant *assistant; + GtkTextBuffer *buffer; GPtrArray *providers; @@ -76,6 +78,57 @@ enum { static GParamSpec *properties [N_PROPS]; +static void +cursor_moved_cb (GtkSourceHover *hover, + GtkSourceBuffer *buffer) +{ + g_assert (GTK_SOURCE_IS_HOVER (hover)); + g_assert (GTK_SOURCE_IS_BUFFER (buffer)); + + g_clear_handle_id (&hover->settle_source, g_source_remove); + _gtk_source_hover_assistant_dismiss (GTK_SOURCE_HOVER_ASSISTANT (hover->assistant)); +} + +static void +gtk_source_hover_notify_buffer (GtkSourceHover *hover, + GParamSpec *pspec, + GtkSourceView *view) +{ + GtkTextBuffer *buffer; + + g_assert (GTK_SOURCE_IS_HOVER (hover)); + g_assert (GTK_SOURCE_IS_VIEW (view)); + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); + + if (buffer == hover->buffer) + { + return; + } + + if (hover->buffer != NULL) + { + g_signal_handlers_disconnect_by_func (hover->buffer, + G_CALLBACK (cursor_moved_cb), + hover); + g_clear_weak_pointer (&hover->buffer); + } + + if (!GTK_SOURCE_IS_BUFFER (buffer)) + { + return; + } + + if (g_set_weak_pointer (&hover->buffer, buffer)) + { + g_signal_connect_object (hover->buffer, + "cursor-moved", + G_CALLBACK (cursor_moved_cb), + hover, + G_CONNECT_SWAPPED); + } +} + static gboolean gtk_source_hover_get_bounds (GtkSourceHover *self, GtkTextIter *begin, @@ -243,6 +296,7 @@ gtk_source_hover_dispose (GObject *object) g_clear_handle_id (&self->settle_source, g_source_remove); g_clear_pointer (&self->assistant, _gtk_source_assistant_destroy); g_clear_weak_pointer (&self->view); + g_clear_weak_pointer (&self->buffer); if (self->providers->len > 0) { @@ -377,6 +431,13 @@ _gtk_source_hover_new (GtkSourceView *view) G_CONNECT_SWAPPED); gtk_widget_add_controller (GTK_WIDGET (view), scroll); + g_signal_connect_object (view, + "notify::buffer", + G_CALLBACK (gtk_source_hover_notify_buffer), + self, + G_CONNECT_SWAPPED); + gtk_source_hover_notify_buffer (self, NULL, view); + return self; } |