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>
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);
    }
};