| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/aura/remote_root_window_host_win.h" | 5 #include "ui/aura/remote_root_window_host_win.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
| 12 #include "ipc/ipc_message.h" | 12 #include "ipc/ipc_message.h" |
| 13 #include "ipc/ipc_sender.h" | 13 #include "ipc/ipc_sender.h" |
| 14 #include "ui/aura/client/aura_constants.h" |
| 14 #include "ui/aura/client/cursor_client.h" | 15 #include "ui/aura/client/cursor_client.h" |
| 15 #include "ui/aura/root_window.h" | 16 #include "ui/aura/root_window.h" |
| 17 #include "ui/aura/window_property.h" |
| 16 #include "ui/base/cursor/cursor_loader_win.h" | 18 #include "ui/base/cursor/cursor_loader_win.h" |
| 19 #include "ui/base/ime/composition_text.h" |
| 20 #include "ui/base/ime/input_method.h" |
| 21 #include "ui/base/ime/remote_input_method_win.h" |
| 22 #include "ui/base/ime/text_input_client.h" |
| 17 #include "ui/events/event_utils.h" | 23 #include "ui/events/event_utils.h" |
| 18 #include "ui/events/keycodes/keyboard_code_conversion_win.h" | 24 #include "ui/events/keycodes/keyboard_code_conversion_win.h" |
| 19 #include "ui/base/view_prop.h" | 25 #include "ui/base/view_prop.h" |
| 20 #include "ui/gfx/insets.h" | 26 #include "ui/gfx/insets.h" |
| 21 #include "ui/metro_viewer/metro_viewer_messages.h" | 27 #include "ui/metro_viewer/metro_viewer_messages.h" |
| 22 | 28 |
| 23 namespace aura { | 29 namespace aura { |
| 24 | 30 |
| 25 namespace { | 31 namespace { |
| 26 | 32 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 47 SetKeyState(keyboard_state, !!(flags & ui::EF_CAPS_LOCK_DOWN), VK_CAPITAL); | 53 SetKeyState(keyboard_state, !!(flags & ui::EF_CAPS_LOCK_DOWN), VK_CAPITAL); |
| 48 SetKeyState(keyboard_state, !!(flags & ui::EF_LEFT_MOUSE_BUTTON), VK_LBUTTON); | 54 SetKeyState(keyboard_state, !!(flags & ui::EF_LEFT_MOUSE_BUTTON), VK_LBUTTON); |
| 49 SetKeyState(keyboard_state, !!(flags & ui::EF_RIGHT_MOUSE_BUTTON), | 55 SetKeyState(keyboard_state, !!(flags & ui::EF_RIGHT_MOUSE_BUTTON), |
| 50 VK_RBUTTON); | 56 VK_RBUTTON); |
| 51 SetKeyState(keyboard_state, !!(flags & ui::EF_MIDDLE_MOUSE_BUTTON), | 57 SetKeyState(keyboard_state, !!(flags & ui::EF_MIDDLE_MOUSE_BUTTON), |
| 52 VK_MBUTTON); | 58 VK_MBUTTON); |
| 53 | 59 |
| 54 ::SetKeyboardState(keyboard_state); | 60 ::SetKeyboardState(keyboard_state); |
| 55 } | 61 } |
| 56 | 62 |
| 63 void FillCompositionText( |
| 64 const string16& text, |
| 65 int32 selection_start, |
| 66 int32 selection_end, |
| 67 const std::vector<metro_viewer::UnderlineInfo>& underlines, |
| 68 ui::CompositionText* composition_text) { |
| 69 composition_text->Clear(); |
| 70 composition_text->text = text; |
| 71 composition_text->selection.set_start(selection_start); |
| 72 composition_text->selection.set_end(selection_end); |
| 73 composition_text->underlines.resize(underlines.size()); |
| 74 for (size_t i = 0; i < underlines.size(); ++i) { |
| 75 composition_text->underlines[i].start_offset = underlines[i].start_offset; |
| 76 composition_text->underlines[i].end_offset = underlines[i].end_offset; |
| 77 composition_text->underlines[i].color = SK_ColorBLACK; |
| 78 composition_text->underlines[i].thick = underlines[i].thick; |
| 79 } |
| 80 } |
| 81 |
| 57 } // namespace | 82 } // namespace |
| 58 | 83 |
| 59 void HandleOpenFile(const base::string16& title, | 84 void HandleOpenFile(const base::string16& title, |
| 60 const base::FilePath& default_path, | 85 const base::FilePath& default_path, |
| 61 const base::string16& filter, | 86 const base::string16& filter, |
| 62 const OpenFileCompletion& on_success, | 87 const OpenFileCompletion& on_success, |
| 63 const FileSelectionCanceled& on_failure) { | 88 const FileSelectionCanceled& on_failure) { |
| 64 DCHECK(aura::RemoteRootWindowHostWin::Instance()); | 89 DCHECK(aura::RemoteRootWindowHostWin::Instance()); |
| 65 aura::RemoteRootWindowHostWin::Instance()->HandleOpenFile(title, | 90 aura::RemoteRootWindowHostWin::Instance()->HandleOpenFile(title, |
| 66 default_path, | 91 default_path, |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 | 169 |
| 145 void RemoteRootWindowHostWin::Connected(IPC::Sender* host, HWND remote_window) { | 170 void RemoteRootWindowHostWin::Connected(IPC::Sender* host, HWND remote_window) { |
| 146 CHECK(host_ == NULL); | 171 CHECK(host_ == NULL); |
| 147 host_ = host; | 172 host_ = host; |
| 148 remote_window_ = remote_window; | 173 remote_window_ = remote_window; |
| 149 } | 174 } |
| 150 | 175 |
| 151 void RemoteRootWindowHostWin::Disconnected() { | 176 void RemoteRootWindowHostWin::Disconnected() { |
| 152 // Don't CHECK here, Disconnected is called on a channel error which can | 177 // Don't CHECK here, Disconnected is called on a channel error which can |
| 153 // happen before we're successfully Connected. | 178 // happen before we're successfully Connected. |
| 179 ui::RemoteInputMethodPrivateWin* remote_input_method_private = |
| 180 GetRemoteInputMethodPrivate(); |
| 181 if (remote_input_method_private) |
| 182 remote_input_method_private->SetRemoteDelegate(NULL); |
| 154 host_ = NULL; | 183 host_ = NULL; |
| 155 remote_window_ = NULL; | 184 remote_window_ = NULL; |
| 156 } | 185 } |
| 157 | 186 |
| 158 bool RemoteRootWindowHostWin::OnMessageReceived(const IPC::Message& message) { | 187 bool RemoteRootWindowHostWin::OnMessageReceived(const IPC::Message& message) { |
| 159 bool handled = true; | 188 bool handled = true; |
| 160 IPC_BEGIN_MESSAGE_MAP(RemoteRootWindowHostWin, message) | 189 IPC_BEGIN_MESSAGE_MAP(RemoteRootWindowHostWin, message) |
| 161 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_MouseMoved, OnMouseMoved) | 190 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_MouseMoved, OnMouseMoved) |
| 162 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_MouseButton, OnMouseButton) | 191 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_MouseButton, OnMouseButton) |
| 163 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_KeyDown, OnKeyDown) | 192 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_KeyDown, OnKeyDown) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 178 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_MultiFileOpenDone, | 207 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_MultiFileOpenDone, |
| 179 OnMultiFileOpenDone) | 208 OnMultiFileOpenDone) |
| 180 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SelectFolderDone, | 209 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SelectFolderDone, |
| 181 OnSelectFolderDone) | 210 OnSelectFolderDone) |
| 182 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursorPosAck, | 211 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursorPosAck, |
| 183 OnSetCursorPosAck) | 212 OnSetCursorPosAck) |
| 184 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_WindowSizeChanged, | 213 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_WindowSizeChanged, |
| 185 OnWindowSizeChanged) | 214 OnWindowSizeChanged) |
| 186 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ActivateDesktopDone, | 215 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ActivateDesktopDone, |
| 187 OnDesktopActivated) | 216 OnDesktopActivated) |
| 217 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ImeCompositionChanged, |
| 218 OnImeCompositionChanged) |
| 219 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ImeTextCommitted, |
| 220 OnImeTextCommitted) |
| 188 IPC_MESSAGE_UNHANDLED(handled = false) | 221 IPC_MESSAGE_UNHANDLED(handled = false) |
| 189 IPC_END_MESSAGE_MAP() | 222 IPC_END_MESSAGE_MAP() |
| 190 return handled; | 223 return handled; |
| 191 } | 224 } |
| 192 | 225 |
| 193 void RemoteRootWindowHostWin::HandleOpenURLOnDesktop( | 226 void RemoteRootWindowHostWin::HandleOpenURLOnDesktop( |
| 194 const base::FilePath& shortcut, | 227 const base::FilePath& shortcut, |
| 195 const base::string16& url) { | 228 const base::string16& url) { |
| 196 if (!host_) | 229 if (!host_) |
| 197 return; | 230 return; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 } | 340 } |
| 308 | 341 |
| 309 gfx::AcceleratedWidget RemoteRootWindowHostWin::GetAcceleratedWidget() { | 342 gfx::AcceleratedWidget RemoteRootWindowHostWin::GetAcceleratedWidget() { |
| 310 if (remote_window_) | 343 if (remote_window_) |
| 311 return remote_window_; | 344 return remote_window_; |
| 312 // Getting here should only happen for ash_unittests.exe and related code. | 345 // Getting here should only happen for ash_unittests.exe and related code. |
| 313 return ::GetDesktopWindow(); | 346 return ::GetDesktopWindow(); |
| 314 } | 347 } |
| 315 | 348 |
| 316 void RemoteRootWindowHostWin::Show() { | 349 void RemoteRootWindowHostWin::Show() { |
| 350 ui::RemoteInputMethodPrivateWin* remote_input_method_private = |
| 351 GetRemoteInputMethodPrivate(); |
| 352 if (remote_input_method_private) |
| 353 remote_input_method_private->SetRemoteDelegate(this); |
| 317 } | 354 } |
| 318 | 355 |
| 319 void RemoteRootWindowHostWin::Hide() { | 356 void RemoteRootWindowHostWin::Hide() { |
| 320 NOTIMPLEMENTED(); | 357 NOTIMPLEMENTED(); |
| 321 } | 358 } |
| 322 | 359 |
| 323 void RemoteRootWindowHostWin::ToggleFullScreen() { | 360 void RemoteRootWindowHostWin::ToggleFullScreen() { |
| 324 } | 361 } |
| 325 | 362 |
| 326 gfx::Rect RemoteRootWindowHostWin::GetBounds() const { | 363 gfx::Rect RemoteRootWindowHostWin::GetBounds() const { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 } | 448 } |
| 412 | 449 |
| 413 void RemoteRootWindowHostWin::OnDeviceScaleFactorChanged( | 450 void RemoteRootWindowHostWin::OnDeviceScaleFactorChanged( |
| 414 float device_scale_factor) { | 451 float device_scale_factor) { |
| 415 NOTIMPLEMENTED(); | 452 NOTIMPLEMENTED(); |
| 416 } | 453 } |
| 417 | 454 |
| 418 void RemoteRootWindowHostWin::PrepareForShutdown() { | 455 void RemoteRootWindowHostWin::PrepareForShutdown() { |
| 419 } | 456 } |
| 420 | 457 |
| 458 void RemoteRootWindowHostWin::CancelComposition() { |
| 459 host_->Send(new MetroViewerHostMsg_ImeCancelComposition); |
| 460 } |
| 461 |
| 462 void RemoteRootWindowHostWin::OnTextInputClientUpdated( |
| 463 const std::vector<int32>& input_scopes, |
| 464 const std::vector<gfx::Rect>& composition_character_bounds) { |
| 465 std::vector<metro_viewer::CharacterBounds> character_bounds; |
| 466 for (size_t i = 0; i < composition_character_bounds.size(); ++i) { |
| 467 const gfx::Rect& rect = composition_character_bounds[i]; |
| 468 metro_viewer::CharacterBounds bounds; |
| 469 bounds.left = rect.x(); |
| 470 bounds.top = rect.y(); |
| 471 bounds.right = rect.right(); |
| 472 bounds.bottom = rect.bottom(); |
| 473 character_bounds.push_back(bounds); |
| 474 } |
| 475 host_->Send(new MetroViewerHostMsg_ImeTextInputClientUpdated( |
| 476 input_scopes, character_bounds)); |
| 477 } |
| 478 |
| 421 void RemoteRootWindowHostWin::OnMouseMoved(int32 x, int32 y, int32 flags) { | 479 void RemoteRootWindowHostWin::OnMouseMoved(int32 x, int32 y, int32 flags) { |
| 422 if (ignore_mouse_moves_until_set_cursor_ack_) | 480 if (ignore_mouse_moves_until_set_cursor_ack_) |
| 423 return; | 481 return; |
| 424 | 482 |
| 425 gfx::Point location(x, y); | 483 gfx::Point location(x, y); |
| 426 ui::MouseEvent event(ui::ET_MOUSE_MOVED, location, location, flags); | 484 ui::MouseEvent event(ui::ET_MOUSE_MOVED, location, location, flags); |
| 427 delegate_->OnHostMouseEvent(&event); | 485 delegate_->OnHostMouseEvent(&event); |
| 428 } | 486 } |
| 429 | 487 |
| 430 void RemoteRootWindowHostWin::OnMouseButton( | 488 void RemoteRootWindowHostWin::OnMouseButton( |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 574 void RemoteRootWindowHostWin::OnWindowSizeChanged(uint32 width, uint32 height) { | 632 void RemoteRootWindowHostWin::OnWindowSizeChanged(uint32 width, uint32 height) { |
| 575 SetBounds(gfx::Rect(0, 0, width, height)); | 633 SetBounds(gfx::Rect(0, 0, width, height)); |
| 576 } | 634 } |
| 577 | 635 |
| 578 void RemoteRootWindowHostWin::OnDesktopActivated() { | 636 void RemoteRootWindowHostWin::OnDesktopActivated() { |
| 579 ActivateDesktopCompleted temp = activate_completed_callback_; | 637 ActivateDesktopCompleted temp = activate_completed_callback_; |
| 580 activate_completed_callback_.Reset(); | 638 activate_completed_callback_.Reset(); |
| 581 temp.Run(); | 639 temp.Run(); |
| 582 } | 640 } |
| 583 | 641 |
| 642 ui::RemoteInputMethodPrivateWin* |
| 643 RemoteRootWindowHostWin::GetRemoteInputMethodPrivate() { |
| 644 ui::InputMethod* input_method = GetAshWindow()->GetProperty( |
| 645 aura::client::kRootWindowInputMethodKey); |
| 646 return ui::RemoteInputMethodPrivateWin::Get(input_method); |
| 647 } |
| 648 |
| 649 void RemoteRootWindowHostWin::OnImeCompositionChanged( |
| 650 const string16& text, |
| 651 int32 selection_start, |
| 652 int32 selection_end, |
| 653 const std::vector<metro_viewer::UnderlineInfo>& underlines) { |
| 654 ui::RemoteInputMethodPrivateWin* remote_input_method_private = |
| 655 GetRemoteInputMethodPrivate(); |
| 656 if (!remote_input_method_private) |
| 657 return; |
| 658 ui::CompositionText composition_text; |
| 659 FillCompositionText( |
| 660 text, selection_start, selection_end, underlines, &composition_text); |
| 661 remote_input_method_private->OnCompositionChanged(composition_text); |
| 662 } |
| 663 |
| 664 void RemoteRootWindowHostWin::OnImeTextCommitted(const string16& text) { |
| 665 ui::RemoteInputMethodPrivateWin* remote_input_method_private = |
| 666 GetRemoteInputMethodPrivate(); |
| 667 if (!remote_input_method_private) |
| 668 return; |
| 669 remote_input_method_private->OnTextCommitted(text); |
| 670 } |
| 671 |
| 584 void RemoteRootWindowHostWin::DispatchKeyboardMessage(ui::EventType type, | 672 void RemoteRootWindowHostWin::DispatchKeyboardMessage(ui::EventType type, |
| 585 uint32 vkey, | 673 uint32 vkey, |
| 586 uint32 repeat_count, | 674 uint32 repeat_count, |
| 587 uint32 scan_code, | 675 uint32 scan_code, |
| 588 uint32 flags, | 676 uint32 flags, |
| 589 bool is_character) { | 677 bool is_character) { |
| 590 SetEventFlags(flags | mouse_event_flags()); | 678 SetEventFlags(flags | mouse_event_flags()); |
| 591 if (base::MessageLoop::current()->IsNested()) { | 679 if (base::MessageLoop::current()->IsNested()) { |
| 592 uint32 message = is_character ? WM_CHAR : | 680 uint32 message = is_character ? WM_CHAR : |
| 593 (type == ui::ET_KEY_PRESSED ? WM_KEYDOWN : WM_KEYUP); | 681 (type == ui::ET_KEY_PRESSED ? WM_KEYDOWN : WM_KEYUP); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 605 } | 693 } |
| 606 | 694 |
| 607 void RemoteRootWindowHostWin::SetEventFlags(uint32 flags) { | 695 void RemoteRootWindowHostWin::SetEventFlags(uint32 flags) { |
| 608 if (flags == event_flags_) | 696 if (flags == event_flags_) |
| 609 return; | 697 return; |
| 610 event_flags_ = flags; | 698 event_flags_ = flags; |
| 611 SetVirtualKeyStates(event_flags_); | 699 SetVirtualKeyStates(event_flags_); |
| 612 } | 700 } |
| 613 | 701 |
| 614 } // namespace aura | 702 } // namespace aura |
| OLD | NEW |