1// Copyright 2014 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 "chrome/browser/extensions/display_info_provider_win.h" 6 7#include <windows.h> 8 9#include "base/hash.h" 10#include "base/strings/string_number_conversions.h" 11#include "base/strings/utf_string_conversions.h" 12#include "base/win/win_util.h" 13#include "extensions/common/api/system_display.h" 14#include "ui/gfx/screen.h" 15#include "ui/gfx/size.h" 16#include "ui/gfx/win/dpi.h" 17 18namespace extensions { 19 20using core_api::system_display::DisplayUnitInfo; 21 22namespace { 23 24BOOL CALLBACK 25EnumMonitorCallback(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM data) { 26 DisplayInfo* all_displays = reinterpret_cast<DisplayInfo*>(data); 27 DCHECK(all_displays); 28 29 linked_ptr<DisplayUnitInfo> unit(new DisplayUnitInfo); 30 31 MONITORINFOEX monitor_info; 32 ZeroMemory(&monitor_info, sizeof(MONITORINFOEX)); 33 monitor_info.cbSize = sizeof(monitor_info); 34 GetMonitorInfo(monitor, &monitor_info); 35 36 DISPLAY_DEVICE device; 37 device.cb = sizeof(device); 38 if (!EnumDisplayDevices(monitor_info.szDevice, 0, &device, 0)) 39 return FALSE; 40 41 gfx::Size dpi(gfx::GetDPI()); 42 unit->id = 43 base::Int64ToString(base::Hash(base::WideToUTF8(monitor_info.szDevice))); 44 unit->name = base::WideToUTF8(device.DeviceString); 45 unit->dpi_x = dpi.width(); 46 unit->dpi_y = dpi.height(); 47 all_displays->push_back(unit); 48 49 return TRUE; 50} 51 52} // namespace 53 54DisplayInfoProviderWin::DisplayInfoProviderWin() { 55} 56 57DisplayInfoProviderWin::~DisplayInfoProviderWin() { 58} 59 60bool DisplayInfoProviderWin::SetInfo( 61 const std::string& display_id, 62 const core_api::system_display::DisplayProperties& info, 63 std::string* error) { 64 *error = "Not implemented"; 65 return false; 66} 67 68void DisplayInfoProviderWin::UpdateDisplayUnitInfoForPlatform( 69 const gfx::Display& display, 70 extensions::core_api::system_display::DisplayUnitInfo* unit) { 71 DisplayInfo all_displays; 72 EnumDisplayMonitors( 73 NULL, NULL, EnumMonitorCallback, reinterpret_cast<LPARAM>(&all_displays)); 74 for (size_t i = 0; i < all_displays.size(); ++i) { 75 if (unit->id == all_displays[i]->id) { 76 unit->name = all_displays[i]->name; 77 unit->dpi_x = all_displays[i]->dpi_x; 78 unit->dpi_y = all_displays[i]->dpi_y; 79 break; 80 } 81 } 82} 83 84gfx::Screen* DisplayInfoProviderWin::GetActiveScreen() { 85 // TODO(scottmg): native screen is wrong http://crbug.com/133312 86 return gfx::Screen::GetNativeScreen(); 87} 88 89// static 90DisplayInfoProvider* DisplayInfoProvider::Create() { 91 return new DisplayInfoProviderWin(); 92} 93 94} // namespace extensions 95