vcl/unx/gtk3/gtkinst.cxx |   34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

New commits:
commit ad1ba0f58ee5cb7db3a856d49f73e3b543a497aa
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Aug 11 15:26:48 2021 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Wed Aug 11 17:41:27 2021 +0200

    gtk4: fill menu MenuToggleButton menu
    
    Change-Id: I512846cda2c8f06838a499043a4cd08314fd7b97
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120329
    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 f67aab429bca..afe7bef66f16 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -10227,6 +10227,10 @@ public:
 #if !GTK_CHECK_VERSION(4, 0, 0)
         gtk_menu_detach(m_pMenu);
         gtk_menu_attach_to_widget(m_pMenu, GTK_WIDGET(m_pToggleButton), 
nullptr);
+#else
+        gtk_widget_insert_action_group(GTK_WIDGET(m_pContainer), "menu", 
m_pActionGroup);
+
+        update_action_group_from_popover_model();
 #endif
 
         g_signal_connect(m_pContainer, "mnemonic-activate", 
G_CALLBACK(signalMenuToggleButton), this);
commit 2ece952c4ae1c65975a4e80645719ad14daa95da
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Aug 11 15:11:10 2021 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Wed Aug 11 17:41:12 2021 +0200

    gtk4: get startcenter MenuToggleButton menu appearing
    
    though still without contents
    
    Change-Id: Ieb7048a74f33fe65ededd1ff8730b2d061ae325f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120328
    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 2147a1e49956..f67aab429bca 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -10039,9 +10039,7 @@ private:
     GtkBox* m_pContainer;
     GtkButton* m_pToggleMenuButton;
     GtkMenuButton* m_pMenuButton;
-#if !GTK_CHECK_VERSION(4, 0, 0)
     gulong m_nMenuBtnClickedId;
-#endif
     gulong m_nToggleStateFlagsChangedId;
     gulong m_nMenuBtnStateFlagsChangedId;
 
@@ -10063,7 +10061,6 @@ private:
         gtk_widget_set_state_flags(GTK_WIDGET(pThis->m_pToggleButton), 
eFinalFlags, true);
     }
 
-#if !GTK_CHECK_VERSION(4, 0, 0)
     static void signalMenuBtnClicked(GtkButton*, gpointer widget)
     {
         GtkInstanceMenuToggleButton* pThis = 
static_cast<GtkInstanceMenuToggleButton*>(widget);
@@ -10080,6 +10077,16 @@ private:
         //launching PopupMenu to be destroyed, instead run the subloop here
         //until the gtk menu is destroyed
         GMainLoop* pLoop = g_main_loop_new(nullptr, true);
+
+#if  GTK_CHECK_VERSION(4, 0, 0)
+        gulong nSignalId = g_signal_connect_swapped(G_OBJECT(m_pMenu), 
"closed", G_CALLBACK(g_main_loop_quit), pLoop);
+
+        g_object_ref(m_pMenu);
+        gtk_menu_button_set_popover(m_pMenuButton, nullptr);
+        gtk_widget_set_parent(GTK_WIDGET(m_pMenu), pWidget);
+        gtk_popover_set_position(GTK_POPOVER(m_pMenu), GTK_POS_BOTTOM);
+        gtk_popover_popup(GTK_POPOVER(m_pMenu));
+#else
         gulong nSignalId = g_signal_connect_swapped(G_OBJECT(m_pMenu), 
"deactivate", G_CALLBACK(g_main_loop_quit), pLoop);
 
 #if GTK_CHECK_VERSION(3,22,0)
@@ -10123,15 +10130,22 @@ private:
 
             gtk_menu_popup(m_pMenu, nullptr, nullptr, nullptr, nullptr, 
nButton, nTime);
         }
+#endif
 
         if (g_main_loop_is_running(pLoop))
             main_loop_run(pLoop);
 
         g_main_loop_unref(pLoop);
         g_signal_handler_disconnect(m_pMenu, nSignalId);
-    }
+
+#if GTK_CHECK_VERSION(4, 0, 0)
+        gtk_widget_unparent(GTK_WIDGET(m_pMenu));
+        gtk_menu_button_set_popover(m_pMenuButton, GTK_WIDGET(m_pMenu));
+        g_object_unref(m_pMenu);
 #endif
 
+    }
+
     static gboolean signalMenuToggleButton(GtkWidget*, gboolean bGroupCycling, 
gpointer widget)
     {
         GtkInstanceMenuToggleButton* pThis = 
static_cast<GtkInstanceMenuToggleButton*>(widget);
@@ -10151,9 +10165,7 @@ public:
         , 
m_pContainer(GTK_BOX(gtk_builder_get_object(pMenuToggleButtonBuilder, "box")))
         , 
m_pToggleMenuButton(GTK_BUTTON(gtk_builder_get_object(pMenuToggleButtonBuilder, 
"menubutton")))
         , m_pMenuButton(pMenuButton)
-#if !GTK_CHECK_VERSION(4, 0, 0)
         , m_nMenuBtnClickedId(g_signal_connect(m_pToggleMenuButton, "clicked", 
G_CALLBACK(signalMenuBtnClicked), this))
-#endif
         , m_nToggleStateFlagsChangedId(g_signal_connect(m_pToggleButton, 
"state-flags-changed", G_CALLBACK(signalToggleStateFlagsChanged), this))
         , m_nMenuBtnStateFlagsChangedId(g_signal_connect(m_pToggleMenuButton, 
"state-flags-changed", G_CALLBACK(signalMenuBtnStateFlagsChanged), this))
     {
@@ -10222,27 +10234,21 @@ public:
 
     virtual void disable_notify_events() override
     {
-#if !GTK_CHECK_VERSION(4, 0, 0)
         g_signal_handler_block(m_pToggleMenuButton, m_nMenuBtnClickedId);
-#endif
         GtkInstanceToggleButton::disable_notify_events();
     }
 
     virtual void enable_notify_events() override
     {
         GtkInstanceToggleButton::enable_notify_events();
-#if !GTK_CHECK_VERSION(4, 0, 0)
         g_signal_handler_unblock(m_pToggleMenuButton, m_nMenuBtnClickedId);
-#endif
     }
 
     virtual ~GtkInstanceMenuToggleButton()
     {
         g_signal_handler_disconnect(m_pToggleButton, 
m_nToggleStateFlagsChangedId);
         g_signal_handler_disconnect(m_pToggleMenuButton, 
m_nMenuBtnStateFlagsChangedId);
-#if !GTK_CHECK_VERSION(4, 0, 0)
         g_signal_handler_disconnect(m_pToggleMenuButton, m_nMenuBtnClickedId);
-#endif
 
 #if GTK_CHECK_VERSION(4, 0, 0)
         GtkWidget* pChild = gtk_button_get_child(GTK_BUTTON(m_pToggleButton));

Reply via email to