| 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 #include <tchar.h> | 10 #include <tchar.h> |
| 11 | 11 |
| 12 #include <utility> | 12 #include <utility> |
| 13 | 13 |
| 14 #include "base/bind.h" | 14 #include "base/bind.h" |
| 15 #include "base/bind_helpers.h" | 15 #include "base/bind_helpers.h" |
| 16 #include "base/debug/alias.h" | 16 #include "base/debug/alias.h" |
| 17 #include "base/location.h" | 17 #include "base/location.h" |
| 18 #include "base/macros.h" | 18 #include "base/macros.h" |
| 19 #include "base/message_loop/message_loop.h" | 19 #include "base/message_loop/message_loop.h" |
| 20 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
| 21 #include "base/threading/thread_task_runner_handle.h" | 21 #include "base/threading/thread_task_runner_handle.h" |
| 22 #include "base/time/time.h" | 22 #include "base/time/time.h" |
| 23 #include "base/trace_event/trace_event.h" | 23 #include "base/trace_event/trace_event.h" |
| 24 #include "base/win/scoped_comptr.h" | |
| 25 #include "base/win/scoped_gdi_object.h" | 24 #include "base/win/scoped_gdi_object.h" |
| 26 #include "base/win/windows_version.h" | 25 #include "base/win/windows_version.h" |
| 27 #include "ui/accessibility/platform/ax_platform_node_win.h" | |
| 28 #include "ui/accessibility/platform/ax_system_caret_win.h" | |
| 29 #include "ui/base/ime/input_method.h" | |
| 30 #include "ui/base/ime/text_input_client.h" | |
| 31 #include "ui/base/ime/text_input_type.h" | |
| 32 #include "ui/base/view_prop.h" | 26 #include "ui/base/view_prop.h" |
| 33 #include "ui/base/win/internal_constants.h" | 27 #include "ui/base/win/internal_constants.h" |
| 34 #include "ui/base/win/lock_state.h" | 28 #include "ui/base/win/lock_state.h" |
| 35 #include "ui/base/win/mouse_wheel_util.h" | 29 #include "ui/base/win/mouse_wheel_util.h" |
| 36 #include "ui/base/win/shell.h" | 30 #include "ui/base/win/shell.h" |
| 37 #include "ui/base/win/touch_input.h" | 31 #include "ui/base/win/touch_input.h" |
| 38 #include "ui/display/win/dpi.h" | 32 #include "ui/display/win/dpi.h" |
| 39 #include "ui/display/win/screen_win.h" | 33 #include "ui/display/win/screen_win.h" |
| 40 #include "ui/events/event.h" | 34 #include "ui/events/event.h" |
| 41 #include "ui/events/event_constants.h" | 35 #include "ui/events/event_constants.h" |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 touch_down_contexts_(0), | 355 touch_down_contexts_(0), |
| 362 last_mouse_hwheel_time_(0), | 356 last_mouse_hwheel_time_(0), |
| 363 dwm_transition_desired_(false), | 357 dwm_transition_desired_(false), |
| 364 sent_window_size_changing_(false), | 358 sent_window_size_changing_(false), |
| 365 left_button_down_on_caption_(false), | 359 left_button_down_on_caption_(false), |
| 366 background_fullscreen_hack_(false), | 360 background_fullscreen_hack_(false), |
| 367 autohide_factory_(this), | 361 autohide_factory_(this), |
| 368 weak_factory_(this) {} | 362 weak_factory_(this) {} |
| 369 | 363 |
| 370 HWNDMessageHandler::~HWNDMessageHandler() { | 364 HWNDMessageHandler::~HWNDMessageHandler() { |
| 371 DCHECK(delegate_->GetHWNDMessageDelegateInputMethod()); | |
| 372 delegate_->GetHWNDMessageDelegateInputMethod()->RemoveObserver(this); | |
| 373 delegate_ = NULL; | 365 delegate_ = NULL; |
| 374 // Prevent calls back into this class via WNDPROC now that we've been | 366 // Prevent calls back into this class via WNDPROC now that we've been |
| 375 // destroyed. | 367 // destroyed. |
| 376 ClearUserData(); | 368 ClearUserData(); |
| 377 } | 369 } |
| 378 | 370 |
| 379 void HWNDMessageHandler::Init(HWND parent, const gfx::Rect& bounds) { | 371 void HWNDMessageHandler::Init(HWND parent, const gfx::Rect& bounds) { |
| 380 TRACE_EVENT0("views", "HWNDMessageHandler::Init"); | 372 TRACE_EVENT0("views", "HWNDMessageHandler::Init"); |
| 381 GetMonitorAndRects(bounds.ToRECT(), &last_monitor_, &last_monitor_rect_, | 373 GetMonitorAndRects(bounds.ToRECT(), &last_monitor_, &last_monitor_rect_, |
| 382 &last_work_area_); | 374 &last_work_area_); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 396 GetProcAddress(GetModuleHandle(L"user32.dll"), | 388 GetProcAddress(GetModuleHandle(L"user32.dll"), |
| 397 "EnableChildWindowDpiMessage")); | 389 "EnableChildWindowDpiMessage")); |
| 398 }(); | 390 }(); |
| 399 if (enable_child_window_dpi_message_func) | 391 if (enable_child_window_dpi_message_func) |
| 400 enable_child_window_dpi_message_func(hwnd(), TRUE); | 392 enable_child_window_dpi_message_func(hwnd(), TRUE); |
| 401 } | 393 } |
| 402 | 394 |
| 403 prop_window_target_.reset(new ui::ViewProp(hwnd(), | 395 prop_window_target_.reset(new ui::ViewProp(hwnd(), |
| 404 ui::WindowEventTarget::kWin32InputEventTarget, | 396 ui::WindowEventTarget::kWin32InputEventTarget, |
| 405 static_cast<ui::WindowEventTarget*>(this))); | 397 static_cast<ui::WindowEventTarget*>(this))); |
| 406 DCHECK(delegate_->GetHWNDMessageDelegateInputMethod()); | |
| 407 delegate_->GetHWNDMessageDelegateInputMethod()->AddObserver(this); | |
| 408 | 398 |
| 409 // Direct Manipulation is enabled on Windows 10+. The CreateInstance function | 399 // Direct Manipulation is enabled on Windows 10+. The CreateInstance function |
| 410 // returns NULL if Direct Manipulation is not available. | 400 // returns NULL if Direct Manipulation is not available. |
| 411 direct_manipulation_helper_ = | 401 direct_manipulation_helper_ = |
| 412 gfx::win::DirectManipulationHelper::CreateInstance(); | 402 gfx::win::DirectManipulationHelper::CreateInstance(); |
| 413 if (direct_manipulation_helper_) | 403 if (direct_manipulation_helper_) |
| 414 direct_manipulation_helper_->Initialize(hwnd()); | 404 direct_manipulation_helper_->Initialize(hwnd()); |
| 415 | 405 |
| 416 // Disable pen flicks (http://crbug.com/506977) | 406 // Disable pen flicks (http://crbug.com/506977) |
| 417 base::win::DisableFlicks(hwnd()); | 407 base::win::DisableFlicks(hwnd()); |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 952 delegate_->HandleDestroyed(); | 942 delegate_->HandleDestroyed(); |
| 953 } | 943 } |
| 954 } | 944 } |
| 955 | 945 |
| 956 if (message == WM_ACTIVATE && IsTopLevelWindow(window)) | 946 if (message == WM_ACTIVATE && IsTopLevelWindow(window)) |
| 957 PostProcessActivateMessage(LOWORD(w_param), !!HIWORD(w_param), | 947 PostProcessActivateMessage(LOWORD(w_param), !!HIWORD(w_param), |
| 958 reinterpret_cast<HWND>(l_param)); | 948 reinterpret_cast<HWND>(l_param)); |
| 959 return result; | 949 return result; |
| 960 } | 950 } |
| 961 | 951 |
| 962 void HWNDMessageHandler::OnTextInputTypeChanged( | |
| 963 const ui::TextInputClient* client) { | |
| 964 if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) { | |
| 965 DestroyAXSystemCaret(); | |
| 966 return; | |
| 967 } | |
| 968 | |
| 969 OnCaretBoundsChanged(client); | |
| 970 } | |
| 971 | |
| 972 void HWNDMessageHandler::OnFocus() {} | |
| 973 | |
| 974 void HWNDMessageHandler::OnBlur() {} | |
| 975 | |
| 976 void HWNDMessageHandler::OnCaretBoundsChanged( | |
| 977 const ui::TextInputClient* client) { | |
| 978 if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) | |
| 979 return; | |
| 980 | |
| 981 if (!ax_system_caret_) | |
| 982 ax_system_caret_ = std::make_unique<ui::AXSystemCaretWin>(hwnd()); | |
| 983 | |
| 984 const gfx::Rect dip_caret_bounds(client->GetCaretBounds()); | |
| 985 gfx::Rect caret_bounds = | |
| 986 display::win::ScreenWin::DIPToScreenRect(hwnd(), dip_caret_bounds); | |
| 987 // Collapse any selection. | |
| 988 caret_bounds.set_width(1); | |
| 989 ax_system_caret_->MoveCaretTo(caret_bounds); | |
| 990 } | |
| 991 | |
| 992 void HWNDMessageHandler::OnTextInputStateChanged( | |
| 993 const ui::TextInputClient* client) {} | |
| 994 | |
| 995 void HWNDMessageHandler::OnInputMethodDestroyed( | |
| 996 const ui::InputMethod* input_method) { | |
| 997 DestroyAXSystemCaret(); | |
| 998 } | |
| 999 | |
| 1000 void HWNDMessageHandler::OnShowImeIfNeeded() {} | |
| 1001 | |
| 1002 LRESULT HWNDMessageHandler::HandleMouseMessage(unsigned int message, | 952 LRESULT HWNDMessageHandler::HandleMouseMessage(unsigned int message, |
| 1003 WPARAM w_param, | 953 WPARAM w_param, |
| 1004 LPARAM l_param, | 954 LPARAM l_param, |
| 1005 bool* handled) { | 955 bool* handled) { |
| 1006 // Don't track forwarded mouse messages. We expect the caller to track the | 956 // Don't track forwarded mouse messages. We expect the caller to track the |
| 1007 // mouse. | 957 // mouse. |
| 1008 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); | 958 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); |
| 1009 LRESULT ret = HandleMouseEventInternal(message, w_param, l_param, false); | 959 LRESULT ret = HandleMouseEventInternal(message, w_param, l_param, false); |
| 1010 *handled = IsMsgHandled(); | 960 *handled = IsMsgHandled(); |
| 1011 return ret; | 961 return ret; |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1576 | 1526 |
| 1577 // Only the lower 32 bits of l_param are valid when checking the object id | 1527 // Only the lower 32 bits of l_param are valid when checking the object id |
| 1578 // because it sometimes gets sign-extended incorrectly (but not always). | 1528 // because it sometimes gets sign-extended incorrectly (but not always). |
| 1579 DWORD obj_id = static_cast<DWORD>(static_cast<DWORD_PTR>(l_param)); | 1529 DWORD obj_id = static_cast<DWORD>(static_cast<DWORD_PTR>(l_param)); |
| 1580 | 1530 |
| 1581 // Accessibility readers will send an OBJID_CLIENT message | 1531 // Accessibility readers will send an OBJID_CLIENT message |
| 1582 if (static_cast<DWORD>(OBJID_CLIENT) == obj_id) { | 1532 if (static_cast<DWORD>(OBJID_CLIENT) == obj_id) { |
| 1583 // Retrieve MSAA dispatch object for the root view. | 1533 // Retrieve MSAA dispatch object for the root view. |
| 1584 base::win::ScopedComPtr<IAccessible> root( | 1534 base::win::ScopedComPtr<IAccessible> root( |
| 1585 delegate_->GetNativeViewAccessible()); | 1535 delegate_->GetNativeViewAccessible()); |
| 1536 |
| 1537 // Create a reference that MSAA will marshall to the client. |
| 1586 reference_result = LresultFromObject(IID_IAccessible, w_param, | 1538 reference_result = LresultFromObject(IID_IAccessible, w_param, |
| 1587 static_cast<IAccessible*>(root.Detach())); | 1539 static_cast<IAccessible*>(root.Detach())); |
| 1588 } else if (::GetFocus() == hwnd() && ax_system_caret_ && | |
| 1589 static_cast<DWORD>(OBJID_CARET) == obj_id) { | |
| 1590 base::win::ScopedComPtr<IAccessible> ax_system_caret_accessible = | |
| 1591 ax_system_caret_->GetCaret(); | |
| 1592 reference_result = LresultFromObject(IID_IAccessible, w_param, | |
| 1593 ax_system_caret_accessible.Detach()); | |
| 1594 } | 1540 } |
| 1595 | 1541 |
| 1596 return reference_result; | 1542 return reference_result; |
| 1597 } | 1543 } |
| 1598 | 1544 |
| 1599 LRESULT HWNDMessageHandler::OnImeMessages(UINT message, | 1545 LRESULT HWNDMessageHandler::OnImeMessages(UINT message, |
| 1600 WPARAM w_param, | 1546 WPARAM w_param, |
| 1601 LPARAM l_param) { | 1547 LPARAM l_param) { |
| 1602 LRESULT result = 0; | 1548 LRESULT result = 0; |
| 1603 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); | 1549 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); |
| (...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2227 // Ignore size/move/maximize in fullscreen mode. | 2173 // Ignore size/move/maximize in fullscreen mode. |
| 2228 if (IsFullscreen() && (((notification_code & sc_mask) == SC_SIZE) || | 2174 if (IsFullscreen() && (((notification_code & sc_mask) == SC_SIZE) || |
| 2229 ((notification_code & sc_mask) == SC_MOVE) || | 2175 ((notification_code & sc_mask) == SC_MOVE) || |
| 2230 ((notification_code & sc_mask) == SC_MAXIMIZE))) | 2176 ((notification_code & sc_mask) == SC_MAXIMIZE))) |
| 2231 return; | 2177 return; |
| 2232 if (delegate_->GetFrameMode() == FrameMode::CUSTOM_DRAWN) { | 2178 if (delegate_->GetFrameMode() == FrameMode::CUSTOM_DRAWN) { |
| 2233 if ((notification_code & sc_mask) == SC_MINIMIZE || | 2179 if ((notification_code & sc_mask) == SC_MINIMIZE || |
| 2234 (notification_code & sc_mask) == SC_MAXIMIZE || | 2180 (notification_code & sc_mask) == SC_MAXIMIZE || |
| 2235 (notification_code & sc_mask) == SC_RESTORE) { | 2181 (notification_code & sc_mask) == SC_RESTORE) { |
| 2236 delegate_->ResetWindowControls(); | 2182 delegate_->ResetWindowControls(); |
| 2237 DestroyAXSystemCaret(); | |
| 2238 } else if ((notification_code & sc_mask) == SC_MOVE || | 2183 } else if ((notification_code & sc_mask) == SC_MOVE || |
| 2239 (notification_code & sc_mask) == SC_SIZE) { | 2184 (notification_code & sc_mask) == SC_SIZE) { |
| 2240 if (!IsVisible()) { | 2185 if (!IsVisible()) { |
| 2241 // Circumvent ScopedRedrawLocks and force visibility before entering a | 2186 // Circumvent ScopedRedrawLocks and force visibility before entering a |
| 2242 // resize or move modal loop to get continuous sizing/moving feedback. | 2187 // resize or move modal loop to get continuous sizing/moving feedback. |
| 2243 SetWindowLong(hwnd(), GWL_STYLE, | 2188 SetWindowLong(hwnd(), GWL_STYLE, |
| 2244 GetWindowLong(hwnd(), GWL_STYLE) | WS_VISIBLE); | 2189 GetWindowLong(hwnd(), GWL_STYLE) | WS_VISIBLE); |
| 2245 } | 2190 } |
| 2246 DestroyAXSystemCaret(); | |
| 2247 } | 2191 } |
| 2248 } | 2192 } |
| 2249 | 2193 |
| 2250 // Handle SC_KEYMENU, which means that the user has pressed the ALT | 2194 // Handle SC_KEYMENU, which means that the user has pressed the ALT |
| 2251 // key and released it, so we should focus the menu bar. | 2195 // key and released it, so we should focus the menu bar. |
| 2252 if ((notification_code & sc_mask) == SC_KEYMENU && point.x() == 0) { | 2196 if ((notification_code & sc_mask) == SC_KEYMENU && point.x() == 0) { |
| 2253 int modifiers = ui::EF_NONE; | 2197 int modifiers = ui::EF_NONE; |
| 2254 if (ui::win::IsShiftPressed()) | 2198 if (ui::win::IsShiftPressed()) |
| 2255 modifiers |= ui::EF_SHIFT_DOWN; | 2199 modifiers |= ui::EF_SHIFT_DOWN; |
| 2256 if (ui::win::IsCtrlPressed()) | 2200 if (ui::win::IsCtrlPressed()) |
| (...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3051 // not treat this like a fullscreen window. | 2995 // not treat this like a fullscreen window. |
| 3052 MONITORINFO monitor_info = {sizeof(monitor_info)}; | 2996 MONITORINFO monitor_info = {sizeof(monitor_info)}; |
| 3053 GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY), | 2997 GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY), |
| 3054 &monitor_info); | 2998 &monitor_info); |
| 3055 gfx::Rect shrunk_rect(monitor_info.rcMonitor); | 2999 gfx::Rect shrunk_rect(monitor_info.rcMonitor); |
| 3056 shrunk_rect.set_height(shrunk_rect.height() - 1); | 3000 shrunk_rect.set_height(shrunk_rect.height() - 1); |
| 3057 background_fullscreen_hack_ = true; | 3001 background_fullscreen_hack_ = true; |
| 3058 SetBoundsInternal(shrunk_rect, false); | 3002 SetBoundsInternal(shrunk_rect, false); |
| 3059 } | 3003 } |
| 3060 | 3004 |
| 3061 void HWNDMessageHandler::DestroyAXSystemCaret() { | |
| 3062 ax_system_caret_ = nullptr; | |
| 3063 } | |
| 3064 | |
| 3065 } // namespace views | 3005 } // namespace views |
| OLD | NEW |