forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscoped_window_event_targeting_blocker.cc
42 lines (35 loc) · 1.45 KB
/
scoped_window_event_targeting_blocker.cc
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
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/aura/scoped_window_event_targeting_blocker.h"
#include "ui/aura/window.h"
namespace aura {
ScopedWindowEventTargetingBlocker::ScopedWindowEventTargetingBlocker(
Window* window)
: window_(window) {
if (window_->event_targeting_blocker_count_ == 0) {
window_->restore_event_targeting_policy_ = window_->event_targeting_policy_;
window_->SetEventTargetingPolicy(EventTargetingPolicy::kNone);
}
// Increase |Window::event_targeting_blocker_count_| after setting the event
// targeting policy to kNone as Window::SetEventTargetingPolicy() relies on
// |Window::event_targeting_blocker_count_| to see if the policy is allowed
// to be changed.
window_->event_targeting_blocker_count_++;
window_->AddObserver(this);
}
ScopedWindowEventTargetingBlocker::~ScopedWindowEventTargetingBlocker() {
if (!window_)
return;
window_->RemoveObserver(this);
window_->event_targeting_blocker_count_--;
DCHECK_GE(window_->event_targeting_blocker_count_, 0);
if (window_->event_targeting_blocker_count_ == 0)
window_->SetEventTargetingPolicy(window_->restore_event_targeting_policy_);
}
void ScopedWindowEventTargetingBlocker::OnWindowDestroying(Window* window) {
DCHECK_EQ(window, window_);
window_->RemoveObserver(this);
window_ = nullptr;
}
} // namespace aura