// 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/macros.h" #include "base/memory/scoped_ptr.h" namespace pp { class InputEvent; } // namespace pp namespace remoting { namespace protocol { class InputStub; class InputEventTracker; } // namespace protocol class PepperInputHandler { public: // Create a PepperInputHandler using the specified InputEventTracker to // handle auto-release. The InputEventTracker instance must remain valid // for the lifetime of the PepperInputHandler. explicit PepperInputHandler(protocol::InputEventTracker* input_tracker); // Sets the input stub to which processed events will be passed. void set_input_stub(protocol::InputStub* input_stub) { input_stub_ = input_stub; } // 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; } void set_send_mouse_move_deltas(bool enable) { send_mouse_move_deltas_ = enable; } // Enable or disable detection of stuck modifier keys. void set_detect_stuck_modifiers(bool detect) { detect_stuck_modifiers_ = detect; } // Processes PPAPI events and dispatches them to |input_stub_|. bool HandleInputEvent(const pp::InputEvent& event); // Must be called when the plugin receives or loses focus. void DidChangeFocus(bool has_focus); private: // Check for any missed "keyup" events for modifiers. These can sometimes be // missed due to OS-level keyboard shortcuts such as "lock screen" that cause // focus to switch to another application. If any modifier keys are held that // are not indicated as active on |event|, release all keys. void ReleaseAllIfModifiersStuck(const pp::InputEvent& event); // Receives input events generated from PPAPI input. protocol::InputStub* input_stub_; // Tracks input events to manage auto-release in ReleaseAllIfModifiersStuck. protocol::InputEventTracker* input_tracker_; // 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_; // True if the plugin should include mouse move deltas, in addition to // absolute position information, in mouse events. bool send_mouse_move_deltas_; // 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_; // Whether or not to check for stuck modifier keys on keyboard input events. bool detect_stuck_modifiers_; DISALLOW_COPY_AND_ASSIGN(PepperInputHandler); }; } // namespace remoting #endif // REMOTING_CLIENT_PLUGIN_PEPPER_INPUT_HANDLER_H_