[vte] widget: gtk4: Add scroll event controller



commit 5f1039f1c86676f79642cb576ec6dbb4dcacd47a
Author: Christian Persch <chpe src gnome org>
Date:   Sat Mar 27 13:28:13 2021 +0100

    widget: gtk4: Add scroll event controller

 src/widget.cc | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/widget.hh |   8 +++++
 2 files changed, 114 insertions(+)
---
diff --git a/src/widget.cc b/src/widget.cc
index 0750e98b..9b7f3ca5 100644
--- a/src/widget.cc
+++ b/src/widget.cc
@@ -288,6 +288,59 @@ catch (...)
         vte::log_exception();
 }
 
+static void
+scroll_begin_cb(GtkEventControllerScroll* controller,
+                Widget* that) noexcept
+try
+{
+        that->event_scroll_begin(controller);
+}
+catch (...)
+{
+        vte::log_exception();
+}
+
+static gboolean
+scroll_scroll_cb(GtkEventControllerScroll* controller,
+                 double dx,
+                 double dy,
+                 Widget* that) noexcept
+try
+{
+        return that->event_scroll(controller, dx, dy);
+}
+catch (...)
+{
+        vte::log_exception();
+        return false;
+}
+
+static void
+scroll_end_cb(GtkEventControllerScroll* controller,
+              Widget* that) noexcept
+try
+{
+        that->event_scroll_end(controller);
+}
+catch (...)
+{
+        vte::log_exception();
+}
+
+static void
+scroll_decelerate_cb(GtkEventControllerScroll* controller,
+                     double vx,
+                     double vy,
+                     Widget* that) noexcept
+try
+{
+        that->event_scroll_decelerate(controller, vx, vy);
+}
+catch (...)
+{
+        vte::log_exception();
+}
+
 #endif /* VTE_GTK == 4 */
 
 Widget::Widget(VteTerminal* t)
@@ -543,6 +596,18 @@ Widget::constructed() noexcept
                          G_CALLBACK(motion_notify_contains_pointer_cb), this);
         gtk_widget_add_controller(m_widget, controller.release());
 
+        auto const scroll_flags = GtkEventControllerScrollFlags(GTK_EVENT_CONTROLLER_SCROLL_VERTICAL);
+        controller = vte::glib::take_ref(gtk_event_controller_scroll_new(scroll_flags));
+        g_signal_connect(controller.get(), "scroll-begin",
+                         G_CALLBACK(scroll_begin_cb), this);
+        g_signal_connect(controller.get(), "scroll-end",
+                         G_CALLBACK(scroll_end_cb), this);
+        g_signal_connect(controller.get(), "scroll",
+                         G_CALLBACK(scroll_scroll_cb), this);
+        g_signal_connect(controller.get(), "decelerate",
+                         G_CALLBACK(scroll_decelerate_cb), this);
+        gtk_widget_add_controller(m_widget, controller.release());
+
 #endif /* VTE_GTK == 4 */
 
 #if VTE_GTK == 3
@@ -861,6 +926,47 @@ Widget::event_motion_notify_contains_pointer(GtkEventControllerMotion* controlle
         // FIXMEgtk4
 }
 
+void
+Widget::event_scroll_begin(GtkEventControllerScroll* controller)
+{
+        _vte_debug_print(VTE_DEBUG_EVENTS, "Scroll begin\n");
+
+        // FIXMEgtk4
+}
+
+bool
+Widget::event_scroll(GtkEventControllerScroll* controller,
+                     double dx,
+                     double dy)
+{
+        _vte_debug_print(VTE_DEBUG_EVENTS, "Scroll delta_x=%.3f delta_y=%.3f\n", dx, dy);
+
+        auto event = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(controller));
+        if (!event)
+                return false;
+
+        return terminal()->widget_mouse_scroll({gdk_event_get_modifier_state(event),
+                                                dx, dy});
+}
+
+void
+Widget::event_scroll_end(GtkEventControllerScroll* controller)
+{
+        _vte_debug_print(VTE_DEBUG_EVENTS, "Scroll end\n");
+
+        // FIXMEgtk4
+}
+
+void
+Widget::event_scroll_decelerate(GtkEventControllerScroll* controller,
+                                double vx,
+                                double vy)
+{
+        _vte_debug_print(VTE_DEBUG_EVENTS, "Scroll decelerate v_x=%.3f v_y=%.3f\n", vx, vy);
+
+        // FIXMEgtk4
+}
+
 #endif /* VTE_GTK == 4 */
 
 void
diff --git a/src/widget.hh b/src/widget.hh
index 238bba11..9c76f131 100644
--- a/src/widget.hh
+++ b/src/widget.hh
@@ -345,6 +345,14 @@ public:
                           double y);
         void event_motion_notify_is_pointer(GtkEventControllerMotion* controller);
         void event_motion_notify_contains_pointer(GtkEventControllerMotion* controller);
+        void event_scroll_begin(GtkEventControllerScroll* controller);
+        bool event_scroll(GtkEventControllerScroll* controller,
+                          double dx,
+                          double dy);
+        void event_scroll_end(GtkEventControllerScroll* controller);
+        void event_scroll_decelerate(GtkEventControllerScroll* controller,
+                                     double vx,
+                                     double vy);
 #endif /* VTE_GTK == 4 */
 
         void grab_focus() noexcept { gtk_widget_grab_focus(gtk()); }


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