Browse Source

NaClApplication: implemented mouse locking.

pull/7/head
Vladimír Vondruš 14 years ago
parent
commit
6793a30701
  1. 15
      src/Platform/NaClApplication.cpp
  2. 27
      src/Platform/NaClApplication.h

15
src/Platform/NaClApplication.cpp

@ -23,7 +23,7 @@
namespace Magnum { namespace Platform {
NaClApplication::NaClApplication(PP_Instance instance, const Math::Vector2<GLsizei>& size): Instance(instance), Graphics3DClient(this), viewportSize(size) {
NaClApplication::NaClApplication(PP_Instance instance, const Math::Vector2<GLsizei>& 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<NaClApplication*>(applicationInstance);
instance->flags |= Flag::MouseLocked;
}
}}

27
src/Platform/NaClApplication.h

@ -24,6 +24,7 @@
#include <ppapi/cpp/input_event.h>
#include <ppapi/cpp/instance.h>
#include <ppapi/cpp/module.h>
#include <ppapi/cpp/mouse_lock.h>
#include <ppapi/cpp/graphics_3d_client.h>
#include <ppapi/gles2/gl2ext_ppapi.h>
@ -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<Flag, std::uint8_t> 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;

Loading…
Cancel
Save