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