1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef APPS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_H_ 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define APPS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_H_ 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/basictypes.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/compiler_specific.h" 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/scoped_ptr.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/aura/client/window_tree_client.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/aura/window_tree_host_observer.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS) 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/display/chromeos/display_configurator.h" 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace aura { 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass TestScreen; 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class Window; 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass WindowTreeHost; 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace client { 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class DefaultCaptureClient; 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FocusClient; 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace content { 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass BrowserContext; 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace gfx { 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class Size; 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_CHROMEOS) 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace ui { 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass UserActivityPowerManagerNotifier; 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace wm { 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class CompoundEventFilter; 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass CursorManager; 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class InputMethodEventFilter; 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass UserActivityDetector; 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace apps { 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ShellAppWindow; 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ShellAppWindowController; 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Handles desktop-related tasks for app_shell. 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class ShellDesktopController : public aura::client::WindowTreeClient, 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public aura::WindowTreeHostObserver 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS) 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) , 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public ui::DisplayConfigurator::Observer 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ShellDesktopController(); 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual ~ShellDesktopController(); 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Returns the single instance of the desktop. (Stateless functions like 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ShellAppWindowCreateFunction need to be able to access the desktop, so 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // we need a singleton somewhere). 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static ShellDesktopController* instance(); 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) aura::WindowTreeHost* host() { return host_.get(); } 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Creates the window that hosts the app. 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void CreateRootWindow(); 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Sets the controller to create/close the app windows. Takes the ownership of 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |app_window_controller|. 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void SetAppWindowController(ShellAppWindowController* app_window_controller); 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Creates a new app window and adds it to the desktop. The desktop maintains 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ownership of the window. 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ShellAppWindow* CreateAppWindow(content::BrowserContext* context); 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Closes and destroys the app windows. 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void CloseAppWindows(); 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Overridden from aura::client::WindowTreeClient: 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual aura::Window* GetDefaultParent(aura::Window* context, 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) aura::Window* window, 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const gfx::Rect& bounds) OVERRIDE; 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS) 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ui::DisplayConfigurator::Observer overrides. 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void OnDisplayModeChanged(const std::vector< 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ui::DisplayConfigurator::DisplayState>& displays) OVERRIDE; 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // aura::WindowTreeHostObserver overrides: 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnHostCloseRequested(const aura::WindowTreeHost* host) OVERRIDE; 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected: 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Creates and sets the aura clients and window manager stuff. Subclass may 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // initialize different sets of the clients. 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void InitWindowManager(); 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Closes and destroys the root window hosting the app. 108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void DestroyRootWindow(); 109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Returns the dimensions (in pixels) of the primary display, or an empty size 111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // if the dimensions can't be determined or no display is connected. 112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Size GetPrimaryDisplaySize(); 113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS) 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<ui::DisplayConfigurator> display_configurator_; 116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<aura::TestScreen> test_screen_; 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<aura::WindowTreeHost> host_; 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<wm::CompoundEventFilter> root_window_event_filter_; 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<aura::client::DefaultCaptureClient> capture_client_; 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<wm::InputMethodEventFilter> input_method_filter_; 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<aura::client::FocusClient> focus_client_; 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<wm::CursorManager> cursor_manager_; 1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<wm::UserActivityDetector> user_activity_detector_; 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_CHROMEOS) 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<ui::UserActivityPowerManagerNotifier> user_activity_notifier_; 1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The desktop supports a single app window. 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<ShellAppWindowController> app_window_controller_; 139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(ShellDesktopController); 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace apps 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif // APPS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_H_ 146