blob: 0d6be46a2d91cae57ad99e3206a9b0d9cace9273 [file] [log] [blame]
Avi Drissman8ba1bad2022-09-13 19:22:361// Copyright 2015 The Chromium Authors
reveman27fe2642015-11-20 06:33:392// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/exo/sub_surface.h"
6
7#include "base/logging.h"
8#include "base/trace_event/trace_event.h"
David 'Digit' Turnerea071142018-10-29 15:38:129#include "base/trace_event/traced_value.h"
Lucas Berthouf18ac602021-11-12 21:35:1010#include "components/exo/sub_surface_observer.h"
reveman27fe2642015-11-20 06:33:3911#include "components/exo/surface.h"
Yuichiro Hanada3a6c31d02020-06-03 08:45:1212#include "ui/aura/client/aura_constants.h"
Lucas Berthouf18ac602021-11-12 21:35:1013#include "ui/gfx/geometry/point_f.h"
reveman27fe2642015-11-20 06:33:3914
15namespace exo {
16
17////////////////////////////////////////////////////////////////////////////////
18// SubSurface, public:
19
20SubSurface::SubSurface(Surface* surface, Surface* parent)
reveman2d3815d2016-06-26 20:13:2521 : surface_(surface), parent_(parent) {
reveman27fe2642015-11-20 06:33:3922 surface_->SetSurfaceDelegate(this);
23 surface_->AddSurfaceObserver(this);
24 parent_->AddSurfaceObserver(this);
25 parent_->AddSubSurface(surface_);
26}
27
28SubSurface::~SubSurface() {
Lucas Berthouf18ac602021-11-12 21:35:1029 for (SubSurfaceObserver& observer : observers_)
30 observer.OnSubSurfaceDestroying(this);
31
reveman27fe2642015-11-20 06:33:3932 if (surface_) {
33 if (parent_)
34 parent_->RemoveSubSurface(surface_);
35 surface_->SetSurfaceDelegate(nullptr);
36 surface_->RemoveSurfaceObserver(this);
37 }
38 if (parent_)
39 parent_->RemoveSurfaceObserver(this);
40}
41
Lucas Berthouf18ac602021-11-12 21:35:1042void SubSurface::SetPosition(const gfx::PointF& position) {
reveman27fe2642015-11-20 06:33:3943 TRACE_EVENT1("exo", "SubSurface::SetPosition", "position",
44 position.ToString());
45
46 if (!parent_ || !surface_)
47 return;
48
49 parent_->SetSubSurfacePosition(surface_, position);
50}
51
52void SubSurface::PlaceAbove(Surface* reference) {
53 TRACE_EVENT1("exo", "SubSurface::PlaceAbove", "reference",
54 reference->AsTracedValue());
55
56 if (!parent_ || !surface_)
57 return;
58
59 if (reference == surface_) {
60 DLOG(WARNING) << "Client tried to place sub-surface above itself";
61 return;
62 }
63
64 parent_->PlaceSubSurfaceAbove(surface_, reference);
65}
66
67void SubSurface::PlaceBelow(Surface* sibling) {
68 TRACE_EVENT1("exo", "SubSurface::PlaceBelow", "sibling",
69 sibling->AsTracedValue());
70
71 if (!parent_ || !surface_)
72 return;
73
74 if (sibling == surface_) {
75 DLOG(WARNING) << "Client tried to place sub-surface below itself";
76 return;
77 }
78
79 parent_->PlaceSubSurfaceBelow(surface_, sibling);
80}
81
82void SubSurface::SetCommitBehavior(bool synchronized) {
83 TRACE_EVENT1("exo", "SubSurface::SetCommitBehavior", "synchronized",
84 synchronized);
85
86 is_synchronized_ = synchronized;
87}
88
dcheng31759da2016-04-21 01:26:3189std::unique_ptr<base::trace_event::TracedValue> SubSurface::AsTracedValue()
90 const {
91 std::unique_ptr<base::trace_event::TracedValue> value(
primianocb1afb32016-02-29 20:46:0592 new base::trace_event::TracedValue());
reveman27fe2642015-11-20 06:33:3993 value->SetBoolean("is_synchronized", is_synchronized_);
94 return value;
95}
96
97////////////////////////////////////////////////////////////////////////////////
98// SurfaceDelegate overrides:
99
100void SubSurface::OnSurfaceCommit() {
101 // Early out if commit should be synchronized with parent.
102 if (IsSurfaceSynchronized())
103 return;
104
David Reveman8b43b352017-11-03 15:24:51105 if (parent_)
106 parent_->OnSubSurfaceCommit();
reveman27fe2642015-11-20 06:33:39107}
108
reveman27fe2642015-11-20 06:33:39109bool SubSurface::IsSurfaceSynchronized() const {
110 // A sub-surface is effectively synchronized if either its parent is
111 // synchronized or itself is in synchronized mode.
112 if (is_synchronized_)
113 return true;
114
Dominik Laskowski3e2f94792017-12-15 00:27:10115 return parent_ && parent_->IsSynchronized();
116}
117
Dominik Laskowski14a163772018-02-09 19:25:18118bool SubSurface::IsInputEnabled(Surface* surface) const {
119 return !parent_ || parent_->IsInputEnabled(surface);
reveman27fe2642015-11-20 06:33:39120}
121
Yuichiro Hanada3a6c31d02020-06-03 08:45:12122void SubSurface::OnSetParent(Surface* parent, const gfx::Point&) {
123 if (parent->window()->GetProperty(aura::client::kSkipImeProcessing))
124 surface_->window()->SetProperty(aura::client::kSkipImeProcessing, true);
125}
126
Nicholas Hollingumda837042022-07-18 23:46:49127SecurityDelegate* SubSurface::GetSecurityDelegate() {
Nicholas Hollingum93d735bb62022-05-25 05:10:35128 if (parent_)
Nicholas Hollingumda837042022-07-18 23:46:49129 return parent_->GetSecurityDelegate();
Nicholas Hollingum93d735bb62022-05-25 05:10:35130 return nullptr;
131}
132
reveman27fe2642015-11-20 06:33:39133////////////////////////////////////////////////////////////////////////////////
134// SurfaceObserver overrides:
135
136void SubSurface::OnSurfaceDestroying(Surface* surface) {
137 surface->RemoveSurfaceObserver(this);
138 if (surface == parent_) {
139 parent_ = nullptr;
140 return;
141 }
142 DCHECK(surface == surface_);
143 if (parent_)
144 parent_->RemoveSubSurface(surface_);
145 surface_ = nullptr;
146}
147
Lucas Berthouf18ac602021-11-12 21:35:10148////////////////////////////////////////////////////////////////////////////////
149// SubSurface Observers
150void SubSurface::AddSubSurfaceObserver(SubSurfaceObserver* observer) {
151 observers_.AddObserver(observer);
152}
153
154void SubSurface::RemoveSubSurfaceObserver(SubSurfaceObserver* observer) {
155 observers_.RemoveObserver(observer);
156}
157
reveman27fe2642015-11-20 06:33:39158} // namespace exo