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

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Fri May 22 18:40:23 UTC 2020


 include/vcl/weld.hxx          |    5 +++--
 vcl/inc/salvtables.hxx        |    2 ++
 vcl/source/app/salvtables.cxx |    6 ++++++
 vcl/unx/gtk3/gtk3gtkinst.cxx  |   40 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 51 insertions(+), 2 deletions(-)

New commits:
commit 208d931861be4d5cf571c404f517fb5c26499aa0
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu May 21 12:48:34 2020 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Fri May 22 20:39:36 2020 +0200

    support rendering a widget snapshot to an OutputDevice
    
    Change-Id: I7beecd8f9579d5ae4b60a839f4a71c3238e0666d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94645
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index fd734309d6a9..a57f7f4321c3 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -272,6 +272,9 @@ public:
     virtual void connect_get_property_tree(const Link<boost::property_tree::ptree&, void>& rLink)
         = 0;
 
+    // render the widget to an output device
+    virtual void draw(VirtualDevice& rOutput) = 0;
+
     virtual ~Widget() {}
 };
 
@@ -461,8 +464,6 @@ public:
 
     virtual void resize_to_request() = 0;
 
-    // render the dialog for a screenshot
-    virtual void draw(VirtualDevice& rOutput) = 0;
     // collect positions of widgets and their help ids for screenshot purposes
     virtual ScreenShotCollection collect_screenshot_data() = 0;
 };
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index 6cc85731952e..86b9d0aec5bf 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -390,6 +390,8 @@ public:
 
     virtual void set_highlight_background() override;
 
+    virtual void draw(VirtualDevice& rOutput) override;
+
     SystemWindow* getSystemWindow();
 };
 
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index b3c9d2cfb77d..67cb4fad45e1 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -1135,6 +1135,12 @@ std::unique_ptr<weld::Container> SalInstanceWidget::weld_parent() const
     return std::make_unique<SalInstanceContainer>(pParent, m_pBuilder, false);
 }
 
+void SalInstanceWidget::draw(VirtualDevice& rOutput)
+{
+    rOutput.SetOutputSizePixel(m_xWidget->GetSizePixel());
+    m_xWidget->PaintToDevice(&rOutput, Point());
+}
+
 namespace
 {
 class SalInstanceBox : public SalInstanceContainer, public virtual weld::Box
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 530a115bd96b..16b2a1ae1d7c 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -3065,6 +3065,46 @@ public:
         xRet->SetBackground(COL_TRANSPARENT);
         return xRet;
     }
+
+    virtual void draw(VirtualDevice& rOutput) override
+    {
+        // detect if we have to manually setup its size
+        bool bAlreadyRealized = gtk_widget_get_realized(m_pWidget);
+        // has to be visible for draw to work
+        bool bAlreadyVisible = gtk_widget_get_visible(m_pWidget);
+        // has to be mapped for draw to work
+        bool bAlreadyMapped = gtk_widget_get_mapped(m_pWidget);
+        if (!bAlreadyVisible)
+            gtk_widget_show(m_pWidget);
+
+        GtkAllocation allocation;
+
+        if (!bAlreadyRealized)
+            gtk_widget_realize(m_pWidget);
+
+        if (!bAlreadyMapped)
+            gtk_widget_map(m_pWidget);
+
+        if (GTK_IS_CONTAINER(m_pWidget))
+            gtk_container_resize_children(GTK_CONTAINER(m_pWidget));
+
+        gtk_widget_get_allocation(m_pWidget, &allocation);
+
+        rOutput.SetOutputSizePixel(Size(allocation.width, allocation.height));
+        cairo_surface_t* pSurface = get_underlying_cairo_surface(rOutput);
+        cairo_t* cr = cairo_create(pSurface);
+
+        gtk_widget_draw(m_pWidget, cr);
+
+        cairo_destroy(cr);
+
+        if (!bAlreadyVisible)
+            gtk_widget_hide(m_pWidget);
+        if (!bAlreadyMapped)
+            gtk_widget_unmap(m_pWidget);
+        if (!bAlreadyRealized)
+            gtk_widget_unrealize(m_pWidget);
+    }
 };
 
 }


More information about the Libreoffice-commits mailing list