summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-07-31 15:28:20 +0200
committerTomaž Vajngerl <quikee@gmail.com>2015-08-03 10:51:38 +0000
commit4acfac8501cebf24e614be090efde12b3b4df392 (patch)
tree9d58775977f3fe8f8255b8563f48c2572c2a4482
parenta4e7c89f36c56bbb8b5a7ea1134e65715d8cd2cf (diff)
tdf#92982 vcl rendercontext: set buffer size in ImplHandleResize()
Instead of in PaintHelper::StartBufferedPaint(). If the buffer size is set to match the size of a sub-widget (for which the paint was triggered), then client using the buffer as a persistent vdev are unable to paint at arbitrary locations. For example, if we painted the ruler, then the blinking cursor won't be able to paint to the SwEditWin area. (cherry picked from commits 161f7533ac177c25516ec206233936bd6982e3df and 43ac95ab64980ed958ba144c33971f897791d15f) Change-Id: Iba07070baafb5b802fc6da200696611afd2010d7 Reviewed-on: https://gerrit.libreoffice.org/17490 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
-rw-r--r--vcl/source/window/paint.cxx9
-rw-r--r--vcl/source/window/winproc.cxx7
2 files changed, 12 insertions, 4 deletions
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index 406c14110477..c529d135c090 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -114,8 +114,12 @@ void PaintHelper::StartBufferedPaint()
// Instead of creating a new VirtualDevice, just erase the area we'll be
// painting over, as VirtualDevice::ImplInitVirDev() would do.
+ // The painted area is m_aPaintRect, or in case it's empty, then the whole window.
pFrameData->mpBuffer->SetBackground(Wallpaper(Color(COL_WHITE)));
- pFrameData->mpBuffer->Erase(m_aPaintRect);
+ if (m_aPaintRect.IsEmpty())
+ pFrameData->mpBuffer->Erase(Rectangle(Point(0, 0), m_pWindow->GetOutputSize()));
+ else
+ pFrameData->mpBuffer->Erase(m_aPaintRect);
pFrameData->mbInBufferedPaint = true;
m_bCreatedBuffer = true;
@@ -125,9 +129,6 @@ void PaintHelper::StartBufferedPaint()
// Remember what was the map mode of m_aPaintRect.
m_aPaintRectMapMode = m_pWindow->GetMapMode();
- // update the output size now, after all the settings were copied
- pFrameData->mpBuffer->SetOutputSize(m_pWindow->GetOutputSize());
-
// we need to remember the mnOutOffX / mnOutOffY, but actually really
// set it just temporarily for the subwidgets - so we are setting it here
// only to remember the value & to be able to pass it to the descendants
diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx
index 06d8fa879dfa..304753a02285 100644
--- a/vcl/source/window/winproc.cxx
+++ b/vcl/source/window/winproc.cxx
@@ -35,6 +35,7 @@
#include <vcl/help.hxx>
#include <vcl/dockwin.hxx>
#include <vcl/menu.hxx>
+#include <vcl/virdev.hxx>
#include <touch/touch.h>
#include <svdata.hxx>
@@ -1712,6 +1713,12 @@ void ImplHandleResize( vcl::Window* pWindow, long nNewWidth, long nNewHeight )
}
else
pWindow->ImplGetWindowImpl()->mbCallResize = true;
+
+ if (pWindow->SupportsDoubleBuffering() && pWindow->ImplGetWindowImpl()->mbFrame)
+ {
+ // Propagate resize for the frame's buffer.
+ pWindow->ImplGetWindowImpl()->mpFrameData->mpBuffer->SetOutputSizePixel(pWindow->GetOutputSizePixel());
+ }
}
}