1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_CHROMEOS_WM_OVERVIEW_CONTROLLER_H_ 6 #define CHROME_BROWSER_CHROMEOS_WM_OVERVIEW_CONTROLLER_H_ 7 #pragma once 8 9 #include <vector> 10 11 #include "base/memory/linked_ptr.h" 12 #include "base/memory/singleton.h" 13 #include "base/timer.h" 14 #include "chrome/browser/chromeos/wm_message_listener.h" 15 #include "chrome/browser/ui/browser_list.h" 16 #include "content/common/notification_registrar.h" 17 #include "ui/gfx/rect.h" 18 19 namespace views { 20 class Widget; 21 } 22 23 class Browser; 24 class RenderWidgetHost; 25 26 namespace chromeos { 27 28 class BrowserListener; 29 30 // WmOverviewController is responsible for managing a list of objects 31 // that listen to the browsers (BrowserListeners, defined in the 32 // source file for this class) for changes, and keep a list of 33 // snapshot images in sync with the browser tab contents. 34 // 35 // As tabs are added/removed from the browsers, the number of snapshot 36 // windows changes to match. 37 // 38 // As obtaining and setting snapshots is expensive we delay setting 39 // the snapshot. The delay is controlled by delay_timer_. Once the 40 // timer fires another timer is started (configure_timer_). This timer 41 // invokes ConfigureNextUnconfiguredCell on the BrowserListener, which 42 // obtains and sets the snapshot of the next uncofigured 43 // cell. ConfigureNextUnconfiguredCell only configures one cell at a 44 // time until they are all configured. 45 46 class WmOverviewController : public BrowserList::Observer, 47 public WmMessageListener::Observer, 48 public NotificationObserver { 49 public: 50 // These are the possible layout modes that this controller can be 51 // in. The layout mode is controlled by the window manager. 52 enum LayoutMode { 53 // ACTIVE_MODE is the mode where chrome takes up the whole screen 54 // and the user interacts with it, and this controller hides the 55 // snapshots and stops refreshing them. 56 ACTIVE_MODE, 57 58 // OVERVIEW_MODE is the mode where the toplevel windows are hidden 59 // and the user interacts with the snapshots. This is when the 60 // snapshot windows are shown and actively updated by this 61 // controller. 62 OVERVIEW_MODE, 63 }; 64 65 // This class is a singleton. 66 static WmOverviewController* GetInstance(); 67 68 // BrowserList::Observer methods OnBrowserAdded(const Browser * browser)69 void OnBrowserAdded(const Browser* browser) {} 70 void OnBrowserRemoved(const Browser* browser); 71 // End BrowserList::Observer methods 72 73 // WmMessageListener::Observer methods 74 // This is called immediately after a browser is added to the list. 75 void ProcessWmMessage(const WmIpc::Message& message, 76 GdkWindow* window); 77 // End WmMessageListener::Observer methods 78 79 // NotificationObserver methods 80 void Observe(NotificationType type, 81 const NotificationSource& source, 82 const NotificationDetails& details); 83 // End NotificationObserver methods 84 85 // Used by the BrowserListeners to configure their snapshots. monitor_bounds()86 const gfx::Rect& monitor_bounds() const { return monitor_bounds_; } 87 88 // Start reloading snapshots if in overview mode. 89 void UpdateSnapshots(); 90 91 // Starts the delay timer, and once the delay is over, configures 92 // any unconfigured snapshots one at a time until none are left to 93 // be configured. 94 void StartDelayTimer(); 95 layout_mode()96 LayoutMode layout_mode() const { return layout_mode_; } 97 98 private: 99 friend struct DefaultSingletonTraits<WmOverviewController>; 100 101 // This class is a singleton. 102 WmOverviewController(); 103 ~WmOverviewController(); 104 105 // Restores tab selections on all browsers to what they were when 106 // Show was last called. Used when cancelling overview mode. 107 void RestoreTabSelections(); 108 109 // Saves the currently selected tabs in the snapshots so that they 110 // can be restored later with RestoreTabSelections. 111 void SaveTabSelections(); 112 113 // Show the snapshot windows, saving current tab selections. 114 void Show(); 115 116 // Hide the snapshot windows. When |cancelled| is true, then the 117 // tab selections that were saved when the snapshot windows were 118 // shown are restored. 119 void Hide(bool cancelled); 120 121 // Add browser listeners for all existing browsers, reusing any that 122 // were already there. 123 void AddAllBrowsers(); 124 125 // Called when the thumbnail generator notifies us that the snapshot 126 // image changed. This determines which TabContents the given 127 // renderer is attached to, and reloads that snapshot. 128 void SnapshotImageChanged(RenderWidgetHost* renderer); 129 130 // This is so we can register for notifications. 131 NotificationRegistrar registrar_; 132 133 // This is a vector of listeners that listen to all the browsers. 134 typedef std::vector<linked_ptr<BrowserListener> > BrowserListenerVector; 135 BrowserListenerVector listeners_; 136 137 // This is the bounds of the monitor we're being displayed on. This 138 // is used to adjust the size of snapshots so they'll fit. 139 gfx::Rect monitor_bounds_; 140 141 // See description above class for details. 142 base::OneShotTimer<WmOverviewController> delay_timer_; 143 144 // The current layout mode. 145 LayoutMode layout_mode_; 146 147 // This flag is set whenever there is a pending |AskForSnapshot| to Chrome; 148 // This is used to prevent |UpdateSnapshots| from being called multiple times. 149 bool updating_snapshots_; 150 151 // These indices are used to track the last updated browser listener and tab 152 // content, They are used to implement update tab contents in a round-robin 153 // fashion. 154 int browser_listener_index_; // index of the last updated browser listener. 155 int tab_contents_index_; // index of the last updated tab contents. 156 157 DISALLOW_COPY_AND_ASSIGN(WmOverviewController); 158 }; 159 160 } // namespace chromeos 161 162 #endif // CHROME_BROWSER_CHROMEOS_WM_OVERVIEW_CONTROLLER_H_ 163