[gtksourceview] view: hide assistants on scroll events



commit 4cbbbc0e812ea524b8e6738f8cb57b5807c37a04
Author: Christian Hergert <chergert redhat com>
Date:   Wed Aug 31 17:56:50 2022 -0700

    view: hide assistants on scroll events
    
    We still need to handle some cases better, particularly with completion
    and ensuring hover assistants can break on scroll internally, but it's a
    start towards that.

 gtksourceview/gtksourceview-assistants.c |  4 ++--
 gtksourceview/gtksourceview-private.h    |  1 +
 gtksourceview/gtksourceview.c            | 33 +++++++++++++++++++++++++++++---
 3 files changed, 33 insertions(+), 5 deletions(-)
---
diff --git a/gtksourceview/gtksourceview-assistants.c b/gtksourceview/gtksourceview-assistants.c
index 5f7c6639..459c6fbf 100644
--- a/gtksourceview/gtksourceview-assistants.c
+++ b/gtksourceview/gtksourceview-assistants.c
@@ -114,7 +114,7 @@ _gtk_source_view_assistants_size_allocate (GtkSourceViewAssistants *assistants,
        }
 }
 
-static gboolean
+gboolean
 _gtk_source_view_assistants_hide_all (GtkSourceViewAssistants *assistants)
 {
        gboolean ret = FALSE;
@@ -129,7 +129,7 @@ _gtk_source_view_assistants_hide_all (GtkSourceViewAssistants *assistants)
 
                if (gtk_widget_get_visible (GTK_WIDGET (assistant)))
                {
-                       gtk_popover_popdown (GTK_POPOVER (assistant));
+                       gtk_widget_hide (GTK_POPOVER (assistant));
                        ret = TRUE;
                }
        }
diff --git a/gtksourceview/gtksourceview-private.h b/gtksourceview/gtksourceview-private.h
index b19c344b..46460a6d 100644
--- a/gtksourceview/gtksourceview-private.h
+++ b/gtksourceview/gtksourceview-private.h
@@ -61,6 +61,7 @@ void     _gtk_source_view_assistants_remove        (GtkSourceViewAssistants *ass
                                                     GtkSourceAssistant      *assistant);
 void     _gtk_source_view_assistants_remove        (GtkSourceViewAssistants *assistants,
                                                     GtkSourceAssistant      *assistant);
+gboolean _gtk_source_view_assistants_hide_all      (GtkSourceViewAssistants *assistants);
 void     _gtk_source_view_assistants_shutdown      (GtkSourceViewAssistants *assistants);
 void     _gtk_source_view_assistants_size_allocate (GtkSourceViewAssistants *assistants,
                                                     int                      width,
diff --git a/gtksourceview/gtksourceview.c b/gtksourceview/gtksourceview.c
index cddbe44a..d0dc90b0 100644
--- a/gtksourceview/gtksourceview.c
+++ b/gtksourceview/gtksourceview.c
@@ -277,6 +277,10 @@ static gboolean       gtk_source_view_key_pressed          (GtkSourceView
                                                             guint                    keycode,
                                                             guint                    state,
                                                             GtkEventControllerKey   *controller);
+static void           gtk_source_view_scroll               (GtkSourceView           *view,
+                                                            double                   x,
+                                                            double                   y,
+                                                            GtkEventControllerScroll*scroll);
 static gint           calculate_real_tab_width             (GtkSourceView           *view,
                                                             guint                    tab_size,
                                                             gchar                    c);
@@ -1408,6 +1412,7 @@ gtk_source_view_init (GtkSourceView *view)
        GtkSourceViewPrivate *priv = gtk_source_view_get_instance_private (view);
        GtkStyleContext *context;
        GtkEventController *key;
+       GtkEventController *scroll;
        GtkDropTarget *dest;
 
        gtk_widget_add_css_class (GTK_WIDGET (view), "GtkSourceView");
@@ -1442,11 +1447,19 @@ gtk_source_view_init (GtkSourceView *view)
        key = gtk_event_controller_key_new ();
        gtk_event_controller_set_propagation_phase (key, GTK_PHASE_CAPTURE);
        g_signal_connect_swapped (key,
-                                 "key-pressed",
-                                 G_CALLBACK (gtk_source_view_key_pressed),
-                                 view);
+                                 "key-pressed",
+                                 G_CALLBACK (gtk_source_view_key_pressed),
+                                 view);
        gtk_widget_add_controller (GTK_WIDGET (view), g_steal_pointer (&key));
 
+       scroll = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES);
+       gtk_event_controller_set_propagation_phase (scroll, GTK_PHASE_CAPTURE);
+       g_signal_connect_swapped (scroll,
+                                 "scroll",
+                                 G_CALLBACK (gtk_source_view_scroll),
+                                 view);
+       gtk_widget_add_controller (GTK_WIDGET (view), g_steal_pointer (&scroll));
+
        dest = gtk_drop_target_new (GDK_TYPE_RGBA, GDK_ACTION_COPY);
        gtk_drop_target_set_preload (dest, TRUE);
        g_signal_connect (dest, "drop", G_CALLBACK (gtk_source_view_rgba_drop), view);
@@ -4194,6 +4207,20 @@ gtk_source_view_key_pressed (GtkSourceView         *view,
        return GDK_EVENT_PROPAGATE;
 }
 
+static void
+gtk_source_view_scroll (GtkSourceView            *view,
+                        double                    x,
+                        double                    y,
+                       GtkEventControllerScroll *scroll)
+{
+       GtkSourceViewPrivate *priv = gtk_source_view_get_instance_private (view);
+
+       g_assert (GTK_SOURCE_IS_VIEW (view));
+       g_assert (GTK_IS_EVENT_CONTROLLER_SCROLL (scroll));
+
+       _gtk_source_view_assistants_hide_all (&priv->assistants);
+}
+
 /**
  * gtk_source_view_get_auto_indent:
  * @view: a #GtkSourceView.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]