summaryrefslogtreecommitdiff
path: root/vcl/unx/gtk3/gtkinst.cxx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-08-03 16:50:00 +0100
committerCaolán McNamara <caolanm@redhat.com>2022-08-03 21:16:22 +0200
commit6568d572e0c7a9c99580f3cc94273d8ddd00b781 (patch)
tree7955b327d3dbfd6dfb0080887d3c4c92b5a8a22f /vcl/unx/gtk3/gtkinst.cxx
parentf6bbd43dc254755c0394473a871f240492abf1e7 (diff)
handle scroll events in surrounding GtkSalFrame if there is one
Change-Id: I47f71371246f6322f41b782697d4824517375c76 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137760 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/unx/gtk3/gtkinst.cxx')
-rw-r--r--vcl/unx/gtk3/gtkinst.cxx35
1 files changed, 35 insertions, 0 deletions
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 8778a6ba9e8e..06c9d706d2fd 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -8420,6 +8420,33 @@ private:
pThis->signal_adjustment_changed();
}
+#if GTK_CHECK_VERSION(4, 0, 0)
+ // if the widget is inside a GtkSalFrame then ensure the event is processed by the GtkSalFrame and not the
+ // GtkScrollbar
+ static gboolean signalScroll(GtkEventControllerScroll* pController, double delta_x, double delta_y, gpointer widget)
+ {
+ GtkInstanceScrollbar* pThis = static_cast<GtkInstanceScrollbar*>(widget);
+
+ GtkWidget* pParent = widget_get_toplevel(GTK_WIDGET(pThis->m_pScrollbar));
+ GtkSalFrame* pFrame = pParent ? GtkSalFrame::getFromWindow(pParent) : nullptr;
+
+ return pFrame && pFrame->event_controller_scroll_forward(pController, delta_x, delta_y);
+ }
+#else
+ static gboolean signalScroll(GtkWidget* pWidget, GdkEventScroll* /*pEvent*/, gpointer widget)
+ {
+ GtkInstanceScrollbar* pThis = static_cast<GtkInstanceScrollbar*>(widget);
+
+ GtkWidget* pParent = widget_get_toplevel(GTK_WIDGET(pThis->m_pScrollbar));
+ GtkSalFrame* pFrame = pParent ? GtkSalFrame::getFromWindow(pParent) : nullptr;
+
+ if (pFrame)
+ g_signal_stop_emission_by_name(pWidget, "scroll-event");
+
+ return false;
+ }
+#endif
+
public:
GtkInstanceScrollbar(GtkScrollbar* pScrollbar, GtkInstanceBuilder* pBuilder, bool bTakeOwnership)
: GtkInstanceWidget(GTK_WIDGET(pScrollbar), pBuilder, bTakeOwnership)
@@ -8431,6 +8458,14 @@ public:
#endif
, m_nAdjustChangedSignalId(g_signal_connect(m_pAdjustment, "value-changed", G_CALLBACK(signalAdjustValueChanged), this))
{
+#if GTK_CHECK_VERSION(4, 0, 0)
+ GtkEventController* pScrollController = gtk_event_controller_scroll_new(GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES);
+ gtk_event_controller_set_propagation_phase(pScrollController, GTK_PHASE_CAPTURE);
+ g_signal_connect(pScrollController, "scroll", G_CALLBACK(signalScroll), this);
+ gtk_widget_add_controller(GTK_WIDGET(pScrollbar), pScrollController);
+#else
+ g_signal_connect(pScrollbar, "scroll-event", G_CALLBACK(signalScroll), this);
+#endif
}
virtual void adjustment_configure(int value, int lower, int upper,