Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: remoting/client/plugin/mac_key_event_processor.cc

Issue 10387226: [chromoting] Fix sticky c key with cmd on mac using usb keycode (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/mac_key_event_processor.h" 5 #include "remoting/client/plugin/mac_key_event_processor.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 namespace remoting { 9 namespace remoting {
10 10
11 namespace { 11 namespace {
12 12
13 // A list of known keycodes. 13 const unsigned int kUsbLeftControl = 0x0700e0;
14 const int kShift = 16; 14 const unsigned int kUsbLeftShift = 0x0700e1;
15 const int kControl = 17; 15 const unsigned int kUsbLeftOption = 0x0700e2;
16 const int kOption = 18; 16 const unsigned int kUsbLeftCmd = 0x0700e3;
17 const int kCapsLock = 20; 17 const unsigned int kUsbRightControl = 0x0700e4;
18 const int kLeftCmd = 91; 18 const unsigned int kUsbRightShift = 0x0700e5;
19 const int kRightCmd = 93; 19 const unsigned int kUsbRightOption = 0x0700e6;
20 const unsigned int kUsbRightCmd = 0x0700e7;
21 const unsigned int kUsbTab = 0x07002b;
20 22
21 } // namespace 23 } // namespace
22 24
23 MacKeyEventProcessor::MacKeyEventProcessor(protocol::InputStub* input_stub) 25 MacKeyEventProcessor::MacKeyEventProcessor(protocol::InputStub* input_stub)
24 : protocol::InputFilter(input_stub) { 26 : protocol::InputFilter(input_stub) {
25 } 27 }
26 28
27 MacKeyEventProcessor::~MacKeyEventProcessor() { 29 MacKeyEventProcessor::~MacKeyEventProcessor() {
28 } 30 }
29 31
30 void MacKeyEventProcessor::InjectKeyEvent(const protocol::KeyEvent& event) { 32 void MacKeyEventProcessor::InjectKeyEvent(const protocol::KeyEvent& event) {
Wez 2012/05/22 00:17:08 nit: DCHECK(event.has_usb_keycode());
31 if (event.pressed()) { 33 bool special_key = event.usb_keycode() == kUsbLeftControl ||
Wez 2012/05/22 00:17:08 nit: is_special_key
32 key_pressed_map_[event.keycode()] = event; 34 event.usb_keycode() == kUsbLeftShift ||
33 } else { 35 event.usb_keycode() == kUsbLeftOption ||
34 key_pressed_map_.erase(event.keycode()); 36 event.usb_keycode() == kUsbRightControl ||
35 if (event.keycode() == kLeftCmd || event.keycode() == kRightCmd) 37 event.usb_keycode() == kUsbRightShift ||
36 GenerateKeyupEvents(); 38 event.usb_keycode() == kUsbRightOption ||
39 event.usb_keycode() == kUsbTab;
40
41 bool cmd_key = event.usb_keycode() == kUsbLeftCmd ||
Wez 2012/05/22 00:17:08 nit: is_cmd_key
42 event.usb_keycode() == kUsbRightCmd;
43
44 if (!cmd_key && !special_key) {
45 if (event.pressed()) {
46 key_pressed_map_[event.usb_keycode()] = event;
47 } else {
48 key_pressed_map_.erase(event.usb_keycode());
49 }
50 }
51
52 if (cmd_key && !event.pressed()) {
53 GenerateKeyupEvents();
37 } 54 }
38 55
39 InputFilter::InjectKeyEvent(event); 56 InputFilter::InjectKeyEvent(event);
40 } 57 }
41 58
42 int MacKeyEventProcessor::NumberOfPressedKeys() const {
43 return key_pressed_map_.size();
44 }
45
46 void MacKeyEventProcessor::GenerateKeyupEvents() { 59 void MacKeyEventProcessor::GenerateKeyupEvents() {
47 // A list of key codes to be erased from |key_pressed_map_|. 60 // A list of key codes to be erased from |key_pressed_map_|.
48 typedef std::vector<int> KeycodeList; 61 typedef std::vector<int> KeycodeList;
49 KeycodeList keycodes; 62 KeycodeList keycodes;
50 63
51 for (KeyPressedMap::iterator i = key_pressed_map_.begin(); 64 for (KeyPressedMap::iterator i = key_pressed_map_.begin();
52 i != key_pressed_map_.end(); ++i) { 65 i != key_pressed_map_.end(); ++i) {
53 const int keycode = i->first; 66 const int keycode = i->first;
54 67
55 if (keycode == kCapsLock || keycode == kOption ||
56 keycode == kControl || keycode == kShift ||
57 keycode == kLeftCmd || keycode == kRightCmd) {
58 continue;
59 }
60
61 keycodes.push_back(keycode); 68 keycodes.push_back(keycode);
62 protocol::KeyEvent event = i->second; 69 protocol::KeyEvent event = i->second;
63 event.set_pressed(false); 70 event.set_pressed(false);
64 InputFilter::InjectKeyEvent(event); 71 InputFilter::InjectKeyEvent(event);
65 } 72 }
66 73
67 for (KeycodeList::iterator i = keycodes.begin(); i != keycodes.end(); ++i) { 74 for (KeycodeList::iterator i = keycodes.begin(); i != keycodes.end(); ++i) {
68 key_pressed_map_.erase(*i); 75 key_pressed_map_.erase(*i);
69 } 76 }
70 } 77 }
71 78
72 } // namespace remoting 79 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/plugin/mac_key_event_processor.h ('k') | remoting/client/plugin/mac_key_event_processor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698