// 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_