Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: ash/utility/screenshot_controller.cc

Issue 2291913002: Allow the user to cancel the capture region action, and show its active status in the tray. (Closed)
Patch Set: Address comments Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ash/utility/screenshot_controller.h ('k') | ash/utility/screenshot_controller_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/utility/screenshot_controller.h" 5 #include "ash/utility/screenshot_controller.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "ash/common/shell_window_ids.h" 9 #include "ash/common/shell_window_ids.h"
10 #include "ash/display/mouse_cursor_event_filter.h" 10 #include "ash/display/mouse_cursor_event_filter.h"
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 root_window_(nullptr), 238 root_window_(nullptr),
239 selected_(nullptr), 239 selected_(nullptr),
240 screenshot_delegate_(nullptr) { 240 screenshot_delegate_(nullptr) {
241 // Keep this here and don't move it to StartPartialScreenshotSession(), as it 241 // Keep this here and don't move it to StartPartialScreenshotSession(), as it
242 // needs to be pre-pended by MouseCursorEventFilter in Shell::Init(). 242 // needs to be pre-pended by MouseCursorEventFilter in Shell::Init().
243 Shell::GetInstance()->PrependPreTargetHandler(this); 243 Shell::GetInstance()->PrependPreTargetHandler(this);
244 } 244 }
245 245
246 ScreenshotController::~ScreenshotController() { 246 ScreenshotController::~ScreenshotController() {
247 if (screenshot_delegate_) 247 if (screenshot_delegate_)
248 Cancel(); 248 CancelScreenshotSession();
249 Shell::GetInstance()->RemovePreTargetHandler(this); 249 Shell::GetInstance()->RemovePreTargetHandler(this);
250 } 250 }
251 251
252 void ScreenshotController::StartWindowScreenshotSession( 252 void ScreenshotController::StartWindowScreenshotSession(
253 ScreenshotDelegate* screenshot_delegate) { 253 ScreenshotDelegate* screenshot_delegate) {
254 if (screenshot_delegate_) { 254 if (screenshot_delegate_) {
255 DCHECK_EQ(screenshot_delegate_, screenshot_delegate); 255 DCHECK_EQ(screenshot_delegate_, screenshot_delegate);
256 return; 256 return;
257 } 257 }
258 screenshot_delegate_ = screenshot_delegate; 258 screenshot_delegate_ = screenshot_delegate;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 } 291 }
292 292
293 if (!pen_events_only_) { 293 if (!pen_events_only_) {
294 cursor_setter_.reset(new ScopedCursorSetter( 294 cursor_setter_.reset(new ScopedCursorSetter(
295 Shell::GetInstance()->cursor_manager(), ui::kCursorCross)); 295 Shell::GetInstance()->cursor_manager(), ui::kCursorCross));
296 } 296 }
297 297
298 EnableMouseWarp(false); 298 EnableMouseWarp(false);
299 } 299 }
300 300
301 void ScreenshotController::CancelScreenshotSession() {
302 mode_ = NONE;
303 pen_events_only_ = false;
304 root_window_ = nullptr;
305 SetSelectedWindow(nullptr);
306 screenshot_delegate_ = nullptr;
307 display::Screen::GetScreen()->RemoveObserver(this);
308 base::STLDeleteValues(&layers_);
309 cursor_setter_.reset();
310 EnableMouseWarp(true);
311 }
312
301 void ScreenshotController::MaybeStart(const ui::LocatedEvent& event) { 313 void ScreenshotController::MaybeStart(const ui::LocatedEvent& event) {
302 aura::Window* current_root = 314 aura::Window* current_root =
303 static_cast<aura::Window*>(event.target())->GetRootWindow(); 315 static_cast<aura::Window*>(event.target())->GetRootWindow();
304 if (root_window_) { 316 if (root_window_) {
305 // It's already started. This can happen when the second finger touches 317 // It's already started. This can happen when the second finger touches
306 // the screen, or combination of the touch and mouse. We should grab the 318 // the screen, or combination of the touch and mouse. We should grab the
307 // partial screenshot instead of restarting. 319 // partial screenshot instead of restarting.
308 if (current_root == root_window_) { 320 if (current_root == root_window_) {
309 Update(event); 321 Update(event);
310 CompletePartialScreenshot(); 322 CompletePartialScreenshot();
311 } 323 }
312 } else { 324 } else {
313 root_window_ = current_root; 325 root_window_ = current_root;
314 start_position_ = event.root_location(); 326 start_position_ = event.root_location();
315 if (!pen_events_only_) { 327 if (!pen_events_only_) {
316 // ScopedCursorSetter must be reset first to make sure that its dtor is 328 // ScopedCursorSetter must be reset first to make sure that its dtor is
317 // called before ctor is called. 329 // called before ctor is called.
318 cursor_setter_.reset(); 330 cursor_setter_.reset();
319 cursor_setter_.reset(new ScopedCursorSetter( 331 cursor_setter_.reset(new ScopedCursorSetter(
320 Shell::GetInstance()->cursor_manager(), ui::kCursorNone)); 332 Shell::GetInstance()->cursor_manager(), ui::kCursorNone));
321 } 333 }
322 Update(event); 334 Update(event);
323 } 335 }
324 } 336 }
325 337
326 void ScreenshotController::CompleteWindowScreenshot() { 338 void ScreenshotController::CompleteWindowScreenshot() {
327 if (selected_) 339 if (selected_)
328 screenshot_delegate_->HandleTakeWindowScreenshot(selected_); 340 screenshot_delegate_->HandleTakeWindowScreenshot(selected_);
329 Cancel(); 341 CancelScreenshotSession();
330 } 342 }
331 343
332 void ScreenshotController::CompletePartialScreenshot() { 344 void ScreenshotController::CompletePartialScreenshot() {
333 if (!root_window_) { 345 if (!root_window_) {
334 // If we received a released event before we ever got a pressed event 346 // If we received a released event before we ever got a pressed event
335 // (resulting in setting |root_window_|), we just return without canceling 347 // (resulting in setting |root_window_|), we just return without canceling
336 // to keep the screenshot session active waiting for the next press. 348 // to keep the screenshot session active waiting for the next press.
337 // 349 //
338 // This is to avoid a crash that used to happen when we start the screenshot 350 // This is to avoid a crash that used to happen when we start the screenshot
339 // session while the mouse is pressed and then release without moving the 351 // session while the mouse is pressed and then release without moving the
340 // mouse. crbug.com/581432. 352 // mouse. crbug.com/581432.
341 return; 353 return;
342 } 354 }
343 355
344 DCHECK(layers_.count(root_window_)); 356 DCHECK(layers_.count(root_window_));
345 const gfx::Rect& region = layers_.at(root_window_)->region(); 357 const gfx::Rect& region = layers_.at(root_window_)->region();
346 if (!region.IsEmpty()) { 358 if (!region.IsEmpty()) {
347 screenshot_delegate_->HandleTakePartialScreenshot( 359 screenshot_delegate_->HandleTakePartialScreenshot(
348 root_window_, gfx::IntersectRects(root_window_->bounds(), region)); 360 root_window_, gfx::IntersectRects(root_window_->bounds(), region));
349 } 361 }
350 Cancel(); 362 CancelScreenshotSession();
351 }
352
353 void ScreenshotController::Cancel() {
354 mode_ = NONE;
355 pen_events_only_ = false;
356 root_window_ = nullptr;
357 SetSelectedWindow(nullptr);
358 screenshot_delegate_ = nullptr;
359 display::Screen::GetScreen()->RemoveObserver(this);
360 base::STLDeleteValues(&layers_);
361 cursor_setter_.reset();
362 EnableMouseWarp(true);
363 } 363 }
364 364
365 void ScreenshotController::Update(const ui::LocatedEvent& event) { 365 void ScreenshotController::Update(const ui::LocatedEvent& event) {
366 // Update may happen without MaybeStart() if the partial screenshot session 366 // Update may happen without MaybeStart() if the partial screenshot session
367 // starts when dragging. 367 // starts when dragging.
368 if (!root_window_) 368 if (!root_window_)
369 MaybeStart(event); 369 MaybeStart(event);
370 DCHECK(layers_.find(root_window_) != layers_.end()); 370 DCHECK(layers_.find(root_window_) != layers_.end());
371 371
372 ScreenshotLayer* layer = layers_.at(root_window_); 372 ScreenshotLayer* layer = layers_.at(root_window_);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 return !pen_events_only_ || 416 return !pen_events_only_ ||
417 pointer_details.pointer_type == ui::EventPointerType::POINTER_TYPE_PEN; 417 pointer_details.pointer_type == ui::EventPointerType::POINTER_TYPE_PEN;
418 } 418 }
419 419
420 void ScreenshotController::OnKeyEvent(ui::KeyEvent* event) { 420 void ScreenshotController::OnKeyEvent(ui::KeyEvent* event) {
421 if (!screenshot_delegate_) 421 if (!screenshot_delegate_)
422 return; 422 return;
423 423
424 if (event->type() == ui::ET_KEY_RELEASED) { 424 if (event->type() == ui::ET_KEY_RELEASED) {
425 if (event->key_code() == ui::VKEY_ESCAPE) { 425 if (event->key_code() == ui::VKEY_ESCAPE) {
426 Cancel(); 426 CancelScreenshotSession();
427 event->StopPropagation(); 427 event->StopPropagation();
428 } else if (event->key_code() == ui::VKEY_RETURN && mode_ == WINDOW) { 428 } else if (event->key_code() == ui::VKEY_RETURN && mode_ == WINDOW) {
429 CompleteWindowScreenshot(); 429 CompleteWindowScreenshot();
430 event->StopPropagation(); 430 event->StopPropagation();
431 } 431 }
432 } 432 }
433 433
434 // Stop all key events except if the user is using a pointer, in which case 434 // Stop all key events except if the user is using a pointer, in which case
435 // they should be able to continue manipulating the screen. 435 // they should be able to continue manipulating the screen.
436 if (!pen_events_only_) 436 if (!pen_events_only_)
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 break; 515 break;
516 } 516 }
517 break; 517 break;
518 } 518 }
519 event->StopPropagation(); 519 event->StopPropagation();
520 } 520 }
521 521
522 void ScreenshotController::OnDisplayAdded(const display::Display& new_display) { 522 void ScreenshotController::OnDisplayAdded(const display::Display& new_display) {
523 if (!screenshot_delegate_) 523 if (!screenshot_delegate_)
524 return; 524 return;
525 Cancel(); 525 CancelScreenshotSession();
526 } 526 }
527 527
528 void ScreenshotController::OnDisplayRemoved( 528 void ScreenshotController::OnDisplayRemoved(
529 const display::Display& old_display) { 529 const display::Display& old_display) {
530 if (!screenshot_delegate_) 530 if (!screenshot_delegate_)
531 return; 531 return;
532 Cancel(); 532 CancelScreenshotSession();
533 } 533 }
534 534
535 void ScreenshotController::OnDisplayMetricsChanged( 535 void ScreenshotController::OnDisplayMetricsChanged(
536 const display::Display& display, 536 const display::Display& display,
537 uint32_t changed_metrics) {} 537 uint32_t changed_metrics) {}
538 538
539 void ScreenshotController::OnWindowDestroying(aura::Window* window) { 539 void ScreenshotController::OnWindowDestroying(aura::Window* window) {
540 SetSelectedWindow(nullptr); 540 SetSelectedWindow(nullptr);
541 } 541 }
542 542
543 } // namespace ash 543 } // namespace ash
OLDNEW
« no previous file with comments | « ash/utility/screenshot_controller.h ('k') | ash/utility/screenshot_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698