vcl/unx/gtk3/gtkinst.cxx | 106 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 74 insertions(+), 32 deletions(-)
New commits: commit c1328995c100e61c940c4c848b1e4416a2931fe6 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Tue Jul 6 17:23:40 2021 +0100 Commit: Caolán McNamara <caol...@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 <caol...@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 <caol...@redhat.com> AuthorDate: Tue Jul 6 17:09:09 2021 +0100 Commit: Caolán McNamara <caol...@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 <caol...@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)) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits