Chromium Code Reviews| Index: ui/views/win/hwnd_message_handler.cc |
| diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc |
| index 83ace04055ca90111db512fd9be52da95f213907..4984233e65c75a14e2c81ac2336c8f6cae75ec3e 100644 |
| --- a/ui/views/win/hwnd_message_handler.cc |
| +++ b/ui/views/win/hwnd_message_handler.cc |
| @@ -18,7 +18,6 @@ |
| #include "base/macros.h" |
| #include "base/single_thread_task_runner.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| -#include "base/time/time.h" |
| #include "base/trace_event/trace_event.h" |
| #include "base/win/scoped_gdi_object.h" |
| #include "base/win/windows_version.h" |
| @@ -31,6 +30,7 @@ |
| #include "ui/display/win/dpi.h" |
| #include "ui/display/win/screen_win.h" |
| #include "ui/events/event.h" |
| +#include "ui/events/event_constants.h" |
| #include "ui/events/event_utils.h" |
| #include "ui/events/keycodes/keyboard_code_conversion_win.h" |
| #include "ui/events/win/system_event_state_lookup.h" |
| @@ -346,6 +346,7 @@ HWNDMessageHandler::HWNDMessageHandler(HWNDMessageHandlerDelegate* delegate) |
| sent_window_size_changing_(false), |
| left_button_down_on_caption_(false), |
| background_fullscreen_hack_(false), |
| + is_pointer_in_range_(false), |
| autohide_factory_(this), |
| weak_factory_(this) {} |
| @@ -942,6 +943,9 @@ LRESULT HWNDMessageHandler::HandleMouseMessage(unsigned int message, |
| WPARAM w_param, |
| LPARAM l_param, |
| bool* handled) { |
| + if (is_pointer_in_range_) |
|
ananta
2017/03/09 00:37:33
Does not appear to be set anywhere.
lanwei
2017/03/09 21:05:05
It is not useful now, I deleted it.
|
| + return 0; |
| + |
| // Don't track forwarded mouse messages. We expect the caller to track the |
| // mouse. |
| base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); |
| @@ -974,6 +978,16 @@ LRESULT HWNDMessageHandler::HandleTouchMessage(unsigned int message, |
| return ret; |
| } |
| +LRESULT HWNDMessageHandler::HandlePointerMessage(unsigned int message, |
| + WPARAM w_param, |
| + LPARAM l_param, |
| + bool* handled) { |
| + base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); |
| + LRESULT ret = OnPointerEvent(message, w_param, l_param); |
| + *handled = IsMsgHandled(); |
| + return ret; |
| +} |
| + |
| LRESULT HWNDMessageHandler::HandleScrollMessage(unsigned int message, |
| WPARAM w_param, |
| LPARAM l_param, |
| @@ -1642,6 +1656,85 @@ LRESULT HWNDMessageHandler::OnPointerActivate(UINT message, |
| return -1; |
| } |
| +LRESULT HWNDMessageHandler::OnPointerEvent(UINT message, |
| + WPARAM w_param, |
| + LPARAM l_param) { |
| + UINT32 pointer_id = GET_POINTERID_WPARAM(w_param); |
| + using GetPointerTypeFn = BOOL(WINAPI*)(UINT32, POINTER_INPUT_TYPE*); |
| + |
| + POINTER_INPUT_TYPE pointer_type; |
| + static GetPointerTypeFn get_pointer_type = reinterpret_cast<GetPointerTypeFn>( |
| + GetProcAddress(GetModuleHandleA("user32.dll"), "GetPointerType")); |
| + if (get_pointer_type && get_pointer_type(pointer_id, &pointer_type)) { |
|
ananta
2017/03/09 00:37:33
If we are getting a WM_POINTER*** message then we
lanwei
2017/03/09 21:05:05
You are right, but the other places calling the Ge
|
| + if (pointer_type != PT_PEN) { |
| + SetMsgHandled(FALSE); |
| + return 0; |
| + } |
| + |
| + using GetPointerPenInfoFn = BOOL(WINAPI*)(UINT32, POINTER_PEN_INFO*); |
| + using GetPointerInfoFn = BOOL(WINAPI*)(UINT32, POINTER_INFO*); |
| + |
| + POINTER_INFO pointer_info; |
| + static GetPointerInfoFn get_pointer_info = |
| + reinterpret_cast<GetPointerInfoFn>( |
| + GetProcAddress(GetModuleHandleA("user32.dll"), "GetPointerInfo")); |
| + |
| + POINTER_PEN_INFO pointer_pen_info; |
| + static GetPointerPenInfoFn get_pointer_pen_info = |
| + reinterpret_cast<GetPointerPenInfoFn>(GetProcAddress( |
| + GetModuleHandleA("user32.dll"), "GetPointerPenInfo")); |
| + if (get_pointer_pen_info && |
| + GetPointerPenInfo(pointer_id, &pointer_pen_info)) { |
| + float pressure = (float)pointer_pen_info.pressure / 1024; |
| + float rotation = pointer_pen_info.rotation; |
| + int tiltX = pointer_pen_info.tiltX; |
| + int tiltY = pointer_pen_info.tiltY; |
| + gfx::Point point; |
| + if (get_pointer_info && get_pointer_info(pointer_id, &pointer_info)) { |
| + POINT client_point = pointer_info.ptPixelLocation; |
| + ScreenToClient(hwnd(), &client_point); |
| + point = gfx::Point(client_point.x, client_point.y); |
| + } |
| + ui::EventType event_type = ui::ET_MOUSE_MOVED; |
|
ananta
2017/03/09 00:37:33
Please add some comments here. The code below is c
lanwei
2017/03/09 21:05:05
Yes. Touch and mouse work as before, and we are re
|
| + int flag = 0; |
| + switch (message) { |
| + case WM_POINTERDOWN: |
| + event_type = ui::ET_MOUSE_PRESSED; |
| + flag = ui::EF_LEFT_MOUSE_BUTTON; |
| + break; |
| + case WM_POINTERUP: |
| + event_type = ui::ET_MOUSE_RELEASED; |
| + flag = ui::EF_LEFT_MOUSE_BUTTON; |
| + break; |
| + case WM_POINTERUPDATE: |
| + event_type = ui::ET_MOUSE_MOVED; |
| + break; |
| + case WM_POINTERLEAVE: |
| + event_type = ui::ET_MOUSE_EXITED; |
| + break; |
| + default: |
| + break; |
| + } |
| + ui::MouseEvent event(event_type, point, point, base::TimeTicks::Now(), 0, |
| + 0); |
| + event.set_flags(flag); |
| + ui::PointerDetails pointer_details(ui::EventPointerType::POINTER_TYPE_PEN, |
| + 0.0f, 0.0f, pressure, tiltX, tiltY, |
| + 0.0f, rotation, pointer_id); |
| + event.set_pointer_details(pointer_details); |
| + |
| + // There are cases where the code handling the message destroys the |
| + // window, so use the weak ptr to check if destruction occured or not. |
| + base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); |
| + bool handled = delegate_->HandleMouseEvent(event); |
| + |
| + if (ref.get()) |
| + SetMsgHandled(handled); |
| + } |
| + } |
| + return 0; |
| +} |
| + |
| void HWNDMessageHandler::OnMove(const gfx::Point& point) { |
| delegate_->HandleMove(); |
| SetMsgHandled(FALSE); |
| @@ -2168,13 +2261,6 @@ void HWNDMessageHandler::OnThemeChanged() { |
| ui::NativeThemeWin::CloseHandles(); |
| } |
| -void HWNDMessageHandler::OnTimeChange() { |
| - // Call NowFromSystemTime() to force base::Time to re-initialize the clock |
| - // from system time. Otherwise base::Time::Now() might continue to reflect the |
| - // old system clock for some amount of time. See https://crbug.com/672906#c5 |
| - base::Time::NowFromSystemTime(); |
| -} |
| - |
| LRESULT HWNDMessageHandler::OnTouchEvent(UINT message, |
| WPARAM w_param, |
| LPARAM l_param) { |