OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROMEOS_DISPLAY_OUTPUT_CONFIGURATOR_H_ | 5 #ifndef CHROMEOS_DISPLAY_OUTPUT_CONFIGURATOR_H_ |
6 #define CHROMEOS_DISPLAY_OUTPUT_CONFIGURATOR_H_ | 6 #define CHROMEOS_DISPLAY_OUTPUT_CONFIGURATOR_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/event_types.h" | 9 #include "base/event_types.h" |
| 10 #include "base/observer_list.h" |
10 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
11 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
12 #include "chromeos/chromeos_export.h" | 13 #include "chromeos/chromeos_export.h" |
13 | 14 |
14 // Forward declarations for Xlib and Xrandr. | 15 // Forward declarations for Xlib and Xrandr. |
15 // This is so unused X definitions don't pollute the namespace. | 16 // This is so unused X definitions don't pollute the namespace. |
16 typedef unsigned long XID; | 17 typedef unsigned long XID; |
17 typedef XID Window; | 18 typedef XID Window; |
18 typedef XID RROutput; | 19 typedef XID RROutput; |
19 typedef XID RRCrtc; | 20 typedef XID RRCrtc; |
(...skipping 13 matching lines...) Expand all Loading... |
33 STATE_DUAL_PRIMARY_ONLY, | 34 STATE_DUAL_PRIMARY_ONLY, |
34 STATE_DUAL_SECONDARY_ONLY, | 35 STATE_DUAL_SECONDARY_ONLY, |
35 }; | 36 }; |
36 | 37 |
37 // This class interacts directly with the underlying Xrandr API to manipulate | 38 // This class interacts directly with the underlying Xrandr API to manipulate |
38 // CTRCs and Outputs. It will likely grow more state, over time, or expose | 39 // CTRCs and Outputs. It will likely grow more state, over time, or expose |
39 // Output info in other ways as more of the Chrome display code grows up around | 40 // Output info in other ways as more of the Chrome display code grows up around |
40 // it. | 41 // it. |
41 class CHROMEOS_EXPORT OutputConfigurator : public MessageLoop::Dispatcher { | 42 class CHROMEOS_EXPORT OutputConfigurator : public MessageLoop::Dispatcher { |
42 public: | 43 public: |
| 44 class Observer { |
| 45 public: |
| 46 // Called when the change of the display mode finished. It will usually |
| 47 // start the fading in the displays. |
| 48 virtual void OnDisplayModeChanged() = 0; |
| 49 }; |
| 50 |
43 explicit OutputConfigurator(bool is_extended_display_enabled); | 51 explicit OutputConfigurator(bool is_extended_display_enabled); |
44 virtual ~OutputConfigurator(); | 52 virtual ~OutputConfigurator(); |
45 | 53 |
46 OutputState output_state() const { return output_state_; } | 54 OutputState output_state() const { return output_state_; } |
47 | 55 |
48 // Called when the user hits ctrl-F4 to request a display mode change. | 56 // Called when the user hits ctrl-F4 to request a display mode change. |
49 // This method should only return false if it was called in a single-head or | 57 // This method should only return false if it was called in a single-head or |
50 // headless mode. | 58 // headless mode. |
51 bool CycleDisplayMode(); | 59 bool CycleDisplayMode(); |
52 | 60 |
53 // Called when powerd notifies us that some set of displays should be turned | 61 // Called when powerd notifies us that some set of displays should be turned |
54 // on or off. This requires enabling or disabling the CRTC associated with | 62 // on or off. This requires enabling or disabling the CRTC associated with |
55 // the display(s) in question so that the low power state is engaged. | 63 // the display(s) in question so that the low power state is engaged. |
56 bool ScreenPowerSet(bool power_on, bool all_displays); | 64 bool ScreenPowerSet(bool power_on, bool all_displays); |
57 | 65 |
58 // Force switching the display mode to |new_state|. This method is used when | 66 // Force switching the display mode to |new_state|. This method is used when |
59 // the user explicitly changes the display mode in the options UI. Returns | 67 // the user explicitly changes the display mode in the options UI. Returns |
60 // false if it was called in a single-head or headless mode. | 68 // false if it was called in a single-head or headless mode. |
61 bool SetDisplayMode(OutputState new_state); | 69 bool SetDisplayMode(OutputState new_state); |
62 | 70 |
63 // Called when an RRNotify event is received. The implementation is | 71 // Called when an RRNotify event is received. The implementation is |
64 // interested in the cases of RRNotify events which correspond to output | 72 // interested in the cases of RRNotify events which correspond to output |
65 // add/remove events. Note that Output add/remove events are sent in response | 73 // add/remove events. Note that Output add/remove events are sent in response |
66 // to our own reconfiguration operations so spurious events are common. | 74 // to our own reconfiguration operations so spurious events are common. |
67 // Spurious events will have no effect. | 75 // Spurious events will have no effect. |
68 virtual bool Dispatch(const base::NativeEvent& event) OVERRIDE; | 76 virtual bool Dispatch(const base::NativeEvent& event) OVERRIDE; |
69 | 77 |
| 78 void AddObserver(Observer* observer); |
| 79 void RemoveObserver(Observer* observer); |
| 80 |
70 private: | 81 private: |
71 // The information we need to cache from an output to implement operations | 82 // The information we need to cache from an output to implement operations |
72 // such as power state but also to eliminate duplicate operations within a | 83 // such as power state but also to eliminate duplicate operations within a |
73 // given action (determining which CRTC to use for a given output, for | 84 // given action (determining which CRTC to use for a given output, for |
74 // example). | 85 // example). |
75 struct CachedOutputDescription { | 86 struct CachedOutputDescription { |
76 RROutput output; | 87 RROutput output; |
77 RRCrtc crtc; | 88 RRCrtc crtc; |
78 RRMode mirror_mode; | 89 RRMode mirror_mode; |
79 RRMode ideal_mode; | 90 RRMode ideal_mode; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 // doesn't match any supported state. |output_cache_| must be up-to-date with | 128 // doesn't match any supported state. |output_cache_| must be up-to-date with |
118 // regards to the state of X or this method may return incorrect results. | 129 // regards to the state of X or this method may return incorrect results. |
119 OutputState InferCurrentState( | 130 OutputState InferCurrentState( |
120 Display* display, XRRScreenResources* screen) const; | 131 Display* display, XRRScreenResources* screen) const; |
121 | 132 |
122 // Scans the |output_cache_| to determine whether or not we are in a | 133 // Scans the |output_cache_| to determine whether or not we are in a |
123 // "projecting" state and then calls the DBus kSetIsProjectingMethod on powerd | 134 // "projecting" state and then calls the DBus kSetIsProjectingMethod on powerd |
124 // with the result. | 135 // with the result. |
125 void CheckIsProjectingAndNotify(); | 136 void CheckIsProjectingAndNotify(); |
126 | 137 |
| 138 // Fires OnDisplayModeChanged() event to the observers. |
| 139 void NotifyOnDisplayChanged(); |
| 140 |
127 // This is detected by the constructor to determine whether or not we should | 141 // This is detected by the constructor to determine whether or not we should |
128 // be enabled. If we aren't running on ChromeOS, we can't assume that the | 142 // be enabled. If we aren't running on ChromeOS, we can't assume that the |
129 // Xrandr X11 extension is supported. | 143 // Xrandr X11 extension is supported. |
130 // If this flag is set to false, any attempts to change the output | 144 // If this flag is set to false, any attempts to change the output |
131 // configuration to immediately fail without changing the state. | 145 // configuration to immediately fail without changing the state. |
132 bool is_running_on_chrome_os_; | 146 bool is_running_on_chrome_os_; |
133 | 147 |
134 // Set to true if the extended display flag is enabled. | 148 // Set to true if the extended display flag is enabled. |
135 const bool is_extended_display_enabled_; | 149 const bool is_extended_display_enabled_; |
136 | 150 |
(...skipping 17 matching lines...) Expand all Loading... |
154 int secondary_output_index_; | 168 int secondary_output_index_; |
155 | 169 |
156 // The base of the event numbers used to represent XRandr events used in | 170 // The base of the event numbers used to represent XRandr events used in |
157 // decoding events regarding output add/remove. | 171 // decoding events regarding output add/remove. |
158 int xrandr_event_base_; | 172 int xrandr_event_base_; |
159 | 173 |
160 // The display state as derived from the outputs observed in |output_cache_|. | 174 // The display state as derived from the outputs observed in |output_cache_|. |
161 // This is used for rotating display modes. | 175 // This is used for rotating display modes. |
162 OutputState output_state_; | 176 OutputState output_state_; |
163 | 177 |
| 178 ObserverList<Observer> observers_; |
| 179 |
164 DISALLOW_COPY_AND_ASSIGN(OutputConfigurator); | 180 DISALLOW_COPY_AND_ASSIGN(OutputConfigurator); |
165 }; | 181 }; |
166 | 182 |
167 } // namespace chromeos | 183 } // namespace chromeos |
168 | 184 |
169 #endif // CHROMEOS_DISPLAY_OUTPUT_CONFIGURATOR_H_ | 185 #endif // CHROMEOS_DISPLAY_OUTPUT_CONFIGURATOR_H_ |
OLD | NEW |