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

Side by Side Diff: ui/events/cocoa/cocoa_event_utils.mm

Issue 2439953005: Support NSFlagsChanged in ui::EventFromNative. (Closed)
Patch Set: Unify NSFlagsChanged handling between content and ui/events. Created 4 years, 1 month 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
« no previous file with comments | « ui/events/cocoa/cocoa_event_utils.h ('k') | ui/events/cocoa/events_mac.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 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 #import "ui/events/cocoa/cocoa_event_utils.h" 5 #import "ui/events/cocoa/cocoa_event_utils.h"
6 6
7 #include "ui/events/event_constants.h" 7 #include "ui/events/event_constants.h"
8 #include "ui/events/event_utils.h" 8 #include "ui/events/event_utils.h"
9 9
10 namespace { 10 namespace {
(...skipping 12 matching lines...) Expand all
23 23
24 bool IsMiddleButtonEvent(NSEvent* event) { 24 bool IsMiddleButtonEvent(NSEvent* event) {
25 if ([event buttonNumber] != 2) 25 if ([event buttonNumber] != 2)
26 return false; 26 return false;
27 27
28 NSEventType type = [event type]; 28 NSEventType type = [event type];
29 return type == NSOtherMouseDown || type == NSOtherMouseDragged || 29 return type == NSOtherMouseDown || type == NSOtherMouseDragged ||
30 type == NSOtherMouseUp; 30 type == NSOtherMouseUp;
31 } 31 }
32 32
33 // Return true if the target modifier key is up. OS X has an "official" flag
34 // to test whether either left or right versions of a modifier key are held,
35 // and "unofficial" flags for the left and right versions independently. This
36 // function verifies that |target_key_mask| and |otherKeyMask| (which should be
37 // the left and right versions of a modifier) are consistent with with the
38 // state of |eitherKeyMask| (which should be the corresponding ""official"
39 // flag). If they are consistent, it tests |target_key_mask|; otherwise it tests
40 // |either_key_mask|.
41 inline bool IsModifierKeyUp(unsigned int flags,
42 unsigned int target_key_mask,
43 unsigned int other_key_mask,
44 unsigned int either_key_mask) {
45 bool either_key_down = (flags & either_key_mask) != 0;
46 bool target_key_down = (flags & target_key_mask) != 0;
47 bool other_key_down = (flags & other_key_mask) != 0;
48 if (either_key_down != (target_key_down || other_key_down))
49 return !either_key_down;
50 return !target_key_down;
51 }
52
33 } // namespace 53 } // namespace
34 54
35 namespace ui { 55 namespace ui {
36 56
37 int EventFlagsFromModifiers(NSUInteger modifiers) { 57 int EventFlagsFromModifiers(NSUInteger modifiers) {
38 int flags = 0; 58 int flags = 0;
39 flags |= (modifiers & NSAlphaShiftKeyMask) ? ui::EF_CAPS_LOCK_ON : 0; 59 flags |= (modifiers & NSAlphaShiftKeyMask) ? ui::EF_CAPS_LOCK_ON : 0;
40 flags |= (modifiers & NSShiftKeyMask) ? ui::EF_SHIFT_DOWN : 0; 60 flags |= (modifiers & NSShiftKeyMask) ? ui::EF_SHIFT_DOWN : 0;
41 flags |= (modifiers & NSControlKeyMask) ? ui::EF_CONTROL_DOWN : 0; 61 flags |= (modifiers & NSControlKeyMask) ? ui::EF_CONTROL_DOWN : 0;
42 flags |= (modifiers & NSAlternateKeyMask) ? ui::EF_ALT_DOWN : 0; 62 flags |= (modifiers & NSAlternateKeyMask) ? ui::EF_ALT_DOWN : 0;
(...skipping 10 matching lines...) Expand all
53 flags = (flags & ~ui::EF_CONTROL_DOWN) | ui::EF_RIGHT_MOUSE_BUTTON; 73 flags = (flags & ~ui::EF_CONTROL_DOWN) | ui::EF_RIGHT_MOUSE_BUTTON;
54 else 74 else
55 flags |= ui::EF_LEFT_MOUSE_BUTTON; 75 flags |= ui::EF_LEFT_MOUSE_BUTTON;
56 } 76 }
57 77
58 flags |= IsRightButtonEvent(event) ? ui::EF_RIGHT_MOUSE_BUTTON : 0; 78 flags |= IsRightButtonEvent(event) ? ui::EF_RIGHT_MOUSE_BUTTON : 0;
59 flags |= IsMiddleButtonEvent(event) ? ui::EF_MIDDLE_MOUSE_BUTTON : 0; 79 flags |= IsMiddleButtonEvent(event) ? ui::EF_MIDDLE_MOUSE_BUTTON : 0;
60 return flags; 80 return flags;
61 } 81 }
62 82
83 bool IsKeyUpEvent(NSEvent* event) {
84 if ([event type] != NSFlagsChanged)
85 return [event type] == NSKeyUp;
86
87 // Unofficial bit-masks for left- and right-hand versions of modifier keys.
88 // These values were determined empirically.
89 const unsigned int kLeftControlKeyMask = 1 << 0;
90 const unsigned int kLeftShiftKeyMask = 1 << 1;
91 const unsigned int kRightShiftKeyMask = 1 << 2;
92 const unsigned int kLeftCommandKeyMask = 1 << 3;
93 const unsigned int kRightCommandKeyMask = 1 << 4;
94 const unsigned int kLeftAlternateKeyMask = 1 << 5;
95 const unsigned int kRightAlternateKeyMask = 1 << 6;
96 const unsigned int kRightControlKeyMask = 1 << 13;
97
98 switch ([event keyCode]) {
99 case 54: // Right Command
100 return IsModifierKeyUp([event modifierFlags], kRightCommandKeyMask,
101 kLeftCommandKeyMask, NSCommandKeyMask);
102 case 55: // Left Command
103 return IsModifierKeyUp([event modifierFlags], kLeftCommandKeyMask,
104 kRightCommandKeyMask, NSCommandKeyMask);
105
106 case 57: // Capslock
107 return ([event modifierFlags] & NSAlphaShiftKeyMask) == 0;
108
109 case 56: // Left Shift
110 return IsModifierKeyUp([event modifierFlags], kLeftShiftKeyMask,
111 kRightShiftKeyMask, NSShiftKeyMask);
112 case 60: // Right Shift
113 return IsModifierKeyUp([event modifierFlags], kRightShiftKeyMask,
114 kLeftShiftKeyMask, NSShiftKeyMask);
115
116 case 58: // Left Alt
117 return IsModifierKeyUp([event modifierFlags], kLeftAlternateKeyMask,
118 kRightAlternateKeyMask, NSAlternateKeyMask);
119 case 61: // Right Alt
120 return IsModifierKeyUp([event modifierFlags], kRightAlternateKeyMask,
121 kLeftAlternateKeyMask, NSAlternateKeyMask);
122
123 case 59: // Left Ctrl
124 return IsModifierKeyUp([event modifierFlags], kLeftControlKeyMask,
125 kRightControlKeyMask, NSControlKeyMask);
126 case 62: // Right Ctrl
127 return IsModifierKeyUp([event modifierFlags], kRightControlKeyMask,
128 kLeftControlKeyMask, NSControlKeyMask);
129
130 case 63: // Function
131 return ([event modifierFlags] & NSFunctionKeyMask) == 0;
132 }
133 return false;
134 }
135
63 } // namespace ui 136 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/cocoa/cocoa_event_utils.h ('k') | ui/events/cocoa/events_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698