File: default_capture_client.cc

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (86 lines) | stat: -rw-r--r-- 2,517 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/aura/client/default_capture_client.h"

#include "base/observer_list.h"
#include "ui/aura/client/capture_client_observer.h"
#include "ui/aura/env.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher.h"
#include "ui/aura/window_tree_host.h"

namespace aura {
namespace client {
namespace {

// Track the active capture window across root windows.
Window* global_capture_window_ = nullptr;

}  // namespace

DefaultCaptureClient::DefaultCaptureClient(Window* root_window)
    : root_window_(root_window), capture_window_(nullptr) {
  DCHECK(root_window_);
  SetCaptureClient(root_window_, this);
}

DefaultCaptureClient::~DefaultCaptureClient() {
  if (global_capture_window_ == capture_window_)
    global_capture_window_ = nullptr;
  SetCaptureClient(root_window_, nullptr);
}

void DefaultCaptureClient::SetCapture(Window* window) {
  if (capture_window_ == window)
    return;
  if (window)
    Env::GetInstance()->gesture_recognizer()->CancelActiveTouchesExcept(window);

  Window* old_capture_window = capture_window_;
  capture_window_ = window;
  global_capture_window_ = window;

  CaptureDelegate* capture_delegate = nullptr;
  if (capture_window_) {
    DCHECK(!root_window_ || root_window_ == capture_window_->GetRootWindow());
    capture_delegate = capture_window_->GetHost()->dispatcher();
    capture_delegate->SetNativeCapture();
  } else {
    DCHECK(!root_window_ ||
           root_window_ == old_capture_window->GetRootWindow());
    capture_delegate = old_capture_window->GetHost()->dispatcher();
    capture_delegate->ReleaseNativeCapture();
  }

  capture_delegate->UpdateCapture(old_capture_window, capture_window_);

  observers_.Notify(&CaptureClientObserver::OnCaptureChanged,
                    old_capture_window, capture_window_);
}

void DefaultCaptureClient::ReleaseCapture(Window* window) {
  if (capture_window_ != window)
    return;
  SetCapture(NULL);
}

Window* DefaultCaptureClient::GetCaptureWindow() {
  return capture_window_;
}

Window* DefaultCaptureClient::GetGlobalCaptureWindow() {
  return global_capture_window_;
}

void DefaultCaptureClient::AddObserver(CaptureClientObserver* observer) {
  observers_.AddObserver(observer);
}

void DefaultCaptureClient::RemoveObserver(CaptureClientObserver* observer) {
  observers_.RemoveObserver(observer);
}

}  // namespace client
}  // namespace aura