[gtksourceview/wip/chergert/hoverers] more wip on hover



commit 3958748ea95a3e7a542973c13d3e4649ba08ec8a
Author: Christian Hergert <chergert redhat com>
Date:   Mon Mar 8 18:55:07 2021 -0800

    more wip on hover

 gtksourceview/gtksourcehover.c | 116 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 113 insertions(+), 3 deletions(-)
---
diff --git a/gtksourceview/gtksourcehover.c b/gtksourceview/gtksourcehover.c
index 9cff9e16..9b8b6e79 100644
--- a/gtksourceview/gtksourcehover.c
+++ b/gtksourceview/gtksourcehover.c
@@ -25,24 +25,89 @@
 #include "gtksourcehover-private.h"
 #include "gtksourcehovercontext.h"
 #include "gtksourcehoverprovider.h"
+#include "gtksourcesignalgroup-private.h"
 #include "gtksourceview.h"
 
 struct _GtkSourceHover
 {
   GObject             parent_instance;
+
   GtkSourceView      *view;
-  GPtrArray          *providers;
   GtkSourceAssistant *assistant;
+
+  GPtrArray          *providers;
+
+  guint               delay_display_source;
+  guint               dismiss_source;
 };
 
 G_DEFINE_TYPE (GtkSourceHover, gtk_source_hover, G_TYPE_OBJECT)
 
+static gboolean
+on_key_pressed_cb (GtkSourceHover        *hover,
+                   guint                  keyval,
+                   guint                  keycode,
+                   GdkModifierType        state,
+                   GtkEventControllerKey *controller)
+{
+       g_assert (GTK_SOURCE_IS_HOVER (hover));
+       g_assert (GTK_IS_EVENT_CONTROLLER_KEY (controller));
+
+       return GDK_EVENT_PROPAGATE;
+}
+
+static void
+on_focus_enter_cb (GtkSourceHover          *hover,
+                   GtkEventControllerFocus *controller)
+{
+       g_assert (GTK_SOURCE_IS_HOVER (hover));
+       g_assert (GTK_IS_EVENT_CONTROLLER_FOCUS (controller));
+
+}
+
+static void
+on_focus_leave_cb (GtkSourceHover          *hover,
+                   GtkEventControllerFocus *controller)
+{
+       g_assert (GTK_SOURCE_IS_HOVER (hover));
+       g_assert (GTK_IS_EVENT_CONTROLLER_FOCUS (controller));
+
+}
+
+static void
+on_motion_cb (GtkSourceHover           *hover,
+              double                    x,
+              double                    y,
+              GtkEventControllerMotion *controller)
+{
+       g_assert (GTK_SOURCE_IS_HOVER (hover));
+       g_assert (GTK_IS_EVENT_CONTROLLER_MOTION (controller));
+
+}
+
+static gboolean
+on_scroll_cb (GtkSourceHover           *hover,
+              double                    dx,
+              double                    dy,
+              GtkEventControllerScroll *controller)
+{
+       g_assert (GTK_SOURCE_IS_HOVER (hover));
+       g_assert (GTK_IS_EVENT_CONTROLLER_SCROLL (controller));
+
+       return GDK_EVENT_PROPAGATE;
+}
+
 static void
 gtk_source_hover_dispose (GObject *object)
 {
        GtkSourceHover *self = (GtkSourceHover *)object;
 
-       self->view = NULL;
+       g_clear_pointer (&self->assistant, _gtk_source_assistant_destroy);
+
+       g_clear_weak_pointer (&self->view);
+
+       g_clear_handle_id (&self->delay_display_source, g_source_remove);
+       g_clear_handle_id (&self->dismiss_source, g_source_remove);
 
        if (self->providers->len > 0)
        {
@@ -59,6 +124,9 @@ gtk_source_hover_finalize (GObject *object)
 
        g_clear_pointer (&self->providers, g_ptr_array_unref);
 
+       g_assert (self->delay_display_source == 0);
+       g_assert (self->dismiss_source == 0);
+
        G_OBJECT_CLASS (gtk_source_hover_parent_class)->finalize (object);
 }
 
@@ -81,11 +149,53 @@ GtkSourceHover *
 _gtk_source_hover_new (GtkSourceView *view)
 {
        GtkSourceHover *self;
+       GtkEventController *focus;
+       GtkEventController *key;
+       GtkEventController *motion;
+       GtkEventController *scroll;
 
        g_return_val_if_fail (GTK_SOURCE_IS_VIEW (view), NULL);
 
        self = g_object_new (GTK_SOURCE_TYPE_HOVER, NULL);
-       self->view = view;
+
+       g_set_weak_pointer (&self->view, view);
+
+       key = gtk_event_controller_key_new ();
+       g_signal_connect_object (key,
+                                "key-pressed",
+                                G_CALLBACK (on_key_pressed_cb),
+                                self,
+                                G_CONNECT_SWAPPED);
+       gtk_widget_add_controller (GTK_WIDGET (self), key);
+
+       focus = gtk_event_controller_focus_new ();
+       g_signal_connect_object (focus,
+                                "enter",
+                                G_CALLBACK (on_focus_enter_cb),
+                                self,
+                                G_CONNECT_SWAPPED);
+       g_signal_connect_object (focus,
+                                "leave",
+                                G_CALLBACK (on_focus_leave_cb),
+                                self,
+                                G_CONNECT_SWAPPED);
+       gtk_widget_add_controller (GTK_WIDGET (self), focus);
+
+       motion = gtk_event_controller_motion_new ();
+       g_signal_connect_object (motion,
+                                "motion",
+                                G_CALLBACK (on_motion_cb),
+                                self,
+                                G_CONNECT_SWAPPED);
+       gtk_widget_add_controller (GTK_WIDGET (self), motion);
+
+       scroll = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES);
+       g_signal_connect_object (scroll,
+                                "scroll",
+                                G_CALLBACK (on_scroll_cb),
+                                self,
+                                G_CONNECT_SWAPPED);
+       gtk_widget_add_controller (GTK_WIDGET (self), scroll);
 
        return self;
 }


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