Kaydet (Commit) 4acfac85 authored tarafından Miklos Vajna's avatar Miklos Vajna Kaydeden (comit) Tomaž Vajngerl

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 161f7533 and
43ac95ab)

Change-Id: Iba07070baafb5b802fc6da200696611afd2010d7
Reviewed-on: https://gerrit.libreoffice.org/17490Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTomaž Vajngerl <quikee@gmail.com>
üst a4e7c89f
...@@ -114,8 +114,12 @@ void PaintHelper::StartBufferedPaint() ...@@ -114,8 +114,12 @@ void PaintHelper::StartBufferedPaint()
// Instead of creating a new VirtualDevice, just erase the area we'll be // Instead of creating a new VirtualDevice, just erase the area we'll be
// painting over, as VirtualDevice::ImplInitVirDev() would do. // 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->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; pFrameData->mbInBufferedPaint = true;
m_bCreatedBuffer = true; m_bCreatedBuffer = true;
...@@ -125,9 +129,6 @@ void PaintHelper::StartBufferedPaint() ...@@ -125,9 +129,6 @@ void PaintHelper::StartBufferedPaint()
// Remember what was the map mode of m_aPaintRect. // Remember what was the map mode of m_aPaintRect.
m_aPaintRectMapMode = m_pWindow->GetMapMode(); 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 // we need to remember the mnOutOffX / mnOutOffY, but actually really
// set it just temporarily for the subwidgets - so we are setting it here // 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 // only to remember the value & to be able to pass it to the descendants
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <vcl/help.hxx> #include <vcl/help.hxx>
#include <vcl/dockwin.hxx> #include <vcl/dockwin.hxx>
#include <vcl/menu.hxx> #include <vcl/menu.hxx>
#include <vcl/virdev.hxx>
#include <touch/touch.h> #include <touch/touch.h>
#include <svdata.hxx> #include <svdata.hxx>
...@@ -1712,6 +1713,12 @@ void ImplHandleResize( vcl::Window* pWindow, long nNewWidth, long nNewHeight ) ...@@ -1712,6 +1713,12 @@ void ImplHandleResize( vcl::Window* pWindow, long nNewWidth, long nNewHeight )
} }
else else
pWindow->ImplGetWindowImpl()->mbCallResize = true; pWindow->ImplGetWindowImpl()->mbCallResize = true;
if (pWindow->SupportsDoubleBuffering() && pWindow->ImplGetWindowImpl()->mbFrame)
{
// Propagate resize for the frame's buffer.
pWindow->ImplGetWindowImpl()->mpFrameData->mpBuffer->SetOutputSizePixel(pWindow->GetOutputSizePixel());
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment