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