blob: d48790ad7bae2cbe66544a307ee2e4612e325f3e [file] [log] [blame]
// Copyright 2014 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/extensions/display_info_provider_win.h"
#include <windows.h>
#include <stddef.h>
#include "base/hash.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/win/win_util.h"
#include "extensions/common/api/system_display.h"
#include "ui/display/display.h"
#include "ui/display/win/dpi.h"
#include "ui/gfx/geometry/size.h"
namespace extensions {
using api::system_display::DisplayUnitInfo;
namespace {
BOOL CALLBACK
EnumMonitorCallback(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM data) {
DisplayInfoProvider::DisplayUnitInfoList* all_displays =
reinterpret_cast<DisplayInfoProvider::DisplayUnitInfoList*>(data);
DCHECK(all_displays);
DisplayUnitInfo unit;
MONITORINFOEX monitor_info;
ZeroMemory(&monitor_info, sizeof(MONITORINFOEX));
monitor_info.cbSize = sizeof(monitor_info);
GetMonitorInfo(monitor, &monitor_info);
DISPLAY_DEVICE device;
device.cb = sizeof(device);
if (!EnumDisplayDevices(monitor_info.szDevice, 0, &device, 0))
return FALSE;
unit.id =
base::Int64ToString(base::Hash(base::WideToUTF8(monitor_info.szDevice)));
unit.name = base::WideToUTF8(device.DeviceString);
all_displays->push_back(std::move(unit));
return TRUE;
}
} // namespace
DisplayInfoProviderWin::DisplayInfoProviderWin() {
}
DisplayInfoProviderWin::~DisplayInfoProviderWin() {
}
bool DisplayInfoProviderWin::SetInfo(
const std::string& display_id,
const api::system_display::DisplayProperties& info,
std::string* error) {
*error = "Not implemented";
return false;
}
void DisplayInfoProviderWin::UpdateDisplayUnitInfoForPlatform(
const display::Display& display,
extensions::api::system_display::DisplayUnitInfo* unit) {
DisplayUnitInfoList all_displays;
EnumDisplayMonitors(
NULL, NULL, EnumMonitorCallback, reinterpret_cast<LPARAM>(&all_displays));
for (size_t i = 0; i < all_displays.size(); ++i) {
if (unit->id == all_displays[i].id) {
unit->name = all_displays[i].name;
float device_scale_factor = display.device_scale_factor();
int dpi = display::win::GetDPIFromScalingFactor(device_scale_factor);
unit->dpi_x = dpi;
unit->dpi_y = dpi;
break;
}
}
}
// static
DisplayInfoProvider* DisplayInfoProvider::Create() {
return new DisplayInfoProviderWin();
}
} // namespace extensions