vcl/unx/gtk3/gtkframe.cxx |   41 +++++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)

New commits:
commit b87ac05be8855275b9c5dd48770a1f52b8e8f966
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Jul 27 16:26:41 2022 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Jul 28 11:43:51 2022 +0200

    gtk4: use GtkPopovers to replace popups
    
    still a bit rough, but functional at least
    
    Change-Id: I4b5f896a0d895ed20da3534173c20241a7fe7ea1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137510
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx
index b1a00fe23129..008a8d5dbbdb 100644
--- a/vcl/unx/gtk3/gtkframe.cxx
+++ b/vcl/unx/gtk3/gtkframe.cxx
@@ -776,10 +776,21 @@ void GtkSalFrame::moveWindow( tools::Long nX, tools::Long 
nY )
                             m_pWindow,
                             nX - m_pParent->maGeometry.x(), nY - 
m_pParent->maGeometry.y() );
         }
+        return;
     }
-#if !GTK_CHECK_VERSION(4,0,0)
-    else
-        gtk_window_move( GTK_WINDOW(m_pWindow), nX, nY );
+#if GTK_CHECK_VERSION(4,0,0)
+    if (GTK_IS_POPOVER(m_pWindow))
+    {
+        GdkRectangle aRect;
+        aRect.x = nX;
+        aRect.y = nY;
+        aRect.width = 1;
+        aRect.height = 1;
+        gtk_popover_set_pointing_to(GTK_POPOVER(m_pWindow), &aRect);
+        return;
+    }
+#else
+    gtk_window_move( GTK_WINDOW(m_pWindow), nX, nY );
 #endif
 }
 
@@ -795,6 +806,13 @@ void GtkSalFrame::window_resize(tools::Long nWidth, 
tools::Long nHeight)
 {
     m_nWidthRequest = nWidth;
     m_nHeightRequest = nHeight;
+    if (!GTK_IS_WINDOW(m_pWindow))
+    {
+#if GTK_CHECK_VERSION(4,0,0)
+        gtk_widget_set_size_request(GTK_WIDGET(m_pDrawingArea), nWidth, 
nHeight);
+#endif
+        return;
+    }
     gtk_window_set_default_size(GTK_WINDOW(m_pWindow), nWidth, nHeight);
 #if !GTK_CHECK_VERSION(4,0,0)
     if (gtk_widget_get_visible(m_pWindow))
@@ -1374,7 +1392,13 @@ void GtkSalFrame::Init( SalFrame* pParent, 
SalFrameStyleFlags nStyle )
 #if !GTK_CHECK_VERSION(4,0,0)
         m_pWindow = gtk_window_new(bPopup ? GTK_WINDOW_POPUP : 
GTK_WINDOW_TOPLEVEL);
 #else
-        m_pWindow = gtk_window_new();
+        if (!bPopup)
+            m_pWindow = gtk_window_new();
+        else
+        {
+            m_pWindow = gtk_popover_new();
+            gtk_popover_set_has_arrow(GTK_POPOVER(m_pWindow), false);
+        }
 #endif
 
 #if !GTK_CHECK_VERSION(4,0,0)
@@ -1418,6 +1442,11 @@ void GtkSalFrame::Init( SalFrame* pParent, 
SalFrameStyleFlags nStyle )
             g_object_unref(gtk_window_get_group(GTK_WINDOW(m_pWindow)));
         }
     }
+    else if (GTK_IS_POPOVER(m_pWindow))
+    {
+        assert(m_pParent);
+        gtk_widget_set_parent(m_pWindow, m_pParent->getMouseEventWidget());
+    }
 
     // set window type
     bool bDecoHandling =
@@ -1581,7 +1610,7 @@ bool GtkSalFrame::PostEvent(std::unique_ptr<ImplSVEvent> 
pData)
 
 void GtkSalFrame::SetTitle( const OUString& rTitle )
 {
-    if( m_pWindow && ! isChild() )
+    if (m_pWindow && GTK_IS_WINDOW(m_pWindow) && !isChild())
     {
         OString sTitle(OUStringToOString(rTitle, RTL_TEXTENCODING_UTF8));
         gtk_window_set_title(GTK_WINDOW(m_pWindow), sTitle.getStr());
@@ -1889,7 +1918,7 @@ void GtkSalFrame::SetPosSize( tools::Long nX, tools::Long 
nY, tools::Long nWidth
 
         maGeometry.setSize({ nWidth, nHeight });
 
-        if( isChild( false ) )
+        if (isChild(false) || GTK_IS_POPOVER(m_pWindow))
             widget_set_size_request(nWidth, nHeight);
         else if( ! ( m_nState & GDK_TOPLEVEL_STATE_MAXIMIZED ) )
             window_resize(nWidth, nHeight);

Reply via email to