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

Unified Diff: services/ui/ws/display_manager.cc

Issue 2904993003: chromeos: changes how DisplayManagerObservers are notified (Closed)
Patch Set: cleanup Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « services/ui/ws/display_manager.h ('k') | services/ui/ws/test_utils.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/ui/ws/display_manager.cc
diff --git a/services/ui/ws/display_manager.cc b/services/ui/ws/display_manager.cc
index 6575884cac1209f67717c14e972e2202cd1eae76..a182f271fa086b7e2270ca959e263c616ba45b4d 100644
--- a/services/ui/ws/display_manager.cc
+++ b/services/ui/ws/display_manager.cc
@@ -7,11 +7,14 @@
#include <vector>
#include "base/memory/ptr_util.h"
+#include "base/stl_util.h"
#include "base/trace_event/trace_event.h"
+#include "services/ui/display/screen_manager.h"
#include "services/ui/display/viewport_metrics.h"
#include "services/ui/ws/cursor_location_manager.h"
#include "services/ui/ws/display.h"
#include "services/ui/ws/display_binding.h"
+#include "services/ui/ws/display_creation_config.h"
#include "services/ui/ws/event_dispatcher.h"
#include "services/ui/ws/frame_generator.h"
#include "services/ui/ws/server_window.h"
@@ -22,6 +25,8 @@
#include "services/ui/ws/window_manager_window_tree_factory.h"
#include "services/ui/ws/window_server_delegate.h"
#include "services/ui/ws/window_tree.h"
+#include "ui/display/display_list.h"
+#include "ui/display/screen_base.h"
#include "ui/events/event_rewriter.h"
#if defined(OS_CHROMEOS)
@@ -54,11 +59,101 @@ DisplayManager::~DisplayManager() {
DestroyAllDisplays();
}
+void DisplayManager::OnDisplayCreationConfigSet() {
+ if (window_server_->display_creation_config() ==
+ DisplayCreationConfig::MANUAL) {
+ for (const auto& pair : user_display_managers_)
+ pair.second->DisableAutomaticNotification();
+ } else {
+ // In AUTOMATIC mode SetDisplayConfiguration() is never called.
+ got_initial_config_from_window_manager_ = true;
+ }
+}
+
+bool DisplayManager::SetDisplayConfiguration(
+ const std::vector<display::Display>& displays,
+ std::vector<ui::mojom::WmViewportMetricsPtr> viewport_metrics,
+ int64_t primary_display_id) {
+ if (window_server_->display_creation_config() !=
+ DisplayCreationConfig::MANUAL) {
+ DVLOG(1) << "SetDisplayConfiguration is only valid when roots manually "
+ "created";
+ return false;
+ }
+ if (displays.size() != viewport_metrics.size()) {
+ DVLOG(1) << "SetDisplayConfiguration called with mismatch in sizes";
+ return false;
+ }
+ size_t primary_display_index = displays.size();
+ std::set<int64_t> display_ids;
+ for (size_t i = 0; i < displays.size(); ++i) {
+ const display::Display& display = displays[i];
+ if (display.id() == display::kInvalidDisplayId) {
+ DVLOG(1) << "SetDisplayConfiguration passed invalid display id";
+ return false;
+ }
+ if (!display_ids.insert(display.id()).second) {
+ DVLOG(1) << "SetDisplayConfiguration passed duplicate display id";
+ return false;
+ }
+ if (display.id() == primary_display_id)
+ primary_display_index = i;
+ Display* ws_display = GetDisplayById(display.id());
+ if (!ws_display) {
+ DVLOG(1) << "SetDisplayConfiguration passed unknown display id "
+ << display.id();
+ return false;
+ }
+ }
+ if (primary_display_index == displays.size()) {
+ DVLOG(1) << "SetDisplayConfiguration primary id not in displays";
+ return false;
+ }
+
+ display::DisplayList& display_list =
+ display::ScreenManager::GetInstance()->GetScreen()->display_list();
+ display_list.AddOrUpdateDisplay(displays[primary_display_index],
+ display::DisplayList::Type::PRIMARY);
+ for (size_t i = 0; i < displays.size(); ++i) {
+ Display* ws_display = GetDisplayById(displays[i].id());
+ DCHECK(ws_display);
+ ws_display->SetDisplay(displays[i]);
+ ws_display->SetBoundsInPixels(viewport_metrics[i]->bounds_in_pixels);
+ if (i != primary_display_index) {
+ display_list.AddOrUpdateDisplay(displays[i],
+ display::DisplayList::Type::NOT_PRIMARY);
+ }
+ }
+
+ std::set<int64_t> existing_display_ids;
+ for (const display::Display& display : display_list.displays())
+ existing_display_ids.insert(display.id());
+ std::set<int64_t> removed_display_ids =
+ base::STLSetDifference<std::set<int64_t>>(existing_display_ids,
+ display_ids);
+ for (int64_t display_id : removed_display_ids)
+ display_list.RemoveDisplay(display_id);
+
+ for (auto& pair : user_display_managers_)
+ pair.second->CallOnDisplaysChanged();
+
+ if (!got_initial_config_from_window_manager_) {
+ got_initial_config_from_window_manager_ = true;
+ window_server_->delegate()->OnFirstDisplayReady();
+ }
+
+ return true;
+}
+
UserDisplayManager* DisplayManager::GetUserDisplayManager(
const UserId& user_id) {
if (!user_display_managers_.count(user_id)) {
user_display_managers_[user_id] =
base::MakeUnique<UserDisplayManager>(window_server_, user_id);
+ if (window_server_->display_creation_config() ==
+ DisplayCreationConfig::MANUAL) {
+ user_display_managers_[user_id]->DisableAutomaticNotification();
+ }
}
return user_display_managers_[user_id].get();
}
@@ -77,10 +172,19 @@ void DisplayManager::AddDisplay(Display* display) {
pending_displays_.insert(display);
}
-void DisplayManager::AddDisplayForWindowManager(
+Display* DisplayManager::AddDisplayForWindowManager(
+ bool is_primary_display,
const display::Display& display,
const display::ViewportMetrics& metrics) {
+ DCHECK_EQ(DisplayCreationConfig::MANUAL,
+ window_server_->display_creation_config());
+ const display::DisplayList::Type display_type =
+ is_primary_display ? display::DisplayList::Type::PRIMARY
+ : display::DisplayList::Type::NOT_PRIMARY;
+ display::ScreenManager::GetInstance()->GetScreen()->display_list().AddDisplay(
+ display, display_type);
OnDisplayAdded(display, metrics);
+ return GetDisplayById(display.id());
}
void DisplayManager::DestroyDisplay(Display* display) {
@@ -180,7 +284,8 @@ WindowId DisplayManager::GetAndAdvanceNextRootId() {
void DisplayManager::OnDisplayAcceleratedWidgetAvailable(Display* display) {
DCHECK_NE(0u, pending_displays_.count(display));
DCHECK_EQ(0u, displays_.count(display));
- const bool is_first_display = displays_.empty();
+ const bool is_first_display =
+ displays_.empty() && got_initial_config_from_window_manager_;
displays_.insert(display);
pending_displays_.erase(display);
if (event_rewriter_)
@@ -212,15 +317,19 @@ void DisplayManager::OnActiveUserIdChanged(const UserId& previously_active_id,
current_window_manager_state->Activate(mouse_location_on_screen);
}
-void DisplayManager::OnDisplayAdded(const display::Display& display,
- const display::ViewportMetrics& metrics) {
- DVLOG(3) << "OnDisplayAdded: " << display.ToString();
-
+void DisplayManager::CreateDisplay(const display::Display& display,
+ const display::ViewportMetrics& metrics) {
ws::Display* ws_display = new ws::Display(window_server_);
ws_display->SetDisplay(display);
ws_display->Init(metrics, nullptr);
}
+void DisplayManager::OnDisplayAdded(const display::Display& display,
+ const display::ViewportMetrics& metrics) {
+ DVLOG(3) << "OnDisplayAdded: " << display.ToString();
+ CreateDisplay(display, metrics);
+}
+
void DisplayManager::OnDisplayRemoved(int64_t display_id) {
DVLOG(3) << "OnDisplayRemoved: " << display_id;
Display* display = GetDisplayById(display_id);
« no previous file with comments | « services/ui/ws/display_manager.h ('k') | services/ui/ws/test_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698