normalizing_input_filter_cros.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/protocol/input_filter.h"
6
7#include "remoting/proto/event.pb.h"
8
9namespace remoting {
10
11// NormalizingInputFilterCros addresses the problems generated by key rewritings
12// such as Down->PageDown, 1->F1, etc, when keys are pressed in combination with
13// the OSKey (aka Search). Rewriting OSKey+Down, for example, causes us to
14// receive the following:
15//
16// keydown OSKey
17// keydown PageDown
18// keyup PageDown
19// keyup OSKey
20//
21// The host system will therefore behave as if OSKey+PageDown were pressed,
22// rather than PageDown alone.
23class NormalizingInputFilterCros : public protocol::InputFilter {
24 public:
25  explicit NormalizingInputFilterCros(protocol::InputStub* input_stub);
26  virtual ~NormalizingInputFilterCros();
27
28  // InputFilter overrides.
29  virtual void InjectKeyEvent(const protocol::KeyEvent& event) OVERRIDE;
30  virtual void InjectMouseEvent(const protocol::MouseEvent& event) OVERRIDE;
31
32 private:
33  void ProcessKeyDown(const protocol::KeyEvent& event);
34  void ProcessKeyUp(const protocol::KeyEvent& event);
35
36  void SwitchRewritingKeyToModifying();
37
38  // Holds the keydown event for the most recent OSKey to have been pressed,
39  // while it is Rewriting, or we are not yet sure whether it is Normal,
40  // Rewriting or Modifying. The event is sent on if we switch to Modifying, or
41  // discarded if the OSKey is released while in Rewriting mode.
42  protocol::KeyEvent deferred_keydown_event_;
43
44  // True while the |rewrite_keydown_event_| key is Rewriting, i.e. was followed
45  // by one or more Rewritten key events, and not by any Modified events.
46  bool deferred_key_is_rewriting_;
47
48  // Stores the code of the OSKey while it is pressed for use as a Modifier.
49  uint32 modifying_key_;
50
51  DISALLOW_COPY_AND_ASSIGN(NormalizingInputFilterCros);
52};
53
54}  // namespace remoting
55