diff options
author | Christian Persch <chpe@src.gnome.org> | 2021-03-27 13:28:13 +0100 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2021-03-27 13:28:13 +0100 |
commit | 5f1039f1c86676f79642cb576ec6dbb4dcacd47a (patch) | |
tree | c44f92970c10ff2470ace0040630259e8e197b36 | |
parent | fcf11ed057f6b4614d47bba84f5424dc392ae680 (diff) | |
download | vte-5f1039f1c86676f79642cb576ec6dbb4dcacd47a.tar.gz |
widget: gtk4: Add scroll event controller
-rw-r--r-- | src/widget.cc | 106 | ||||
-rw-r--r-- | src/widget.hh | 8 |
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()); } |