Home | History | Annotate | Download | only in desktop_aura
      1 // Copyright (c) 2012 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 "ui/views/widget/desktop_aura/desktop_screen_position_client.h"
      6 
      7 #include "ui/aura/window_tree_host.h"
      8 #include "ui/gfx/display.h"
      9 #include "ui/gfx/point_conversions.h"
     10 #include "ui/gfx/screen.h"
     11 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
     12 
     13 namespace views {
     14 
     15 namespace {
     16 
     17 gfx::Point GetOrigin(const aura::Window* root_window) {
     18   gfx::Point origin_in_pixels = root_window->GetHost()->GetBounds().origin();
     19   aura::Window* window = const_cast<aura::Window*>(root_window);
     20   float scale = gfx::Screen::GetScreenFor(window)->
     21        GetDisplayNearestWindow(window).device_scale_factor();
     22   return gfx::ToFlooredPoint(gfx::ScalePoint(origin_in_pixels, 1 / scale));
     23 }
     24 
     25 // Returns true if bounds passed to window are treated as though they are in
     26 // screen coordinates.
     27 bool PositionWindowInScreenCoordinates(aura::Window* window) {
     28   if (window->type() == ui::wm::WINDOW_TYPE_POPUP)
     29     return true;
     30 
     31   Widget* widget = Widget::GetWidgetForNativeView(window);
     32   return widget && widget->is_top_level();
     33 }
     34 
     35 }  // namespace
     36 
     37 DesktopScreenPositionClient::DesktopScreenPositionClient(
     38     aura::Window* root_window)
     39     : root_window_(root_window) {
     40   aura::client::SetScreenPositionClient(root_window_, this);
     41 }
     42 
     43 DesktopScreenPositionClient::~DesktopScreenPositionClient() {
     44   aura::client::SetScreenPositionClient(root_window_, NULL);
     45 }
     46 
     47 void DesktopScreenPositionClient::ConvertPointToScreen(
     48     const aura::Window* window,
     49     gfx::Point* point) {
     50   const aura::Window* root_window = window->GetRootWindow();
     51   aura::Window::ConvertPointToTarget(window, root_window, point);
     52   gfx::Point origin = GetOrigin(root_window);
     53   point->Offset(origin.x(), origin.y());
     54 }
     55 
     56 void DesktopScreenPositionClient::ConvertPointFromScreen(
     57     const aura::Window* window,
     58     gfx::Point* point) {
     59   const aura::Window* root_window = window->GetRootWindow();
     60   gfx::Point origin = GetOrigin(root_window);
     61   point->Offset(-origin.x(), -origin.y());
     62   aura::Window::ConvertPointToTarget(root_window, window, point);
     63 }
     64 
     65 void DesktopScreenPositionClient::ConvertHostPointToScreen(aura::Window* window,
     66                                                            gfx::Point* point) {
     67   aura::Window* root_window = window->GetRootWindow();
     68   ConvertPointToScreen(root_window, point);
     69 }
     70 
     71 void DesktopScreenPositionClient::SetBounds(aura::Window* window,
     72                                             const gfx::Rect& bounds,
     73                                             const gfx::Display& display) {
     74   // TODO: Use the 3rd parameter, |display|.
     75   aura::Window* root = window->GetRootWindow();
     76 
     77   // This method assumes that |window| does not have an associated
     78   // DesktopNativeWidgetAura.
     79   internal::NativeWidgetPrivate* desktop_native_widget =
     80       DesktopNativeWidgetAura::ForWindow(root);
     81   DCHECK(!desktop_native_widget ||
     82          desktop_native_widget->GetNativeView() != window);
     83 
     84   if (PositionWindowInScreenCoordinates(window)) {
     85     // The caller expects windows we consider "embedded" to be placed in the
     86     // screen coordinate system. So we need to offset the root window's
     87     // position (which is in screen coordinates) from these bounds.
     88 
     89     gfx::Point origin = bounds.origin();
     90     aura::Window::ConvertPointToTarget(window->parent(), root, &origin);
     91 
     92     gfx::Point host_origin = GetOrigin(root);
     93     origin.Offset(-host_origin.x(), -host_origin.y());
     94     window->SetBounds(gfx::Rect(origin, bounds.size()));
     95     return;
     96   }
     97 
     98   window->SetBounds(bounds);
     99 }
    100 
    101 }  // namespace views
    102