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

@ -228,6 +228,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;
int gx, gy; int gx, gy;
@ -235,9 +238,14 @@ 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,8 +260,12 @@ 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

@ -178,10 +178,18 @@ 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();
}
} }
@ -195,9 +203,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)
{ {
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