Index: win8/metro_driver/chrome_app_view_ash.cc |
=================================================================== |
--- win8/metro_driver/chrome_app_view_ash.cc (revision 186512) |
+++ win8/metro_driver/chrome_app_view_ash.cc (working copy) |
@@ -37,6 +37,10 @@ |
winui::Core::KeyEventArgs*> KeyEventHandler; |
typedef winfoundtn::ITypedEventHandler< |
+ winui::Core::CoreDispatcher*, |
+ winui::Core::AcceleratorKeyEventArgs*> AcceleratorKeyEventHandler; |
+ |
+typedef winfoundtn::ITypedEventHandler< |
winui::Core::CoreWindow*, |
winui::Core::CharacterReceivedEventArgs*> CharEventHandler; |
@@ -311,6 +315,21 @@ |
&keyup_token_); |
CheckHR(hr); |
+ mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher; |
+ hr = window_->get_Dispatcher(&dispatcher); |
+ CheckHR(hr, "Get Dispatcher failed."); |
+ |
+ mswr::ComPtr<winui::Core::ICoreAcceleratorKeys> accelerator_keys; |
+ hr = dispatcher.CopyTo(__uuidof(winui::Core::ICoreAcceleratorKeys), |
+ reinterpret_cast<void**>( |
+ accelerator_keys.GetAddressOf())); |
+ CheckHR(hr, "QI for ICoreAcceleratorKeys failed."); |
+ hr = accelerator_keys->add_AcceleratorKeyActivated( |
+ mswr::Callback<AcceleratorKeyEventHandler>( |
+ this, &ChromeAppViewAsh::OnAcceleratorKeyDown).Get(), |
+ &accel_keydown_token_); |
+ CheckHR(hr); |
+ |
hr = window_->add_PointerWheelChanged(mswr::Callback<PointerEventHandler>( |
this, &ChromeAppViewAsh::OnWheel).Get(), |
&wheel_token_); |
@@ -640,6 +659,55 @@ |
return S_OK; |
} |
+HRESULT ChromeAppViewAsh::OnAcceleratorKeyDown( |
+ winui::Core::ICoreDispatcher* sender, |
+ winui::Core::IAcceleratorKeyEventArgs* args) { |
+ winsys::VirtualKey virtual_key; |
+ HRESULT hr = args->get_VirtualKey(&virtual_key); |
+ if (FAILED(hr)) |
+ return hr; |
+ winui::Core::CorePhysicalKeyStatus status; |
+ hr = args->get_KeyStatus(&status); |
+ if (FAILED(hr)) |
+ return hr; |
+ |
+ winui::Core::CoreAcceleratorKeyEventType event_type; |
+ hr = args->get_EventType(&event_type); |
+ if (FAILED(hr)) |
+ return hr; |
+ |
+ // The AURA event handling code does not handle the system key down event for |
+ // the Alt key if we pass in the flag EF_ALT_DOWN. |
+ uint32 keyboard_flags = GetKeyboardEventFlags() & ~ui::EF_ALT_DOWN; |
+ |
+ switch (event_type) { |
+ case winui::Core::CoreAcceleratorKeyEventType_SystemCharacter: |
+ ui_channel_->Send(new MetroViewerHostMsg_Character(virtual_key, |
+ status.RepeatCount, |
+ status.ScanCode, |
+ keyboard_flags)); |
+ break; |
+ |
+ case winui::Core::CoreAcceleratorKeyEventType_SystemKeyDown: |
+ ui_channel_->Send(new MetroViewerHostMsg_KeyDown(virtual_key, |
+ status.RepeatCount, |
+ status.ScanCode, |
+ keyboard_flags)); |
+ break; |
+ |
+ case winui::Core::CoreAcceleratorKeyEventType_SystemKeyUp: |
+ ui_channel_->Send(new MetroViewerHostMsg_KeyUp(virtual_key, |
+ status.RepeatCount, |
+ status.ScanCode, |
+ keyboard_flags)); |
+ break; |
+ |
+ default: |
+ break; |
+ } |
+ return S_OK; |
+} |
+ |
HRESULT ChromeAppViewAsh::OnCharacterReceived( |
winui::Core::ICoreWindow* sender, |
winui::Core::ICharacterReceivedEventArgs* args) { |