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