summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-05-21 12:48:34 +0100
committerCaolán McNamara <caolanm@redhat.com>2020-05-22 20:39:36 +0200
commit208d931861be4d5cf571c404f517fb5c26499aa0 (patch)
tree0a351b0f0cb9e45b1ce66ca2f591ca32a69fae26 /vcl
parenta12b8566e835badeae449c52dbace21efc5e623e (diff)
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@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/salvtables.hxx2
-rw-r--r--vcl/source/app/salvtables.cxx6
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx40
3 files changed, 48 insertions, 0 deletions
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);
+ }
};
}