vcl/inc/unx/gtk/gtkdata.hxx |    3 +++
 vcl/unx/gtk3/gtkdata.cxx    |   40 ++++++++++++++++++++++++++++++++++++++++
 vcl/unx/gtk3/gtkframe.cxx   |   27 +++++++++++++++++----------
 vcl/unx/gtk3/gtkinst.cxx    |   40 ++++------------------------------------
 4 files changed, 64 insertions(+), 46 deletions(-)

New commits:
commit 4836e15ba980ea3bdccd3c063eb94f52e35646b0
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Mon Nov 15 11:27:37 2021 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Mon Nov 15 16:17:25 2021 +0100

    gtk4: implement CreateChildFrame
    
    which gets the extension options tab pages working, e.g.
    "English Sentence Checking"
    
    Change-Id: Ib98f366fdcc7c51f4399372a78f78a655b3c0b86
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125242
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/inc/unx/gtk/gtkdata.hxx b/vcl/inc/unx/gtk/gtkdata.hxx
index 5299d15a2088..0c6b73cabadc 100644
--- a/vcl/inc/unx/gtk/gtkdata.hxx
+++ b/vcl/inc/unx/gtk/gtkdata.hxx
@@ -195,6 +195,9 @@ inline GdkGLContext* surface_create_gl_context(GdkSurface* 
pSurface)
 void set_buildable_id(GtkBuildable* pWidget, const OString& rId);
 OString get_buildable_id(GtkBuildable* pWidget);
 
+void container_remove(GtkWidget* pContainer, GtkWidget* pChild);
+void container_add(GtkWidget* pContainer, GtkWidget* pChild);
+
 #if !GTK_CHECK_VERSION(4, 0, 0)
 typedef GtkClipboard GdkClipboard;
 #endif
diff --git a/vcl/unx/gtk3/gtkdata.cxx b/vcl/unx/gtk3/gtkdata.cxx
index 8f2afb4dc5a4..861ae6e64743 100644
--- a/vcl/unx/gtk3/gtkdata.cxx
+++ b/vcl/unx/gtk3/gtkdata.cxx
@@ -925,4 +925,44 @@ int getButtonPriority(std::string_view rType)
     return -1;
 }
 
+void container_remove(GtkWidget* pContainer, GtkWidget* pChild)
+{
+#if !GTK_CHECK_VERSION(4, 0, 0)
+    gtk_container_remove(GTK_CONTAINER(pContainer), pChild);
+#else
+    assert(GTK_IS_BOX(pContainer) || GTK_IS_GRID(pContainer) || 
GTK_IS_POPOVER(pContainer) ||
+           GTK_IS_FIXED(pContainer) || GTK_IS_WINDOW(pContainer));
+    if (GTK_IS_BOX(pContainer))
+        gtk_box_remove(GTK_BOX(pContainer), pChild);
+    else if (GTK_IS_GRID(pContainer))
+        gtk_grid_remove(GTK_GRID(pContainer), pChild);
+    else if (GTK_IS_POPOVER(pContainer))
+        gtk_popover_set_child(GTK_POPOVER(pContainer), nullptr);
+    else if (GTK_IS_WINDOW(pContainer))
+        gtk_window_set_child(GTK_WINDOW(pContainer), nullptr);
+    else if (GTK_IS_FIXED(pContainer))
+        gtk_fixed_remove(GTK_FIXED(pContainer), pChild);
+#endif
+}
+
+void container_add(GtkWidget* pContainer, GtkWidget* pChild)
+{
+#if !GTK_CHECK_VERSION(4, 0, 0)
+    gtk_container_add(GTK_CONTAINER(pContainer), pChild);
+#else
+    assert(GTK_IS_BOX(pContainer) || GTK_IS_GRID(pContainer) || 
GTK_IS_POPOVER(pContainer) ||
+           GTK_IS_FIXED(pContainer) || GTK_IS_WINDOW(pContainer));
+    if (GTK_IS_BOX(pContainer))
+        gtk_box_append(GTK_BOX(pContainer), pChild);
+    else if (GTK_IS_GRID(pContainer))
+        gtk_grid_attach(GTK_GRID(pContainer), pChild, 0, 0, 1, 1);
+    else if (GTK_IS_POPOVER(pContainer))
+        gtk_popover_set_child(GTK_POPOVER(pContainer), pChild);
+    else if (GTK_IS_WINDOW(pContainer))
+        gtk_window_set_child(GTK_WINDOW(pContainer), pChild);
+    else if (GTK_IS_FIXED(pContainer))
+        gtk_fixed_put(GTK_FIXED(pContainer), pChild, 0, 0);
+#endif
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx
index a4463bde6d06..a42a745aa988 100644
--- a/vcl/unx/gtk3/gtkframe.cxx
+++ b/vcl/unx/gtk3/gtkframe.cxx
@@ -735,7 +735,10 @@ GtkSalFrame::~GtkSalFrame()
 #if !GTK_CHECK_VERSION(4,0,0)
             gtk_widget_destroy( m_pWindow );
 #else
-            gtk_window_destroy(GTK_WINDOW(m_pWindow));
+            if (GTK_IS_WINDOW(m_pWindow))
+                gtk_window_destroy(GTK_WINDOW(m_pWindow));
+            else
+                g_clear_pointer(&m_pWindow, gtk_widget_unparent);
 #endif
         }
     }
@@ -906,17 +909,15 @@ void GtkSalFrame::InitCommon()
 #endif
 
     m_pTopLevelGrid = GTK_GRID(gtk_grid_new());
-#if !GTK_CHECK_VERSION(4,0,0)
-    gtk_container_add(GTK_CONTAINER(m_pWindow), GTK_WIDGET(m_pTopLevelGrid));
+    container_add(m_pWindow, GTK_WIDGET(m_pTopLevelGrid));
 
+#if !GTK_CHECK_VERSION(4,0,0)
     m_pEventBox = GTK_EVENT_BOX(gtk_event_box_new());
     gtk_widget_add_events( GTK_WIDGET(m_pEventBox),
                            GDK_ALL_EVENTS_MASK );
     gtk_widget_set_vexpand(GTK_WIDGET(m_pEventBox), true);
     gtk_widget_set_hexpand(GTK_WIDGET(m_pEventBox), true);
     gtk_grid_attach(m_pTopLevelGrid, GTK_WIDGET(m_pEventBox), 0, 0, 1, 1);
-#else
-    gtk_window_set_child(GTK_WINDOW(m_pWindow),  GTK_WIDGET(m_pTopLevelGrid));
 #endif
 
     // add the fixed container child,
@@ -1064,7 +1065,8 @@ void GtkSalFrame::InitCommon()
 #else
     g_signal_connect( G_OBJECT(m_pWindow), "map", G_CALLBACK(signalMap), this 
);
     g_signal_connect( G_OBJECT(m_pWindow), "unmap", G_CALLBACK(signalUnmap), 
this );
-    g_signal_connect( G_OBJECT(m_pWindow), "close-request", 
G_CALLBACK(signalDelete), this );
+    if (GTK_IS_WINDOW(m_pWindow))
+        g_signal_connect( G_OBJECT(m_pWindow), "close-request", 
G_CALLBACK(signalDelete), this );
 #endif
 #if !GTK_CHECK_VERSION(4,0,0)
     g_signal_connect( G_OBJECT(m_pWindow), "configure-event", 
G_CALLBACK(signalConfigure), this );
@@ -1122,12 +1124,15 @@ void GtkSalFrame::InitCommon()
     // realize the window, we need an XWindow id
     gtk_widget_realize( m_pWindow );
 
+    if (GTK_IS_WINDOW(m_pWindow))
+    {
 #if !GTK_CHECK_VERSION(4,0,0)
-    g_signal_connect(G_OBJECT(m_pWindow), "window-state-event", 
G_CALLBACK(signalWindowState), this);
+        g_signal_connect(G_OBJECT(m_pWindow), "window-state-event", 
G_CALLBACK(signalWindowState), this);
 #else
-    GdkSurface* gdkWindow = widget_get_surface(m_pWindow);
-    g_signal_connect(G_OBJECT(gdkWindow), "notify::state", 
G_CALLBACK(signalWindowState), this);
+        GdkSurface* gdkWindow = widget_get_surface(m_pWindow);
+        g_signal_connect(G_OBJECT(gdkWindow), "notify::state", 
G_CALLBACK(signalWindowState), this);
 #endif
+    }
 
     //system data
     m_aSystemData.SetWindowHandle(GetNativeWindowHandle(m_pWindow));
@@ -1263,13 +1268,15 @@ void GtkSalFrame::Init( SalFrame* pParent, 
SalFrameStyleFlags nStyle )
     {
 #if !GTK_CHECK_VERSION(4,0,0)
         m_pWindow = gtk_event_box_new();
+#else
+        m_pWindow = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+#endif
         if( m_pParent )
         {
             // insert into container
             gtk_fixed_put( m_pParent->getFixedContainer(),
                            m_pWindow, 0, 0 );
         }
-#endif
     }
     else
     {
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 45f3639a2a7f..8960b70aa34c 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -2233,36 +2233,6 @@ namespace
         return pWidget;
     }
 
-    void container_remove(GtkWidget* pContainer, GtkWidget* pChild)
-    {
-#if !GTK_CHECK_VERSION(4, 0, 0)
-        gtk_container_remove(GTK_CONTAINER(pContainer), pChild);
-#else
-        assert(GTK_IS_BOX(pContainer) || GTK_IS_GRID(pContainer) || 
GTK_IS_POPOVER(pContainer));
-        if (GTK_IS_BOX(pContainer))
-            gtk_box_remove(GTK_BOX(pContainer), pChild);
-        else if (GTK_IS_GRID(pContainer))
-            gtk_grid_remove(GTK_GRID(pContainer), pChild);
-        else if (GTK_IS_POPOVER(pContainer))
-            gtk_popover_set_child(GTK_POPOVER(pContainer), nullptr);
-#endif
-    }
-
-    void container_add(GtkWidget* pContainer, GtkWidget* pChild)
-    {
-#if !GTK_CHECK_VERSION(4, 0, 0)
-        gtk_container_add(GTK_CONTAINER(pContainer), pChild);
-#else
-        assert(GTK_IS_BOX(pContainer) || GTK_IS_GRID(pContainer) || 
GTK_IS_POPOVER(pContainer));
-        if (GTK_IS_BOX(pContainer))
-            gtk_box_append(GTK_BOX(pContainer), pChild);
-        else if (GTK_IS_GRID(pContainer))
-            gtk_grid_attach(GTK_GRID(pContainer), pChild, 0, 0, 1, 1);
-        else if (GTK_IS_POPOVER(pContainer))
-            gtk_popover_set_child(GTK_POPOVER(pContainer), pChild);
-#endif
-    }
-
     void replaceWidget(GtkWidget* pWidget, GtkWidget* pReplacement)
     {
         // remove the widget and replace it with pReplacement
@@ -5847,7 +5817,6 @@ public:
 
     virtual css::uno::Reference<css::awt::XWindow> CreateChildFrame() override
     {
-#if !GTK_CHECK_VERSION(4, 0, 0)
         // This will cause a GtkSalFrame to be created. With 
WB_SYSTEMCHILDWINDOW set it
         // will create a toplevel GtkEventBox window
         auto xEmbedWindow = VclPtr<ChildFrame>::Create(ImplGetDefaultWindow(), 
WB_SYSTEMCHILDWINDOW | WB_DIALOGCONTROL | WB_CHILDDLGCTRL);
@@ -5861,9 +5830,11 @@ public:
         GtkWidget* pParent = gtk_widget_get_parent(pWindow);
 
         g_object_ref(pWindow);
-        gtk_container_remove(GTK_CONTAINER(pParent), pWindow);
-        gtk_container_add(m_pContainer, pWindow);
+        container_remove(pParent, pWindow);
+        container_add(GTK_WIDGET(m_pContainer), pWindow);
+#if !GTK_CHECK_VERSION(4, 0, 0)
         gtk_container_child_set(m_pContainer, pWindow, "expand", true, "fill", 
true, nullptr);
+#endif
         gtk_widget_set_hexpand(pWindow, true);
         gtk_widget_set_vexpand(pWindow, true);
         gtk_widget_realize(pWindow);
@@ -5874,9 +5845,6 @@ public:
         xEmbedWindow->Show(true, ShowFlags::NoActivate);
         css::uno::Reference<css::awt::XWindow> 
xWindow(xEmbedWindow->GetComponentInterface(), css::uno::UNO_QUERY);
         return xWindow;
-#else
-        return nullptr;
-#endif
     }
 
     virtual ~GtkInstanceContainer() override

Reply via email to