2d01c68
From f929a7e9e854ede215a72d3d84ca74cae156e1aa Mon Sep 17 00:00:00 2001
2d01c68
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
2d01c68
Date: Thu, 17 Jan 2019 12:28:55 +0000
2d01c68
Subject: [PATCH] tdf#122393 move to overflow row on using left/right at end of
2d01c68
 other row
2d01c68
2d01c68
and on ctrl+page_up/ctrl+page_down
2d01c68
2d01c68
Change-Id: I3320abfb91655b7b4278886cc6fc4dceb637e4b1
2d01c68
Reviewed-on: https://gerrit.libreoffice.org/66527
2d01c68
Tested-by: Jenkins
2d01c68
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
2d01c68
---
2d01c68
 vcl/unx/gtk3/gtk3gtkinst.cxx | 59 ++++++++++++++++++++++++++++++++++++
2d01c68
 1 file changed, 59 insertions(+)
2d01c68
2d01c68
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
2d01c68
index fe74ae76bdb3..08fc49de25e5 100644
2d01c68
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
2d01c68
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
2d01c68
@@ -3002,6 +3002,8 @@ private:
2d01c68
     gulong m_nSwitchPageSignalId;
2d01c68
     gulong m_nOverFlowSwitchPageSignalId;
2d01c68
     gulong m_nSizeAllocateSignalId;
2d01c68
+    gulong m_nFocusSignalId;
2d01c68
+    gulong m_nChangeCurrentPageId;
2d01c68
     guint m_nLaunchSplitTimeoutId;
2d01c68
     bool m_bOverFlowBoxActive;
2d01c68
     bool m_bOverFlowBoxIsStart;
2d01c68
@@ -3365,6 +3367,55 @@ private:
2d01c68
         pThis->signal_notebook_size_allocate();
2d01c68
     }
2d01c68
 
2d01c68
+    bool signal_focus(GtkDirectionType direction)
2d01c68
+    {
2d01c68
+        if (!m_bOverFlowBoxActive)
2d01c68
+            return false;
2d01c68
+
2d01c68
+        int nPage = gtk_notebook_get_current_page(m_pNotebook);
2d01c68
+        if (direction == GTK_DIR_LEFT && nPage == 0)
2d01c68
+        {
2d01c68
+            auto nOverFlowLen = gtk_notebook_get_n_pages(m_pOverFlowNotebook) - 1;
2d01c68
+            gtk_notebook_set_current_page(m_pOverFlowNotebook, nOverFlowLen - 1);
2d01c68
+            return true;
2d01c68
+        }
2d01c68
+        else if (direction == GTK_DIR_RIGHT && nPage == gtk_notebook_get_n_pages(m_pNotebook) - 1)
2d01c68
+        {
2d01c68
+            gtk_notebook_set_current_page(m_pOverFlowNotebook, 0);
2d01c68
+            return true;
2d01c68
+        }
2d01c68
+
2d01c68
+        return false;
2d01c68
+    }
2d01c68
+
2d01c68
+    static gboolean signalFocus(GtkNotebook* notebook, GtkDirectionType direction, gpointer widget)
2d01c68
+    {
2d01c68
+        // if the notebook widget itself has focus
2d01c68
+        if (gtk_widget_is_focus(GTK_WIDGET(notebook)))
2d01c68
+        {
2d01c68
+            GtkInstanceNotebook* pThis = static_cast<GtkInstanceNotebook*>(widget);
2d01c68
+            return pThis->signal_focus(direction);
2d01c68
+        }
2d01c68
+        return false;
2d01c68
+    }
2d01c68
+
2d01c68
+    // ctrl + page_up/ page_down
2d01c68
+    bool signal_change_current_page(gint arg1)
2d01c68
+    {
2d01c68
+        bool bHandled = signal_focus(arg1 < 0 ? GTK_DIR_LEFT : GTK_DIR_RIGHT);
2d01c68
+        if (bHandled)
2d01c68
+            g_signal_stop_emission_by_name(m_pNotebook, "change-current-page");
2d01c68
+        return false;
2d01c68
+    }
2d01c68
+
2d01c68
+    static gboolean signalChangeCurrentPage(GtkNotebook*, gint arg1, gpointer widget)
2d01c68
+    {
2d01c68
+        if (arg1 == 0)
2d01c68
+            return true;
2d01c68
+        GtkInstanceNotebook* pThis = static_cast<GtkInstanceNotebook*>(widget);
2d01c68
+        return pThis->signal_change_current_page(arg1);
2d01c68
+    }
2d01c68
+
2d01c68
 public:
2d01c68
     GtkInstanceNotebook(GtkNotebook* pNotebook, bool bTakeOwnership)
2d01c68
         : GtkInstanceContainer(GTK_CONTAINER(pNotebook), bTakeOwnership)
2d01c68
@@ -3373,6 +3424,8 @@ public:
2d01c68
         , m_pOverFlowNotebook(GTK_NOTEBOOK(gtk_notebook_new()))
2d01c68
         , m_nSwitchPageSignalId(g_signal_connect(pNotebook, "switch-page", G_CALLBACK(signalSwitchPage), this))
2d01c68
         , m_nOverFlowSwitchPageSignalId(g_signal_connect(m_pOverFlowNotebook, "switch-page", G_CALLBACK(signalOverFlowSwitchPage), this))
2d01c68
+        , m_nFocusSignalId(g_signal_connect(pNotebook, "focus", G_CALLBACK(signalFocus), this))
2d01c68
+        , m_nChangeCurrentPageId(g_signal_connect(pNotebook, "change-current-page", G_CALLBACK(signalChangeCurrentPage), this))
2d01c68
         , m_nLaunchSplitTimeoutId(0)
2d01c68
         , m_bOverFlowBoxActive(false)
2d01c68
         , m_bOverFlowBoxIsStart(false)
2d01c68
@@ -3508,6 +3561,8 @@ public:
2d01c68
     virtual void disable_notify_events() override
2d01c68
     {
2d01c68
         g_signal_handler_block(m_pNotebook, m_nSwitchPageSignalId);
2d01c68
+        g_signal_handler_block(m_pNotebook, m_nFocusSignalId);
2d01c68
+        g_signal_handler_block(m_pNotebook, m_nChangeCurrentPageId);
2d01c68
         g_signal_handler_block(m_pOverFlowNotebook, m_nOverFlowSwitchPageSignalId);
2d01c68
         gtk_widget_freeze_child_notify(GTK_WIDGET(m_pOverFlowNotebook));
2d01c68
         GtkInstanceContainer::disable_notify_events();
2d01c68
@@ -3519,6 +3574,8 @@ public:
2d01c68
         gtk_widget_thaw_child_notify(GTK_WIDGET(m_pOverFlowNotebook));
2d01c68
         g_signal_handler_unblock(m_pOverFlowNotebook, m_nOverFlowSwitchPageSignalId);
2d01c68
         g_signal_handler_unblock(m_pNotebook, m_nSwitchPageSignalId);
2d01c68
+        g_signal_handler_unblock(m_pNotebook, m_nFocusSignalId);
2d01c68
+        g_signal_handler_unblock(m_pNotebook, m_nChangeCurrentPageId);
2d01c68
     }
2d01c68
 
2d01c68
     void reset_split_data()
2d01c68
@@ -3560,6 +3617,8 @@ public:
2d01c68
         if (m_nSizeAllocateSignalId)
2d01c68
             g_signal_handler_disconnect(m_pNotebook, m_nSizeAllocateSignalId);
2d01c68
         g_signal_handler_disconnect(m_pNotebook, m_nSwitchPageSignalId);
2d01c68
+        g_signal_handler_disconnect(m_pNotebook, m_nFocusSignalId);
2d01c68
+        g_signal_handler_disconnect(m_pNotebook, m_nChangeCurrentPageId);
2d01c68
         g_signal_handler_disconnect(m_pOverFlowNotebook, m_nOverFlowSwitchPageSignalId);
2d01c68
         gtk_widget_destroy(GTK_WIDGET(m_pOverFlowNotebook));
2d01c68
         if (m_pOverFlowBox)
2d01c68
-- 
2d01c68
2.21.0.rc1
2d01c68