Resolves: tdf#121752 let scroll wheel change active notebook tab
Change-Id: If8437346a58ea14266f11293b94082740303e5a9
Reviewed-on: https://gerrit.libreoffice.org/64170
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 6eb623e..286206f 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -3012,6 +3012,7 @@ private:
GtkNotebook* m_pNotebook;
gulong m_nSwitchPageSignalId;
gulong m_nSizeAllocateSignalId;
gulong m_nScrollSignalId;
mutable std::vector<std::unique_ptr<GtkInstanceContainer>> m_aPages;
static void signalSwitchPage(GtkNotebook*, GtkWidget*, guint nNewPage, gpointer widget)
@@ -3033,6 +3034,50 @@ private:
m_aEnterPageHdl.Call(sNewIdent);
}
static gboolean signalScroll(GtkWidget*, GdkEventScroll* event, gpointer widget)
{
GtkInstanceNotebook* pThis = static_cast<GtkInstanceNotebook*>(widget);
return pThis->signal_scroll(event);
}
bool signal_scroll(GdkEventScroll* event)
{
bool bNext(false), bPrev(false);
switch (event->direction)
{
case GDK_SCROLL_RIGHT:
case GDK_SCROLL_DOWN:
bNext = true;
break;
case GDK_SCROLL_LEFT:
case GDK_SCROLL_UP:
bPrev = true;
break;
case GDK_SCROLL_SMOOTH:
{
switch (gtk_notebook_get_tab_pos(m_pNotebook))
{
case GTK_POS_LEFT:
case GTK_POS_RIGHT:
bNext = event->delta_y > 0;
bPrev = event->delta_y < 0;
break;
case GTK_POS_TOP:
case GTK_POS_BOTTOM:
bNext = event->delta_x > 0;
bPrev = event->delta_x < 0;
break;
}
break;
}
}
if (bNext)
gtk_notebook_next_page(m_pNotebook);
else if (bPrev)
gtk_notebook_prev_page(m_pNotebook);
return true;
}
OString get_page_ident(guint nPage) const
{
const GtkWidget* pTabWidget = gtk_notebook_get_tab_label(m_pNotebook, gtk_notebook_get_nth_page(m_pNotebook, nPage));
@@ -3097,6 +3142,8 @@ public:
, m_pNotebook(pNotebook)
, m_nSwitchPageSignalId(g_signal_connect(pNotebook, "switch-page", G_CALLBACK(signalSwitchPage), this))
{
gtk_widget_add_events(GTK_WIDGET(pNotebook), GDK_SCROLL_MASK);
m_nScrollSignalId = g_signal_connect(pNotebook, "scroll-event", G_CALLBACK(signalScroll), this);
if (get_n_pages() > 6)
m_nSizeAllocateSignalId = g_signal_connect(pNotebook, "size-allocate", G_CALLBACK(signalSizeAllocate), this);
else
@@ -3188,9 +3235,10 @@ public:
virtual ~GtkInstanceNotebook() override
{
g_signal_handler_disconnect(m_pNotebook, m_nSwitchPageSignalId);
if (m_nSizeAllocateSignalId)
g_signal_handler_disconnect(m_pNotebook, m_nSizeAllocateSignalId);
g_signal_handler_disconnect(m_pNotebook, m_nScrollSignalId);
g_signal_handler_disconnect(m_pNotebook, m_nSwitchPageSignalId);
}
};