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

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Thu May 27 13:44:09 UTC 2021


 vcl/unx/gtk3/gtkinst.cxx |  120 +++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 111 insertions(+), 9 deletions(-)

New commits:
commit 8596312d8f298cfddb6dda11a25669fb78372d4f
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu May 27 09:41:42 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu May 27 15:43:28 2021 +0200

    gtk4: reenable menubutton
    
    not really expected to work yet
    
    Change-Id: I27fe5ecd8f78017dd669aeba0c1d8db797e91e3e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116237
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 3261cec30275..bf417426914a 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -8588,7 +8588,13 @@ GtkPositionType show_menu(GtkWidget* pMenuButton, GtkWindow* pMenu)
     return ePosUsed;
 }
 
+#endif
+
+#if !GTK_CHECK_VERSION(4, 0, 0)
 class GtkInstanceMenuButton : public GtkInstanceToggleButton, public MenuHelper, public virtual weld::MenuButton
+#else
+class GtkInstanceMenuButton : public GtkInstanceToggleButton, public virtual weld::MenuButton
+#endif
 {
 protected:
     GtkMenuButton* m_pMenuButton;
@@ -8612,6 +8618,7 @@ private:
 
     void toggle_menu()
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         if (!m_pMenuHack)
             return;
         if (!get_active())
@@ -8653,8 +8660,10 @@ private:
             // tdf#132540 keep the placeholder popover on this same side as the replacement menu
             gtk_popover_set_position(gtk_menu_button_get_popover(m_pMenuButton), ePosUsed);
         }
+#endif
     }
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
     static void signalGrabBroken(GtkWidget*, GdkEventGrabBroken *pEvent, gpointer widget)
     {
         GtkInstanceMenuButton* pThis = static_cast<GtkInstanceMenuButton*>(widget);
@@ -8724,33 +8733,65 @@ private:
         }
         return false;
     }
+#endif
 
     void ensure_image_widget()
     {
         if (!m_pImage)
         {
             m_pImage = GTK_IMAGE(gtk_image_new());
+#if !GTK_CHECK_VERSION(4, 0, 0)
             gtk_box_pack_start(m_pBox, GTK_WIDGET(m_pImage), false, false, 0);
             gtk_box_reorder_child(m_pBox, GTK_WIDGET(m_pImage), 0);
+#else
+            gtk_box_prepend(m_pBox, GTK_WIDGET(m_pImage));
+#endif
             gtk_widget_show(GTK_WIDGET(m_pImage));
         }
     }
 
+#if GTK_CHECK_VERSION(4, 0, 0)
+    static GtkWidget* find_image_widget(GtkWidget* pContainer)
+    {
+        GtkWidget* pImage = nullptr;
+        for (GtkWidget* pChild = gtk_widget_get_first_child(pContainer);
+             pChild; pChild = gtk_widget_get_next_sibling(pChild))
+        {
+            if (GTK_IS_IMAGE(pChild))
+            {
+                pImage = pChild;
+                break;
+            }
+            else
+            {
+                pImage = find_image_widget(pChild);
+                if (pImage)
+                    break;
+            }
+        }
+        return pImage;
+    }
+#endif
+
     static void find_image(GtkWidget *pWidget, gpointer user_data)
     {
+        GtkImage **ppImage = static_cast<GtkImage**>(user_data);
         if (GTK_IS_IMAGE(pWidget))
-        {
-            GtkImage **ppImage = static_cast<GtkImage**>(user_data);
             *ppImage = GTK_IMAGE(pWidget);
-        }
-        else if (GTK_IS_CONTAINER(pWidget))
+#if GTK_CHECK_VERSION(4, 0, 0)
+        *ppImage = GTK_IMAGE(find_image_widget(pWidget));
+#else
+        if (GTK_IS_CONTAINER(pWidget))
             gtk_container_forall(GTK_CONTAINER(pWidget), find_image, user_data);
+#endif
     }
 
 public:
     GtkInstanceMenuButton(GtkMenuButton* pMenuButton, GtkWidget* pMenuAlign, GtkInstanceBuilder* pBuilder, bool bTakeOwnership)
         : GtkInstanceToggleButton(GTK_TOGGLE_BUTTON(pMenuButton), pBuilder, bTakeOwnership)
+#if !GTK_CHECK_VERSION(4, 0, 0)
         , MenuHelper(gtk_menu_button_get_popup(pMenuButton), false)
+#endif
         , m_pMenuButton(pMenuButton)
         , m_pImage(nullptr)
         , m_pMenuHack(nullptr)
@@ -8758,7 +8799,11 @@ public:
         , m_pPopover(nullptr)
         , m_nSignalId(0)
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         m_pLabel = gtk_bin_get_child(GTK_BIN(m_pMenuButton));
+#else
+        m_pLabel = find_label_widget(GTK_WIDGET(m_pMenuButton));
+#endif
         find_image(GTK_WIDGET(m_pMenuButton), &m_pImage);
         m_pBox = formatMenuButton(m_pLabel);
     }
@@ -8803,69 +8848,98 @@ public:
     virtual void insert_item(int pos, const OUString& rId, const OUString& rStr,
                         const OUString* pIconName, VirtualDevice* pImageSurface, TriState eCheckRadioFalse) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         MenuHelper::insert_item(pos, rId, rStr, pIconName, pImageSurface, eCheckRadioFalse);
+#endif
     }
 
     virtual void insert_separator(int pos, const OUString& rId) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         MenuHelper::insert_separator(pos, rId);
+#endif
     }
 
     virtual void remove_item(const OString& rId) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         MenuHelper::remove_item(rId);
+#endif
     }
 
     virtual void clear() override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         clear_items();
+#endif
     }
 
     virtual void set_item_active(const OString& rIdent, bool bActive) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         MenuHelper::set_item_active(rIdent, bActive);
+#endif
     }
 
     virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         MenuHelper::set_item_sensitive(rIdent, bSensitive);
+#endif
     }
 
     virtual void set_item_label(const OString& rIdent, const OUString& rLabel) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         MenuHelper::set_item_label(rIdent, rLabel);
+#endif
     }
 
     virtual OUString get_item_label(const OString& rIdent) const override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         return MenuHelper::get_item_label(rIdent);
+#else
+        return OUString();
+#endif
     }
 
     virtual void set_item_visible(const OString& rIdent, bool bVisible) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         MenuHelper::set_item_visible(rIdent, bVisible);
+#endif
     }
 
     virtual void set_item_help_id(const OString& rIdent, const OString& rHelpId) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         MenuHelper::set_item_help_id(rIdent, rHelpId);
+#endif
     }
 
     virtual OString get_item_help_id(const OString& rIdent) const override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         return MenuHelper::get_item_help_id(rIdent);
+#else
+        return OString();
+#endif
     }
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
     virtual void signal_activate(GtkMenuItem* pItem) override
     {
         signal_selected(::get_buildable_id(GTK_BUILDABLE(pItem)));
     }
+#endif
 
     virtual void set_popover(weld::Widget* pPopover) override
     {
         GtkInstanceWidget* pPopoverWidget = dynamic_cast<GtkInstanceWidget*>(pPopover);
         m_pPopover = pPopoverWidget ? pPopoverWidget->getWidget() : nullptr;
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
 #if defined(GDK_WINDOWING_X11)
         if (!m_pMenuHack)
         {
@@ -8885,7 +8959,9 @@ public:
             }
         }
 #endif
+#endif
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
         if (m_pMenuHack)
         {
             GtkWidget* pPlaceHolder = gtk_popover_new(GTK_WIDGET(m_pMenuButton));
@@ -8902,10 +8978,17 @@ public:
             gtk_menu_button_set_popover(m_pMenuButton, pPlaceHolder);
         }
         else
+#endif
         {
             gtk_menu_button_set_popover(m_pMenuButton, m_pPopover);
             if (m_pPopover)
+            {
+#if !GTK_CHECK_VERSION(4, 0, 0)
                 gtk_widget_show_all(m_pPopover);
+#else
+                gtk_popover_popup(GTK_POPOVER(m_pPopover));
+#endif
+            }
         }
     }
 
@@ -8917,36 +9000,60 @@ public:
         // on the right at the same time as an image is shown on the left
         g_object_ref(pLabel);
         GtkWidget* pContainer = gtk_widget_get_parent(pLabel);
+#if !GTK_CHECK_VERSION(4, 0, 0)
         gtk_container_remove(GTK_CONTAINER(pContainer), pLabel);
+#else
+        gtk_widget_unparent(pLabel);
+#endif
 
         gint nImageSpacing(2);
+#if !GTK_CHECK_VERSION(4, 0, 0)
         GtkStyleContext *pContext = gtk_widget_get_style_context(pContainer);
         gtk_style_context_get_style(pContext, "image-spacing", &nImageSpacing, nullptr);
+#endif
         GtkBox* pBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, nImageSpacing));
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
         gtk_box_pack_start(pBox, pLabel, true, true, 0);
+#else
+        gtk_box_prepend(pBox, pLabel);
+#endif
         g_object_unref(pLabel);
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
         if (gtk_toggle_button_get_mode(GTK_TOGGLE_BUTTON(pContainer)))
             gtk_box_pack_end(pBox, gtk_image_new_from_icon_name("pan-down-symbolic", GTK_ICON_SIZE_BUTTON), false, false, 0);
+#endif
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
         gtk_container_add(GTK_CONTAINER(pContainer), GTK_WIDGET(pBox));
+#else
+        gtk_widget_set_parent(pContainer, GTK_WIDGET(pBox));
+#endif
+#if !GTK_CHECK_VERSION(4, 0, 0)
         gtk_widget_show_all(GTK_WIDGET(pBox));
+#else
+        gtk_widget_show(GTK_WIDGET(pBox));
+#endif
 
         return pBox;
     }
 
     virtual ~GtkInstanceMenuButton() override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         if (m_pMenuHack)
         {
             g_signal_handler_disconnect(m_pMenuButton, m_nSignalId);
             gtk_menu_button_set_popover(m_pMenuButton, nullptr);
             gtk_widget_destroy(GTK_WIDGET(m_pMenuHack));
         }
+#endif
     }
 };
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
+
 class GtkInstanceMenuToggleButton : public GtkInstanceToggleButton, public MenuHelper
                                   , public virtual weld::MenuToggleButton
 {
@@ -19490,16 +19597,11 @@ public:
 
     virtual std::unique_ptr<weld::MenuButton> weld_menu_button(const OString &id) override
     {
-#if !GTK_CHECK_VERSION(4, 0, 0)
         GtkMenuButton* pButton = GTK_MENU_BUTTON(gtk_builder_get_object(m_pBuilder, id.getStr()));
         if (!pButton)
             return nullptr;
         auto_add_parentless_widgets_to_container(GTK_WIDGET(pButton));
         return std::make_unique<GtkInstanceMenuButton>(pButton, nullptr, this, false);
-#else
-        (void)id;
-        return nullptr;
-#endif
     }
 
     virtual std::unique_ptr<weld::MenuToggleButton> weld_menu_toggle_button(const OString &id) override


More information about the Libreoffice-commits mailing list