diff options
Diffstat (limited to 'views')
-rw-r--r-- | views/window/window_win.cc | 42 | ||||
-rw-r--r-- | views/window/window_win.h | 6 |
2 files changed, 44 insertions, 4 deletions
diff --git a/views/window/window_win.cc b/views/window/window_win.cc index 12ef674..74807c8 100644 --- a/views/window/window_win.cc +++ b/views/window/window_win.cc @@ -513,6 +513,7 @@ WindowWin::WindowWin(WindowDelegate* window_delegate) ignore_window_pos_changes_(false), ignore_pos_changes_factory_(this), force_hidden_count_(0), + is_right_mouse_pressed_on_caption_(false), last_monitor_(NULL) { is_window_ = true; InitClass(); @@ -946,10 +947,43 @@ void WindowWin::OnNCLButtonDown(UINT ht_component, const CPoint& point) { } void WindowWin::OnNCRButtonDown(UINT ht_component, const CPoint& point) { - if (ht_component == HTCAPTION || ht_component == HTSYSMENU) - RunSystemMenu(gfx::Point(point)); - else - WidgetWin::OnNCRButtonDown(ht_component, point); + if (ht_component == HTCAPTION || ht_component == HTSYSMENU) { + is_right_mouse_pressed_on_caption_ = true; + // Using SetCapture() here matches Windows native behavior for right-clicks + // on the title bar. It's not obvious why Windows does this. + SetCapture(); + } + + WidgetWin::OnNCRButtonDown(ht_component, point); +} + +void WindowWin::OnNCRButtonUp(UINT ht_component, const CPoint& point) { + if (is_right_mouse_pressed_on_caption_) + is_right_mouse_pressed_on_caption_ = false; + + WidgetWin::OnNCRButtonUp(ht_component, point); +} + +void WindowWin::OnRButtonUp(UINT ht_component, const CPoint& point) { + // We handle running the system menu on mouseup here because calling + // SetCapture() on mousedown makes the mouseup generate WM_RBUTTONUP instead + // of WM_NCRBUTTONUP. + if (is_right_mouse_pressed_on_caption_) { + is_right_mouse_pressed_on_caption_ = false; + ReleaseCapture(); + // |point| is in window coordinates, but WM_NCHITTEST and RunSystemMenu() + // expect screen coordinates. + CPoint screen_point(point); + MapWindowPoints(GetNativeView(), HWND_DESKTOP, &screen_point, 1); + ht_component = ::SendMessage(GetNativeView(), WM_NCHITTEST, 0, + MAKELPARAM(screen_point.x, screen_point.y)); + if (ht_component == HTCAPTION || ht_component == HTSYSMENU) { + RunSystemMenu(gfx::Point(screen_point)); + return; + } + } + + WidgetWin::OnRButtonUp(ht_component, point); } LRESULT WindowWin::OnNCUAHDrawCaption(UINT msg, WPARAM w_param, diff --git a/views/window/window_win.h b/views/window/window_win.h index f799ae7..b6b9122 100644 --- a/views/window/window_win.h +++ b/views/window/window_win.h @@ -124,6 +124,8 @@ class WindowWin : public WidgetWin, virtual void OnNCPaint(HRGN rgn); virtual void OnNCLButtonDown(UINT ht_component, const CPoint& point); virtual void OnNCRButtonDown(UINT ht_component, const CPoint& point); + virtual void OnNCRButtonUp(UINT ht_component, const CPoint& point); + virtual void OnRButtonUp(UINT ht_component, const CPoint& point); virtual LRESULT OnNCUAHDrawCaption(UINT msg, WPARAM w_param, LPARAM l_param); virtual LRESULT OnNCUAHDrawFrame(UINT msg, WPARAM w_param, LPARAM l_param); virtual LRESULT OnSetCursor(HWND window, UINT hittest_code, UINT message); @@ -276,6 +278,10 @@ class WindowWin : public WidgetWin, // when all we want to do is restore it. int force_hidden_count_; + // Set to true when the user presses the right mouse button on the caption + // area. We need this so we can correctly show the context menu on mouse-up. + bool is_right_mouse_pressed_on_caption_; + // The last-seen monitor containing us, and its rect and work area. These are // used to catch updates to the rect and work area and react accordingly. HMONITOR last_monitor_; |