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..0fccc5bee7434a449f4bbeeb8970759dc8b9c3d1 100644 |
| --- a/win8/metro_driver/metro_driver_win7.cc |
| +++ b/win8/metro_driver/metro_driver_win7.cc |
| @@ -6,6 +6,8 @@ |
| #include <corewindow.h> |
| #include <shobjidl.h> |
| +#include "base/base_switches.h" |
| +#include "base/command_line.h" |
| #include "base/logging.h" |
| #include "base/profiler/scoped_tracker.h" |
| #include "ui/gfx/geometry/safe_integer_conversions.h" |
| @@ -371,8 +373,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 +390,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 +416,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 +465,8 @@ class CoreDispatcherEmulation : |
| MSG msg = {0}; |
| while((::GetMessage(&msg, NULL, 0, 0) != 0) && g_window_count > 0) { |
| - ProcessInputMessage(msg); |
| ::TranslateMessage(&msg); |
|
yukawa
2015/08/19 06:17:53
Would it be possible to preserve the current behav
Shu Chen
2015/08/19 06:41:31
Done.
|
| + ProcessInputMessage(msg); |
| ::DispatchMessage(&msg); |
| } |
| // TODO(cpu): figure what to do with msg.WParam which we would normally |
| @@ -522,7 +525,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 +916,30 @@ class CoreWindowEmulation |
| switch (msg.message) { |
| case WM_KEYDOWN: |
| case WM_KEYUP: { |
| + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kDisableMergeKeyCharEvents)) { |
| + // Combines the WM_KEY* and WM_CHAR messages in the event processing |
| + // flow which is necessary to let Chrome IME extension to process the |
| + // key event and perform corresponding IME actions. |
| + // Chrome IME extension may wants to consume certain key events based |
| + // on the character information of WM_CHAR messages. Holding WM_KEY* |
| + // messages until WM_CHAR is processed by the IME extension is not |
| + // feasible because there is no way to know wether there will or not |
| + // be a WM_CHAR following the WM_KEY*. |
| + // Chrome never handles dead chars so it is safe to remove/ignore |
| + // WM_*DEADCHAR messages. |
| + 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 +950,9 @@ class CoreWindowEmulation |
| break; |
| } |
| - case WM_CHAR: |
| - case WM_DEADCHAR: |
| - case WM_UNICHAR: { |
| + case WM_CHAR: { |
| mswr::ComPtr<winui::Core::ICharacterReceivedEventArgs> event_args; |
| - event_args = mswr::Make<KeyEvent>(msg); |
| + event_args = mswr::Make<KeyEvent>(msg, false); |
| character_received_handler_->Invoke(this, event_args.Get()); |
| break; |
| } |