diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-11-28 11:50:19 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2018-11-28 14:35:37 +0100 |
commit | f6e0212285f48beab3c47a00e5b2f9549654a066 (patch) | |
tree | 60c7f7dd7da75b6f7f63e3f0cb97161de7425d9d /vcl/unx | |
parent | 46d434cd12f49fdaab93e8d60b7519f33a711666 (diff) |
Resolves: tdf#121752 let scroll wheel change active notebook tab
Change-Id: If8437346a58ea14266f11293b94082740303e5a9
Reviewed-on: https://gerrit.libreoffice.org/64158
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/unx')
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 6eb623efe088..286206f7c4a5 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); } }; |