[Libreoffice-commits] core.git: 2 commits - vcl/unx

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Wed Jul 7 07:28:38 UTC 2021


 vcl/unx/gtk3/gtkinst.cxx |  106 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 74 insertions(+), 32 deletions(-)

New commits:
commit c1328995c100e61c940c4c848b1e4416a2931fe6
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Tue Jul 6 17:23:40 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Jul 7 09:28:19 2021 +0200

    gtk4: use state-flags-changed for toolbar GtkMenuButton toggling
    
    Change-Id: I71b6a3e2e99b52be0c51987f097a3487bf83fac8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118526
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index ac36df0374ac..2f3c9f8da9bd 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -10720,10 +10720,14 @@ private:
             // left in the main document and not in the toolbar
 #if !GTK_CHECK_VERSION(4, 0, 0)
             gtk_button_set_focus_on_click(GTK_BUTTON(pMenuButton), false);
+            g_signal_connect(pMenuButton, "toggled", G_CALLBACK(signalItemToggled), this);
 #else
             gtk_widget_set_focus_on_click(GTK_WIDGET(pMenuButton), false);
+
+            GtkWidget* pToggleButton = gtk_widget_get_first_child(GTK_WIDGET(pMenuButton));
+            assert(GTK_IS_TOGGLE_BUTTON(pToggleButton));
+            g_signal_connect(pToggleButton, "state-flags-changed", G_CALLBACK(signalItemFlagsChanged), this);
 #endif
-            g_signal_connect(pMenuButton, "toggled", G_CALLBACK(signalItemToggled), this);
 
             // by default the GtkMenuButton down arrow button is as wide as
             // a normal button and LibreOffice's original ones are very
@@ -10779,6 +10783,7 @@ private:
         signal_clicked(::get_buildable_id(GTK_BUILDABLE(pItem)));
     }
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
     static void signalItemToggled(GtkToggleButton* pItem, gpointer widget)
     {
         GtkInstanceToolbar* pThis = static_cast<GtkInstanceToolbar*>(widget);
@@ -10797,6 +10802,30 @@ private:
             }
         }
     }
+#else
+    static void signalItemFlagsChanged(GtkToggleButton* pItem, GtkStateFlags flags, gpointer widget)
+    {
+        GtkInstanceToolbar* pThis = static_cast<GtkInstanceToolbar*>(widget);
+        bool bOldChecked = flags & GTK_STATE_FLAG_CHECKED;
+        bool bNewChecked = gtk_widget_get_state_flags(GTK_WIDGET(pItem)) & GTK_STATE_FLAG_CHECKED;
+        if (bOldChecked == bNewChecked)
+            return;
+        SolarMutexGuard aGuard;
+        pThis->signal_item_toggled(pItem);
+    }
+
+    void signal_item_toggled(GtkToggleButton* pItem)
+    {
+        for (auto& a : m_aMenuButtonMap)
+        {
+            if (a.second->getWidget() == gtk_widget_get_parent(GTK_WIDGET(pItem)))
+            {
+                signal_toggle_menu(a.first);
+                break;
+            }
+        }
+    }
+#endif
 
 #if !GTK_CHECK_VERSION(4, 0, 0)
     static void set_item_image(GtkToolButton* pItem, const css::uno::Reference<css::graphic::XGraphic>& rIcon)
@@ -10939,10 +10968,6 @@ public:
 #if !GTK_CHECK_VERSION(4, 0, 0)
         if (GTK_IS_TOGGLE_TOOL_BUTTON(pToolButton))
             gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(pToolButton), bActive);
-#else
-        if (GTK_IS_TOGGLE_BUTTON(pToolButton))
-            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pToolButton), bActive);
-#endif
         else
         {
             GtkButton* pButton = nullptr;
@@ -10957,6 +10982,20 @@ public:
                 gtk_widget_set_state_flags(GTK_WIDGET(pButton), static_cast<GtkStateFlags>(eState), true);
             }
         }
+#else
+        GtkWidget* pWidget;
+        if (GTK_IS_MENU_BUTTON(pToolButton))
+        {
+            pWidget = gtk_widget_get_first_child(pToolButton);
+            assert(GTK_IS_TOGGLE_BUTTON(pWidget));
+        }
+        else
+            pWidget = pToolButton;
+        auto eState = gtk_widget_get_state_flags(pWidget) & ~GTK_STATE_FLAG_CHECKED;
+        if (bActive)
+            eState |= GTK_STATE_FLAG_CHECKED;
+        gtk_widget_set_state_flags(pWidget, static_cast<GtkStateFlags>(eState), true);
+#endif
 
         enable_item_notify_events();
     }
@@ -10968,10 +11007,6 @@ public:
 #if !GTK_CHECK_VERSION(4, 0, 0)
         if (GTK_IS_TOGGLE_TOOL_BUTTON(pToolButton))
             return gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(pToolButton));
-#else
-        if (GTK_IS_TOGGLE_BUTTON(pToolButton))
-            return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pToolButton));
-#endif
         else
         {
             GtkButton* pButton = nullptr;
@@ -10983,6 +11018,17 @@ public:
                 return gtk_widget_get_state_flags(GTK_WIDGET(pButton)) & GTK_STATE_FLAG_CHECKED;
             }
         }
+#else
+        GtkWidget* pWidget;
+        if (GTK_IS_MENU_BUTTON(pToolButton))
+        {
+            pWidget = gtk_widget_get_first_child(pToolButton);
+            assert(GTK_IS_TOGGLE_BUTTON(pWidget));
+        }
+        else
+            pWidget = pToolButton;
+        return gtk_widget_get_state_flags(pWidget) & GTK_STATE_FLAG_CHECKED;
+#endif
 
         return false;
     }
commit d1640dfa88652aef9cc9b85b68f34626b592c569
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Tue Jul 6 17:09:09 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Jul 7 09:28:03 2021 +0200

    pMenuButton check against null inside pMenuButton check against null
    
    and there's no possibility it changed since the first check
    
    Change-Id: Ic32f9ef3c4659178792a35c87f13ee21b1d54228
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118524
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 4503a161cb52..ac36df0374ac 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -10725,32 +10725,28 @@ private:
 #endif
             g_signal_connect(pMenuButton, "toggled", G_CALLBACK(signalItemToggled), this);
 
-            if (pMenuButton)
+            // by default the GtkMenuButton down arrow button is as wide as
+            // a normal button and LibreOffice's original ones are very
+            // narrow, that assumption is fairly baked into the toolbar and
+            // sidebar designs, try and minimize the width of the dropdown
+            // zone.
+            GtkStyleContext *pButtonContext = gtk_widget_get_style_context(GTK_WIDGET(pMenuButton));
+
+            if (!m_pMenuButtonProvider)
             {
-                // by default the GtkMenuButton down arrow button is as wide as
-                // a normal button and LibreOffice's original ones are very
-                // narrow, that assumption is fairly baked into the toolbar and
-                // sidebar designs, try and minimize the width of the dropdown
-                // zone.
-                GtkStyleContext *pButtonContext = gtk_widget_get_style_context(GTK_WIDGET(pMenuButton));
-
-                if (!m_pMenuButtonProvider)
-                {
-                    m_pMenuButtonProvider = gtk_css_provider_new();
-                    static const gchar data[] = "* { "
-                      "padding: 0;"
-                      "margin-left: 0px;"
-                      "margin-right: 0px;"
-                      "min-width: 4px;"
-                      "}";
-                    css_provider_load_from_data(m_pMenuButtonProvider, data, -1);
-                }
-
-                gtk_style_context_add_provider(pButtonContext,
-                                               GTK_STYLE_PROVIDER(m_pMenuButtonProvider),
-                                               GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+                m_pMenuButtonProvider = gtk_css_provider_new();
+                static const gchar data[] = "* { "
+                  "padding: 0;"
+                  "margin-left: 0px;"
+                  "margin-right: 0px;"
+                  "min-width: 4px;"
+                  "}";
+                css_provider_load_from_data(m_pMenuButtonProvider, data, -1);
             }
 
+            gtk_style_context_add_provider(pButtonContext,
+                                           GTK_STYLE_PROVIDER(m_pMenuButtonProvider),
+                                           GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
         }
 #if !GTK_CHECK_VERSION(4, 0, 0)
         if (!GTK_IS_TOOL_BUTTON(pToolItem))


More information about the Libreoffice-commits mailing list