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

Side by Side Diff: components/mus/ws/user_display_manager.cc

Issue 2119963002: Move mus to //services/ui (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 5 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
OLDNEW
(Empty)
1 // Copyright 2016 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
5 #include "components/mus/ws/user_display_manager.h"
6
7 #include "components/mus/ws/display.h"
8 #include "components/mus/ws/display_manager.h"
9 #include "components/mus/ws/display_manager_delegate.h"
10
11 namespace mus {
12 namespace ws {
13
14 UserDisplayManager::UserDisplayManager(ws::DisplayManager* display_manager,
15 DisplayManagerDelegate* delegate,
16 const UserId& user_id)
17 : display_manager_(display_manager),
18 delegate_(delegate),
19 user_id_(user_id),
20 got_valid_frame_decorations_(
21 delegate->GetFrameDecorationsForUser(user_id, nullptr)),
22 current_cursor_location_(0) {}
23
24 UserDisplayManager::~UserDisplayManager() {}
25
26 void UserDisplayManager::OnFrameDecorationValuesChanged() {
27 if (!got_valid_frame_decorations_) {
28 got_valid_frame_decorations_ = true;
29 display_manager_observers_.ForAllPtrs([this](
30 mojom::DisplayManagerObserver* observer) { CallOnDisplays(observer); });
31 if (test_observer_)
32 CallOnDisplays(test_observer_);
33 return;
34 }
35
36 mojo::Array<mojom::DisplayPtr> displays = GetAllDisplays();
37 display_manager_observers_.ForAllPtrs(
38 [this, &displays](mojom::DisplayManagerObserver* observer) {
39 observer->OnDisplaysChanged(displays.Clone());
40 });
41 if (test_observer_)
42 test_observer_->OnDisplaysChanged(displays.Clone());
43 }
44
45 void UserDisplayManager::AddDisplayManagerBinding(
46 mojo::InterfaceRequest<mojom::DisplayManager> request) {
47 display_manager_bindings_.AddBinding(this, std::move(request));
48 }
49
50 void UserDisplayManager::OnWillDestroyDisplay(Display* display) {
51 if (!got_valid_frame_decorations_)
52 return;
53
54 display_manager_observers_.ForAllPtrs(
55 [this, &display](mojom::DisplayManagerObserver* observer) {
56 observer->OnDisplayRemoved(display->id());
57 });
58 if (test_observer_)
59 test_observer_->OnDisplayRemoved(display->id());
60 }
61
62 void UserDisplayManager::OnMouseCursorLocationChanged(const gfx::Point& point) {
63 current_cursor_location_ =
64 static_cast<base::subtle::Atomic32>(
65 (point.x() & 0xFFFF) << 16 | (point.y() & 0xFFFF));
66 if (cursor_location_memory()) {
67 base::subtle::NoBarrier_Store(cursor_location_memory(),
68 current_cursor_location_);
69 }
70 }
71
72 void UserDisplayManager::OnDisplayUpdate(Display* display) {
73 if (!got_valid_frame_decorations_)
74 return;
75
76 mojo::Array<mojom::DisplayPtr> displays(1);
77 displays[0] = display->ToMojomDisplay();
78 delegate_->GetFrameDecorationsForUser(
79 user_id_, &(displays[0]->frame_decoration_values));
80 display_manager_observers_.ForAllPtrs(
81 [this, &displays](mojom::DisplayManagerObserver* observer) {
82 observer->OnDisplaysChanged(displays.Clone());
83 });
84 if (test_observer_)
85 test_observer_->OnDisplaysChanged(displays.Clone());
86 }
87
88 mojo::ScopedSharedBufferHandle UserDisplayManager::GetCursorLocationMemory() {
89 if (!cursor_location_handle_.is_valid()) {
90 // Create our shared memory segment to share the cursor state with our
91 // window clients.
92 cursor_location_handle_ =
93 mojo::SharedBufferHandle::Create(sizeof(base::subtle::Atomic32));
94
95 if (!cursor_location_handle_.is_valid())
96 return mojo::ScopedSharedBufferHandle();
97
98 cursor_location_mapping_ =
99 cursor_location_handle_->Map(sizeof(base::subtle::Atomic32));
100 if (!cursor_location_mapping_)
101 return mojo::ScopedSharedBufferHandle();
102 base::subtle::NoBarrier_Store(cursor_location_memory(),
103 current_cursor_location_);
104 }
105
106 return cursor_location_handle_->Clone(
107 mojo::SharedBufferHandle::AccessMode::READ_ONLY);
108 }
109
110
111 void UserDisplayManager::OnObserverAdded(
112 mojom::DisplayManagerObserver* observer) {
113 // Many clients key off the frame decorations to size widgets. Wait for frame
114 // decorations before notifying so that we don't have to worry about clients
115 // resizing appropriately.
116 if (!got_valid_frame_decorations_)
117 return;
118
119 CallOnDisplays(observer);
120 }
121
122 mojo::Array<mojom::DisplayPtr> UserDisplayManager::GetAllDisplays() {
123 const std::set<Display*>& displays = display_manager_->displays();
124 mojo::Array<mojom::DisplayPtr> display_ptrs(displays.size());
125 {
126 size_t i = 0;
127 // TODO(sky): need ordering!
128 for (Display* display : displays) {
129 display_ptrs[i] = display->ToMojomDisplay();
130 delegate_->GetFrameDecorationsForUser(
131 user_id_, &(display_ptrs[i]->frame_decoration_values));
132 ++i;
133 }
134 }
135 return display_ptrs;
136 }
137
138 void UserDisplayManager::CallOnDisplays(
139 mojom::DisplayManagerObserver* observer) {
140 observer->OnDisplays(GetAllDisplays());
141 }
142
143 void UserDisplayManager::AddObserver(
144 mojom::DisplayManagerObserverPtr observer) {
145 mojom::DisplayManagerObserver* observer_impl = observer.get();
146 display_manager_observers_.AddPtr(std::move(observer));
147 OnObserverAdded(observer_impl);
148 }
149
150 } // namespace ws
151 } // namespace mus
OLDNEW
« no previous file with comments | « components/mus/ws/user_display_manager.h ('k') | components/mus/ws/user_display_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698