OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/client/plugin/pepper_input_handler.h" | 5 #include "remoting/client/plugin/pepper_input_handler.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "ppapi/cpp/image_data.h" | 8 #include "ppapi/cpp/image_data.h" |
9 #include "ppapi/cpp/input_event.h" | 9 #include "ppapi/cpp/input_event.h" |
10 #include "ppapi/cpp/module_impl.h" | 10 #include "ppapi/cpp/module_impl.h" |
11 #include "ppapi/cpp/mouse_cursor.h" | 11 #include "ppapi/cpp/mouse_cursor.h" |
12 #include "ppapi/cpp/point.h" | 12 #include "ppapi/cpp/point.h" |
13 #include "ppapi/cpp/var.h" | 13 #include "ppapi/cpp/var.h" |
14 #include "remoting/proto/event.pb.h" | 14 #include "remoting/proto/event.pb.h" |
15 #include "ui/events/keycodes/dom4/keycode_converter.h" | 15 #include "ui/events/keycodes/dom4/keycode_converter.h" |
16 | 16 |
17 namespace remoting { | 17 namespace remoting { |
18 | 18 |
19 PepperInputHandler::PepperInputHandler( | 19 PepperInputHandler::PepperInputHandler( |
20 pp::Instance* instance, | 20 pp::Instance* instance) |
21 protocol::InputStub* input_stub) | |
22 : pp::MouseLock(instance), | 21 : pp::MouseLock(instance), |
23 instance_(instance), | 22 instance_(instance), |
24 input_stub_(input_stub), | 23 input_stub_(NULL), |
25 callback_factory_(this), | 24 callback_factory_(this), |
26 has_focus_(false), | 25 has_focus_(false), |
27 mouse_lock_state_(MouseLockDisallowed), | 26 mouse_lock_state_(MouseLockDisallowed), |
28 wheel_delta_x_(0), | 27 wheel_delta_x_(0), |
29 wheel_delta_y_(0), | 28 wheel_delta_y_(0), |
30 wheel_ticks_x_(0), | 29 wheel_ticks_x_(0), |
31 wheel_ticks_y_(0) { | 30 wheel_ticks_y_(0) { |
32 } | 31 } |
33 | 32 |
34 PepperInputHandler::~PepperInputHandler() { | 33 PepperInputHandler::~PepperInputHandler() {} |
35 } | |
36 | 34 |
37 // Helper function to get the USB key code using the Dev InputEvent interface. | 35 // Helper function to get the USB key code using the Dev InputEvent interface. |
38 uint32_t GetUsbKeyCode(pp::KeyboardInputEvent pp_key_event) { | 36 uint32_t GetUsbKeyCode(pp::KeyboardInputEvent pp_key_event) { |
39 // Get the DOM3 |code| as a string. | 37 // Get the DOM3 |code| as a string. |
40 std::string codestr = pp_key_event.GetCode().AsString(); | 38 std::string codestr = pp_key_event.GetCode().AsString(); |
41 | 39 |
42 // Convert the |code| string into a USB keycode. | 40 // Convert the |code| string into a USB keycode. |
43 ui::KeycodeConverter* key_converter = ui::KeycodeConverter::GetInstance(); | 41 ui::KeycodeConverter* key_converter = ui::KeycodeConverter::GetInstance(); |
44 return key_converter->CodeToUsbKeycode(codestr.c_str()); | 42 return key_converter->CodeToUsbKeycode(codestr.c_str()); |
45 } | 43 } |
(...skipping 16 matching lines...) Expand all Loading... |
62 lock_states |= protocol::KeyEvent::LOCK_STATES_CAPSLOCK; | 60 lock_states |= protocol::KeyEvent::LOCK_STATES_CAPSLOCK; |
63 | 61 |
64 if (modifiers & PP_INPUTEVENT_MODIFIER_NUMLOCKKEY) | 62 if (modifiers & PP_INPUTEVENT_MODIFIER_NUMLOCKKEY) |
65 lock_states |= protocol::KeyEvent::LOCK_STATES_NUMLOCK; | 63 lock_states |= protocol::KeyEvent::LOCK_STATES_NUMLOCK; |
66 | 64 |
67 protocol::KeyEvent key_event; | 65 protocol::KeyEvent key_event; |
68 key_event.set_usb_keycode(GetUsbKeyCode(pp_key_event)); | 66 key_event.set_usb_keycode(GetUsbKeyCode(pp_key_event)); |
69 key_event.set_pressed(event.GetType() == PP_INPUTEVENT_TYPE_KEYDOWN); | 67 key_event.set_pressed(event.GetType() == PP_INPUTEVENT_TYPE_KEYDOWN); |
70 key_event.set_lock_states(lock_states); | 68 key_event.set_lock_states(lock_states); |
71 | 69 |
72 input_stub_->InjectKeyEvent(key_event); | 70 if (input_stub_) |
| 71 input_stub_->InjectKeyEvent(key_event); |
73 return true; | 72 return true; |
74 } | 73 } |
75 | 74 |
76 case PP_INPUTEVENT_TYPE_MOUSEDOWN: | 75 case PP_INPUTEVENT_TYPE_MOUSEDOWN: |
77 case PP_INPUTEVENT_TYPE_MOUSEUP: { | 76 case PP_INPUTEVENT_TYPE_MOUSEUP: { |
78 if (!has_focus_) | 77 if (!has_focus_) |
79 return false; | 78 return false; |
80 | 79 |
81 pp::MouseInputEvent pp_mouse_event(event); | 80 pp::MouseInputEvent pp_mouse_event(event); |
82 protocol::MouseEvent mouse_event; | 81 protocol::MouseEvent mouse_event; |
(...skipping 16 matching lines...) Expand all Loading... |
99 mouse_event.set_x(pp_mouse_event.GetPosition().x()); | 98 mouse_event.set_x(pp_mouse_event.GetPosition().x()); |
100 mouse_event.set_y(pp_mouse_event.GetPosition().y()); | 99 mouse_event.set_y(pp_mouse_event.GetPosition().y()); |
101 | 100 |
102 // Add relative movement if the mouse is locked. | 101 // Add relative movement if the mouse is locked. |
103 if (mouse_lock_state_ == MouseLockOn) { | 102 if (mouse_lock_state_ == MouseLockOn) { |
104 pp::Point delta = pp_mouse_event.GetMovement(); | 103 pp::Point delta = pp_mouse_event.GetMovement(); |
105 mouse_event.set_delta_x(delta.x()); | 104 mouse_event.set_delta_x(delta.x()); |
106 mouse_event.set_delta_y(delta.y()); | 105 mouse_event.set_delta_y(delta.y()); |
107 } | 106 } |
108 | 107 |
109 input_stub_->InjectMouseEvent(mouse_event); | 108 if (input_stub_) |
| 109 input_stub_->InjectMouseEvent(mouse_event); |
110 } | 110 } |
111 return true; | 111 return true; |
112 } | 112 } |
113 | 113 |
114 case PP_INPUTEVENT_TYPE_MOUSEMOVE: | 114 case PP_INPUTEVENT_TYPE_MOUSEMOVE: |
115 case PP_INPUTEVENT_TYPE_MOUSEENTER: | 115 case PP_INPUTEVENT_TYPE_MOUSEENTER: |
116 case PP_INPUTEVENT_TYPE_MOUSELEAVE: { | 116 case PP_INPUTEVENT_TYPE_MOUSELEAVE: { |
117 if (!has_focus_) | 117 if (!has_focus_) |
118 return false; | 118 return false; |
119 | 119 |
120 pp::MouseInputEvent pp_mouse_event(event); | 120 pp::MouseInputEvent pp_mouse_event(event); |
121 protocol::MouseEvent mouse_event; | 121 protocol::MouseEvent mouse_event; |
122 mouse_event.set_x(pp_mouse_event.GetPosition().x()); | 122 mouse_event.set_x(pp_mouse_event.GetPosition().x()); |
123 mouse_event.set_y(pp_mouse_event.GetPosition().y()); | 123 mouse_event.set_y(pp_mouse_event.GetPosition().y()); |
124 | 124 |
125 // Add relative movement if the mouse is locked. | 125 // Add relative movement if the mouse is locked. |
126 if (mouse_lock_state_ == MouseLockOn) { | 126 if (mouse_lock_state_ == MouseLockOn) { |
127 pp::Point delta = pp_mouse_event.GetMovement(); | 127 pp::Point delta = pp_mouse_event.GetMovement(); |
128 mouse_event.set_delta_x(delta.x()); | 128 mouse_event.set_delta_x(delta.x()); |
129 mouse_event.set_delta_y(delta.y()); | 129 mouse_event.set_delta_y(delta.y()); |
130 } | 130 } |
131 | 131 |
132 input_stub_->InjectMouseEvent(mouse_event); | 132 if (input_stub_) |
| 133 input_stub_->InjectMouseEvent(mouse_event); |
133 return true; | 134 return true; |
134 } | 135 } |
135 | 136 |
136 case PP_INPUTEVENT_TYPE_WHEEL: { | 137 case PP_INPUTEVENT_TYPE_WHEEL: { |
137 if (!has_focus_) | 138 if (!has_focus_) |
138 return false; | 139 return false; |
139 | 140 |
140 pp::WheelInputEvent pp_wheel_event(event); | 141 pp::WheelInputEvent pp_wheel_event(event); |
141 | 142 |
142 // Don't handle scroll-by-page events, for now. | 143 // Don't handle scroll-by-page events, for now. |
(...skipping 25 matching lines...) Expand all Loading... |
168 // that can't inject pixel-based scroll events that the client will | 169 // that can't inject pixel-based scroll events that the client will |
169 // accumulate them into tick-based scrolling, which gives a better | 170 // accumulate them into tick-based scrolling, which gives a better |
170 // overall experience than trying to do this host-side. | 171 // overall experience than trying to do this host-side. |
171 int ticks_x = static_cast<int>(wheel_ticks_x_); | 172 int ticks_x = static_cast<int>(wheel_ticks_x_); |
172 int ticks_y = static_cast<int>(wheel_ticks_y_); | 173 int ticks_y = static_cast<int>(wheel_ticks_y_); |
173 wheel_ticks_x_ -= ticks_x; | 174 wheel_ticks_x_ -= ticks_x; |
174 wheel_ticks_y_ -= ticks_y; | 175 wheel_ticks_y_ -= ticks_y; |
175 mouse_event.set_wheel_ticks_x(ticks_x); | 176 mouse_event.set_wheel_ticks_x(ticks_x); |
176 mouse_event.set_wheel_ticks_y(ticks_y); | 177 mouse_event.set_wheel_ticks_y(ticks_y); |
177 | 178 |
178 input_stub_->InjectMouseEvent(mouse_event); | 179 if (input_stub_) |
| 180 input_stub_->InjectMouseEvent(mouse_event); |
179 } | 181 } |
180 return true; | 182 return true; |
181 } | 183 } |
182 | 184 |
183 case PP_INPUTEVENT_TYPE_CHAR: | 185 case PP_INPUTEVENT_TYPE_CHAR: |
184 // Consume but ignore character input events. | 186 // Consume but ignore character input events. |
185 return true; | 187 return true; |
186 | 188 |
187 default: { | 189 default: { |
188 VLOG(0) << "Unhandled input event: " << event.GetType(); | 190 VLOG(0) << "Unhandled input event: " << event.GetType(); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 mouse_lock_state_ = MouseLockOff; | 300 mouse_lock_state_ = MouseLockOff; |
299 UpdateMouseCursor(); | 301 UpdateMouseCursor(); |
300 } | 302 } |
301 | 303 |
302 // Cancel as needed. | 304 // Cancel as needed. |
303 if (should_cancel) | 305 if (should_cancel) |
304 CancelMouseLock(); | 306 CancelMouseLock(); |
305 } | 307 } |
306 | 308 |
307 } // namespace remoting | 309 } // namespace remoting |
OLD | NEW |