1 // Copyright (c) 2012 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_UI_PANELS_DISPLAY_SETTINGS_PROVIDER_H_ 6 #define CHROME_BROWSER_UI_PANELS_DISPLAY_SETTINGS_PROVIDER_H_ 7 8 #include "base/observer_list.h" 9 #include "base/timer/timer.h" 10 #include "ui/gfx/rect.h" 11 12 // Encapsulates the logic to provide display settings support, including the 13 // information for: 14 // 1) Work area 15 // 2) Auto-hiding desktop bars, like Windows taskbar and MacOSX dock. 16 class DisplaySettingsProvider { 17 public: 18 // Indicates which screen edge the desktop bar is aligned to. 19 // We do not care about the desktop aligned to the top screen edge. 20 enum DesktopBarAlignment { 21 DESKTOP_BAR_ALIGNED_BOTTOM = 0, 22 DESKTOP_BAR_ALIGNED_LEFT = 1, 23 DESKTOP_BAR_ALIGNED_RIGHT = 2 24 }; 25 26 // Indicates current visibility state of the desktop bar. 27 enum DesktopBarVisibility { 28 DESKTOP_BAR_VISIBLE, 29 DESKTOP_BAR_ANIMATING, 30 DESKTOP_BAR_HIDDEN 31 }; 32 33 class DisplayObserver { 34 public: 35 virtual void OnDisplayChanged() = 0; 36 }; 37 38 class DesktopBarObserver { 39 public: 40 virtual void OnAutoHidingDesktopBarVisibilityChanged( 41 DesktopBarAlignment alignment, DesktopBarVisibility visibility) = 0; 42 virtual void OnAutoHidingDesktopBarThicknessChanged( 43 DesktopBarAlignment alignment, int thickness) = 0; 44 }; 45 46 class FullScreenObserver { 47 public: 48 virtual void OnFullScreenModeChanged(bool is_full_screen) = 0; 49 }; 50 51 static DisplaySettingsProvider* Create(); 52 53 virtual ~DisplaySettingsProvider(); 54 55 // Subscribes/unsubscribes from the display settings change notification. 56 void AddDisplayObserver(DisplayObserver* observer); 57 void RemoveDisplayObserver(DisplayObserver* observer); 58 59 void AddDesktopBarObserver(DesktopBarObserver* observer); 60 void RemoveDesktopBarObserver(DesktopBarObserver* observer); 61 62 void AddFullScreenObserver(FullScreenObserver* observer); 63 void RemoveFullScreenObserver(FullScreenObserver* observer); 64 65 // 66 // Display Area: 67 // This is the area of a display (monitor). There could be multiple display 68 // areas. 69 // Work Area: 70 // This is the standard work area returned by the system. It is usually 71 // computed by the system as the part of display area that excludes 72 // top-most system menu or bars aligned to the screen edges. 73 // 74 75 // Returns the bounds of primary display. 76 virtual gfx::Rect GetPrimaryDisplayArea() const; 77 78 // Returns the bounds of the work area of primary display. 79 virtual gfx::Rect GetPrimaryWorkArea() const; 80 81 // Returns the bounds of the display area that most closely intersects the 82 // provided bounds. 83 virtual gfx::Rect GetDisplayAreaMatching(const gfx::Rect& bounds) const; 84 85 // Returns the bounds of the work area that most closely intersects the 86 // provided bounds. 87 virtual gfx::Rect GetWorkAreaMatching(const gfx::Rect& bounds) const; 88 89 // Invoked when the display settings has changed, due to any of the following: 90 // 1) screen resolution changes 91 // 2) the thickness of desktop bar changes 92 // 3) desktop bar switches between auto-hiding and non-auto-hiding 93 virtual void OnDisplaySettingsChanged(); 94 95 // Returns true if there is a desktop bar that is aligned to the specified 96 // screen edge and set to auto-hide. 97 virtual bool IsAutoHidingDesktopBarEnabled(DesktopBarAlignment alignment); 98 99 // Returns the thickness of the desktop bar that is aligned to the specified 100 // screen edge, when it is visible. When the desktop bar is aligned to bottom 101 // edge, this is the height of the bar. If the desktop bar is aligned to 102 // left or right edge, this is the width of the bar. 103 virtual int GetDesktopBarThickness(DesktopBarAlignment alignment) const; 104 105 // Returns the visibility state of the desktop bar that is aligned to the 106 // specified screen edge. 107 virtual DesktopBarVisibility GetDesktopBarVisibility( 108 DesktopBarAlignment alignment) const; 109 110 ObserverList<DisplayObserver>& display_observers() { 111 return display_observers_; 112 } 113 114 ObserverList<DesktopBarObserver>& desktop_bar_observers() { 115 return desktop_bar_observers_; 116 } 117 118 ObserverList<FullScreenObserver>& full_screen_observers() { 119 return full_screen_observers_; 120 } 121 122 bool is_full_screen() const { return is_full_screen_; } 123 124 protected: 125 enum FullScreenCheckMode { 126 ASSUME_FULLSCREEN_ON, 127 ASSUME_FULLSCREEN_OFF, 128 PERFORM_FULLSCREEN_CHECK 129 }; 130 131 DisplaySettingsProvider(); 132 133 // Returns true if we need to perform fullscreen check periodically. 134 virtual bool NeedsPeriodicFullScreenCheck() const; 135 136 // Returns true if full screen or presentation mode in main screen is entered. 137 virtual bool IsFullScreen(); 138 139 // Callback to perform periodic check for full screen mode changes. 140 void CheckFullScreenMode(FullScreenCheckMode check_mode); 141 142 private: 143 // Observers that listen to various display settings changes. 144 ObserverList<DisplayObserver> display_observers_; 145 ObserverList<DesktopBarObserver> desktop_bar_observers_; 146 ObserverList<FullScreenObserver> full_screen_observers_; 147 148 // True if full screen mode or presentation mode is entered. 149 bool is_full_screen_; 150 151 // Timer used to detect full-screen mode change. 152 base::RepeatingTimer<DisplaySettingsProvider> full_screen_mode_timer_; 153 154 DISALLOW_COPY_AND_ASSIGN(DisplaySettingsProvider); 155 }; 156 157 #endif // CHROME_BROWSER_UI_PANELS_DISPLAY_SETTINGS_PROVIDER_H_ 158