Home | History | Annotate | Download | only in host
      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 "ash/host/ash_window_tree_host.h"
      6 
      7 #include "ash/ash_export.h"
      8 #include "ash/ash_switches.h"
      9 #include "ash/host/ash_remote_window_tree_host_win.h"
     10 #include "ash/host/ash_window_tree_host_init_params.h"
     11 #include "ash/host/root_window_transformer.h"
     12 #include "ash/host/transformer_helper.h"
     13 #include "base/command_line.h"
     14 #include "base/win/windows_version.h"
     15 #include "ui/aura/window_tree_host_win.h"
     16 #include "ui/gfx/geometry/insets.h"
     17 #include "ui/gfx/transform.h"
     18 
     19 namespace ash {
     20 namespace {
     21 
     22 class AshWindowTreeHostWin : public AshWindowTreeHost,
     23                              public aura::WindowTreeHostWin {
     24  public:
     25   explicit AshWindowTreeHostWin(const gfx::Rect& initial_bounds)
     26       : aura::WindowTreeHostWin(initial_bounds),
     27         fullscreen_(false),
     28         saved_window_style_(0),
     29         saved_window_ex_style_(0),
     30         transformer_helper_(this) {}
     31   virtual ~AshWindowTreeHostWin() {}
     32 
     33  private:
     34   // AshWindowTreeHost:
     35   virtual void ToggleFullScreen() OVERRIDE {
     36     gfx::Rect target_rect;
     37     if (!fullscreen_) {
     38       fullscreen_ = true;
     39       saved_window_style_ = GetWindowLong(hwnd(), GWL_STYLE);
     40       saved_window_ex_style_ = GetWindowLong(hwnd(), GWL_EXSTYLE);
     41       GetWindowRect(hwnd(), &saved_window_rect_);
     42       SetWindowLong(hwnd(),
     43                     GWL_STYLE,
     44                     saved_window_style_ & ~(WS_CAPTION | WS_THICKFRAME));
     45       SetWindowLong(
     46           hwnd(),
     47           GWL_EXSTYLE,
     48           saved_window_ex_style_ & ~(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE |
     49                                      WS_EX_CLIENTEDGE | WS_EX_STATICEDGE));
     50 
     51       MONITORINFO mi;
     52       mi.cbSize = sizeof(mi);
     53       GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTONEAREST), &mi);
     54       target_rect = gfx::Rect(mi.rcMonitor);
     55     } else {
     56       fullscreen_ = false;
     57       SetWindowLong(hwnd(), GWL_STYLE, saved_window_style_);
     58       SetWindowLong(hwnd(), GWL_EXSTYLE, saved_window_ex_style_);
     59       target_rect = gfx::Rect(saved_window_rect_);
     60     }
     61     SetWindowPos(hwnd(),
     62                  NULL,
     63                  target_rect.x(),
     64                  target_rect.y(),
     65                  target_rect.width(),
     66                  target_rect.height(),
     67                  SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
     68   }
     69   virtual bool ConfineCursorToRootWindow() OVERRIDE { return false; }
     70   virtual void UnConfineCursor() OVERRIDE { NOTIMPLEMENTED(); }
     71   virtual void SetRootWindowTransformer(
     72       scoped_ptr<RootWindowTransformer> transformer) {
     73     transformer_helper_.SetRootWindowTransformer(transformer.Pass());
     74   }
     75   virtual gfx::Insets GetHostInsets() const OVERRIDE {
     76     return transformer_helper_.GetHostInsets();
     77   }
     78   virtual aura::WindowTreeHost* AsWindowTreeHost() OVERRIDE { return this; }
     79 
     80   // WindowTreeHostWin:
     81   virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE {
     82     if (fullscreen_) {
     83       saved_window_rect_.right = saved_window_rect_.left + bounds.width();
     84       saved_window_rect_.bottom = saved_window_rect_.top + bounds.height();
     85       return;
     86     }
     87     WindowTreeHostWin::SetBounds(bounds);
     88   }
     89   virtual void SetRootTransform(const gfx::Transform& transform) OVERRIDE {
     90     transformer_helper_.SetTransform(transform);
     91   }
     92   gfx::Transform GetRootTransform() const {
     93     return transformer_helper_.GetTransform();
     94   }
     95   virtual gfx::Transform GetInverseRootTransform() const OVERRIDE {
     96     return transformer_helper_.GetInverseTransform();
     97   }
     98   virtual void UpdateRootWindowSize(const gfx::Size& host_size) OVERRIDE {
     99     transformer_helper_.UpdateWindowSize(host_size);
    100   }
    101 
    102   bool fullscreen_;
    103   RECT saved_window_rect_;
    104   DWORD saved_window_style_;
    105   DWORD saved_window_ex_style_;
    106 
    107   TransformerHelper transformer_helper_;
    108 
    109   DISALLOW_COPY_AND_ASSIGN(AshWindowTreeHostWin);
    110 };
    111 
    112 }  // namespace
    113 
    114 AshWindowTreeHost* AshWindowTreeHost::Create(
    115     const AshWindowTreeHostInitParams& init_params) {
    116   if (base::win::GetVersion() >= base::win::VERSION_WIN7 &&
    117       !CommandLine::ForCurrentProcess()->HasSwitch(
    118           ash::switches::kForceAshToDesktop))
    119     return new AshRemoteWindowTreeHostWin(init_params.remote_hwnd);
    120 
    121   return new AshWindowTreeHostWin(init_params.initial_bounds);
    122 }
    123 
    124 }  // namespace ash
    125