diff --git a/src/Platform/NaClApplication.cpp b/src/Platform/NaClApplication.cpp index 3059d63b2..909aea265 100644 --- a/src/Platform/NaClApplication.cpp +++ b/src/Platform/NaClApplication.cpp @@ -23,7 +23,7 @@ namespace Magnum { namespace Platform { -NaClApplication::NaClApplication(PP_Instance instance, const Math::Vector2& size): Instance(instance), Graphics3DClient(this), viewportSize(size) { +NaClApplication::NaClApplication(PP_Instance instance, const Math::Vector2& size): Instance(instance), Graphics3DClient(this), MouseLock(this), viewportSize(size) { int32_t attributes[] = { PP_GRAPHICS3DATTRIB_ALPHA_SIZE, 8, PP_GRAPHICS3DATTRIB_DEPTH_SIZE, 24, @@ -187,4 +187,17 @@ void NaClApplication::swapCallback(void* applicationInstance, std::int32_t) { } } +void NaClApplication::setMouseLocked(bool enabled) { + /* Already done, nothing to do */ + if(enabled == isMouseLocked()) return; + + if(enabled) LockMouse(pp::CompletionCallback(&mouseLockCallback, this)); + else UnlockMouse(); +} + +void NaClApplication::mouseLockCallback(void* applicationInstance, int32_t) { + NaClApplication* instance = static_cast(applicationInstance); + instance->flags |= Flag::MouseLocked; +} + }} diff --git a/src/Platform/NaClApplication.h b/src/Platform/NaClApplication.h index 69d2a4e30..7a32d68cf 100644 --- a/src/Platform/NaClApplication.h +++ b/src/Platform/NaClApplication.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -57,7 +58,7 @@ class MyApplication: public Magnum::Platform::Sdl2Application { MAGNUM_NACLAPPLICATION_MAIN(MyApplication) @endcode */ -class NaClApplication: public pp::Instance, public pp::Graphics3DClient { +class NaClApplication: public pp::Instance, public pp::Graphics3DClient, public pp::MouseLock { public: class InputEvent; class KeyEvent; @@ -130,6 +131,22 @@ class NaClApplication: public pp::Instance, public pp::Graphics3DClient { /** @{ @name Mouse handling */ + public: + /** @brief Whether mouse is locked */ + inline bool isMouseLocked() const { + return flags & Flag::MouseLocked; + } + + /** + * @brief Enable or disable mouse locking + * + * When mouse is locked, the cursor is hidden and only + * MouseMoveEvent::relativePosition() is changing, absolute position + * stays the same. + */ + void setMouseLocked(bool enabled); + + protected: /** * @brief Mouse press event * @@ -165,7 +182,8 @@ class NaClApplication: public pp::Instance, public pp::Graphics3DClient { SwapInProgress = 1 << 1, Redraw = 1 << 2, FullscreenSwitchInProgress = 1 << 3, - WillBeFullscreen = 1 << 4 + WillBeFullscreen = 1 << 4, + MouseLocked = 1 << 5 }; typedef Corrade::Containers::EnumSet Flags; @@ -173,11 +191,16 @@ class NaClApplication: public pp::Instance, public pp::Graphics3DClient { CORRADE_ASSERT(false, "NaClApplication: context unexpectedly lost", ); } + inline void MouseLockLost() override { + flags &= ~Flag::MouseLocked; + } + void DidChangeView(const pp::View& view) override; bool HandleInputEvent(const pp::InputEvent& event) override; static void swapCallback(void* applicationInstance, std::int32_t); + static void mouseLockCallback(void* applicationInstance, std::int32_t); pp::Graphics3D* graphics; pp::Fullscreen* fullscreen;