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; |
} |