Index: remoting/client/plugin/normalizing_input_filter_cros.h |
diff --git a/remoting/client/plugin/normalizing_input_filter_cros.h b/remoting/client/plugin/normalizing_input_filter_cros.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..977c90caedf12491ec9d858cb0bdb9083352a4e3 |
--- /dev/null |
+++ b/remoting/client/plugin/normalizing_input_filter_cros.h |
@@ -0,0 +1,54 @@ |
+// Copyright 2014 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. |
+ |
+#include "remoting/protocol/input_filter.h" |
+ |
+#include "remoting/proto/event.pb.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); |
+ virtual ~NormalizingInputFilterCros(); |
+ |
+ // InputFilter overrides. |
+ virtual void InjectKeyEvent(const protocol::KeyEvent& event) OVERRIDE; |
+ virtual void InjectMouseEvent(const protocol::MouseEvent& event) OVERRIDE; |
+ |
+ private: |
+ void ProcessKeyDown(const protocol::KeyEvent& event); |
+ void ProcessKeyUp(const protocol::KeyEvent& event); |
+ |
+ void SwitchRewritingKeyToModifying(); |
+ |
+ // 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 modifying_key_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(NormalizingInputFilterCros); |
+}; |
+ |
+} // namespace remoting |