From f513da8b67417a7b0a16ab9cb309fc29d6afc343 Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Sat, 19 Jan 2013 00:22:25 -0800 Subject: [PATCH] Added mouse lock. --- examples/common/entry.h | 1 + examples/common/entry_emscripten.cpp | 4 ++ examples/common/entry_linux.cpp | 4 ++ examples/common/entry_nacl.cpp | 4 ++ examples/common/entry_osx.mm | 4 ++ examples/common/entry_windows.cpp | 58 ++++++++++++++++++++++++++++ 6 files changed, 75 insertions(+) diff --git a/examples/common/entry.h b/examples/common/entry.h index 9e869290..e528492b 100644 --- a/examples/common/entry.h +++ b/examples/common/entry.h @@ -159,6 +159,7 @@ namespace entry void setWindowSize(uint32_t _width, uint32_t _height); void toggleWindowFrame(); + void setMouseLock(bool _lock); } // namespace entry diff --git a/examples/common/entry_emscripten.cpp b/examples/common/entry_emscripten.cpp index 8b43bed5..3bd38e84 100644 --- a/examples/common/entry_emscripten.cpp +++ b/examples/common/entry_emscripten.cpp @@ -32,6 +32,10 @@ namespace entry { } + void setMouseLock(bool _lock) + { + } + } // namespace entry extern int _main_(int _argc, char** _argv); diff --git a/examples/common/entry_linux.cpp b/examples/common/entry_linux.cpp index 3a38cc53..6f881487 100644 --- a/examples/common/entry_linux.cpp +++ b/examples/common/entry_linux.cpp @@ -302,6 +302,10 @@ namespace entry { } + void setMouseLock(bool _lock) + { + } + } // namespace entry int main(int _argc, char** _argv) diff --git a/examples/common/entry_nacl.cpp b/examples/common/entry_nacl.cpp index d15e216d..cddbe069 100644 --- a/examples/common/entry_nacl.cpp +++ b/examples/common/entry_nacl.cpp @@ -44,6 +44,10 @@ namespace entry { } + void setMouseLock(bool _lock) + { + } + } // namespace entry extern int _main_(int _argc, char** _argv); diff --git a/examples/common/entry_osx.mm b/examples/common/entry_osx.mm index 06236e3a..029da19b 100755 --- a/examples/common/entry_osx.mm +++ b/examples/common/entry_osx.mm @@ -236,6 +236,10 @@ namespace entry { } + void setMouseLock(bool _lock) + { + } + } // namespace entry int main(int _argc, char** _argv) diff --git a/examples/common/entry_windows.cpp b/examples/common/entry_windows.cpp index af1159fa..d30f3e5c 100644 --- a/examples/common/entry_windows.cpp +++ b/examples/common/entry_windows.cpp @@ -20,6 +20,7 @@ #define WM_USER_SET_WINDOW_SIZE (WM_USER+0) #define WM_USER_TOGGLE_WINDOW_FRAME (WM_USER+1) +#define WM_USER_MOUSE_LOCK (WM_USER+2) extern int _main_(int _argc, char** _argv); @@ -267,6 +268,10 @@ namespace entry } break; + case WM_USER_MOUSE_LOCK: + setMouseLock(!!_lparam); + break; + case WM_DESTROY: break; @@ -348,6 +353,21 @@ namespace entry { int32_t mx = GET_X_LPARAM(_lparam); int32_t my = GET_Y_LPARAM(_lparam); + + if (m_mouseLock) + { + mx -= m_mx; + my -= m_my; + + if (0 == mx + && 0 == my) + { + break; + } + + setMousePos(m_mx, m_my); + } + m_eventQueue.postMouseEvent(mx, my); } break; @@ -505,6 +525,34 @@ namespace entry m_frame = _windowFrame; } + void setMousePos(int32_t _mx, int32_t _my) + { + POINT pt = { _mx, _my }; + ClientToScreen(m_hwnd, &pt); + SetCursorPos(pt.x, pt.y); + } + + void setMouseLock(bool _lock) + { + if (_lock != m_mouseLock) + { + if (_lock) + { + m_mx = m_width/2; + m_my = m_height/2; + ShowCursor(false); + setMousePos(m_mx, m_my); + } + else + { + setMousePos(m_mx, m_my); + ShowCursor(true); + } + + m_mouseLock = _lock; + } + } + static LRESULT CALLBACK wndProc(HWND _hwnd, UINT _id, WPARAM _wparam, LPARAM _lparam); EventQueue m_eventQueue; @@ -517,7 +565,12 @@ namespace entry uint32_t m_oldWidth; uint32_t m_oldHeight; float m_aspectRatio; + + int32_t m_mx; + int32_t m_my; + bool m_frame; + bool m_mouseLock; bool m_init; bool m_exit; @@ -550,6 +603,11 @@ namespace entry PostMessage(s_ctx.m_hwnd, WM_USER_TOGGLE_WINDOW_FRAME, 0, 0); } + void setMouseLock(bool _lock) + { + PostMessage(s_ctx.m_hwnd, WM_USER_MOUSE_LOCK, 0, _lock); + } + int32_t MainThreadEntry::threadFunc(void* _userData) { MainThreadEntry* self = (MainThreadEntry*)_userData;