Added check for changes to window size during GraphicsWindowWin32::init() to fix bug that occurs when the window manage resizes the window automatically on creation.

git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14835 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
Robert Osfield
2015-04-14 18:16:32 +00:00
parent 3add98180c
commit 1909de938a

View File

@@ -10,7 +10,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*
* This file is Copyright (C) 2007 - Andr<EFBFBD> Garneau (andre@pixdev.com) and licensed under OSGPL.
* This file is Copyright (C) 2007 - Andre Garneau (andre@pixdev.com) and licensed under OSGPL.
*
* Some elements of GraphicsWindowWin32 have used the Producer implementation as a reference.
* These elements are licensed under OSGPL as above, with Copyright (C) 2001-2004 Don Burns.
@@ -401,6 +401,41 @@ class Win32WindowingSystem : public osg::GraphicsContext::WindowingSystemInterfa
Win32WindowingSystem& operator=( const Win32WindowingSystem& );
};
///////////////////////////////////////////////////////////////////////////////
// Check if window dimensions have changed w.r.t stored values
//////////////////////////////////////////////////////////////////////////////
static bool areWindowDimensionsChanged(HWND hwnd, int screenOriginX, int screenOriginY, int& windowX, int& windowY, int& windowWidth, int& windowHeight)
{
POINT origin;
origin.x = 0;
origin.y = 0;
::ClientToScreen(hwnd, &origin);
int new_windowX = origin.x - screenOriginX;
int new_windowY = origin.y - screenOriginY;
RECT clientRect;
::GetClientRect(hwnd, &clientRect);
int new_windowWidth = (clientRect.right == 0) ? 1 : clientRect.right;
int new_windowHeight = (clientRect.bottom == 0) ? 1 : clientRect.bottom;
if ((new_windowX != windowX) || (new_windowY != windowY) || (new_windowWidth != windowWidth) || (new_windowHeight != windowHeight))
{
windowX = new_windowX;
windowY = new_windowY;
windowWidth = new_windowWidth;
windowHeight = new_windowHeight;
return true;
}
else
{
return false;
}
}
///////////////////////////////////////////////////////////////////////////////
// Error reporting
//////////////////////////////////////////////////////////////////////////////
@@ -1176,7 +1211,7 @@ void GraphicsWindowWin32::init()
// getEventQueue()->setCurrentEventState(osgGA::GUIEventAdapter::getAccumulatedEventState().get());
WindowData *windowData = _traits.get() ? dynamic_cast<WindowData*>(_traits->inheritedWindowData.get()) : 0;
WindowData *windowData = _traits.valid() ? dynamic_cast<WindowData*>(_traits->inheritedWindowData.get()) : 0;
HWND windowHandle = windowData ? windowData->_hwnd : 0;
_ownsWindow = windowHandle==0;
@@ -1187,6 +1222,20 @@ void GraphicsWindowWin32::init()
_initialized = _ownsWindow ? createWindow() : setWindow(windowHandle);
_valid = _initialized;
int windowX = 0, windowY = 0, windowWidth = 0, windowHeight = 0;
if (_traits.valid())
{
windowX = _traits->x;
windowY = _traits->y;
windowWidth = _traits->width;
windowHeight = _traits->height;
}
if (areWindowDimensionsChanged(_hwnd, _screenOriginX, _screenOriginY, windowX, windowY, windowWidth, windowHeight))
{
resized(windowX, windowY, windowWidth, windowHeight);
}
// make sure the event queue has the correct window rectangle size and input range
getEventQueue()->syncWindowRectangleWithGraphicsContext();
@@ -2463,7 +2512,6 @@ LRESULT GraphicsWindowWin32::handleNativeWindowingEvent( HWND hwnd, UINT uMsg, W
//!@todo adapt windows event time to osgGA event queue time for better resolution
double eventTime = getEventQueue()->getTime();
double resizeTime = eventTime;
_timeOfLastCheckEvents = eventTime;
switch(uMsg)
@@ -2593,27 +2641,11 @@ LRESULT GraphicsWindowWin32::handleNativeWindowingEvent( HWND hwnd, UINT uMsg, W
/////////////////
{
POINT origin;
origin.x = 0;
origin.y = 0;
::ClientToScreen(hwnd, &origin);
int windowX = origin.x - _screenOriginX;
int windowY = origin.y - _screenOriginY;
resizeTime = eventTime;
RECT clientRect;
::GetClientRect(hwnd, &clientRect);
int windowWidth = (clientRect.right == 0) ? 1 : clientRect.right ;
int windowHeight = (clientRect.bottom == 0) ? 1 : clientRect.bottom;;
// send resize event if window position or size was changed
if (windowX!=_traits->x || windowY!=_traits->y || windowWidth!=_traits->width || windowHeight!=_traits->height)
int windowX=_traits->x, windowY=_traits->y, windowWidth=_traits->width, windowHeight=_traits->height;
if (areWindowDimensionsChanged(hwnd, _screenOriginX, _screenOriginY, windowX, windowY, windowWidth, windowHeight))
{
resized(windowX, windowY, windowWidth, windowHeight);
getEventQueue()->windowResize(windowX, windowY, windowWidth, windowHeight, resizeTime);
getEventQueue()->windowResize(windowX, windowY, windowWidth, windowHeight, eventTime);
// request redraw if window size was changed
if (windowWidth!=_traits->width || windowHeight!=_traits->height)