Home | History | Annotate | Download | only in protocol
      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 
     13 InputEventTracker::InputEventTracker(InputStub* input_stub)
     14     : input_stub_(input_stub),
     15       mouse_button_state_(0) {
     16 }
     17 
     18 InputEventTracker::~InputEventTracker() {}
     19 
     20 bool InputEventTracker::IsKeyPressed(uint32 usb_keycode) const {
     21   return pressed_keys_.find(usb_keycode) != pressed_keys_.end();
     22 }
     23 
     24 int InputEventTracker::PressedKeyCount() const {
     25   return pressed_keys_.size();
     26 }
     27 
     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 
     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 
     73 void InputEventTracker::InjectTextEvent(const TextEvent& event) {
     74   input_stub_->InjectTextEvent(event);
     75 }
     76 
     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