[vte] widget: gtk4: Add scroll event controller
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vte] widget: gtk4: Add scroll event controller
- Date: Sat, 27 Mar 2021 12:28:34 +0000 (UTC)
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]