Chromium Code Reviews| Index: win8/metro_driver/metro_driver_win7.cc |
| diff --git a/win8/metro_driver/metro_driver_win7.cc b/win8/metro_driver/metro_driver_win7.cc |
| index 3ace04caee0a06327e53b95281b2c12e2be42b5c..2ab4d6f64e5e39c154cfd0fa7726fa5b84d32102 100644 |
| --- a/win8/metro_driver/metro_driver_win7.cc |
| +++ b/win8/metro_driver/metro_driver_win7.cc |
| @@ -371,8 +371,8 @@ class KeyEvent : public mswr::RuntimeClass< |
| winui::Core::ICharacterReceivedEventArgs, |
| winui::Core::IAcceleratorKeyEventArgs> { |
| public: |
| - KeyEvent(const MSG& msg) |
| - : msg_(msg) {} |
| + KeyEvent(const MSG& msg, bool was_key) |
| + : msg_(msg), was_key_(was_key) {} |
| // IKeyEventArgs implementation. |
| HRESULT STDMETHODCALLTYPE |
| @@ -388,8 +388,8 @@ class KeyEvent : public mswr::RuntimeClass< |
| key_status->ScanCode = (msg_.lParam >> 16) & 0x00FF; |
| key_status->IsExtendedKey = (msg_.lParam & (1 << 24)); |
| key_status->IsMenuKeyDown = (msg_.lParam & (1 << 29)); |
| - key_status->WasKeyDown = (msg_.lParam & (1 << 30)); |
| key_status->IsKeyReleased = (msg_.lParam & (1 << 31)); |
| + key_status->WasKeyDown = was_key_; |
| return S_OK; |
| } |
| @@ -414,6 +414,7 @@ class KeyEvent : public mswr::RuntimeClass< |
| private: |
| MSG msg_; |
| + bool was_key_; |
| }; |
| // The following classes are the emulation of the WinRT system as exposed |
| @@ -462,8 +463,8 @@ class CoreDispatcherEmulation : |
| MSG msg = {0}; |
| while((::GetMessage(&msg, NULL, 0, 0) != 0) && g_window_count > 0) { |
| - ProcessInputMessage(msg); |
| ::TranslateMessage(&msg); |
| + ProcessInputMessage(msg); |
| ::DispatchMessage(&msg); |
| } |
| // TODO(cpu): figure what to do with msg.WParam which we would normally |
| @@ -522,7 +523,7 @@ class CoreDispatcherEmulation : |
| bool HandleSystemKeys(const MSG& msg) { |
| mswr::ComPtr<winui::Core::IAcceleratorKeyEventArgs> event_args; |
| - event_args = mswr::Make<KeyEvent>(msg); |
| + event_args = mswr::Make<KeyEvent>(msg, true); |
| accelerator_key_event_handler_->Invoke(this, event_args.Get()); |
| return true; |
| } |
| @@ -913,8 +914,21 @@ class CoreWindowEmulation |
| switch (msg.message) { |
| case WM_KEYDOWN: |
| case WM_KEYUP: { |
| + // Peek & remove the following messages in the message queue. |
|
robliao
2015/08/14 16:42:34
Similarly, this is clear from the code below. Inst
Shu Chen
2015/08/17 04:09:21
Done.
|
| + // - WM_CHAR (0x0102) |
| + // - WM_DEADCHAR (0x0103) |
| + // And only process WM_CHAR message in browser. |
| + MSG char_msg; |
| + while (::PeekMessage(&char_msg, msg.hwnd, WM_CHAR, WM_DEADCHAR, |
| + PM_REMOVE)) { |
| + if (char_msg.message == WM_DEADCHAR) |
| + continue; |
| + mswr::ComPtr<winui::Core::ICharacterReceivedEventArgs> char_args; |
| + char_args = mswr::Make<KeyEvent>(char_msg, true); |
| + character_received_handler_->Invoke(this, char_args.Get()); |
| + } |
| mswr::ComPtr<winui::Core::IKeyEventArgs> event_args; |
| - event_args = mswr::Make<KeyEvent>(msg); |
| + event_args = mswr::Make<KeyEvent>(msg, true); |
| KeyEventHandler* handler = NULL; |
| if (msg.message == WM_KEYDOWN) { |
| handler = key_down_handler_; |
| @@ -925,11 +939,9 @@ class CoreWindowEmulation |
| break; |
| } |
| - case WM_CHAR: |
| - case WM_DEADCHAR: |
| - case WM_UNICHAR: { |
| + case WM_CHAR: { |
| mswr::ComPtr<winui::Core::ICharacterReceivedEventArgs> event_args; |
|
robliao
2015/08/14 16:42:34
Have we confirmed no one sends WM_UNICHAR to us?
Shu Chen
2015/08/17 04:09:21
Some apps may send WM_UNICHAR to us. However, Wind
|
| - event_args = mswr::Make<KeyEvent>(msg); |
| + event_args = mswr::Make<KeyEvent>(msg, false); |
| character_received_handler_->Invoke(this, event_args.Get()); |
| break; |
| } |