| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |