root/chrome/browser/ui/panels/display_settings_provider.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// Copyright (c) 2012 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_UI_PANELS_DISPLAY_SETTINGS_PROVIDER_H_
#define CHROME_BROWSER_UI_PANELS_DISPLAY_SETTINGS_PROVIDER_H_

#include "base/observer_list.h"
#include "base/timer/timer.h"
#include "ui/gfx/rect.h"

// Encapsulates the logic to provide display settings support, including the
// information for:
// 1) Work area
// 2) Auto-hiding desktop bars, like Windows taskbar and MacOSX dock.
class DisplaySettingsProvider {
 public:
  // Indicates which screen edge the desktop bar is aligned to.
  // We do not care about the desktop aligned to the top screen edge.
  enum DesktopBarAlignment {
    DESKTOP_BAR_ALIGNED_BOTTOM = 0,
    DESKTOP_BAR_ALIGNED_LEFT = 1,
    DESKTOP_BAR_ALIGNED_RIGHT = 2
  };

  // Indicates current visibility state of the desktop bar.
  enum DesktopBarVisibility {
    DESKTOP_BAR_VISIBLE,
    DESKTOP_BAR_ANIMATING,
    DESKTOP_BAR_HIDDEN
  };

  class DisplayObserver {
   public:
    virtual void OnDisplayChanged() = 0;
  };

  class DesktopBarObserver {
   public:
    virtual void OnAutoHidingDesktopBarVisibilityChanged(
        DesktopBarAlignment alignment, DesktopBarVisibility visibility) = 0;
    virtual void OnAutoHidingDesktopBarThicknessChanged(
        DesktopBarAlignment alignment, int thickness) = 0;
  };

  class FullScreenObserver {
   public:
    virtual void OnFullScreenModeChanged(bool is_full_screen) = 0;
  };

  static DisplaySettingsProvider* Create();

  virtual ~DisplaySettingsProvider();

  // Subscribes/unsubscribes from the display settings change notification.
  void AddDisplayObserver(DisplayObserver* observer);
  void RemoveDisplayObserver(DisplayObserver* observer);

  void AddDesktopBarObserver(DesktopBarObserver* observer);
  void RemoveDesktopBarObserver(DesktopBarObserver* observer);

  void AddFullScreenObserver(FullScreenObserver* observer);
  void RemoveFullScreenObserver(FullScreenObserver* observer);

  //
  // Display Area:
  //   This is the area of a display (monitor). There could be multiple display
  //   areas.
  // Work Area:
  //   This is the standard work area returned by the system. It is usually
  //   computed by the system as the part of display area that excludes
  //   top-most system menu or bars aligned to the screen edges.
  //

  // Returns the bounds of primary display.
  virtual gfx::Rect GetPrimaryDisplayArea() const;

  // Returns the bounds of the work area of primary display.
  virtual gfx::Rect GetPrimaryWorkArea() const;

  // Returns the bounds of the display area that most closely intersects the
  // provided bounds.
  virtual gfx::Rect GetDisplayAreaMatching(const gfx::Rect& bounds) const;

  // Returns the bounds of the work area that most closely intersects the
  // provided bounds.
  virtual gfx::Rect GetWorkAreaMatching(const gfx::Rect& bounds) const;

  // Invoked when the display settings has changed, due to any of the following:
  // 1) screen resolution changes
  // 2) the thickness of desktop bar changes
  // 3) desktop bar switches between auto-hiding and non-auto-hiding
  virtual void OnDisplaySettingsChanged();

  // Returns true if there is a desktop bar that is aligned to the specified
  // screen edge and set to auto-hide.
  virtual bool IsAutoHidingDesktopBarEnabled(DesktopBarAlignment alignment);

  // Returns the thickness of the desktop bar that is aligned to the specified
  // screen edge, when it is visible. When the desktop bar is aligned to bottom
  // edge, this is the height of the bar. If the desktop bar is aligned to
  // left or right edge, this is the width of the bar.
  virtual int GetDesktopBarThickness(DesktopBarAlignment alignment) const;

  // Returns the visibility state of the desktop bar that is aligned to the
  // specified screen edge.
  virtual DesktopBarVisibility GetDesktopBarVisibility(
      DesktopBarAlignment alignment) const;

  ObserverList<DisplayObserver>& display_observers() {
    return display_observers_;
  }

  ObserverList<DesktopBarObserver>& desktop_bar_observers() {
    return desktop_bar_observers_;
  }

  ObserverList<FullScreenObserver>& full_screen_observers() {
    return full_screen_observers_;
  }

  bool is_full_screen() const { return is_full_screen_; }

 protected:
  enum FullScreenCheckMode {
    ASSUME_FULLSCREEN_ON,
    ASSUME_FULLSCREEN_OFF,
    PERFORM_FULLSCREEN_CHECK
  };

  DisplaySettingsProvider();

  // Returns true if we need to perform fullscreen check periodically.
  virtual bool NeedsPeriodicFullScreenCheck() const;

  // Returns true if full screen or presentation mode in main screen is entered.
  virtual bool IsFullScreen();

  // Callback to perform periodic check for full screen mode changes.
  void CheckFullScreenMode(FullScreenCheckMode check_mode);

 private:
  // Observers that listen to various display settings changes.
  ObserverList<DisplayObserver> display_observers_;
  ObserverList<DesktopBarObserver> desktop_bar_observers_;
  ObserverList<FullScreenObserver> full_screen_observers_;

  // True if full screen mode or presentation mode is entered.
  bool is_full_screen_;

  // Timer used to detect full-screen mode change.
  base::RepeatingTimer<DisplaySettingsProvider> full_screen_mode_timer_;

  DISALLOW_COPY_AND_ASSIGN(DisplaySettingsProvider);
};

#endif  // CHROME_BROWSER_UI_PANELS_DISPLAY_SETTINGS_PROVIDER_H_

/* [<][>][^][v][top][bottom][index][help] */