blob: f68de6a84618e0d9676b2d8a7ffd7a8e1b30b627 [file] [log] [blame]
// Copyright 2013 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/api/system_display/display_info_provider.h"
#include <windows.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 "ui/gfx/size.h"
#include "ui/gfx/win/dpi.h"
namespace extensions {
using api::system_display::DisplayUnitInfo;
namespace {
BOOL CALLBACK EnumMonitorCallback(HMONITOR monitor,
HDC hdc,
LPRECT rect,
LPARAM data) {
DisplayInfo* all_displays = reinterpret_cast<DisplayInfo*>(data);
DCHECK(all_displays);
linked_ptr<DisplayUnitInfo> unit(new DisplayUnitInfo);
MONITORINFOEX monitor_info;
ZeroMemory(&monitor_info, sizeof(MONITORINFOEX));
monitor_info.cbSize = sizeof(monitor_info);
base::win::GetMonitorInfoWrapper(monitor, &monitor_info);
DISPLAY_DEVICE device;
device.cb = sizeof(device);
if (!EnumDisplayDevices(monitor_info.szDevice, 0, &device, 0))
return FALSE;
gfx::Size dpi(gfx::GetDPI());
unit->id = base::Int64ToString(base::Hash(WideToUTF8(monitor_info.szDevice)));
unit->name = WideToUTF8(device.DeviceString);
unit->dpi_x = dpi.width();
unit->dpi_y = dpi.height();
all_displays->push_back(unit);
return TRUE;
}
} // namespace
bool DisplayInfoProvider::SetInfo(const std::string& display_id,
const api::system_display::DisplayProperties& info,
std::string* error) {
*error = "Not implemented";
return false;
}
void DisplayInfoProvider::UpdateDisplayUnitInfoForPlatform(
const gfx::Display& display,
extensions::api::system_display::DisplayUnitInfo* unit) {
DisplayInfo 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;
unit->dpi_x = all_displays[i]->dpi_x;
unit->dpi_y = all_displays[i]->dpi_y;
break;
}
}
}
} // namespace extensions