| 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/views/win/hwnd_message_handler.h" | 5 #include "ui/views/win/hwnd_message_handler.h" |
| 6 | 6 |
| 7 #include <dwmapi.h> | 7 #include <dwmapi.h> |
| 8 #include <oleacc.h> | 8 #include <oleacc.h> |
| 9 #include <shellapi.h> | 9 #include <shellapi.h> |
| 10 | 10 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "ui/base/win/touch_input.h" | 25 #include "ui/base/win/touch_input.h" |
| 26 #include "ui/events/event.h" | 26 #include "ui/events/event.h" |
| 27 #include "ui/events/event_utils.h" | 27 #include "ui/events/event_utils.h" |
| 28 #include "ui/events/keycodes/keyboard_code_conversion_win.h" | 28 #include "ui/events/keycodes/keyboard_code_conversion_win.h" |
| 29 #include "ui/gfx/canvas.h" | 29 #include "ui/gfx/canvas.h" |
| 30 #include "ui/gfx/geometry/insets.h" | 30 #include "ui/gfx/geometry/insets.h" |
| 31 #include "ui/gfx/icon_util.h" | 31 #include "ui/gfx/icon_util.h" |
| 32 #include "ui/gfx/path.h" | 32 #include "ui/gfx/path.h" |
| 33 #include "ui/gfx/path_win.h" | 33 #include "ui/gfx/path_win.h" |
| 34 #include "ui/gfx/screen.h" | 34 #include "ui/gfx/screen.h" |
| 35 #include "ui/gfx/win/direct_manipulation.h" |
| 35 #include "ui/gfx/win/dpi.h" | 36 #include "ui/gfx/win/dpi.h" |
| 36 #include "ui/gfx/win/hwnd_util.h" | 37 #include "ui/gfx/win/hwnd_util.h" |
| 37 #include "ui/native_theme/native_theme_win.h" | 38 #include "ui/native_theme/native_theme_win.h" |
| 38 #include "ui/views/views_delegate.h" | 39 #include "ui/views/views_delegate.h" |
| 39 #include "ui/views/widget/monitor_win.h" | 40 #include "ui/views/widget/monitor_win.h" |
| 40 #include "ui/views/widget/widget_hwnd_utils.h" | 41 #include "ui/views/widget/widget_hwnd_utils.h" |
| 41 #include "ui/views/win/fullscreen_handler.h" | 42 #include "ui/views/win/fullscreen_handler.h" |
| 42 #include "ui/views/win/hwnd_message_handler_delegate.h" | 43 #include "ui/views/win/hwnd_message_handler_delegate.h" |
| 43 #include "ui/views/win/scoped_fullscreen_visibility.h" | 44 #include "ui/views/win/scoped_fullscreen_visibility.h" |
| 44 #include "ui/views/win/windows_session_change_observer.h" | 45 #include "ui/views/win/windows_session_change_observer.h" |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 if (!(current_style & WS_POPUP)) { | 366 if (!(current_style & WS_POPUP)) { |
| 366 AddScrollStylesToWindow(hwnd()); | 367 AddScrollStylesToWindow(hwnd()); |
| 367 needs_scroll_styles_ = true; | 368 needs_scroll_styles_ = true; |
| 368 } | 369 } |
| 369 } | 370 } |
| 370 #endif | 371 #endif |
| 371 | 372 |
| 372 prop_window_target_.reset(new ui::ViewProp(hwnd(), | 373 prop_window_target_.reset(new ui::ViewProp(hwnd(), |
| 373 ui::WindowEventTarget::kWin32InputEventTarget, | 374 ui::WindowEventTarget::kWin32InputEventTarget, |
| 374 static_cast<ui::WindowEventTarget*>(this))); | 375 static_cast<ui::WindowEventTarget*>(this))); |
| 376 |
| 377 // Direct Manipulation is enabled on Windows 10+. The CreateInstance function |
| 378 // returns NULL if Direct Manipulation is not available. |
| 379 direct_manipulation_helper_ = |
| 380 gfx::win::DirectManipulationHelper::CreateInstance(); |
| 381 if (direct_manipulation_helper_) |
| 382 direct_manipulation_helper_->Initialize(hwnd()); |
| 375 } | 383 } |
| 376 | 384 |
| 377 void HWNDMessageHandler::InitModalType(ui::ModalType modal_type) { | 385 void HWNDMessageHandler::InitModalType(ui::ModalType modal_type) { |
| 378 if (modal_type == ui::MODAL_TYPE_NONE) | 386 if (modal_type == ui::MODAL_TYPE_NONE) |
| 379 return; | 387 return; |
| 380 // We implement modality by crawling up the hierarchy of windows starting | 388 // We implement modality by crawling up the hierarchy of windows starting |
| 381 // at the owner, disabling all of them so that they don't receive input | 389 // at the owner, disabling all of them so that they don't receive input |
| 382 // messages. | 390 // messages. |
| 383 HWND start = ::GetWindow(hwnd(), GW_OWNER); | 391 HWND start = ::GetWindow(hwnd(), GW_OWNER); |
| 384 while (start) { | 392 while (start) { |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 bounds_in_pixels.width(), bounds_in_pixels.height(), | 514 bounds_in_pixels.width(), bounds_in_pixels.height(), |
| 507 SWP_NOACTIVATE | SWP_NOZORDER); | 515 SWP_NOACTIVATE | SWP_NOZORDER); |
| 508 | 516 |
| 509 // If HWND size is not changed, we will not receive standard size change | 517 // If HWND size is not changed, we will not receive standard size change |
| 510 // notifications. If |force_size_changed| is |true|, we should pretend size is | 518 // notifications. If |force_size_changed| is |true|, we should pretend size is |
| 511 // changed. | 519 // changed. |
| 512 if (old_size == bounds_in_pixels.size() && force_size_changed) { | 520 if (old_size == bounds_in_pixels.size() && force_size_changed) { |
| 513 delegate_->HandleClientSizeChanged(GetClientAreaBounds().size()); | 521 delegate_->HandleClientSizeChanged(GetClientAreaBounds().size()); |
| 514 ResetWindowRegion(false, true); | 522 ResetWindowRegion(false, true); |
| 515 } | 523 } |
| 524 |
| 525 if (direct_manipulation_helper_) |
| 526 direct_manipulation_helper_->SetBounds(bounds_in_pixels); |
| 516 } | 527 } |
| 517 | 528 |
| 518 void HWNDMessageHandler::SetSize(const gfx::Size& size) { | 529 void HWNDMessageHandler::SetSize(const gfx::Size& size) { |
| 519 SetWindowPos(hwnd(), NULL, 0, 0, size.width(), size.height(), | 530 SetWindowPos(hwnd(), NULL, 0, 0, size.width(), size.height(), |
| 520 SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE); | 531 SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE); |
| 521 } | 532 } |
| 522 | 533 |
| 523 void HWNDMessageHandler::CenterWindow(const gfx::Size& size) { | 534 void HWNDMessageHandler::CenterWindow(const gfx::Size& size) { |
| 524 HWND parent = GetParent(hwnd()); | 535 HWND parent = GetParent(hwnd()); |
| 525 if (!IsWindow(hwnd())) | 536 if (!IsWindow(hwnd())) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 547 | 558 |
| 548 void HWNDMessageHandler::Show() { | 559 void HWNDMessageHandler::Show() { |
| 549 if (IsWindow(hwnd())) { | 560 if (IsWindow(hwnd())) { |
| 550 if (!(GetWindowLong(hwnd(), GWL_EXSTYLE) & WS_EX_TRANSPARENT) && | 561 if (!(GetWindowLong(hwnd(), GWL_EXSTYLE) & WS_EX_TRANSPARENT) && |
| 551 !(GetWindowLong(hwnd(), GWL_EXSTYLE) & WS_EX_NOACTIVATE)) { | 562 !(GetWindowLong(hwnd(), GWL_EXSTYLE) & WS_EX_NOACTIVATE)) { |
| 552 ShowWindowWithState(ui::SHOW_STATE_NORMAL); | 563 ShowWindowWithState(ui::SHOW_STATE_NORMAL); |
| 553 } else { | 564 } else { |
| 554 ShowWindowWithState(ui::SHOW_STATE_INACTIVE); | 565 ShowWindowWithState(ui::SHOW_STATE_INACTIVE); |
| 555 } | 566 } |
| 556 } | 567 } |
| 568 if (direct_manipulation_helper_) |
| 569 direct_manipulation_helper_->Activate(hwnd()); |
| 557 } | 570 } |
| 558 | 571 |
| 559 void HWNDMessageHandler::ShowWindowWithState(ui::WindowShowState show_state) { | 572 void HWNDMessageHandler::ShowWindowWithState(ui::WindowShowState show_state) { |
| 560 TRACE_EVENT0("views", "HWNDMessageHandler::ShowWindowWithState"); | 573 TRACE_EVENT0("views", "HWNDMessageHandler::ShowWindowWithState"); |
| 561 DWORD native_show_state; | 574 DWORD native_show_state; |
| 562 switch (show_state) { | 575 switch (show_state) { |
| 563 case ui::SHOW_STATE_INACTIVE: | 576 case ui::SHOW_STATE_INACTIVE: |
| 564 native_show_state = SW_SHOWNOACTIVATE; | 577 native_show_state = SW_SHOWNOACTIVATE; |
| 565 break; | 578 break; |
| 566 case ui::SHOW_STATE_MAXIMIZED: | 579 case ui::SHOW_STATE_MAXIMIZED: |
| (...skipping 2097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2664 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); | 2677 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); |
| 2665 bool handled = delegate_->HandleMouseEvent(event); | 2678 bool handled = delegate_->HandleMouseEvent(event); |
| 2666 | 2679 |
| 2667 // TODO(vadimt): Remove ScopedTracker below once crbug.com/440919 is fixed. | 2680 // TODO(vadimt): Remove ScopedTracker below once crbug.com/440919 is fixed. |
| 2668 tracked_objects::ScopedTracker tracking_profile8( | 2681 tracked_objects::ScopedTracker tracking_profile8( |
| 2669 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 2682 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 2670 "440919 HWNDMessageHandler::HandleMouseEventInternal8")); | 2683 "440919 HWNDMessageHandler::HandleMouseEventInternal8")); |
| 2671 | 2684 |
| 2672 if (!ref.get()) | 2685 if (!ref.get()) |
| 2673 return 0; | 2686 return 0; |
| 2687 |
| 2688 if (direct_manipulation_helper_ && track_mouse && |
| 2689 (message == WM_MOUSEWHEEL || message == WM_MOUSEHWHEEL)) { |
| 2690 direct_manipulation_helper_->HandleMouseWheel(hwnd(), message, w_param, |
| 2691 l_param); |
| 2692 } |
| 2693 |
| 2674 if (!handled && message == WM_NCLBUTTONDOWN && w_param != HTSYSMENU && | 2694 if (!handled && message == WM_NCLBUTTONDOWN && w_param != HTSYSMENU && |
| 2675 delegate_->IsUsingCustomFrame()) { | 2695 delegate_->IsUsingCustomFrame()) { |
| 2676 // TODO(vadimt): Remove ScopedTracker below once crbug.com/440919 is fixed. | 2696 // TODO(vadimt): Remove ScopedTracker below once crbug.com/440919 is fixed. |
| 2677 tracked_objects::ScopedTracker tracking_profile9( | 2697 tracked_objects::ScopedTracker tracking_profile9( |
| 2678 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 2698 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 2679 "440919 HWNDMessageHandler::HandleMouseEventInternal9")); | 2699 "440919 HWNDMessageHandler::HandleMouseEventInternal9")); |
| 2680 | 2700 |
| 2681 // TODO(msw): Eliminate undesired painting, or re-evaluate this workaround. | 2701 // TODO(msw): Eliminate undesired painting, or re-evaluate this workaround. |
| 2682 // DefWindowProc for WM_NCLBUTTONDOWN does weird non-client painting, so we | 2702 // DefWindowProc for WM_NCLBUTTONDOWN does weird non-client painting, so we |
| 2683 // need to call it inside a ScopedRedrawLock. This may cause other negative | 2703 // need to call it inside a ScopedRedrawLock. This may cause other negative |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2740 SetWindowPos(hwnd(), NULL, 0, 0, 0, 0, flags | SWP_HIDEWINDOW); | 2760 SetWindowPos(hwnd(), NULL, 0, 0, 0, 0, flags | SWP_HIDEWINDOW); |
| 2741 SetWindowPos(hwnd(), NULL, 0, 0, 0, 0, flags | SWP_SHOWWINDOW); | 2761 SetWindowPos(hwnd(), NULL, 0, 0, 0, 0, flags | SWP_SHOWWINDOW); |
| 2742 } | 2762 } |
| 2743 // WM_DWMCOMPOSITIONCHANGED is only sent to top level windows, however we want | 2763 // WM_DWMCOMPOSITIONCHANGED is only sent to top level windows, however we want |
| 2744 // to notify our children too, since we can have MDI child windows who need to | 2764 // to notify our children too, since we can have MDI child windows who need to |
| 2745 // update their appearance. | 2765 // update their appearance. |
| 2746 EnumChildWindows(hwnd(), &SendDwmCompositionChanged, NULL); | 2766 EnumChildWindows(hwnd(), &SendDwmCompositionChanged, NULL); |
| 2747 } | 2767 } |
| 2748 | 2768 |
| 2749 } // namespace views | 2769 } // namespace views |
| OLD | NEW |