| // Copyright 2017 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "starboard/shared/uwp/application_uwp.h" |
| |
| #include "starboard/event.h" |
| #include "starboard/input.h" |
| #include "starboard/key.h" |
| |
| using Windows::System::VirtualKey; |
| using Windows::UI::Core::CoreVirtualKeyStates; |
| using Windows::UI::Core::CoreWindow; |
| using Windows::UI::Core::KeyEventArgs; |
| |
| namespace { |
| |
| SbKey VirtualKeyToSbKey(VirtualKey key) { |
| // Disable warning for Invalid valid values from switch of enum. |
| #pragma warning(push) |
| #pragma warning(disable : 4063) |
| switch (key) { |
| case VirtualKey::None: |
| case VirtualKey::NavigationView: |
| case VirtualKey::NavigationMenu: |
| case VirtualKey::NavigationUp: |
| case VirtualKey::NavigationDown: |
| case VirtualKey::NavigationLeft: |
| case VirtualKey::NavigationRight: |
| case VirtualKey::NavigationAccept: |
| case VirtualKey::NavigationCancel: |
| return kSbKeyUnknown; |
| case VirtualKey::Cancel: |
| return kSbKeyCancel; |
| case VirtualKey::Back: |
| return kSbKeyBack; |
| case VirtualKey::Tab: |
| return kSbKeyTab; |
| case VirtualKey::Clear: |
| return kSbKeyClear; |
| case VirtualKey::Enter: |
| return kSbKeyReturn; |
| case VirtualKey::Shift: |
| return kSbKeyShift; |
| case VirtualKey::Control: |
| return kSbKeyControl; |
| case VirtualKey::Menu: |
| return kSbKeyMenu; |
| case VirtualKey::Pause: |
| return kSbKeyPause; |
| case VirtualKey::CapitalLock: |
| return kSbKeyCapital; |
| // Hangul and Kana have the same VirtualKey constant |
| case VirtualKey::Kana: |
| return kSbKeyKana; |
| case VirtualKey::Junja: |
| return kSbKeyJunja; |
| case VirtualKey::Final: |
| return kSbKeyFinal; |
| // Hanja and Kanji have the same VirtualKey constant |
| case VirtualKey::Hanja: |
| return kSbKeyHanja; |
| case VirtualKey::Escape: |
| return kSbKeyEscape; |
| case VirtualKey::Convert: |
| return kSbKeyConvert; |
| case VirtualKey::NonConvert: |
| return kSbKeyNonconvert; |
| case VirtualKey::Accept: |
| return kSbKeyAccept; |
| case VirtualKey::ModeChange: |
| return kSbKeyModechange; |
| case VirtualKey::Space: |
| return kSbKeySpace; |
| case VirtualKey::PageUp: |
| return kSbKeyPrior; |
| case VirtualKey::PageDown: |
| return kSbKeyNext; |
| case VirtualKey::End: |
| return kSbKeyEnd; |
| case VirtualKey::Home: |
| return kSbKeyHome; |
| case VirtualKey::Left: |
| return kSbKeyLeft; |
| case VirtualKey::Up: |
| return kSbKeyUp; |
| case VirtualKey::Right: |
| return kSbKeyRight; |
| case VirtualKey::Down: |
| return kSbKeyDown; |
| case VirtualKey::Select: |
| return kSbKeySelect; |
| case VirtualKey::Print: |
| return kSbKeyPrint; |
| case VirtualKey::Execute: |
| return kSbKeyExecute; |
| case VirtualKey::Snapshot: |
| return kSbKeySnapshot; |
| case VirtualKey::Insert: |
| return kSbKeyInsert; |
| case VirtualKey::Delete: |
| return kSbKeyDelete; |
| case VirtualKey::Number0: |
| return kSbKey0; |
| case VirtualKey::Number1: |
| return kSbKey1; |
| case VirtualKey::Number2: |
| return kSbKey2; |
| case VirtualKey::Number3: |
| return kSbKey3; |
| case VirtualKey::Number4: |
| return kSbKey4; |
| case VirtualKey::Number5: |
| return kSbKey5; |
| case VirtualKey::Number6: |
| return kSbKey6; |
| case VirtualKey::Number7: |
| return kSbKey7; |
| case VirtualKey::Number8: |
| return kSbKey8; |
| case VirtualKey::Number9: |
| return kSbKey9; |
| case VirtualKey::A: |
| return kSbKeyA; |
| case VirtualKey::B: |
| return kSbKeyB; |
| case VirtualKey::C: |
| return kSbKeyC; |
| case VirtualKey::D: |
| return kSbKeyD; |
| case VirtualKey::E: |
| return kSbKeyE; |
| case VirtualKey::F: |
| return kSbKeyF; |
| case VirtualKey::G: |
| return kSbKeyG; |
| case VirtualKey::H: |
| return kSbKeyH; |
| case VirtualKey::I: |
| return kSbKeyI; |
| case VirtualKey::J: |
| return kSbKeyJ; |
| case VirtualKey::K: |
| return kSbKeyK; |
| case VirtualKey::L: |
| return kSbKeyL; |
| case VirtualKey::M: |
| return kSbKeyM; |
| case VirtualKey::N: |
| return kSbKeyN; |
| case VirtualKey::O: |
| return kSbKeyO; |
| case VirtualKey::P: |
| return kSbKeyP; |
| case VirtualKey::Q: |
| return kSbKeyQ; |
| case VirtualKey::R: |
| return kSbKeyR; |
| case VirtualKey::S: |
| return kSbKeyS; |
| case VirtualKey::T: |
| return kSbKeyT; |
| case VirtualKey::U: |
| return kSbKeyU; |
| case VirtualKey::V: |
| return kSbKeyV; |
| case VirtualKey::W: |
| return kSbKeyW; |
| case VirtualKey::X: |
| return kSbKeyX; |
| case VirtualKey::Y: |
| return kSbKeyY; |
| case VirtualKey::Z: |
| return kSbKeyZ; |
| case VirtualKey::LeftWindows: |
| return kSbKeyLwin; |
| case VirtualKey::RightWindows: |
| return kSbKeyRwin; |
| case VirtualKey::Application: |
| return kSbKeyApps; |
| case VirtualKey::Sleep: |
| return kSbKeySleep; |
| case VirtualKey::NumberPad0: |
| return kSbKeyNumpad0; |
| case VirtualKey::NumberPad1: |
| return kSbKeyNumpad1; |
| case VirtualKey::NumberPad2: |
| return kSbKeyNumpad2; |
| case VirtualKey::NumberPad3: |
| return kSbKeyNumpad3; |
| case VirtualKey::NumberPad4: |
| return kSbKeyNumpad4; |
| case VirtualKey::NumberPad5: |
| return kSbKeyNumpad5; |
| case VirtualKey::NumberPad6: |
| return kSbKeyNumpad6; |
| case VirtualKey::NumberPad7: |
| return kSbKeyNumpad7; |
| case VirtualKey::NumberPad8: |
| return kSbKeyNumpad8; |
| case VirtualKey::NumberPad9: |
| return kSbKeyNumpad9; |
| case VirtualKey::Multiply: |
| return kSbKeyMultiply; |
| case VirtualKey::Add: |
| return kSbKeyAdd; |
| case VirtualKey::Separator: |
| return kSbKeySeparator; |
| case VirtualKey::Subtract: |
| return kSbKeySubtract; |
| case VirtualKey::Decimal: |
| return kSbKeyDecimal; |
| case VirtualKey::Divide: |
| return kSbKeyDivide; |
| case VirtualKey::F1: |
| return kSbKeyF1; |
| case VirtualKey::F2: |
| return kSbKeyF2; |
| case VirtualKey::F3: |
| return kSbKeyF3; |
| case VirtualKey::F4: |
| return kSbKeyF4; |
| case VirtualKey::F5: |
| return kSbKeyF5; |
| case VirtualKey::F6: |
| return kSbKeyF6; |
| case VirtualKey::F7: |
| return kSbKeyF7; |
| case VirtualKey::F8: |
| return kSbKeyF8; |
| case VirtualKey::F9: |
| return kSbKeyF9; |
| case VirtualKey::F10: |
| return kSbKeyF10; |
| case VirtualKey::F11: |
| return kSbKeyF11; |
| case VirtualKey::F12: |
| return kSbKeyF12; |
| case VirtualKey::F13: |
| return kSbKeyF13; |
| case VirtualKey::F14: |
| return kSbKeyF14; |
| case VirtualKey::F15: |
| return kSbKeyF15; |
| case VirtualKey::F16: |
| return kSbKeyF16; |
| case VirtualKey::F17: |
| return kSbKeyF17; |
| case VirtualKey::F18: |
| return kSbKeyF18; |
| case VirtualKey::F19: |
| return kSbKeyF19; |
| case VirtualKey::F20: |
| return kSbKeyF20; |
| case VirtualKey::F21: |
| return kSbKeyF21; |
| case VirtualKey::F22: |
| return kSbKeyF22; |
| case VirtualKey::F23: |
| return kSbKeyF23; |
| case VirtualKey::F24: |
| return kSbKeyF24; |
| // SbKeys were originally modeled after the windows virtual key mappings |
| // [1]. UWP VirtualKey uses a very similar mapping, but the UWP enum does |
| // not contain all of the Virtual-Key Codes. [1] |
| // https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx |
| case 0xBA: |
| return kSbKeyOem1; // Used for ";:" key with US keyboards. |
| case 0xBB: |
| return kSbKeyOemPlus; |
| case 0xBC: |
| return kSbKeyOemComma; |
| case 0xBD: |
| return kSbKeyOemMinus; |
| case 0xBE: |
| return kSbKeyOemPeriod; |
| case 0xBF: |
| return kSbKeyOem2; // Used for "/?" key with US keyboards. |
| case 0xC0: |
| return kSbKeyOem3; // Used for "~" with US keyboards. |
| case 0xDB: |
| return kSbKeyOem4; // Used for "[{" with US keyboards. |
| case 0xDC: |
| return kSbKeyOem5; // Used for "\|" with US keyboards. |
| case 0xDD: |
| return kSbKeyOem6; // Used for "]}" with US keyboards. |
| case 0xDE: |
| return kSbKeyOem7; // Used for quotes with US keyboards. |
| case 0xDF: |
| return kSbKeyOem8; // Used for misc. chars with US keyboards. |
| case 0xE2: |
| return kSbKeyOem102; // Used for "/" or angle bracket keys. |
| case 0xAD: |
| return kSbKeyVolumeMute; |
| case 0xAE: |
| return kSbKeyVolumeDown; |
| case 0xAF: |
| return kSbKeyVolumeUp; |
| case VirtualKey::NumberKeyLock: |
| return kSbKeyNumlock; |
| case VirtualKey::Scroll: |
| return kSbKeyScroll; |
| case VirtualKey::LeftShift: |
| return kSbKeyLshift; |
| case VirtualKey::RightShift: |
| return kSbKeyRshift; |
| case VirtualKey::LeftControl: |
| return kSbKeyLcontrol; |
| case VirtualKey::RightControl: |
| return kSbKeyRcontrol; |
| case VirtualKey::LeftMenu: |
| return kSbKeyLmenu; |
| case VirtualKey::RightMenu: |
| return kSbKeyRmenu; |
| case VirtualKey::GoBack: |
| return kSbKeyBrowserBack; |
| case VirtualKey::GoForward: |
| return kSbKeyBrowserForward; |
| case VirtualKey::Refresh: |
| return kSbKeyBrowserRefresh; |
| case VirtualKey::Stop: |
| return kSbKeyBrowserStop; |
| case VirtualKey::Search: |
| return kSbKeyBrowserSearch; |
| case VirtualKey::Favorites: |
| return kSbKeyBrowserFavorites; |
| case VirtualKey::GoHome: |
| return kSbKeyBrowserHome; |
| case VirtualKey::LeftButton: |
| return kSbKeyMouse1; |
| case VirtualKey::RightButton: |
| return kSbKeyMouse2; |
| case VirtualKey::MiddleButton: |
| return kSbKeyMouse3; |
| case VirtualKey::XButton1: |
| return kSbKeyMouse4; |
| case VirtualKey::XButton2: |
| return kSbKeyMouse5; |
| case VirtualKey::GamepadA: |
| return kSbKeyGamepad1; |
| case VirtualKey::GamepadB: |
| return kSbKeyGamepad2; |
| case VirtualKey::GamepadX: |
| return kSbKeyGamepad3; |
| case VirtualKey::GamepadY: |
| return kSbKeyGamepad4; |
| case VirtualKey::GamepadRightShoulder: |
| return kSbKeyGamepadRightBumper; |
| case VirtualKey::GamepadLeftShoulder: |
| return kSbKeyGamepadLeftBumper; |
| case VirtualKey::GamepadLeftTrigger: |
| return kSbKeyGamepadLeftTrigger; |
| case VirtualKey::GamepadRightTrigger: |
| return kSbKeyGamepadRightTrigger; |
| case VirtualKey::GamepadDPadUp: |
| return kSbKeyGamepadDPadUp; |
| case VirtualKey::GamepadDPadDown: |
| return kSbKeyGamepadDPadDown; |
| case VirtualKey::GamepadDPadLeft: |
| return kSbKeyGamepadDPadLeft; |
| case VirtualKey::GamepadDPadRight: |
| return kSbKeyGamepadDPadRight; |
| case VirtualKey::GamepadMenu: |
| return kSbKeyGamepad6; |
| case VirtualKey::GamepadView: |
| return kSbKeyGamepad5; |
| case VirtualKey::GamepadLeftThumbstickButton: |
| return kSbKeyGamepadLeftStick; |
| case VirtualKey::GamepadRightThumbstickButton: |
| return kSbKeyGamepadRightStick; |
| case VirtualKey::GamepadLeftThumbstickUp: |
| return kSbKeyGamepadLeftStickUp; |
| case VirtualKey::GamepadLeftThumbstickDown: |
| return kSbKeyGamepadLeftStickDown; |
| case VirtualKey::GamepadLeftThumbstickRight: |
| return kSbKeyGamepadLeftStickRight; |
| case VirtualKey::GamepadLeftThumbstickLeft: |
| return kSbKeyGamepadLeftStickLeft; |
| case VirtualKey::GamepadRightThumbstickUp: |
| return kSbKeyGamepadRightStickUp; |
| case VirtualKey::GamepadRightThumbstickDown: |
| return kSbKeyGamepadRightStickDown; |
| case VirtualKey::GamepadRightThumbstickRight: |
| return kSbKeyGamepadRightStickRight; |
| case VirtualKey::GamepadRightThumbstickLeft: |
| return kSbKeyGamepadRightStickLeft; |
| default: |
| return kSbKeyUnknown; |
| } |
| #pragma warning(pop) // Warning 4093 (Invalid valid values from switch of enum) |
| } |
| |
| // Returns true if a given VirtualKey is currently being held down. |
| bool IsDown(CoreWindow ^ sender, VirtualKey key) { |
| return ((sender->GetKeyState(key) & CoreVirtualKeyStates::Down) == |
| CoreVirtualKeyStates::Down); |
| } |
| |
| } // namespace |
| |
| namespace starboard { |
| namespace shared { |
| namespace uwp { |
| |
| void ApplicationUwp::OnKeyEvent(CoreWindow ^ sender, |
| KeyEventArgs ^ args, |
| bool up) { |
| args->Handled = true; |
| SbInputData* data = new SbInputData(); |
| memset(data, 0, sizeof(*data)); |
| |
| data->window = window_; |
| data->device_type = kSbInputDeviceTypeKeyboard; |
| data->device_id = device_id(); |
| data->key = VirtualKeyToSbKey(args->VirtualKey); |
| |
| if (up) { |
| data->type = kSbInputEventTypeUnpress; |
| } else { |
| data->type = kSbInputEventTypePress; |
| } |
| |
| // Build up key_modifiers |
| if (IsDown(sender, VirtualKey::Menu) || |
| IsDown(sender, VirtualKey::LeftMenu) || |
| IsDown(sender, VirtualKey::RightMenu)) { |
| data->key_modifiers |= kSbKeyModifiersAlt; |
| } |
| if (IsDown(sender, VirtualKey::Control) || |
| IsDown(sender, VirtualKey::LeftControl) || |
| IsDown(sender, VirtualKey::RightControl)) { |
| data->key_modifiers |= kSbKeyModifiersCtrl; |
| } |
| if (IsDown(sender, VirtualKey::LeftWindows) || |
| IsDown(sender, VirtualKey::RightWindows)) { |
| data->key_modifiers |= kSbKeyModifiersMeta; |
| } |
| if (IsDown(sender, VirtualKey::Shift) || |
| IsDown(sender, VirtualKey::LeftShift) || |
| IsDown(sender, VirtualKey::RightShift)) { |
| data->key_modifiers |= kSbKeyModifiersShift; |
| } |
| |
| // Set key_location |
| switch (args->VirtualKey) { |
| case VirtualKey::LeftMenu: |
| case VirtualKey::LeftControl: |
| case VirtualKey::LeftWindows: |
| case VirtualKey::LeftShift: |
| data->key_location = kSbKeyLocationLeft; |
| break; |
| case VirtualKey::RightMenu: |
| case VirtualKey::RightControl: |
| case VirtualKey::RightWindows: |
| case VirtualKey::RightShift: |
| data->key_location = kSbKeyLocationRight; |
| break; |
| default: |
| break; |
| } |
| |
| DispatchAndDelete(new Event(kSbEventTypeInput, data, |
| &Application::DeleteDestructor<SbInputData>)); |
| } |
| |
| } // namespace uwp |
| } // namespace shared |
| } // namespace starboard |