blob: ef5b49141363d6e1f25b3f86873b28e3793bf878 [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_WM_OVERVIEW_CONTROLLER_H_
#define CHROME_BROWSER_CHROMEOS_WM_OVERVIEW_CONTROLLER_H_
#pragma once
#include <vector>
#include "base/memory/linked_ptr.h"
#include "base/memory/singleton.h"
#include "base/timer.h"
#include "chrome/browser/chromeos/wm_message_listener.h"
#include "chrome/browser/ui/browser_list.h"
#include "content/common/notification_registrar.h"
#include "ui/gfx/rect.h"
namespace views {
class Widget;
}
class Browser;
class RenderWidgetHost;
namespace chromeos {
class BrowserListener;
// WmOverviewController is responsible for managing a list of objects
// that listen to the browsers (BrowserListeners, defined in the
// source file for this class) for changes, and keep a list of
// snapshot images in sync with the browser tab contents.
//
// As tabs are added/removed from the browsers, the number of snapshot
// windows changes to match.
//
// As obtaining and setting snapshots is expensive we delay setting
// the snapshot. The delay is controlled by delay_timer_. Once the
// timer fires another timer is started (configure_timer_). This timer
// invokes ConfigureNextUnconfiguredCell on the BrowserListener, which
// obtains and sets the snapshot of the next uncofigured
// cell. ConfigureNextUnconfiguredCell only configures one cell at a
// time until they are all configured.
class WmOverviewController : public BrowserList::Observer,
public WmMessageListener::Observer,
public NotificationObserver {
public:
// These are the possible layout modes that this controller can be
// in. The layout mode is controlled by the window manager.
enum LayoutMode {
// ACTIVE_MODE is the mode where chrome takes up the whole screen
// and the user interacts with it, and this controller hides the
// snapshots and stops refreshing them.
ACTIVE_MODE,
// OVERVIEW_MODE is the mode where the toplevel windows are hidden
// and the user interacts with the snapshots. This is when the
// snapshot windows are shown and actively updated by this
// controller.
OVERVIEW_MODE,
};
// This class is a singleton.
static WmOverviewController* GetInstance();
// BrowserList::Observer methods
void OnBrowserAdded(const Browser* browser) {}
void OnBrowserRemoved(const Browser* browser);
// End BrowserList::Observer methods
// WmMessageListener::Observer methods
// This is called immediately after a browser is added to the list.
void ProcessWmMessage(const WmIpc::Message& message,
GdkWindow* window);
// End WmMessageListener::Observer methods
// NotificationObserver methods
void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// End NotificationObserver methods
// Used by the BrowserListeners to configure their snapshots.
const gfx::Rect& monitor_bounds() const { return monitor_bounds_; }
// Start reloading snapshots if in overview mode.
void UpdateSnapshots();
// Starts the delay timer, and once the delay is over, configures
// any unconfigured snapshots one at a time until none are left to
// be configured.
void StartDelayTimer();
LayoutMode layout_mode() const { return layout_mode_; }
private:
friend struct DefaultSingletonTraits<WmOverviewController>;
// This class is a singleton.
WmOverviewController();
~WmOverviewController();
// Restores tab selections on all browsers to what they were when
// Show was last called. Used when cancelling overview mode.
void RestoreTabSelections();
// Saves the currently selected tabs in the snapshots so that they
// can be restored later with RestoreTabSelections.
void SaveTabSelections();
// Show the snapshot windows, saving current tab selections.
void Show();
// Hide the snapshot windows. When |cancelled| is true, then the
// tab selections that were saved when the snapshot windows were
// shown are restored.
void Hide(bool cancelled);
// Add browser listeners for all existing browsers, reusing any that
// were already there.
void AddAllBrowsers();
// Called when the thumbnail generator notifies us that the snapshot
// image changed. This determines which TabContents the given
// renderer is attached to, and reloads that snapshot.
void SnapshotImageChanged(RenderWidgetHost* renderer);
// This is so we can register for notifications.
NotificationRegistrar registrar_;
// This is a vector of listeners that listen to all the browsers.
typedef std::vector<linked_ptr<BrowserListener> > BrowserListenerVector;
BrowserListenerVector listeners_;
// This is the bounds of the monitor we're being displayed on. This
// is used to adjust the size of snapshots so they'll fit.
gfx::Rect monitor_bounds_;
// See description above class for details.
base::OneShotTimer<WmOverviewController> delay_timer_;
// The current layout mode.
LayoutMode layout_mode_;
// This flag is set whenever there is a pending |AskForSnapshot| to Chrome;
// This is used to prevent |UpdateSnapshots| from being called multiple times.
bool updating_snapshots_;
// These indices are used to track the last updated browser listener and tab
// content, They are used to implement update tab contents in a round-robin
// fashion.
int browser_listener_index_; // index of the last updated browser listener.
int tab_contents_index_; // index of the last updated tab contents.
DISALLOW_COPY_AND_ASSIGN(WmOverviewController);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_WM_OVERVIEW_CONTROLLER_H_