summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Persch <chpe@src.gnome.org>2021-03-27 13:28:13 +0100
committerChristian Persch <chpe@src.gnome.org>2021-03-27 13:28:13 +0100
commit5f1039f1c86676f79642cb576ec6dbb4dcacd47a (patch)
treec44f92970c10ff2470ace0040630259e8e197b36
parentfcf11ed057f6b4614d47bba84f5424dc392ae680 (diff)
downloadvte-5f1039f1c86676f79642cb576ec6dbb4dcacd47a.tar.gz
widget: gtk4: Add scroll event controller
-rw-r--r--src/widget.cc106
-rw-r--r--src/widget.hh8
2 files changed, 114 insertions, 0 deletions
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()); }