| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef REMOTING_CLIENT_PLUGIN_PEPPER_INPUT_HANDLER_H_ |
| #define REMOTING_CLIENT_PLUGIN_PEPPER_INPUT_HANDLER_H_ |
| |
| #include "base/compiler_specific.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "ppapi/cpp/mouse_lock.h" |
| #include "ppapi/cpp/point.h" |
| #include "ppapi/utility/completion_callback_factory.h" |
| #include "remoting/protocol/input_stub.h" |
| |
| namespace pp { |
| class ImageData; |
| class InputEvent; |
| class Instance; |
| } // namespace pp |
| |
| namespace remoting { |
| |
| namespace protocol { |
| class InputStub; |
| } // namespace protocol |
| |
| class PepperInputHandler : public pp::MouseLock { |
| public: |
| // |instance| must outlive |this|. |
| explicit PepperInputHandler(pp::Instance* instance); |
| virtual ~PepperInputHandler(); |
| |
| void set_input_stub(protocol::InputStub* input_stub) { |
| input_stub_ = input_stub; |
| } |
| |
| bool HandleInputEvent(const pp::InputEvent& event); |
| |
| // Enables locking the mouse when the host sets a completely transparent mouse |
| // cursor. |
| void AllowMouseLock(); |
| |
| // Called when the plugin receives or loses focus. |
| void DidChangeFocus(bool has_focus); |
| |
| // Sets the mouse cursor image. Passing NULL image will lock the mouse if |
| // mouse lock is enabled. |
| void SetMouseCursor(scoped_ptr<pp::ImageData> image, |
| const pp::Point& hotspot); |
| |
| // Enable or disable sending mouse input when the plugin does not have input |
| // focus. |
| void set_send_mouse_input_when_unfocused(bool send) { |
| send_mouse_input_when_unfocused_ = send; |
| } |
| |
| private: |
| enum MouseLockState { |
| MouseLockDisallowed, |
| MouseLockOff, |
| MouseLockRequestPending, |
| MouseLockOn, |
| MouseLockCancelling |
| }; |
| |
| // pp::MouseLock interface. |
| virtual void MouseLockLost() OVERRIDE; |
| |
| // Requests the browser to lock the mouse and hides the cursor. |
| void RequestMouseLock(); |
| |
| // Requests the browser to cancel mouse lock and restores the cursor once |
| // the lock is gone. |
| void CancelMouseLock(); |
| |
| // Applies |cursor_image_| as the custom pointer or uses the standard arrow |
| // pointer if |cursor_image_| is not available. |
| void UpdateMouseCursor(); |
| |
| // Handles completion of the mouse lock request issued by RequestMouseLock(). |
| void OnMouseLocked(int error); |
| |
| pp::Instance* instance_; |
| protocol::InputStub* input_stub_; |
| |
| pp::CompletionCallbackFactory<PepperInputHandler> callback_factory_; |
| |
| // Custom cursor image sent by the host. |cursor_image_| is set to NULL when |
| // the cursor image is completely transparent. This can be interpreted as |
| // a mouse lock request if enabled by the webapp. |
| scoped_ptr<pp::ImageData> cursor_image_; |
| |
| // Hot spot for |cursor_image_|. |
| pp::Point cursor_hotspot_; |
| |
| // True if the plugin has focus. |
| bool has_focus_; |
| |
| // True if the plugin should respond to mouse input even if it does not have |
| // keyboard focus. |
| bool send_mouse_input_when_unfocused_; |
| |
| MouseLockState mouse_lock_state_; |
| |
| // Accumulated sub-pixel and sub-tick deltas from wheel events. |
| float wheel_delta_x_; |
| float wheel_delta_y_; |
| float wheel_ticks_x_; |
| float wheel_ticks_y_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PepperInputHandler); |
| }; |
| |
| } // namespace remoting |
| |
| #endif // REMOTING_CLIENT_PLUGIN_PEPPER_INPUT_HANDLER_H_ |