shell_desktop_controller.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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;
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Handles desktop-related tasks for app_shell.
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class ShellDesktopController : public aura::client::WindowTreeClient,
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                               public aura::WindowTreeHostObserver
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS)
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                               ,
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                               public ui::DisplayConfigurator::Observer
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                               {
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ShellDesktopController();
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~ShellDesktopController();
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Returns the single instance of the desktop. (Stateless functions like
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // ShellAppWindowCreateFunction need to be able to access the desktop, so
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // we need a singleton somewhere).
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  static ShellDesktopController* instance();
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  aura::WindowTreeHost* host() { return host_.get(); }
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Creates the window that hosts the app.
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void CreateRootWindow();
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Creates a new app window and adds it to the desktop. The desktop maintains
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // ownership of the window.
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ShellAppWindow* CreateAppWindow(content::BrowserContext* context);
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Closes and destroys the app window.
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void CloseAppWindow();
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Overridden from aura::client::WindowTreeClient:
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual aura::Window* GetDefaultParent(aura::Window* context,
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                         aura::Window* window,
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                         const gfx::Rect& bounds) OVERRIDE;
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS)
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // ui::DisplayConfigurator::Observer overrides.
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void OnDisplayModeChanged(const std::vector<
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ui::DisplayConfigurator::DisplayState>& displays) OVERRIDE;
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // aura::WindowTreeHostObserver overrides:
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void OnHostCloseRequested(const aura::WindowTreeHost* host) OVERRIDE;
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected:
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Creates and sets the aura clients and window manager stuff. Subclass may
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // initialize different sets of the clients.
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void InitWindowManager();
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Closes and destroys the root window hosting the app.
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void DestroyRootWindow();
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns the dimensions (in pixels) of the primary display, or an empty size
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // if the dimensions can't be determined or no display is connected.
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Size GetPrimaryDisplaySize();
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS)
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<ui::DisplayConfigurator> display_configurator_;
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<aura::TestScreen> test_screen_;
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<aura::WindowTreeHost> host_;
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<wm::CompoundEventFilter> root_window_event_filter_;
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<aura::client::DefaultCaptureClient> capture_client_;
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<wm::InputMethodEventFilter> input_method_filter_;
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<aura::client::FocusClient> focus_client_;
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<wm::CursorManager> cursor_manager_;
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<wm::UserActivityDetector> user_activity_detector_;
1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_CHROMEOS)
1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<ui::UserActivityPowerManagerNotifier> user_activity_notifier_;
1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The desktop supports a single app window.
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<ShellAppWindow> app_window_;
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ShellDesktopController);
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace apps
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // APPS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_H_
141