Chromium Code Reviews| Index: views/widget/widget_win.cc |
| diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc |
| index f50dfbc27664a02d1afa0ca81d7e363a31e8e720..74b8b4afc490a55e43191453e38e3424e58492cf 100644 |
| --- a/views/widget/widget_win.cc |
| +++ b/views/widget/widget_win.cc |
| @@ -139,8 +139,6 @@ WidgetWin::WidgetWin() |
| ALLOW_THIS_IN_INITIALIZER_LIST(paint_layered_window_factory_(this)), |
| delete_on_destroy_(true), |
| can_update_layered_window_(true), |
| - last_mouse_event_was_move_(false), |
| - is_mouse_down_(false), |
| is_window_(false), |
| restore_focus_when_enabled_(false), |
| accessibility_view_events_index_(-1), |
| @@ -322,19 +320,23 @@ bool WidgetWin::IsScreenReaderActive() const { |
| return screen_reader_active_; |
| } |
| -void WidgetWin::SetNativeCapture() { |
| - DCHECK(!HasNativeCapture()); |
| +void WidgetWin::SetMouseCapture() { |
| + DCHECK(!HasMouseCapture()); |
| SetCapture(hwnd()); |
| } |
| -void WidgetWin::ReleaseNativeCapture() { |
| +void WidgetWin::ReleaseMouseCapture() { |
| ReleaseCapture(); |
| } |
| -bool WidgetWin::HasNativeCapture() const { |
| +bool WidgetWin::HasMouseCapture() const { |
| return GetCapture() == hwnd(); |
| } |
| +bool WidgetWin::ShouldReleaseCaptureOnMouseReleased() const { |
| + return true; |
| +} |
| + |
| gfx::Rect WidgetWin::GetWindowScreenBounds() const { |
| RECT r; |
| GetWindowRect(&r); |
| @@ -566,9 +568,7 @@ void WidgetWin::OnCancelMode() { |
| } |
| void WidgetWin::OnCaptureChanged(HWND hwnd) { |
| - if (is_mouse_down_) |
| - GetRootView()->OnMouseCaptureLost(); |
| - is_mouse_down_ = false; |
| + ProcessMouseCaptureLost(); |
| } |
| void WidgetWin::OnClose() { |
| @@ -750,32 +750,53 @@ LRESULT WidgetWin::OnMouseActivate(UINT message, |
| } |
| LRESULT WidgetWin::OnMouseLeave(UINT message, WPARAM w_param, LPARAM l_param) { |
| - tooltip_manager_->OnMouseLeave(); |
| - ProcessMouseExited(message, w_param, l_param); |
| + if (message != WM_NCMOUSELEAVE) |
| + tooltip_manager_->OnMouseLeave(); |
| + |
| + MSG msg; |
| + MakeMSG(&msg, message, w_param, l_param, 0, GET_X_LPARAM(l_param), |
| + GET_Y_LPARAM(l_param)); |
| + last_mouse_event_was_move_ = false; |
| + GetRootView()->OnMouseExited(MouseEvent(msg)); |
| + // Reset our tracking flag so that future mouse movement over this WidgetWin |
| + // results in a new tracking session. |
| + active_mouse_tracking_flags_ = 0; |
| return 0; |
| } |
| LRESULT WidgetWin::OnMouseMove(UINT message, WPARAM w_param, LPARAM l_param) { |
| - ProcessMouseMoved(message, w_param, l_param); |
| + if (message == WM_NCMOUSEMOVE) |
| + tooltip_manager_->OnMouse(message, w_param, l_param); |
| + |
| + // Windows only fires WM_MOUSELEAVE events if the application begins |
| + // "tracking" mouse events for a given HWND during WM_MOUSEMOVE events. |
| + // We need to call |TrackMouseEvents| to listen for WM_MOUSELEAVE. |
| + if (!HasMouseCapture()) |
| + TrackMouseEvents((message == WM_NCMOUSEMOVE) ? |
| + TME_NONCLIENT | TME_LEAVE : TME_LEAVE); |
| + MSG msg; |
| + MakeMSG(&msg, message, w_param, l_param, 0, GET_X_LPARAM(l_param), |
| + GET_Y_LPARAM(l_param)); |
| + ProcessMouseMoved(MouseEvent(msg)); |
| return 0; |
| } |
| LRESULT WidgetWin::OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param) { |
| - tooltip_manager_->OnMouse(message, w_param, l_param); |
| + MSG msg; |
| + MakeMSG(&msg, message, w_param, l_param, 0, GET_X_LPARAM(l_param), |
| + GET_Y_LPARAM(l_param)); |
| + MouseEvent event(msg); |
| - switch (message) { |
| - case WM_LBUTTONDBLCLK: |
| - case WM_LBUTTONDOWN: |
| - case WM_MBUTTONDBLCLK: |
| - case WM_MBUTTONDOWN: |
| - case WM_RBUTTONDBLCLK: |
| - case WM_RBUTTONDOWN: |
| - SetMsgHandled(ProcessMousePressed(message, w_param, l_param)); |
| + if (!(event.flags() & ui::EF_IS_NON_CLIENT)) |
| + tooltip_manager_->OnMouse(message, w_param, l_param); |
| + |
| + switch (event.type()) { |
| + case ui::ET_MOUSE_PRESSED: |
| + SetMsgHandled(ProcessMousePressed(event)); |
| break; |
| - case WM_LBUTTONUP: |
| - case WM_MBUTTONUP: |
| - case WM_RBUTTONUP: |
| - SetMsgHandled(ProcessMouseReleased(message, w_param, l_param)); |
| + case ui::ET_MOUSE_RELEASED: |
| + SetMsgHandled((event.flags() & ui::EF_IS_NON_CLIENT) ? FALSE : |
| + ProcessMouseReleased(event)); |
|
Ben Goodger (Google)
2011/03/30 23:22:55
This is fine for now. I want you to eventually con
msw
2011/03/31 14:01:18
Done; I did some of this work now.
|
| break; |
| default: |
| SetMsgHandled(FALSE); |
| @@ -824,45 +845,6 @@ LRESULT WidgetWin::OnNCHitTest(const CPoint& pt) { |
| return 0; |
| } |
| -LRESULT WidgetWin::OnNCMouseLeave(UINT message, |
| - WPARAM w_param, |
| - LPARAM l_param) { |
| - ProcessMouseExited(message, w_param, l_param); |
| - return 0; |
| -} |
| - |
| -LRESULT WidgetWin::OnNCMouseMove(UINT message, WPARAM w_param, LPARAM l_param) { |
| - tooltip_manager_->OnMouse(message, w_param, l_param); |
| - ProcessMouseMoved(message, w_param, l_param); |
| - |
| - // We need to process this message to stop Windows from drawing the window |
| - // controls as the mouse moves over the title bar area when the window is |
| - // maximized. |
| - return 0; |
| -} |
| - |
| -LRESULT WidgetWin::OnNCMouseRange(UINT message, |
| - WPARAM w_param, |
| - LPARAM l_param) { |
| - switch (message) { |
| - case WM_NCLBUTTONDBLCLK: |
| - case WM_NCLBUTTONDOWN: |
| - case WM_NCMBUTTONDBLCLK: |
| - case WM_NCMBUTTONDOWN: |
| - case WM_NCRBUTTONDBLCLK: |
| - case WM_NCRBUTTONDOWN: |
| - SetMsgHandled(ProcessMousePressed(message, w_param, l_param)); |
| - break; |
| - case WM_NCLBUTTONUP: |
| - case WM_NCMBUTTONUP: |
| - case WM_NCRBUTTONUP: |
| - default: |
| - SetMsgHandled(FALSE); |
| - } |
| - |
| - return 0; |
| -} |
| - |
| void WidgetWin::OnNCPaint(HRGN rgn) { |
| SetMsgHandled(FALSE); |
| } |
| @@ -993,87 +975,10 @@ void WidgetWin::TrackMouseEvents(DWORD mouse_tracking_flags) { |
| } |
| } |
| -bool WidgetWin::ProcessMousePressed(UINT message, |
| - WPARAM w_param, |
| - LPARAM l_param) { |
| - last_mouse_event_was_move_ = false; |
| - |
| - MSG msg; |
| - MakeMSG(&msg, message, w_param, l_param, 0, GET_X_LPARAM(l_param), |
| - GET_Y_LPARAM(l_param)); |
| - if (GetRootView()->OnMousePressed(MouseEvent(msg))) { |
| - is_mouse_down_ = true; |
| - if (!HasNativeCapture()) |
| - SetNativeCapture(); |
| - return true; |
| - } |
| - return false; |
| -} |
| - |
| -bool WidgetWin::ProcessMouseReleased(UINT message, |
| - WPARAM w_param, |
| - LPARAM l_param) { |
| - last_mouse_event_was_move_ = false; |
| - is_mouse_down_ = false; |
| - |
| - // Release the capture first, that way we don't get confused if |
| - // OnMouseReleased blocks. |
| - if (HasNativeCapture() && ReleaseCaptureOnMouseReleased()) |
| - ReleaseNativeCapture(); |
| - |
| - MSG msg; |
| - MakeMSG(&msg, message, w_param, l_param, 0, GET_X_LPARAM(l_param), |
| - GET_Y_LPARAM(l_param)); |
| - GetRootView()->OnMouseReleased(MouseEvent(msg)); |
| - return true; |
| -} |
| - |
| -bool WidgetWin::ProcessMouseMoved(UINT message, |
| - WPARAM w_param, |
| - LPARAM l_param) { |
| - // Windows only fires WM_MOUSELEAVE events if the application begins |
| - // "tracking" mouse events for a given HWND during WM_MOUSEMOVE events. |
| - // We need to call |TrackMouseEvents| to listen for WM_MOUSELEAVE. |
| - if (!HasNativeCapture()) |
| - TrackMouseEvents((message == WM_NCMOUSEMOVE) ? |
| - TME_NONCLIENT | TME_LEAVE : TME_LEAVE); |
| - MSG msg; |
| - MakeMSG(&msg, message, w_param, l_param, 0, GET_X_LPARAM(l_param), |
| - GET_Y_LPARAM(l_param)); |
| - if (HasNativeCapture() && is_mouse_down_) |
| - GetRootView()->OnMouseDragged(MouseEvent(msg)); |
| - else if (!last_mouse_event_was_move_ || |
| - (last_mouse_move_x_ != GET_X_LPARAM(l_param) || |
| - last_mouse_move_y_ != GET_Y_LPARAM(l_param))) { |
| - last_mouse_move_x_ = GET_X_LPARAM(l_param); |
| - last_mouse_move_y_ = GET_Y_LPARAM(l_param); |
| - last_mouse_event_was_move_ = true; |
| - GetRootView()->OnMouseMoved(MouseEvent(msg)); |
| - } |
| - return true; |
| -} |
| - |
| -void WidgetWin::ProcessMouseExited(UINT message, |
| - WPARAM w_param, |
| - LPARAM l_param) { |
| - last_mouse_event_was_move_ = false; |
| - MSG msg; |
| - MakeMSG(&msg, message, w_param, l_param, 0, GET_X_LPARAM(l_param), |
| - GET_Y_LPARAM(l_param)); |
| - GetRootView()->OnMouseExited(MouseEvent(msg)); |
| - // Reset our tracking flag so that future mouse movement over this WidgetWin |
| - // results in a new tracking session. |
| - active_mouse_tracking_flags_ = 0; |
| -} |
| - |
| void WidgetWin::OnScreenReaderDetected() { |
| screen_reader_active_ = true; |
| } |
| -bool WidgetWin::ReleaseCaptureOnMouseReleased() { |
| - return true; |
| -} |
| - |
| //////////////////////////////////////////////////////////////////////////////// |
| // WidgetWin, private: |