OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 UI_DISPLAY_CHROMEOS_DISPLAY_CONFIGURATOR_H_ | 5 #ifndef UI_DISPLAY_CHROMEOS_DISPLAY_CONFIGURATOR_H_ |
6 #define UI_DISPLAY_CHROMEOS_DISPLAY_CONFIGURATOR_H_ | 6 #define UI_DISPLAY_CHROMEOS_DISPLAY_CONFIGURATOR_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
11 #include <string> | 11 #include <string> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "base/event_types.h" | 14 #include "base/event_types.h" |
15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
16 #include "base/memory/weak_ptr.h" | |
16 #include "base/observer_list.h" | 17 #include "base/observer_list.h" |
17 #include "base/timer/timer.h" | 18 #include "base/timer/timer.h" |
18 #include "third_party/cros_system_api/dbus/service_constants.h" | 19 #include "third_party/cros_system_api/dbus/service_constants.h" |
19 #include "ui/display/display_export.h" | 20 #include "ui/display/display_export.h" |
20 #include "ui/display/types/display_constants.h" | 21 #include "ui/display/types/display_constants.h" |
21 #include "ui/display/types/native_display_observer.h" | 22 #include "ui/display/types/native_display_observer.h" |
22 #include "ui/gfx/geometry/size.h" | 23 #include "ui/gfx/geometry/size.h" |
23 | 24 |
24 namespace gfx { | 25 namespace gfx { |
25 class Point; | 26 class Point; |
26 class Size; | 27 class Size; |
27 } | 28 } |
28 | 29 |
29 namespace ui { | 30 namespace ui { |
30 struct DisplayConfigureRequest; | 31 struct DisplayConfigureRequest; |
31 class DisplayMode; | 32 class DisplayMode; |
32 class DisplaySnapshot; | 33 class DisplaySnapshot; |
33 class NativeDisplayDelegate; | 34 class NativeDisplayDelegate; |
35 class UpdateDisplayConfigurationTask; | |
34 | 36 |
35 // This class interacts directly with the system display configurator. | 37 // This class interacts directly with the system display configurator. |
36 class DISPLAY_EXPORT DisplayConfigurator : public NativeDisplayObserver { | 38 class DISPLAY_EXPORT DisplayConfigurator : public NativeDisplayObserver { |
37 public: | 39 public: |
38 typedef uint64_t ContentProtectionClientId; | 40 typedef uint64_t ContentProtectionClientId; |
39 static const ContentProtectionClientId kInvalidClientId = 0; | 41 static const ContentProtectionClientId kInvalidClientId = 0; |
40 | 42 |
41 struct DisplayState { | 43 struct DisplayState { |
42 DisplayState(); | 44 DisplayState(); |
43 | 45 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
165 | 167 |
166 // Returns the mode within |display| that matches the given size with highest | 168 // Returns the mode within |display| that matches the given size with highest |
167 // refresh rate. Returns None if no matching display was found. | 169 // refresh rate. Returns None if no matching display was found. |
168 static const DisplayMode* FindDisplayModeMatchingSize( | 170 static const DisplayMode* FindDisplayModeMatchingSize( |
169 const DisplaySnapshot& display, | 171 const DisplaySnapshot& display, |
170 const gfx::Size& size); | 172 const gfx::Size& size); |
171 | 173 |
172 DisplayConfigurator(); | 174 DisplayConfigurator(); |
173 virtual ~DisplayConfigurator(); | 175 virtual ~DisplayConfigurator(); |
174 | 176 |
175 MultipleDisplayState display_state() const { return display_state_; } | 177 MultipleDisplayState display_state() const { return current_display_state_; } |
176 chromeos::DisplayPowerState requested_power_state() const { | 178 chromeos::DisplayPowerState requested_power_state() const { |
177 return requested_power_state_; | 179 return requested_power_state_; |
178 } | 180 } |
179 const gfx::Size framebuffer_size() const { return framebuffer_size_; } | 181 const gfx::Size framebuffer_size() const { return framebuffer_size_; } |
180 const std::vector<DisplayState>& cached_displays() const { | 182 const std::vector<DisplayState>& cached_displays() const { |
181 return cached_displays_; | 183 return cached_displays_; |
182 } | 184 } |
183 | 185 |
184 // Called when an external process no longer needs to control the display | 186 // Called when an external process no longer needs to control the display |
185 // and Chrome can take control. | 187 // and Chrome can take control. |
(...skipping 29 matching lines...) Expand all Loading... | |
215 void ForceInitialConfigure(uint32_t background_color_argb); | 217 void ForceInitialConfigure(uint32_t background_color_argb); |
216 | 218 |
217 // Stop handling display configuration events/requests. | 219 // Stop handling display configuration events/requests. |
218 void PrepareForExit(); | 220 void PrepareForExit(); |
219 | 221 |
220 // Called when powerd notifies us that some set of displays should be turned | 222 // Called when powerd notifies us that some set of displays should be turned |
221 // on or off. This requires enabling or disabling the CRTC associated with | 223 // on or off. This requires enabling or disabling the CRTC associated with |
222 // the display(s) in question so that the low power state is engaged. | 224 // the display(s) in question so that the low power state is engaged. |
223 // |flags| contains bitwise-or-ed kSetDisplayPower* values. Returns true if | 225 // |flags| contains bitwise-or-ed kSetDisplayPower* values. Returns true if |
224 // the system successfully enters (or was already in) |power_state|. | 226 // the system successfully enters (or was already in) |power_state|. |
225 bool SetDisplayPower(chromeos::DisplayPowerState power_state, int flags); | 227 void SetDisplayPower(chromeos::DisplayPowerState power_state, int flags); |
226 | 228 |
227 // Force switching the display mode to |new_state|. Returns false if | 229 // Force switching the display mode to |new_state|. Returns false if |
228 // switching failed (possibly because |new_state| is invalid for the | 230 // switching failed (possibly because |new_state| is invalid for the |
229 // current set of connected displays). | 231 // current set of connected displays). |
230 bool SetDisplayMode(MultipleDisplayState new_state); | 232 void SetDisplayMode(MultipleDisplayState new_state); |
231 | 233 |
232 // NativeDisplayDelegate::Observer overrides: | 234 // NativeDisplayDelegate::Observer overrides: |
233 virtual void OnConfigurationChanged() override; | 235 virtual void OnConfigurationChanged() override; |
234 | 236 |
235 void AddObserver(Observer* observer); | 237 void AddObserver(Observer* observer); |
236 void RemoveObserver(Observer* observer); | 238 void RemoveObserver(Observer* observer); |
237 | 239 |
238 // Sets all the displays into pre-suspend mode; usually this means | 240 // Sets all the displays into pre-suspend mode; usually this means |
239 // configure them for their resume state. This allows faster resume on | 241 // configure them for their resume state. This allows faster resume on |
240 // machines where display configuration is slow. | 242 // machines where display configuration is slow. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
272 // Checks the available color profiles for |display_id| and fills the result | 274 // Checks the available color profiles for |display_id| and fills the result |
273 // into |profiles|. | 275 // into |profiles|. |
274 std::vector<ui::ColorCalibrationProfile> GetAvailableColorCalibrationProfiles( | 276 std::vector<ui::ColorCalibrationProfile> GetAvailableColorCalibrationProfiles( |
275 int64_t display_id); | 277 int64_t display_id); |
276 | 278 |
277 // Updates the color calibration to |new_profile|. | 279 // Updates the color calibration to |new_profile|. |
278 bool SetColorCalibrationProfile(int64_t display_id, | 280 bool SetColorCalibrationProfile(int64_t display_id, |
279 ui::ColorCalibrationProfile new_profile); | 281 ui::ColorCalibrationProfile new_profile); |
280 | 282 |
281 private: | 283 private: |
284 class DisplayLayoutManagerImpl; | |
285 | |
282 // Mapping a display_id to a protection request bitmask. | 286 // Mapping a display_id to a protection request bitmask. |
283 typedef std::map<int64_t, uint32_t> ContentProtections; | 287 typedef std::map<int64_t, uint32_t> ContentProtections; |
284 // Mapping a client to its protection request. | 288 // Mapping a client to its protection request. |
285 typedef std::map<ContentProtectionClientId, ContentProtections> | 289 typedef std::map<ContentProtectionClientId, ContentProtections> |
286 ProtectionRequests; | 290 ProtectionRequests; |
287 | 291 |
288 // Performs platform specific delegate initialization. | 292 // Performs platform specific delegate initialization. |
289 scoped_ptr<NativeDisplayDelegate> CreatePlatformNativeDisplayDelegate(); | 293 scoped_ptr<NativeDisplayDelegate> CreatePlatformNativeDisplayDelegate(); |
290 | 294 |
291 // Updates |cached_displays_| to contain currently-connected displays. Calls | |
292 // |delegate_->GetDisplays()| and then does additional work, like finding the | |
293 // mirror mode and setting user-preferred modes. Note that the server must be | |
294 // grabbed via |delegate_->GrabServer()| first. | |
295 void UpdateCachedDisplays(); | |
296 | |
297 // Helper method for UpdateCachedDisplays() that initializes the passed-in | |
298 // displays' |mirror_mode| fields by looking for a mode in |internal_display| | |
299 // and |external_display| having the same resolution. Returns false if a | |
300 // shared | |
301 // mode wasn't found or created. | |
302 // | |
303 // |try_panel_fitting| allows creating a panel-fitting mode for | |
304 // |internal_display| instead of only searching for a matching mode (note that | |
305 // it may lead to a crash if |internal_info| is not capable of panel fitting). | |
306 // | |
307 // |preserve_aspect| limits the search/creation only to the modes having the | |
308 // native aspect ratio of |external_display|. | |
309 bool FindMirrorMode(DisplayState* internal_display, | |
310 DisplayState* external_display, | |
311 bool try_panel_fitting, | |
312 bool preserve_aspect); | |
313 | |
314 // Configures displays. Invoked by |configure_timer_|. | 295 // Configures displays. Invoked by |configure_timer_|. |
315 void ConfigureDisplays(); | 296 void ConfigureDisplays(); |
316 | 297 |
317 // Restores |requested_power_state_| after the system has resumed, | 298 // Restores |requested_power_state_| after the system has resumed, |
318 // additionally forcing a probe. Invoked by |configure_timer_|. | 299 // additionally forcing a probe. Invoked by |configure_timer_|. |
319 void RestoreRequestedPowerStateAfterResume(); | 300 void RestoreRequestedPowerStateAfterResume(); |
320 | 301 |
321 // Notifies observers about an attempted state change. | 302 // Notifies observers about an attempted state change. |
322 void NotifyObservers(bool success, MultipleDisplayState attempted_state); | 303 void NotifyObservers(bool success, MultipleDisplayState attempted_state); |
323 | 304 |
324 // Switches to the state specified in |display_state| and |power_state|. | |
325 // If the hardware mirroring failed and |mirroring_controller_| is set, | |
326 // it switches to |STATE_DUAL_EXTENDED| and calls |SetSoftwareMirroring()| | |
327 // to enable software based mirroring. | |
328 // On success, updates |display_state_|, |power_state_|, and | |
329 // |cached_displays_| and returns true. | |
330 bool EnterStateOrFallBackToSoftwareMirroring( | |
331 MultipleDisplayState display_state, | |
332 chromeos::DisplayPowerState power_state); | |
333 | |
334 // Switches to the state specified in |display_state| and |power_state|. | |
335 // On success, updates |display_state_|, |power_state_|, and | |
336 // |cached_displays_| and returns true. | |
337 bool EnterState(MultipleDisplayState display_state, | |
338 chromeos::DisplayPowerState power_state); | |
339 | |
340 // Returns the display state that should be used with |cached_displays_| while | 305 // Returns the display state that should be used with |cached_displays_| while |
341 // in |power_state|. | 306 // in |power_state|. |
342 MultipleDisplayState ChooseDisplayState( | 307 MultipleDisplayState ChooseDisplayState( |
343 chromeos::DisplayPowerState power_state) const; | 308 chromeos::DisplayPowerState power_state) const; |
344 | 309 |
345 // Returns the ratio between mirrored mode area and native mode area: | 310 // Returns the ratio between mirrored mode area and native mode area: |
346 // (mirror_mode_width * mirrow_mode_height) / (native_width * native_height) | 311 // (mirror_mode_width * mirrow_mode_height) / (native_width * native_height) |
347 float GetMirroredDisplayAreaRatio(const DisplayState& display); | 312 float GetMirroredDisplayAreaRatio(const DisplayState& display); |
348 | 313 |
349 // Returns true if in either hardware or software mirroring mode. | 314 // Returns true if in either hardware or software mirroring mode. |
350 bool IsMirroring() const; | 315 bool IsMirroring() const; |
351 | 316 |
352 // Applies display protections according to requests. | 317 // Applies display protections according to requests. |
353 bool ApplyProtections(const ContentProtections& requests); | 318 bool ApplyProtections(const ContentProtections& requests); |
354 | 319 |
320 // If |configuration_task_| isn't initialized, initialize it and start the | |
Daniel Erat
2014/12/12 20:36:30
nit: s/initialize/initializes/, s/start/starts/
dnicoara
2014/12/12 20:56:24
Done.
| |
321 // configuration task. | |
322 void RunPendingConfiguration(); | |
323 | |
324 // Callback for |configuration_taks_|. When the configuration process finishes | |
325 // this is called with the result (|success|) and the updated display state. | |
326 void OnConfigured(bool success, | |
327 const std::vector<DisplayState>& displays, | |
328 const gfx::Size& framebuffer_size, | |
329 MultipleDisplayState new_display_state, | |
330 chromeos::DisplayPowerState new_power_state); | |
331 | |
332 // Helps in identifying if a configuration task needs to be scheduled. | |
333 // Return true if any of the |requested_*| parameters have been updated. False | |
334 // otherwise. | |
335 bool ShouldRunConfigurationTask() const; | |
336 | |
355 StateController* state_controller_; | 337 StateController* state_controller_; |
356 SoftwareMirroringController* mirroring_controller_; | 338 SoftwareMirroringController* mirroring_controller_; |
357 scoped_ptr<NativeDisplayDelegate> native_display_delegate_; | 339 scoped_ptr<NativeDisplayDelegate> native_display_delegate_; |
358 | 340 |
359 // Used to enable modes which rely on panel fitting. | 341 // Used to enable modes which rely on panel fitting. |
360 bool is_panel_fitting_enabled_; | 342 bool is_panel_fitting_enabled_; |
361 | 343 |
362 // This is detected by the constructor to determine whether or not we should | 344 // This is detected by the constructor to determine whether or not we should |
363 // be enabled. If we aren't running on ChromeOS, we can't assume that the | 345 // be enabled. If we aren't running on ChromeOS, we can't assume that the |
364 // Xrandr X11 extension is supported. | 346 // Xrandr X11 extension is supported. |
365 // If this flag is set to false, any attempts to change the display | 347 // If this flag is set to false, any attempts to change the display |
366 // configuration to immediately fail without changing the state. | 348 // configuration to immediately fail without changing the state. |
367 bool configure_display_; | 349 bool configure_display_; |
368 | 350 |
369 // The current display state. | 351 // Current configuration state. |
370 MultipleDisplayState display_state_; | 352 MultipleDisplayState current_display_state_; |
353 chromeos::DisplayPowerState current_power_state_; | |
371 | 354 |
372 gfx::Size framebuffer_size_; | 355 // Pending requests. These values are used when triggering the next display |
356 // configuration. | |
357 // | |
358 // Stores the user requested state or INVALID if nothing was requested. | |
359 MultipleDisplayState requested_display_state_; | |
373 | 360 |
374 // The last-requested and current power state. These may differ if | 361 // Stores the requested power state. |
375 // configuration fails: SetDisplayMode() needs the last-requested state while | |
376 // SetDisplayPower() needs the current state. | |
377 chromeos::DisplayPowerState requested_power_state_; | 362 chromeos::DisplayPowerState requested_power_state_; |
378 chromeos::DisplayPowerState current_power_state_; | 363 |
364 // True if |requested_power_state_| has been changed due to a user request. | |
365 bool requested_power_state_change_; | |
366 | |
367 // Bitwise-or value of the |kSetDisplayPower*| flags defined above. | |
368 int requested_power_flags_; | |
369 | |
370 // True if the caller wants to force the display configuration process. | |
371 bool force_configure_; | |
379 | 372 |
380 // Most-recently-used display configuration. Note that the actual | 373 // Most-recently-used display configuration. Note that the actual |
381 // configuration changes asynchronously. | 374 // configuration changes asynchronously. |
382 DisplayStateList cached_displays_; | 375 DisplayStateList cached_displays_; |
383 | 376 |
377 // Most-recently-used framebuffer size. | |
378 gfx::Size framebuffer_size_; | |
379 | |
384 ObserverList<Observer> observers_; | 380 ObserverList<Observer> observers_; |
385 | 381 |
386 // The timer to delay configuring displays. This is used to aggregate multiple | 382 // The timer to delay configuring displays. This is used to aggregate multiple |
387 // display configuration events when they are reported in short time spans. | 383 // display configuration events when they are reported in short time spans. |
388 // See comment for NativeDisplayEventDispatcherX11 for more details. | 384 // See comment for NativeDisplayEventDispatcherX11 for more details. |
389 base::OneShotTimer<DisplayConfigurator> configure_timer_; | 385 base::OneShotTimer<DisplayConfigurator> configure_timer_; |
390 | 386 |
391 // Id for next display protection client. | 387 // Id for next display protection client. |
392 ContentProtectionClientId next_display_protection_client_id_; | 388 ContentProtectionClientId next_display_protection_client_id_; |
393 | 389 |
394 // Display protection requests of each client. | 390 // Display protection requests of each client. |
395 ProtectionRequests client_protection_requests_; | 391 ProtectionRequests client_protection_requests_; |
396 | 392 |
397 // Display controlled by an external entity. | 393 // Display controlled by an external entity. |
398 bool display_externally_controlled_; | 394 bool display_externally_controlled_; |
399 | 395 |
396 scoped_ptr<DisplayLayoutManager> layout_manager_; | |
397 | |
398 scoped_ptr<UpdateDisplayConfigurationTask> configuration_task_; | |
399 | |
400 // This must be the last variable. | |
401 base::WeakPtrFactory<DisplayConfigurator> weak_ptr_factory_; | |
402 | |
400 DISALLOW_COPY_AND_ASSIGN(DisplayConfigurator); | 403 DISALLOW_COPY_AND_ASSIGN(DisplayConfigurator); |
401 }; | 404 }; |
402 | 405 |
403 } // namespace ui | 406 } // namespace ui |
404 | 407 |
405 #endif // UI_DISPLAY_CHROMEOS_DISPLAY_CONFIGURATOR_H_ | 408 #endif // UI_DISPLAY_CHROMEOS_DISPLAY_CONFIGURATOR_H_ |
OLD | NEW |