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

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Fri Jun 11 20:06:28 UTC 2021


 vcl/unx/gtk3/gtkinst.cxx |   71 +++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 66 insertions(+), 5 deletions(-)

New commits:
commit 37ddff25a67aa0b858da0e56fe7263a537002f7b
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Fri Jun 11 17:10:37 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Fri Jun 11 22:05:33 2021 +0200

    gtk4: starting point for welded menus
    
    submenus will need a rethink I guess
    
    Change-Id: I6d2a645267146c537fe7ba62d8be2501855e7f62
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117067
    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 dbdd56994b71..98eea7cadcbe 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -10192,15 +10192,27 @@ public:
         assert(false && "not implemented");
     }
 };
+#endif
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
 class GtkInstanceMenu : public MenuHelper, public virtual weld::Menu
+#else
+class GtkInstanceMenu : public virtual weld::Menu
+#endif
 {
 protected:
+#if !GTK_CHECK_VERSION(4, 0, 0)
     std::vector<GtkMenuItem*> m_aExtraItems;
+#endif
     OString m_sActivated;
+#if !GTK_CHECK_VERSION(4, 0, 0)
     MenuHelper* m_pTopLevelMenuHelper;
+#else
+    GtkPopoverMenu* m_pMenu;
+#endif
 
 private:
+#if !GTK_CHECK_VERSION(4, 0, 0)
     virtual void signal_activate(GtkMenuItem* pItem) override
     {
         m_sActivated = ::get_buildable_id(GTK_BUILDABLE(pItem));
@@ -10218,13 +10230,20 @@ private:
         }
         m_aExtraItems.clear();
     }
+#endif
 
 public:
+#if !GTK_CHECK_VERSION(4, 0, 0)
     GtkInstanceMenu(GtkMenu* pMenu, bool bTakeOwnership)
         : MenuHelper(pMenu, bTakeOwnership)
         , m_pTopLevelMenuHelper(nullptr)
+#else
+    GtkInstanceMenu(GtkPopoverMenu* pMenu, bool /*bTakeOwnership*/)
+        : m_pMenu(pMenu)
+#endif
     {
         g_object_set_data(G_OBJECT(m_pMenu), "g-lo-GtkInstanceMenu", this);
+#if !GTK_CHECK_VERSION(4, 0, 0)
         // tdf#122527 if we're welding a submenu of a menu of a MenuButton,
         // then find that MenuButton parent so that when adding items to this
         // menu we can inform the MenuButton of their addition
@@ -10255,6 +10274,7 @@ public:
             void* pData = g_object_get_data(G_OBJECT(pTopLevelMenu), "g-lo-GtkInstanceMenu");
             m_pTopLevelMenuHelper = static_cast<GtkInstanceMenu*>(pData);
         }
+#endif
     }
 
     virtual OString popup_at_rect(weld::Widget* pParent, const tools::Rectangle &rRect) override
@@ -10264,6 +10284,7 @@ public:
         GtkInstanceWidget* pGtkWidget = dynamic_cast<GtkInstanceWidget*>(pParent);
         assert(pGtkWidget);
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
         GtkWidget* pWidget = pGtkWidget->getWidget();
         gtk_menu_attach_to_widget(m_pMenu, pWidget, nullptr);
 
@@ -10327,54 +10348,79 @@ public:
         g_main_loop_unref(pLoop);
         g_signal_handler_disconnect(m_pMenu, nSignalId);
         gtk_menu_detach(m_pMenu);
+#endif
 
         return m_sActivated;
     }
 
     virtual void set_sensitive(const OString& rIdent, bool bSensitive) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         set_item_sensitive(rIdent, bSensitive);
+#endif
     }
 
     virtual bool get_sensitive(const OString& rIdent) const override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         return get_item_sensitive(rIdent);
+#else
+        return false;
+#endif
     }
 
     virtual void set_active(const OString& rIdent, bool bActive) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         set_item_active(rIdent, bActive);
+#endif
     }
 
     virtual bool get_active(const OString& rIdent) const override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         return get_item_active(rIdent);
+#else
+        return false;
+#endif
     }
 
     virtual void set_visible(const OString& rIdent, bool bShow) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         set_item_visible(rIdent, bShow);
+#endif
     }
 
     virtual void set_label(const OString& rIdent, const OUString& rLabel) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         set_item_label(rIdent, rLabel);
+#endif
     }
 
     virtual OUString get_label(const OString& rIdent) const override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         return get_item_label(rIdent);
+#else
+        return OUString();
+#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 clear() override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         clear_extras();
         clear_items();
+#endif
     }
 
     virtual void insert(int pos, const OUString& rId, const OUString& rStr,
@@ -10382,6 +10428,7 @@ public:
                         const css::uno::Reference<css::graphic::XGraphic>& rGraphic,
                         TriState eCheckRadioFalse) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         GtkWidget* pImage = nullptr;
         if (pIconName)
         {
@@ -10435,27 +10482,37 @@ public:
             m_pTopLevelMenuHelper->add_to_map(pMenuItem);
         if (pos != -1)
             gtk_menu_reorder_child(m_pMenu, pItem, pos);
+#endif
     }
 
     virtual OString get_id(int pos) const override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         GList* pChildren = gtk_container_get_children(GTK_CONTAINER(m_pMenu));
         gpointer pMenuItem = g_list_nth_data(pChildren, pos);
         OString id = ::get_buildable_id(GTK_BUILDABLE(pMenuItem));
         g_list_free(pChildren);
         return id;
+#else
+        return OString();
+#endif
     }
 
     virtual int n_children() const override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         GList* pChildren = gtk_container_get_children(GTK_CONTAINER(m_pMenu));
         int nLen = g_list_length(pChildren);
         g_list_free(pChildren);
         return nLen;
+#else
+        return 0;
+#endif
     }
 
     void remove(const OString& rIdent) override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         if (!m_aExtraItems.empty())
         {
             GtkMenuItem* pMenuItem = m_aMap[rIdent];
@@ -10468,15 +10525,20 @@ public:
             }
         }
         MenuHelper::remove_item(rIdent);
+#endif
     }
 
     virtual ~GtkInstanceMenu() override
     {
+#if !GTK_CHECK_VERSION(4, 0, 0)
         clear_extras();
+#endif
         g_object_steal_data(G_OBJECT(m_pMenu), "g-lo-GtkInstanceMenu");
     }
 };
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
+
     vcl::ImageType GtkToVcl(GtkIconSize eSize)
     {
         vcl::ImageType eRet;
@@ -21977,15 +22039,14 @@ public:
 
     virtual std::unique_ptr<weld::Menu> weld_menu(const OString &id) override
     {
-#if !GTK_CHECK_VERSION(4, 0, 0)
+#if GTK_CHECK_VERSION(4, 0, 0)
+        GtkPopoverMenu* pMenu = GTK_POPOVER_MENU(gtk_builder_get_object(m_pBuilder, id.getStr()));
+#else
         GtkMenu* pMenu = GTK_MENU(gtk_builder_get_object(m_pBuilder, id.getStr()));
+#endif
         if (!pMenu)
             return nullptr;
         return std::make_unique<GtkInstanceMenu>(pMenu, true);
-#else
-        (void)id;
-        return nullptr;
-#endif
     }
 
     virtual std::unique_ptr<weld::Popover> weld_popover(const OString &id) override


More information about the Libreoffice-commits mailing list