15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen_win.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/hash.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/win/win_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/dpi.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MONITORINFOEX GetMonitorInfoForMonitor(HMONITOR monitor) {
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MONITORINFOEX monitor_info;
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ZeroMemory(&monitor_info, sizeof(MONITORINFOEX));
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  monitor_info.cbSize = sizeof(monitor_info);
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetMonitorInfo(monitor, &monitor_info);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return monitor_info;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Display GetDisplay(MONITORINFOEX& monitor_info) {
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 id = static_cast<int64>(
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Hash(base::WideToUTF8(monitor_info.szDevice)));
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds = gfx::Rect(monitor_info.rcMonitor);
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Display display(id, bounds);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  display.set_work_area(gfx::Rect(monitor_info.rcWork));
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  display.SetScaleAndBounds(gfx::win::GetDeviceScaleFactor(), bounds);
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DEVMODE mode;
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  memset(&mode, 0, sizeof(DEVMODE));
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  mode.dmSize = sizeof(DEVMODE);
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  mode.dmDriverExtra = 0;
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (EnumDisplaySettings(monitor_info.szDevice,
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          ENUM_CURRENT_SETTINGS,
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          &mode)) {
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    switch (mode.dmDisplayOrientation) {
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case DMDO_DEFAULT:
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display.set_rotation(gfx::Display::ROTATE_0);
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case DMDO_90:
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display.set_rotation(gfx::Display::ROTATE_90);
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case DMDO_180:
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display.set_rotation(gfx::Display::ROTATE_180);
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case DMDO_270:
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display.set_rotation(gfx::Display::ROTATE_270);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    default:
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NOTREACHED();
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return display;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)BOOL CALLBACK EnumMonitorCallback(HMONITOR monitor,
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  HDC hdc,
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  LPRECT rect,
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  LPARAM data) {
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<gfx::Display>* all_displays =
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      reinterpret_cast<std::vector<gfx::Display>*>(data);
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(all_displays);
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MONITORINFOEX monitor_info = GetMonitorInfoForMonitor(monitor);
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Display display = GetDisplay(monitor_info);
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  all_displays->push_back(display);
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return TRUE;
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)std::vector<gfx::Display> GetDisplays() {
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<gfx::Display> displays;
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EnumDisplayMonitors(NULL, NULL, EnumMonitorCallback,
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      reinterpret_cast<LPARAM>(&displays));
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return displays;
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ScreenWin::ScreenWin()
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : displays_(GetDisplays()) {
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SingletonHwnd::GetInstance()->AddObserver(this);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScreenWin::~ScreenWin() {
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SingletonHwnd::GetInstance()->RemoveObserver(this);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ScreenWin::IsDIPEnabled() {
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return IsInHighDPIMode();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point ScreenWin::GetCursorScreenPoint() {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  POINT pt;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetCursorPos(&pt);
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  gfx::Point cursor_pos_pixels(pt);
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return gfx::win::ScreenToDIPPoint(cursor_pos_pixels);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)gfx::NativeWindow ScreenWin::GetWindowUnderCursor() {
108424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  POINT cursor_loc;
109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  HWND hwnd = GetCursorPos(&cursor_loc) ? WindowFromPoint(cursor_loc) : NULL;
110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return GetNativeWindowFromHWND(hwnd);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)gfx::NativeWindow ScreenWin::GetWindowAtScreenPoint(const gfx::Point& point) {
1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  gfx::Point point_in_pixels = gfx::win::DIPToScreenPoint(point);
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return GetNativeWindowFromHWND(WindowFromPoint(point_in_pixels.ToPOINT()));
116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int ScreenWin::GetNumDisplays() const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetSystemMetrics(SM_CMONITORS);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)std::vector<gfx::Display> ScreenWin::GetAllDisplays() const {
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return displays_;
124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display ScreenWin::GetDisplayNearestWindow(gfx::NativeView window) const {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND window_hwnd = GetHWNDFromNativeView(window);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!window_hwnd) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // When |window| isn't rooted to a display, we should just return the
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // default display so we get some correct display information like the
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // scaling factor.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return GetPrimaryDisplay();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MONITORINFOEX monitor_info;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  monitor_info.cbSize = sizeof(monitor_info);
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetMonitorInfo(MonitorFromWindow(window_hwnd, MONITOR_DEFAULTTONEAREST),
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 &monitor_info);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetDisplay(monitor_info);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display ScreenWin::GetDisplayNearestPoint(const gfx::Point& point) const {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  POINT initial_loc = { point.x(), point.y() };
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HMONITOR monitor = MonitorFromPoint(initial_loc, MONITOR_DEFAULTTONEAREST);
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MONITORINFOEX mi;
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ZeroMemory(&mi, sizeof(MONITORINFOEX));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mi.cbSize = sizeof(mi);
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (monitor && GetMonitorInfo(monitor, &mi)) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetDisplay(mi);
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Display();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display ScreenWin::GetDisplayMatching(const gfx::Rect& match_rect) const {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT other_bounds_rect = match_rect.ToRECT();
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MONITORINFOEX monitor_info = GetMonitorInfoForMonitor(MonitorFromRect(
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &other_bounds_rect, MONITOR_DEFAULTTONEAREST));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetDisplay(monitor_info);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display ScreenWin::GetPrimaryDisplay() const {
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MONITORINFOEX mi = GetMonitorInfoForMonitor(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MonitorFromWindow(NULL, MONITOR_DEFAULTTOPRIMARY));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display display = GetDisplay(mi);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(kevers|girard): Test if these checks can be reintroduced for high-DIP
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // once more of the app is DIP-aware.
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!(IsInHighDPIMode() || IsHighDPIEnabled())) {
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DCHECK_EQ(GetSystemMetrics(SM_CXSCREEN), display.size().width());
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DCHECK_EQ(GetSystemMetrics(SM_CYSCREEN), display.size().height());
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return display;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScreenWin::AddObserver(DisplayObserver* observer) {
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier_.AddObserver(observer);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScreenWin::RemoveObserver(DisplayObserver* observer) {
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier_.RemoveObserver(observer);
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ScreenWin::OnWndProc(HWND hwnd,
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          UINT message,
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          WPARAM wparam,
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          LPARAM lparam) {
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (message != WM_DISPLAYCHANGE)
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<gfx::Display> old_displays = displays_;
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  displays_ = GetDisplays();
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier_.NotifyDisplaysChanged(old_displays, displays_);
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HWND ScreenWin::GetHWNDFromNativeView(NativeView window) const {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWindow ScreenWin::GetNativeWindowFromHWND(HWND hwnd) const {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
206