diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-05-21 12:48:34 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-05-22 20:39:36 +0200 |
commit | 208d931861be4d5cf571c404f517fb5c26499aa0 (patch) | |
tree | 0a351b0f0cb9e45b1ce66ca2f591ca32a69fae26 /vcl | |
parent | a12b8566e835badeae449c52dbace21efc5e623e (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.hxx | 2 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 6 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 40 |
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); + } }; } |