| 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 "ui/base/accelerators/accelerator.h" | 5 #include "ui/base/accelerators/accelerator.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/i18n/rtl.h" | 9 #include "base/i18n/rtl.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "build/build_config.h" | 13 #include "build/build_config.h" |
| 14 #include "ui/base/l10n/l10n_util.h" | 14 #include "ui/base/l10n/l10n_util.h" |
| 15 #include "ui/events/event.h" | 15 #include "ui/events/event.h" |
| 16 #include "ui/strings/grit/ui_strings.h" | 16 #include "ui/strings/grit/ui_strings.h" |
| 17 | 17 |
| 18 #if defined(OS_WIN) | 18 #if defined(OS_WIN) |
| 19 #include <windows.h> | 19 #include <windows.h> |
| 20 #endif | 20 #endif |
| 21 | 21 |
| 22 #if !defined(OS_WIN) && (defined(USE_AURA) || defined(OS_MACOSX)) | 22 #if !defined(OS_WIN) && (defined(USE_AURA) || defined(OS_MACOSX)) |
| 23 #include "ui/events/keycodes/keyboard_code_conversion.h" | 23 #include "ui/events/keycodes/keyboard_code_conversion.h" |
| 24 #endif | 24 #endif |
| 25 | 25 |
| 26 namespace ui { | 26 namespace ui { |
| 27 | 27 |
| 28 namespace { | 28 namespace { |
| 29 | 29 |
| 30 const int kModifierMask = ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | | 30 const int kModifierMask = |
| 31 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN; | 31 EF_SHIFT_DOWN | EF_CONTROL_DOWN | EF_ALT_DOWN | EF_COMMAND_DOWN; |
| 32 | 32 |
| 33 const int kInterestingFlagsMask = | 33 const int kInterestingFlagsMask = |
| 34 kModifierMask | ui::EF_IS_SYNTHESIZED | ui::EF_IS_REPEAT; | 34 kModifierMask | EF_IS_SYNTHESIZED | EF_IS_REPEAT; |
| 35 | 35 |
| 36 } // namespace | 36 } // namespace |
| 37 | 37 |
| 38 Accelerator::Accelerator() | 38 Accelerator::Accelerator() : Accelerator(VKEY_UNKNOWN, EF_NONE) {} |
| 39 : key_code_(ui::VKEY_UNKNOWN), type_(ui::ET_KEY_PRESSED), modifiers_(0) {} | |
| 40 | 39 |
| 41 Accelerator::Accelerator(KeyboardCode keycode, int modifiers) | 40 Accelerator::Accelerator(KeyboardCode key_code, int modifiers) |
| 42 : key_code_(keycode), | 41 : key_code_(key_code), |
| 43 type_(ui::ET_KEY_PRESSED), | 42 key_state_(KeyState::PRESSED), |
| 44 modifiers_(modifiers & kInterestingFlagsMask) {} | 43 modifiers_(modifiers & kInterestingFlagsMask) {} |
| 45 | 44 |
| 46 Accelerator::Accelerator(const KeyEvent& key_event) | 45 Accelerator::Accelerator(const KeyEvent& key_event) |
| 47 : key_code_(key_event.key_code()), | 46 : key_code_(key_event.key_code()), |
| 48 type_(key_event.type()), | 47 key_state_(key_event.type() == ET_KEY_PRESSED ? KeyState::PRESSED |
| 48 : KeyState::RELEASED), |
| 49 // |modifiers_| may include the repeat flag. | 49 // |modifiers_| may include the repeat flag. |
| 50 modifiers_(key_event.flags() & kInterestingFlagsMask) {} | 50 modifiers_(key_event.flags() & kInterestingFlagsMask) {} |
| 51 | 51 |
| 52 Accelerator::Accelerator(const Accelerator& accelerator) { | 52 Accelerator::Accelerator(const Accelerator& accelerator) { |
| 53 key_code_ = accelerator.key_code_; | 53 key_code_ = accelerator.key_code_; |
| 54 type_ = accelerator.type_; | 54 key_state_ = accelerator.key_state_; |
| 55 modifiers_ = accelerator.modifiers_; | 55 modifiers_ = accelerator.modifiers_; |
| 56 if (accelerator.platform_accelerator_.get()) | 56 if (accelerator.platform_accelerator_) |
| 57 platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy(); | 57 platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy(); |
| 58 } | 58 } |
| 59 | 59 |
| 60 Accelerator::~Accelerator() { | 60 Accelerator::~Accelerator() { |
| 61 } | 61 } |
| 62 | 62 |
| 63 // static | 63 // static |
| 64 int Accelerator::MaskOutKeyEventFlags(int flags) { | 64 int Accelerator::MaskOutKeyEventFlags(int flags) { |
| 65 return flags & kModifierMask; | 65 return flags & kModifierMask; |
| 66 } | 66 } |
| 67 | 67 |
| 68 Accelerator& Accelerator::operator=(const Accelerator& accelerator) { | 68 Accelerator& Accelerator::operator=(const Accelerator& accelerator) { |
| 69 if (this != &accelerator) { | 69 if (this != &accelerator) { |
| 70 key_code_ = accelerator.key_code_; | 70 key_code_ = accelerator.key_code_; |
| 71 type_ = accelerator.type_; | 71 key_state_ = accelerator.key_state_; |
| 72 modifiers_ = accelerator.modifiers_; | 72 modifiers_ = accelerator.modifiers_; |
| 73 if (accelerator.platform_accelerator_.get()) | 73 if (accelerator.platform_accelerator_) |
| 74 platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy(); | 74 platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy(); |
| 75 else | 75 else |
| 76 platform_accelerator_.reset(); | 76 platform_accelerator_.reset(); |
| 77 } | 77 } |
| 78 return *this; | 78 return *this; |
| 79 } | 79 } |
| 80 | 80 |
| 81 bool Accelerator::operator <(const Accelerator& rhs) const { | 81 bool Accelerator::operator <(const Accelerator& rhs) const { |
| 82 if (key_code_ != rhs.key_code_) | 82 if (key_code_ != rhs.key_code_) |
| 83 return key_code_ < rhs.key_code_; | 83 return key_code_ < rhs.key_code_; |
| 84 if (type_ != rhs.type_) | 84 if (key_state_ != rhs.key_state_) { |
| 85 return type_ < rhs.type_; | 85 return static_cast<int32_t>(key_state_) < |
| 86 static_cast<int32_t>(rhs.key_state_); |
| 87 } |
| 86 return MaskOutKeyEventFlags(modifiers_) < | 88 return MaskOutKeyEventFlags(modifiers_) < |
| 87 MaskOutKeyEventFlags(rhs.modifiers_); | 89 MaskOutKeyEventFlags(rhs.modifiers_); |
| 88 } | 90 } |
| 89 | 91 |
| 90 bool Accelerator::operator ==(const Accelerator& rhs) const { | 92 bool Accelerator::operator ==(const Accelerator& rhs) const { |
| 91 if ((key_code_ == rhs.key_code_) && (type_ == rhs.type_) && | 93 if ((key_code_ == rhs.key_code_) && (key_state_ == rhs.key_state_) && |
| 92 (MaskOutKeyEventFlags(modifiers_) == | 94 (MaskOutKeyEventFlags(modifiers_) == |
| 93 MaskOutKeyEventFlags(rhs.modifiers_))) | 95 MaskOutKeyEventFlags(rhs.modifiers_))) |
| 94 return true; | 96 return true; |
| 95 | 97 |
| 96 bool platform_equal = | 98 bool platform_equal = |
| 97 platform_accelerator_.get() && rhs.platform_accelerator_.get() && | 99 platform_accelerator_.get() && rhs.platform_accelerator_.get() && |
| 98 platform_accelerator_.get() == rhs.platform_accelerator_.get(); | 100 platform_accelerator_.get() == rhs.platform_accelerator_.get(); |
| 99 | 101 |
| 100 return platform_equal; | 102 return platform_equal; |
| 101 } | 103 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 120 return (modifiers_ & EF_COMMAND_DOWN) != 0; | 122 return (modifiers_ & EF_COMMAND_DOWN) != 0; |
| 121 } | 123 } |
| 122 | 124 |
| 123 bool Accelerator::IsRepeat() const { | 125 bool Accelerator::IsRepeat() const { |
| 124 return (modifiers_ & EF_IS_REPEAT) != 0; | 126 return (modifiers_ & EF_IS_REPEAT) != 0; |
| 125 } | 127 } |
| 126 | 128 |
| 127 base::string16 Accelerator::GetShortcutText() const { | 129 base::string16 Accelerator::GetShortcutText() const { |
| 128 int string_id = 0; | 130 int string_id = 0; |
| 129 switch (key_code_) { | 131 switch (key_code_) { |
| 130 case ui::VKEY_TAB: | 132 case VKEY_TAB: |
| 131 string_id = IDS_APP_TAB_KEY; | 133 string_id = IDS_APP_TAB_KEY; |
| 132 break; | 134 break; |
| 133 case ui::VKEY_RETURN: | 135 case VKEY_RETURN: |
| 134 string_id = IDS_APP_ENTER_KEY; | 136 string_id = IDS_APP_ENTER_KEY; |
| 135 break; | 137 break; |
| 136 case ui::VKEY_ESCAPE: | 138 case VKEY_ESCAPE: |
| 137 string_id = IDS_APP_ESC_KEY; | 139 string_id = IDS_APP_ESC_KEY; |
| 138 break; | 140 break; |
| 139 case ui::VKEY_SPACE: | 141 case VKEY_SPACE: |
| 140 string_id = IDS_APP_SPACE_KEY; | 142 string_id = IDS_APP_SPACE_KEY; |
| 141 break; | 143 break; |
| 142 case ui::VKEY_PRIOR: | 144 case VKEY_PRIOR: |
| 143 string_id = IDS_APP_PAGEUP_KEY; | 145 string_id = IDS_APP_PAGEUP_KEY; |
| 144 break; | 146 break; |
| 145 case ui::VKEY_NEXT: | 147 case VKEY_NEXT: |
| 146 string_id = IDS_APP_PAGEDOWN_KEY; | 148 string_id = IDS_APP_PAGEDOWN_KEY; |
| 147 break; | 149 break; |
| 148 case ui::VKEY_END: | 150 case VKEY_END: |
| 149 string_id = IDS_APP_END_KEY; | 151 string_id = IDS_APP_END_KEY; |
| 150 break; | 152 break; |
| 151 case ui::VKEY_HOME: | 153 case VKEY_HOME: |
| 152 string_id = IDS_APP_HOME_KEY; | 154 string_id = IDS_APP_HOME_KEY; |
| 153 break; | 155 break; |
| 154 case ui::VKEY_INSERT: | 156 case VKEY_INSERT: |
| 155 string_id = IDS_APP_INSERT_KEY; | 157 string_id = IDS_APP_INSERT_KEY; |
| 156 break; | 158 break; |
| 157 case ui::VKEY_DELETE: | 159 case VKEY_DELETE: |
| 158 string_id = IDS_APP_DELETE_KEY; | 160 string_id = IDS_APP_DELETE_KEY; |
| 159 break; | 161 break; |
| 160 case ui::VKEY_LEFT: | 162 case VKEY_LEFT: |
| 161 string_id = IDS_APP_LEFT_ARROW_KEY; | 163 string_id = IDS_APP_LEFT_ARROW_KEY; |
| 162 break; | 164 break; |
| 163 case ui::VKEY_RIGHT: | 165 case VKEY_RIGHT: |
| 164 string_id = IDS_APP_RIGHT_ARROW_KEY; | 166 string_id = IDS_APP_RIGHT_ARROW_KEY; |
| 165 break; | 167 break; |
| 166 case ui::VKEY_UP: | 168 case VKEY_UP: |
| 167 string_id = IDS_APP_UP_ARROW_KEY; | 169 string_id = IDS_APP_UP_ARROW_KEY; |
| 168 break; | 170 break; |
| 169 case ui::VKEY_DOWN: | 171 case VKEY_DOWN: |
| 170 string_id = IDS_APP_DOWN_ARROW_KEY; | 172 string_id = IDS_APP_DOWN_ARROW_KEY; |
| 171 break; | 173 break; |
| 172 case ui::VKEY_BACK: | 174 case VKEY_BACK: |
| 173 string_id = IDS_APP_BACKSPACE_KEY; | 175 string_id = IDS_APP_BACKSPACE_KEY; |
| 174 break; | 176 break; |
| 175 case ui::VKEY_F1: | 177 case VKEY_F1: |
| 176 string_id = IDS_APP_F1_KEY; | 178 string_id = IDS_APP_F1_KEY; |
| 177 break; | 179 break; |
| 178 case ui::VKEY_F11: | 180 case VKEY_F11: |
| 179 string_id = IDS_APP_F11_KEY; | 181 string_id = IDS_APP_F11_KEY; |
| 180 break; | 182 break; |
| 181 case ui::VKEY_OEM_COMMA: | 183 case VKEY_OEM_COMMA: |
| 182 string_id = IDS_APP_COMMA_KEY; | 184 string_id = IDS_APP_COMMA_KEY; |
| 183 break; | 185 break; |
| 184 case ui::VKEY_OEM_PERIOD: | 186 case VKEY_OEM_PERIOD: |
| 185 string_id = IDS_APP_PERIOD_KEY; | 187 string_id = IDS_APP_PERIOD_KEY; |
| 186 break; | 188 break; |
| 187 case ui::VKEY_MEDIA_NEXT_TRACK: | 189 case VKEY_MEDIA_NEXT_TRACK: |
| 188 string_id = IDS_APP_MEDIA_NEXT_TRACK_KEY; | 190 string_id = IDS_APP_MEDIA_NEXT_TRACK_KEY; |
| 189 break; | 191 break; |
| 190 case ui::VKEY_MEDIA_PLAY_PAUSE: | 192 case VKEY_MEDIA_PLAY_PAUSE: |
| 191 string_id = IDS_APP_MEDIA_PLAY_PAUSE_KEY; | 193 string_id = IDS_APP_MEDIA_PLAY_PAUSE_KEY; |
| 192 break; | 194 break; |
| 193 case ui::VKEY_MEDIA_PREV_TRACK: | 195 case VKEY_MEDIA_PREV_TRACK: |
| 194 string_id = IDS_APP_MEDIA_PREV_TRACK_KEY; | 196 string_id = IDS_APP_MEDIA_PREV_TRACK_KEY; |
| 195 break; | 197 break; |
| 196 case ui::VKEY_MEDIA_STOP: | 198 case VKEY_MEDIA_STOP: |
| 197 string_id = IDS_APP_MEDIA_STOP_KEY; | 199 string_id = IDS_APP_MEDIA_STOP_KEY; |
| 198 break; | 200 break; |
| 199 default: | 201 default: |
| 200 break; | 202 break; |
| 201 } | 203 } |
| 202 | 204 |
| 203 base::string16 shortcut; | 205 base::string16 shortcut; |
| 204 if (!string_id) { | 206 if (!string_id) { |
| 205 #if defined(OS_WIN) | 207 #if defined(OS_WIN) |
| 206 // Our fallback is to try translate the key code to a regular character | 208 // Our fallback is to try translate the key code to a regular character |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 | 288 |
| 287 // Subtracting the size of the shortcut key and 1 for the '+' sign. | 289 // Subtracting the size of the shortcut key and 1 for the '+' sign. |
| 288 shortcut_rtl.append(shortcut, 0, shortcut.length() - key_length - 1); | 290 shortcut_rtl.append(shortcut, 0, shortcut.length() - key_length - 1); |
| 289 shortcut.swap(shortcut_rtl); | 291 shortcut.swap(shortcut_rtl); |
| 290 } | 292 } |
| 291 | 293 |
| 292 return shortcut; | 294 return shortcut; |
| 293 } | 295 } |
| 294 | 296 |
| 295 } // namespace ui | 297 } // namespace ui |
| OLD | NEW |