// Copyright 2015 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_NORMALIZING_INPUT_FILTER_CROS_H_ #define REMOTING_CLIENT_NORMALIZING_INPUT_FILTER_CROS_H_ #include #include "base/macros.h" #include "remoting/proto/event.pb.h" #include "remoting/protocol/input_filter.h" namespace remoting { // NormalizingInputFilterCros addresses the problems generated by key rewritings // such as Down->PageDown, 1->F1, etc, when keys are pressed in combination with // the OSKey (aka Search). Rewriting OSKey+Down, for example, causes us to // receive the following: // // keydown OSKey // keydown PageDown // keyup PageDown // keyup OSKey // // The host system will therefore behave as if OSKey+PageDown were pressed, // rather than PageDown alone. class NormalizingInputFilterCros : public protocol::InputFilter { public: explicit NormalizingInputFilterCros(protocol::InputStub* input_stub); ~NormalizingInputFilterCros() override; // InputFilter overrides. void InjectKeyEvent(const protocol::KeyEvent& event) override; void InjectMouseEvent(const protocol::MouseEvent& event) override; private: void ProcessKeyDown(const protocol::KeyEvent& event); void ProcessKeyUp(const protocol::KeyEvent& event); void SwitchRewritingKeyToModifying(); void UndoAltKeyMapping(protocol::KeyEvent* event); // Holds the keydown event for the most recent OSKey to have been pressed, // while it is Rewriting, or we are not yet sure whether it is Normal, // Rewriting or Modifying. The event is sent on if we switch to Modifying, or // discarded if the OSKey is released while in Rewriting mode. protocol::KeyEvent deferred_keydown_event_; // True while the |rewrite_keydown_event_| key is Rewriting, i.e. was followed // by one or more Rewritten key events, and not by any Modified events. bool deferred_key_is_rewriting_; // Stores the code of the OSKey while it is pressed for use as a Modifier. uint32_t modifying_key_; // True if the left or right Alt keys are pressed, respectively. bool left_alt_is_pressed_; bool right_alt_is_pressed_; // Previous mouse coordinates. int previous_mouse_x_; int previous_mouse_y_; DISALLOW_COPY_AND_ASSIGN(NormalizingInputFilterCros); }; } // namespace remoting #endif // REMOTING_CLIENT_NORMALIZING_INPUT_FILTER_CROS_H_