Home | History | Annotate | Download | only in system_display
      1 // Copyright 2013 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/api/system_display/display_info_provider.h"
      6 
      7 #include <windows.h>
      8 
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "ui/base/win/dpi.h"
     11 #include "ui/gfx/display.h"
     12 #include "ui/gfx/size.h"
     13 
     14 namespace extensions {
     15 
     16 using api::system_display::Bounds;
     17 using api::system_display::DisplayUnitInfo;
     18 
     19 namespace {
     20 
     21 BOOL CALLBACK EnumMonitorCallback(HMONITOR monitor,
     22                                   HDC hdc,
     23                                   LPRECT rect,
     24                                   LPARAM data) {
     25   DisplayInfo* display_info =
     26       reinterpret_cast<DisplayInfo*>(data);
     27   DCHECK(display_info);
     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::Display display(0, gfx::Rect(monitor_info.rcMonitor));
     42   display.set_work_area(gfx::Rect(monitor_info.rcWork));
     43 
     44   gfx::Size dpi(ui::GetDPI());
     45   unit->id = WideToUTF8(device.DeviceID);
     46   unit->name = WideToUTF8(device.DeviceString);
     47   unit->is_primary = monitor_info.dwFlags & MONITORINFOF_PRIMARY ? true : false;
     48 
     49   // TODO(hongbo): Figure out how to determine whether the display monitor is
     50   // internal or not.
     51   unit->is_internal = false;
     52   unit->is_enabled = device.StateFlags & DISPLAY_DEVICE_ACTIVE ? true : false;
     53   unit->dpi_x = dpi.width();
     54   unit->dpi_y = dpi.height();
     55   unit->bounds.left = display.bounds().x();
     56   unit->bounds.top = display.bounds().y();
     57   unit->bounds.width = display.bounds().width();
     58   unit->bounds.height = display.bounds().height();
     59   unit->work_area.left = display.work_area().x();
     60   unit->work_area.top = display.work_area().y();
     61   unit->work_area.width = display.work_area().width();
     62   unit->work_area.height = display.work_area().height();
     63   display_info->push_back(unit);
     64 
     65   return TRUE;
     66 }
     67 
     68 }  // namespace
     69 
     70 void DisplayInfoProvider::RequestInfo(const RequestInfoCallback& callback) {
     71   // Redirect the request to a worker pool thread.
     72   StartQueryInfo(callback);
     73 }
     74 
     75 void DisplayInfoProvider::SetInfo(
     76     const std::string& display_id,
     77     const api::system_display::DisplayProperties& info,
     78     const SetInfoCallback& callback) {
     79   base::MessageLoopProxy::current()->PostTask(
     80       FROM_HERE,
     81       base::Bind(callback, false, "Not implemented"));
     82 }
     83 
     84 bool DisplayInfoProvider::QueryInfo() {
     85   info_.clear();
     86 
     87   if (EnumDisplayMonitors(NULL, NULL, EnumMonitorCallback,
     88         reinterpret_cast<LPARAM>(&info_)))
     89     return true;
     90   return false;
     91 }
     92 
     93 }  // namespace extensions
     94