| 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..684b37a713273a486c41d82f361a4bea9cce8810 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,15 @@ class CoreDispatcherEmulation :
|
|
|
| MSG msg = {0};
|
| while((::GetMessage(&msg, NULL, 0, 0) != 0) && g_window_count > 0) {
|
| - ProcessInputMessage(msg);
|
| - ::TranslateMessage(&msg);
|
| + if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kDisableMergeKeyCharEvents)) {
|
| + ::TranslateMessage(&msg);
|
| + ProcessInputMessage(msg);
|
| + } else {
|
| + // Preserve the old behavior when merge- key-char-events is disabled.
|
| + ProcessInputMessage(msg);
|
| + ::TranslateMessage(&msg);
|
| + }
|
| ::DispatchMessage(&msg);
|
| }
|
| // TODO(cpu): figure what to do with msg.WParam which we would normally
|
| @@ -522,7 +532,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 +923,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 +957,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;
|
| }
|
|
|