103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/extensions/display_info_provider_win.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <windows.h> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/hash.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/win/win_util.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/system_display.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/screen.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/dpi.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing core_api::system_display::DisplayUnitInfo; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)BOOL CALLBACK 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)EnumMonitorCallback(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM data) { 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisplayInfo* all_displays = reinterpret_cast<DisplayInfo*>(data); 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(all_displays); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<DisplayUnitInfo> unit(new DisplayUnitInfo); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MONITORINFOEX monitor_info; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZeroMemory(&monitor_info, sizeof(MONITORINFOEX)); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) monitor_info.cbSize = sizeof(monitor_info); 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetMonitorInfo(monitor, &monitor_info); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISPLAY_DEVICE device; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device.cb = sizeof(device); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!EnumDisplayDevices(monitor_info.szDevice, 0, &device, 0)) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return FALSE; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Size dpi(gfx::GetDPI()); 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) unit->id = 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Int64ToString(base::Hash(base::WideToUTF8(monitor_info.szDevice))); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unit->name = base::WideToUTF8(device.DeviceString); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unit->dpi_x = dpi.width(); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unit->dpi_y = dpi.height(); 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) all_displays->push_back(unit); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TRUE; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)DisplayInfoProviderWin::DisplayInfoProviderWin() { 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)DisplayInfoProviderWin::~DisplayInfoProviderWin() { 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool DisplayInfoProviderWin::SetInfo( 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& display_id, 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const core_api::system_display::DisplayProperties& info, 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string* error) { 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *error = "Not implemented"; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DisplayInfoProviderWin::UpdateDisplayUnitInfoForPlatform( 69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const gfx::Display& display, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::core_api::system_display::DisplayUnitInfo* unit) { 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisplayInfo all_displays; 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EnumDisplayMonitors( 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NULL, NULL, EnumMonitorCallback, reinterpret_cast<LPARAM>(&all_displays)); 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < all_displays.size(); ++i) { 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (unit->id == all_displays[i]->id) { 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unit->name = all_displays[i]->name; 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unit->dpi_x = all_displays[i]->dpi_x; 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unit->dpi_y = all_displays[i]->dpi_y; 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigfx::Screen* DisplayInfoProviderWin::GetActiveScreen() { 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(scottmg): native screen is wrong http://crbug.com/133312 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return gfx::Screen::GetNativeScreen(); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)DisplayInfoProvider* DisplayInfoProvider::Create() { 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return new DisplayInfoProviderWin(); 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 95