partial_screenshot_view.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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() { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->overlay_filter()->Deactivate(); 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; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverlayDelegate* overlay_delegate = new OverlayDelegate(); 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (aura::Window::Windows::iterator it = root_windows.begin(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != root_windows.end(); ++it) { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PartialScreenshotView* new_view = new PartialScreenshotView( 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overlay_delegate, screenshot_delegate); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_view->Init(*it); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views.push_back(new_view); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return views; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PartialScreenshotView::PartialScreenshotView( 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PartialScreenshotView::OverlayDelegate* overlay_delegate, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenshotDelegate* screenshot_delegate) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : is_dragging_(false), 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overlay_delegate_(overlay_delegate), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_(screenshot_delegate) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PartialScreenshotView::~PartialScreenshotView() { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overlay_delegate_ = NULL; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_ = NULL; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PartialScreenshotView::Init(aura::Window* root_window) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* widget = new views::Widget; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::InitParams params( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = this; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The partial screenshot rectangle has to be at the real top of 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the screen. 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.parent = 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetContainer(root_window, kShellWindowId_OverlayContainer); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->SetContentsView(this); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->SetBounds(root_window->GetBoundsInScreen()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetNativeView()->SetName("PartialScreenshotView"); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->StackAtTop(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Releases the mouse capture to let mouse events come to the view. This 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will close the context menu. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::CaptureClient* capture_client = 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetCaptureClient(root_window); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capture_client->GetCaptureWindow()) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capture_client->ReleaseCapture(capture_client->GetCaptureWindow()); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overlay_delegate_->RegisterWidget(widget); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect PartialScreenshotView::GetScreenshotRect() const { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int left = std::min(start_position_.x(), current_position_.x()); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int top = std::min(start_position_.y(), current_position_.y()); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int width = ::abs(start_position_.x() - current_position_.x()); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int height = ::abs(start_position_.y() - current_position_.y()); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Rect(left, top, width, height); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnSelectionStarted(const gfx::Point& position) { 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) start_position_ = position; 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnSelectionChanged(const gfx::Point& position) { 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_dragging_ && current_position_ == position) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_position_ = position; 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SchedulePaint(); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_dragging_ = true; 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnSelectionFinished() { 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overlay_delegate_->Cancel(); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_dragging_) 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_dragging_ = false; 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (screenshot_delegate_) { 1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window*root_window = 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWidget()->GetNativeWindow()->GetRootWindow(); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_delegate_->HandleTakePartialScreenshot( 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window, 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::IntersectRects(root_window->bounds(), GetScreenshotRect())); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor PartialScreenshotView::GetCursor( 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::MouseEvent& event) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always use "crosshair" cursor. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::kCursorCross; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PartialScreenshotView::OnPaint(gfx::Canvas* canvas) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_dragging_) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Screenshot area representation: black rectangle with white 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rectangle inside. To avoid capturing these rectangles when mouse 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // release, they should be outside of the actual capturing area. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect screenshot_rect = GetScreenshotRect(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_rect.Inset(-1, -1, -1, -1); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->DrawRect(screenshot_rect, SK_ColorWHITE); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_rect.Inset(-1, -1, -1, -1); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->DrawRect(screenshot_rect, SK_ColorBLACK); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PartialScreenshotView::OnMousePressed(const ui::MouseEvent& event) { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prevent moving across displays during drag. Capturing a screenshot across 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the displays is not supported yet. 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(mukai): remove this restriction. 196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MouseCursorEventFilter* mouse_cursor_filter = 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->mouse_cursor_filter(); 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mouse_cursor_filter->set_mouse_warp_mode(MouseCursorEventFilter::WARP_NONE); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionStarted(event.location()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PartialScreenshotView::OnMouseDragged(const ui::MouseEvent& event) { 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionChanged(event.location()); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PartialScreenshotView::OnMouseWheel(const ui::MouseWheelEvent& event) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing but do not propagate events futhermore. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PartialScreenshotView::OnMouseReleased(const ui::MouseEvent& event) { 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionFinished(); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnMouseCaptureLost() { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_dragging_ = false; 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionFinished(); 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnGestureEvent(ui::GestureEvent* event) { 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch(event->type()) { 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ui::ET_GESTURE_TAP_DOWN: 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionStarted(event->location()); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ui::ET_GESTURE_SCROLL_UPDATE: 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionChanged(event->location()); 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ui::ET_GESTURE_SCROLL_END: 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ui::ET_SCROLL_FLING_START: 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSelectionFinished(); 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->SetHandled(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 242