blob: a30bfef590573afb15dc0734b9d49153bf475c4b [file] [log] [blame]
// Copyright 2021 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 "chrome/browser/chromeos/full_restore/arc_window_utils.h"
#include "ash/public/cpp/ash_features.h"
#include "components/arc/arc_util.h"
#include "components/exo/wm_helper.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
namespace {
void ScaleToRoundedRect(apps::mojom::Rect* rect, double scale_factor) {
if (rect == nullptr)
return;
auto res_rect = gfx::ScaleToRoundedRect(
gfx::Rect(rect->x, rect->y, rect->width, rect->height), scale_factor);
rect->x = res_rect.x();
rect->y = res_rect.y();
rect->width = res_rect.width();
rect->height = res_rect.height();
}
} // namespace
namespace chromeos {
namespace full_restore {
bool IsArcGhostWindowEnabled() {
return ash::features::IsFullRestoreEnabled() &&
ash::features::IsArcGhostWindowEnabled() && arc::IsArcVmEnabled() &&
exo::WMHelper::HasInstance();
}
base::Optional<double> GetDisplayScaleFactor(int64_t display_id) {
display::Display display;
if (display::Screen::GetScreen()->GetDisplayWithDisplayId(display_id,
&display)) {
return display.device_scale_factor();
}
return base::nullopt;
}
apps::mojom::WindowInfoPtr HandleArcWindowInfo(
apps::mojom::WindowInfoPtr window_info) {
// Remove ARC bounds info if the ghost window disabled. The bounds will
// be controlled by ARC.
if (!IsArcGhostWindowEnabled()) {
window_info->bounds.reset();
return window_info;
}
auto scale_factor = GetDisplayScaleFactor(window_info->display_id);
// Remove ARC bounds info if the the display doesn't exist. The bounds will
// be controlled by ARC.
if (!scale_factor.has_value()) {
window_info->bounds.reset();
return window_info;
}
ScaleToRoundedRect(window_info->bounds.get(), scale_factor.value());
return window_info;
}
} // namespace full_restore
} // namespace chromeos