default_capture_client.cc 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/aura/client/default_capture_client.h"
  5. #include "base/observer_list.h"
  6. #include "ui/aura/client/capture_client_observer.h"
  7. #include "ui/aura/env.h"
  8. #include "ui/aura/window.h"
  9. #include "ui/aura/window_event_dispatcher.h"
  10. #include "ui/aura/window_tree_host.h"
  11. namespace aura {
  12. namespace client {
  13. namespace {
  14. // Track the active capture window across root windows.
  15. Window* global_capture_window_ = nullptr;
  16. } // namespace
  17. DefaultCaptureClient::DefaultCaptureClient(Window* root_window)
  18. : root_window_(root_window), capture_window_(nullptr) {
  19. DCHECK(root_window_);
  20. SetCaptureClient(root_window_, this);
  21. }
  22. DefaultCaptureClient::~DefaultCaptureClient() {
  23. if (global_capture_window_ == capture_window_)
  24. global_capture_window_ = nullptr;
  25. SetCaptureClient(root_window_, nullptr);
  26. }
  27. void DefaultCaptureClient::SetCapture(Window* window) {
  28. if (capture_window_ == window)
  29. return;
  30. if (window)
  31. Env::GetInstance()->gesture_recognizer()->CancelActiveTouchesExcept(window);
  32. Window* old_capture_window = capture_window_;
  33. capture_window_ = window;
  34. global_capture_window_ = window;
  35. CaptureDelegate* capture_delegate = nullptr;
  36. if (capture_window_) {
  37. DCHECK(!root_window_ || root_window_ == capture_window_->GetRootWindow());
  38. capture_delegate = capture_window_->GetHost()->dispatcher();
  39. capture_delegate->SetNativeCapture();
  40. } else {
  41. DCHECK(!root_window_ ||
  42. root_window_ == old_capture_window->GetRootWindow());
  43. capture_delegate = old_capture_window->GetHost()->dispatcher();
  44. capture_delegate->ReleaseNativeCapture();
  45. }
  46. capture_delegate->UpdateCapture(old_capture_window, capture_window_);
  47. for (CaptureClientObserver& observer : observers_)
  48. observer.OnCaptureChanged(old_capture_window, capture_window_);
  49. }
  50. void DefaultCaptureClient::ReleaseCapture(Window* window) {
  51. if (capture_window_ != window)
  52. return;
  53. SetCapture(NULL);
  54. }
  55. Window* DefaultCaptureClient::GetCaptureWindow() {
  56. return capture_window_;
  57. }
  58. Window* DefaultCaptureClient::GetGlobalCaptureWindow() {
  59. return global_capture_window_;
  60. }
  61. void DefaultCaptureClient::AddObserver(CaptureClientObserver* observer) {
  62. observers_.AddObserver(observer);
  63. }
  64. void DefaultCaptureClient::RemoveObserver(CaptureClientObserver* observer) {
  65. observers_.RemoveObserver(observer);
  66. }
  67. } // namespace client
  68. } // namespace aura