| Index: ui/aura/remote_root_window_host_win.cc
|
| ===================================================================
|
| --- ui/aura/remote_root_window_host_win.cc (revision 186512)
|
| +++ ui/aura/remote_root_window_host_win.cc (working copy)
|
| @@ -29,6 +29,29 @@
|
| // The touch id to be used for touch events coming in from Windows Ash.
|
| const int kRemoteWindowTouchId = 10;
|
|
|
| +// Sets the keystate for the virtual key passed in to down or up.
|
| +void SetKeyState(uint8* key_states, bool key_down, uint32 virtual_key_code) {
|
| + DCHECK(key_states);
|
| +
|
| + if (key_down)
|
| + key_states[virtual_key_code] |= 0x80;
|
| + else
|
| + key_states[virtual_key_code] &= 0x7F;
|
| +}
|
| +
|
| +// Sets the keyboard states for the Shift/Control/Alt/Caps lock keys.
|
| +void SetVirtualKeyStates(uint32 flags) {
|
| + uint8 keyboard_state[256] = {0};
|
| + ::GetKeyboardState(keyboard_state);
|
| +
|
| + SetKeyState(keyboard_state, !!(flags & ui::EF_SHIFT_DOWN), VK_SHIFT);
|
| + SetKeyState(keyboard_state, !!(flags & ui::EF_CONTROL_DOWN), VK_CONTROL);
|
| + SetKeyState(keyboard_state, !!(flags & ui::EF_ALT_DOWN), VK_MENU);
|
| + SetKeyState(keyboard_state, !!(flags & ui::EF_CAPS_LOCK_DOWN), VK_CAPITAL);
|
| +
|
| + ::SetKeyboardState(keyboard_state);
|
| +}
|
| +
|
| } // namespace
|
|
|
| void HandleOpenFile(
|
| @@ -317,33 +340,24 @@
|
| uint32 repeat_count,
|
| uint32 scan_code,
|
| uint32 flags) {
|
| - ui::KeyEvent event(ui::ET_KEY_PRESSED,
|
| - ui::KeyboardCodeForWindowsKeyCode(vkey),
|
| - flags,
|
| - false);
|
| - delegate_->OnHostKeyEvent(&event);
|
| + DispatchKeyboardMessage(ui::ET_KEY_PRESSED, vkey, repeat_count, scan_code,
|
| + flags, false);
|
| }
|
|
|
| void RemoteRootWindowHostWin::OnKeyUp(uint32 vkey,
|
| uint32 repeat_count,
|
| uint32 scan_code,
|
| uint32 flags) {
|
| - ui::KeyEvent event(ui::ET_KEY_RELEASED,
|
| - ui::KeyboardCodeForWindowsKeyCode(vkey),
|
| - flags,
|
| - false);
|
| - delegate_->OnHostKeyEvent(&event);
|
| + DispatchKeyboardMessage(ui::ET_KEY_RELEASED, vkey, repeat_count, scan_code,
|
| + flags, false);
|
| }
|
|
|
| void RemoteRootWindowHostWin::OnChar(uint32 key_code,
|
| uint32 repeat_count,
|
| uint32 scan_code,
|
| uint32 flags) {
|
| - ui::KeyEvent event(ui::ET_KEY_PRESSED,
|
| - ui::KeyboardCodeForWindowsKeyCode(key_code),
|
| - flags,
|
| - true);
|
| - delegate_->OnHostKeyEvent(&event);
|
| + DispatchKeyboardMessage(ui::ET_KEY_PRESSED, key_code, repeat_count,
|
| + scan_code, flags, true);
|
| }
|
|
|
| void RemoteRootWindowHostWin::OnVisibilityChanged(bool visible) {
|
| @@ -405,4 +419,28 @@
|
| multi_file_open_completion_callback_.Reset();
|
| }
|
|
|
| +void RemoteRootWindowHostWin::DispatchKeyboardMessage(ui::EventType type,
|
| + uint32 vkey,
|
| + uint32 repeat_count,
|
| + uint32 scan_code,
|
| + uint32 flags,
|
| + bool is_character) {
|
| + if (MessageLoop::current()->IsNested()) {
|
| + SetVirtualKeyStates(flags);
|
| +
|
| + uint32 message = is_character ? WM_CHAR :
|
| + (type == ui::ET_KEY_PRESSED ? WM_KEYDOWN : WM_KEYUP);
|
| + ::PostThreadMessage(::GetCurrentThreadId(),
|
| + message,
|
| + vkey,
|
| + repeat_count | scan_code >> 15);
|
| + } else {
|
| + ui::KeyEvent event(type,
|
| + ui::KeyboardCodeForWindowsKeyCode(vkey),
|
| + flags,
|
| + is_character);
|
| + delegate_->OnHostKeyEvent(&event);
|
| + }
|
| +}
|
| +
|
| } // namespace aura
|
|
|