vcl/unx/gtk3/gtkinst.cxx |   42 ++++++++++++++++++++++++++----------------
 1 file changed, 26 insertions(+), 16 deletions(-)

New commits:
commit 61b806b28b6c7e49fb5e153e0ea589a020191f25
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Fri Nov 19 16:57:27 2021 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Sat Nov 20 17:42:06 2021 +0100

    gtk3: don't double close popover replacement
    
    Change-Id: Ibdd7de56ab1cadd76748422c08e21904f912532a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125567
    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 3acdbbd8276e..4f64c75ae480 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -21952,6 +21952,7 @@ private:
 #if !GTK_CHECK_VERSION(4, 0, 0)
     //popover cannot escape dialog under X so we might need to stick up own 
window instead
     GtkWindow* m_pMenuHack;
+    bool m_bMenuPoppedUp;
     bool m_nButtonPressSeen;
 #endif
     GtkPopover* m_pPopover;
@@ -22035,6 +22036,7 @@ public:
 #if !GTK_CHECK_VERSION(4, 0, 0)
         : GtkInstanceContainer(GTK_CONTAINER(pPopover), pBuilder, 
bTakeOwnership)
         , m_pMenuHack(nullptr)
+        , m_bMenuPoppedUp(false)
         , m_nButtonPressSeen(false)
 #else
         : GtkInstanceContainer(GTK_WIDGET(pPopover), pBuilder, bTakeOwnership)
@@ -22079,23 +22081,27 @@ public:
         GdkDisplay *pDisplay = gtk_widget_get_display(GTK_WIDGET(m_pPopover));
         if (DLSYM_GDK_IS_X11_DISPLAY(pDisplay) && 
gtk_popover_get_constrain_to(m_pPopover) == GTK_POPOVER_CONSTRAINT_NONE)
         {
-            if (!m_pMenuHack)
+            if (!m_bMenuPoppedUp)
             {
-                m_pMenuHack = GTK_WINDOW(gtk_window_new(GTK_WINDOW_POPUP));
-                gtk_window_set_type_hint(m_pMenuHack, 
GDK_WINDOW_TYPE_HINT_COMBO);
-                bool bModal = gtk_popover_get_modal(m_pPopover);
-                gtk_window_set_modal(m_pMenuHack, bModal);
-                gtk_window_set_resizable(m_pMenuHack, false);
-                g_signal_connect(m_pMenuHack, "key-press-event", 
G_CALLBACK(keyPress), this);
-                if (bModal)
+                if (!m_pMenuHack)
                 {
-                     g_signal_connect(m_pMenuHack, "grab-broken-event", 
G_CALLBACK(signalGrabBroken), this);
-                     g_signal_connect(m_pMenuHack, "button-press-event", 
G_CALLBACK(signalButtonPress), this);
-                     g_signal_connect(m_pMenuHack, "button-release-event", 
G_CALLBACK(signalButtonRelease), this);
+                    m_pMenuHack = GTK_WINDOW(gtk_window_new(GTK_WINDOW_POPUP));
+                    gtk_window_set_type_hint(m_pMenuHack, 
GDK_WINDOW_TYPE_HINT_COMBO);
+                    bool bModal = gtk_popover_get_modal(m_pPopover);
+                    gtk_window_set_modal(m_pMenuHack, bModal);
+                    gtk_window_set_resizable(m_pMenuHack, false);
+                    g_signal_connect(m_pMenuHack, "key-press-event", 
G_CALLBACK(keyPress), this);
+                    if (bModal)
+                    {
+                         g_signal_connect(m_pMenuHack, "grab-broken-event", 
G_CALLBACK(signalGrabBroken), this);
+                         g_signal_connect(m_pMenuHack, "button-press-event", 
G_CALLBACK(signalButtonPress), this);
+                         g_signal_connect(m_pMenuHack, "button-release-event", 
G_CALLBACK(signalButtonRelease), this);
+                    }
                 }
-            }
 
-            MovePopoverContentsToWindow(GTK_WIDGET(m_pPopover), m_pMenuHack, 
pWidget, aRect, ePlace);
+                MovePopoverContentsToWindow(GTK_WIDGET(m_pPopover), 
m_pMenuHack, pWidget, aRect, ePlace);
+                m_bMenuPoppedUp = true;
+            }
             return;
         }
 #endif
@@ -22113,9 +22119,13 @@ public:
         GdkDisplay *pDisplay = gtk_widget_get_display(GTK_WIDGET(m_pPopover));
         if (DLSYM_GDK_IS_X11_DISPLAY(pDisplay))
         {
-            m_nButtonPressSeen = false;
-            MoveWindowContentsToPopover(m_pMenuHack, GTK_WIDGET(m_pPopover), 
gtk_popover_get_relative_to(m_pPopover));
-            signal_closed();
+            if (m_bMenuPoppedUp)
+            {
+                m_nButtonPressSeen = false;
+                MoveWindowContentsToPopover(m_pMenuHack, 
GTK_WIDGET(m_pPopover), gtk_popover_get_relative_to(m_pPopover));
+                m_bMenuPoppedUp = false;
+                signal_closed();
+            }
             return;
         }
 #endif

Reply via email to