15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/partial_screenshot_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/mouse_cursor_event_filter.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screenshot_delegate.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/overlay_event_filter.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/capture_client.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/cursor/cursor.h" 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_observer.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A self-owned object to handle the cancel and the finish of current partial 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// screenshot session. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PartialScreenshotView::OverlayDelegate 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : public OverlayEventFilter::Delegate, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public views::WidgetObserver { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverlayDelegate() { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->overlay_filter()->Activate(this); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RegisterWidget(views::Widget* widget) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widgets_.push_back(widget); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->AddObserver(this); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from OverlayEventFilter::Delegate: 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Cancel() OVERRIDE { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the mouse_warp_mode allows warping. It can be stopped by a 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // partial screenshot view. 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MouseCursorEventFilter* mouse_cursor_filter = 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->mouse_cursor_filter(); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_cursor_filter->set_mouse_warp_mode( 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MouseCursorEventFilter::WARP_ALWAYS); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < widgets_.size(); ++i) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widgets_[i]->Close(); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsCancelingKeyEvent(ui::KeyEvent* event) OVERRIDE { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return event->key_code() == ui::VKEY_ESCAPE; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual aura::Window* GetWindow() OVERRIDE { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Just returns NULL because this class does not handle key events in 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OverlayEventFilter, except for cancel keys. 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::WidgetObserver: 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->RemoveObserver(this); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widgets_.erase(std::remove(widgets_.begin(), widgets_.end(), widget)); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (widgets_.empty()) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~OverlayDelegate() { 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Shell::GetInstance()->overlay_filter()->Deactivate(this); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<views::Widget*> widgets_; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OverlayDelegate); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<PartialScreenshotView*> 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PartialScreenshotView::StartPartialScreenshot( 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenshotDelegate* screenshot_delegate) { 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<PartialScreenshotView*> views; 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (Shell::GetInstance()->overlay_filter()->IsActive()) 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return views; 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverlayDelegate* overlay_delegate = new OverlayDelegate(); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (aura::Window::Windows::iterator it = root_windows.begin(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != root_windows.end(); ++it) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PartialScreenshotView* new_view = new PartialScreenshotView( 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overlay_delegate, screenshot_delegate); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_view->Init(*it); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views.push_back(new_view); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return views; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PartialScreenshotView::PartialScreenshotView( 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PartialScreenshotView::OverlayDelegate* overlay_delegate, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenshotDelegate* screenshot_delegate) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : is_dragging_(false), 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overlay_delegate_(overlay_delegate), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_(screenshot_delegate) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PartialScreenshotView::~PartialScreenshotView() { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overlay_delegate_ = NULL; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_ = NULL; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PartialScreenshotView::Init(aura::Window* root_window) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* widget = new views::Widget; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::InitParams params( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = this; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The partial screenshot rectangle has to be at the real top of 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the screen. 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.parent = 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetContainer(root_window, kShellWindowId_OverlayContainer); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->SetContentsView(this); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->SetBounds(root_window->GetBoundsInScreen()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetNativeView()->SetName("PartialScreenshotView"); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->StackAtTop(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Releases the mouse capture to let mouse events come to the view. This 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will close the context menu. 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::CaptureClient* capture_client = 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetCaptureClient(root_window); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capture_client->GetCaptureWindow()) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capture_client->ReleaseCapture(capture_client->GetCaptureWindow()); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overlay_delegate_->RegisterWidget(widget); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect PartialScreenshotView::GetScreenshotRect() const { 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int left = std::min(start_position_.x(), current_position_.x()); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int top = std::min(start_position_.y(), current_position_.y()); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int width = ::abs(start_position_.x() - current_position_.x()); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int height = ::abs(start_position_.y() - current_position_.y()); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Rect(left, top, width, height); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnSelectionStarted(const gfx::Point& position) { 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) start_position_ = position; 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnSelectionChanged(const gfx::Point& position) { 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_dragging_ && current_position_ == position) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_position_ = position; 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SchedulePaint(); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_dragging_ = true; 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnSelectionFinished() { 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overlay_delegate_->Cancel(); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_dragging_) 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_dragging_ = false; 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (screenshot_delegate_) { 1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window*root_window = 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWidget()->GetNativeWindow()->GetRootWindow(); 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_delegate_->HandleTakePartialScreenshot( 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window, 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::IntersectRects(root_window->bounds(), GetScreenshotRect())); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor PartialScreenshotView::GetCursor( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::MouseEvent& event) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always use "crosshair" cursor. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::kCursorCross; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PartialScreenshotView::OnPaint(gfx::Canvas* canvas) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_dragging_) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Screenshot area representation: black rectangle with white 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rectangle inside. To avoid capturing these rectangles when mouse 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // release, they should be outside of the actual capturing area. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect screenshot_rect = GetScreenshotRect(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_rect.Inset(-1, -1, -1, -1); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->DrawRect(screenshot_rect, SK_ColorWHITE); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_rect.Inset(-1, -1, -1, -1); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->DrawRect(screenshot_rect, SK_ColorBLACK); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PartialScreenshotView::OnMousePressed(const ui::MouseEvent& event) { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prevent moving across displays during drag. Capturing a screenshot across 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the displays is not supported yet. 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(mukai): remove this restriction. 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MouseCursorEventFilter* mouse_cursor_filter = 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->mouse_cursor_filter(); 202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mouse_cursor_filter->set_mouse_warp_mode(MouseCursorEventFilter::WARP_NONE); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionStarted(event.location()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PartialScreenshotView::OnMouseDragged(const ui::MouseEvent& event) { 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionChanged(event.location()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PartialScreenshotView::OnMouseWheel(const ui::MouseWheelEvent& event) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing but do not propagate events futhermore. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PartialScreenshotView::OnMouseReleased(const ui::MouseEvent& event) { 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionFinished(); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnMouseCaptureLost() { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_dragging_ = false; 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionFinished(); 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnGestureEvent(ui::GestureEvent* event) { 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch(event->type()) { 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ui::ET_GESTURE_TAP_DOWN: 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionStarted(event->location()); 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ui::ET_GESTURE_SCROLL_UPDATE: 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionChanged(event->location()); 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ui::ET_GESTURE_SCROLL_END: 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ui::ET_SCROLL_FLING_START: 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionFinished(); 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->SetHandled(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 246