Fixed error in Mouse::Set/GetPosition when the given window was already closed

This commit is contained in:
Laurent Gomila 2011-07-17 11:26:28 +02:00
parent 61adc51d09
commit 73665bd50a
2 changed files with 41 additions and 17 deletions

View File

@ -227,6 +227,9 @@ Vector2i InputImpl::GetMousePosition()
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
Vector2i InputImpl::GetMousePosition(const Window& relativeTo) Vector2i InputImpl::GetMousePosition(const Window& relativeTo)
{
WindowHandle handle = relativeTo.GetSystemHandle();
if (handle)
{ {
// we don't care about these but they are required // we don't care about these but they are required
::Window root, child; ::Window root, child;
@ -235,10 +238,15 @@ Vector2i InputImpl::GetMousePosition(const Window& relativeTo)
int x = 0; int x = 0;
int y = 0; int y = 0;
XQueryPointer(global.display, relativeTo.GetSystemHandle(), &root, &child, &gx, &gy, &x, &y, &buttons); XQueryPointer(global.display, handle, &root, &child, &gx, &gy, &x, &y, &buttons);
return Vector2i(x, y); return Vector2i(x, y);
} }
else
{
return Vector2i();
}
}
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -252,9 +260,13 @@ void InputImpl::SetMousePosition(const Vector2i& position)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void InputImpl::SetMousePosition(const Vector2i& position, const Window& relativeTo) void InputImpl::SetMousePosition(const Vector2i& position, const Window& relativeTo)
{ {
XWarpPointer(global.display, None, relativeTo.GetSystemHandle(), 0, 0, 0, 0, position.x, position.y); WindowHandle handle = relativeTo.GetSystemHandle();
if (handle)
{
XWarpPointer(global.display, None, handle, 0, 0, 0, 0, position.x, position.y);
XFlush(global.display); XFlush(global.display);
} }
}
} // namespace priv } // namespace priv

View File

@ -177,12 +177,20 @@ Vector2i InputImpl::GetMousePosition()
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
Vector2i InputImpl::GetMousePosition(const Window& relativeTo) Vector2i InputImpl::GetMousePosition(const Window& relativeTo)
{
WindowHandle handle = relativeTo.GetSystemHandle();
if (handle)
{ {
POINT point; POINT point;
GetCursorPos(&point); GetCursorPos(&point);
ScreenToClient(relativeTo.GetSystemHandle(), &point); ScreenToClient(handle, &point);
return Vector2i(point.x, point.y); return Vector2i(point.x, point.y);
} }
else
{
return Vector2i();
}
}
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -194,11 +202,15 @@ void InputImpl::SetMousePosition(const Vector2i& position)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void InputImpl::SetMousePosition(const Vector2i& position, const Window& relativeTo) void InputImpl::SetMousePosition(const Vector2i& position, const Window& relativeTo)
{
WindowHandle handle = relativeTo.GetSystemHandle();
if (handle)
{ {
POINT point = {position.x, position.y}; POINT point = {position.x, position.y};
ClientToScreen(relativeTo.GetSystemHandle(), &point); ClientToScreen(handle, &point);
SetCursorPos(point.x, point.y); SetCursorPos(point.x, point.y);
} }
}
} // namespace priv } // namespace priv