• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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_event_tracker.h"
6 
7 #include "base/logging.h"
8 #include "remoting/proto/event.pb.h"
9 
10 namespace remoting {
11 namespace protocol {
12 
InputEventTracker(InputStub * input_stub)13 InputEventTracker::InputEventTracker(InputStub* input_stub)
14     : input_stub_(input_stub),
15       mouse_button_state_(0) {
16 }
17 
~InputEventTracker()18 InputEventTracker::~InputEventTracker() {}
19 
IsKeyPressed(uint32 usb_keycode) const20 bool InputEventTracker::IsKeyPressed(uint32 usb_keycode) const {
21   return pressed_keys_.find(usb_keycode) != pressed_keys_.end();
22 }
23 
PressedKeyCount() const24 int InputEventTracker::PressedKeyCount() const {
25   return pressed_keys_.size();
26 }
27 
ReleaseAll()28 void InputEventTracker::ReleaseAll() {
29   std::set<uint32>::iterator i;
30   for (i = pressed_keys_.begin(); i != pressed_keys_.end(); ++i) {
31     KeyEvent event;
32     event.set_pressed(false);
33     event.set_usb_keycode(*i);
34     input_stub_->InjectKeyEvent(event);
35   }
36   pressed_keys_.clear();
37 
38   for (int i = MouseEvent::BUTTON_UNDEFINED + 1;
39        i < MouseEvent::BUTTON_MAX; ++i) {
40     if (mouse_button_state_ & (1 << (i - 1))) {
41       MouseEvent mouse;
42 
43       // TODO(wez): EventInjectors should cope with positionless events by
44       // using the current cursor position, and we wouldn't set position here.
45       mouse.set_x(mouse_pos_.x());
46       mouse.set_y(mouse_pos_.y());
47 
48       mouse.set_button((MouseEvent::MouseButton)i);
49       mouse.set_button_down(false);
50       input_stub_->InjectMouseEvent(mouse);
51     }
52   }
53   mouse_button_state_ = 0;
54 }
55 
InjectKeyEvent(const KeyEvent & event)56 void InputEventTracker::InjectKeyEvent(const KeyEvent& event) {
57   // We don't need to track the keyboard lock states of key down events.
58   // Pressed keys will be released with |lock_states| set to 0.
59   // The lock states of auto generated key up events don't matter as long as
60   // we release all the pressed keys at blurring/disconnection time.
61   if (event.has_pressed()) {
62     if (event.has_usb_keycode()) {
63       if (event.pressed()) {
64         pressed_keys_.insert(event.usb_keycode());
65       } else {
66         pressed_keys_.erase(event.usb_keycode());
67       }
68     }
69   }
70   input_stub_->InjectKeyEvent(event);
71 }
72 
InjectTextEvent(const TextEvent & event)73 void InputEventTracker::InjectTextEvent(const TextEvent& event) {
74   input_stub_->InjectTextEvent(event);
75 }
76 
InjectMouseEvent(const MouseEvent & event)77 void InputEventTracker::InjectMouseEvent(const MouseEvent& event) {
78   if (event.has_x() && event.has_y()) {
79     mouse_pos_ = webrtc::DesktopVector(event.x(), event.y());
80   }
81   if (event.has_button() && event.has_button_down()) {
82     // Button values are defined in remoting/proto/event.proto.
83     if (event.button() >= 1 && event.button() < MouseEvent::BUTTON_MAX) {
84       uint32 button_change = 1 << (event.button() - 1);
85       if (event.button_down()) {
86         mouse_button_state_ |= button_change;
87       } else {
88         mouse_button_state_ &= ~button_change;
89       }
90     }
91   }
92   input_stub_->InjectMouseEvent(event);
93 }
94 
95 }  // namespace protocol
96 }  // namespace remoting
97