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 <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 26 matching lines...) Expand all Loading... |
37 }; | 37 }; |
38 | 38 |
39 // This class interacts directly with the underlying Xrandr API to manipulate | 39 // This class interacts directly with the underlying Xrandr API to manipulate |
40 // CTRCs and Outputs. | 40 // CTRCs and Outputs. |
41 class CHROMEOS_EXPORT OutputConfigurator | 41 class CHROMEOS_EXPORT OutputConfigurator |
42 : public base::MessageLoop::Dispatcher, | 42 : public base::MessageLoop::Dispatcher, |
43 public base::MessagePumpObserver { | 43 public base::MessagePumpObserver { |
44 public: | 44 public: |
45 struct ModeInfo { | 45 struct ModeInfo { |
46 ModeInfo(); | 46 ModeInfo(); |
47 ModeInfo(int width, int height, bool interlaced); | 47 ModeInfo(int width, int height, bool interlaced, float refresh_rate); |
48 | 48 |
49 int width; | 49 int width; |
50 int height; | 50 int height; |
51 bool interlaced; | 51 bool interlaced; |
| 52 float refresh_rate; |
52 }; | 53 }; |
53 | 54 |
| 55 typedef std::map<RRMode, ModeInfo> ModeInfoMap; |
| 56 |
54 struct CoordinateTransformation { | 57 struct CoordinateTransformation { |
55 // Initialized to the identity transformation. | 58 // Initialized to the identity transformation. |
56 CoordinateTransformation(); | 59 CoordinateTransformation(); |
57 | 60 |
58 float x_scale; | 61 float x_scale; |
59 float x_offset; | 62 float x_offset; |
60 float y_scale; | 63 float y_scale; |
61 float y_offset; | 64 float y_offset; |
62 }; | 65 }; |
63 | 66 |
(...skipping 25 matching lines...) Expand all Loading... |
89 int y; | 92 int y; |
90 | 93 |
91 // Output's physical dimensions. | 94 // Output's physical dimensions. |
92 uint64 width_mm; | 95 uint64 width_mm; |
93 uint64 height_mm; | 96 uint64 height_mm; |
94 | 97 |
95 bool is_internal; | 98 bool is_internal; |
96 bool is_aspect_preserving_scaling; | 99 bool is_aspect_preserving_scaling; |
97 | 100 |
98 // Map from mode IDs to details about the corresponding modes. | 101 // Map from mode IDs to details about the corresponding modes. |
99 std::map<RRMode, ModeInfo> mode_infos; | 102 ModeInfoMap mode_infos; |
100 | 103 |
101 // XInput device ID or 0 if this output isn't a touchscreen. | 104 // XInput device ID or 0 if this output isn't a touchscreen. |
102 int touch_device_id; | 105 int touch_device_id; |
103 | 106 |
104 CoordinateTransformation transform; | 107 CoordinateTransformation transform; |
105 | 108 |
106 // Display id for this output. | 109 // Display id for this output. |
107 int64 display_id; | 110 int64 display_id; |
108 | 111 |
109 bool has_display_id; | 112 bool has_display_id; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 | 156 |
154 // Called when the hardware mirroring failed. | 157 // Called when the hardware mirroring failed. |
155 virtual void SetSoftwareMirroring(bool enabled) = 0; | 158 virtual void SetSoftwareMirroring(bool enabled) = 0; |
156 }; | 159 }; |
157 | 160 |
158 // Interface for classes that perform actions on behalf of OutputController. | 161 // Interface for classes that perform actions on behalf of OutputController. |
159 class Delegate { | 162 class Delegate { |
160 public: | 163 public: |
161 virtual ~Delegate() {} | 164 virtual ~Delegate() {} |
162 | 165 |
163 virtual void SetPanelFittingEnabled(bool enabled) = 0; | |
164 | |
165 // Initializes the XRandR extension, saving the base event ID to | 166 // Initializes the XRandR extension, saving the base event ID to |
166 // |event_base|. | 167 // |event_base|. |
167 virtual void InitXRandRExtension(int* event_base) = 0; | 168 virtual void InitXRandRExtension(int* event_base) = 0; |
168 | 169 |
169 // Tells XRandR to update its configuration in response to |event|, an | 170 // Tells XRandR to update its configuration in response to |event|, an |
170 // RRScreenChangeNotify event. | 171 // RRScreenChangeNotify event. |
171 virtual void UpdateXRandRConfiguration(const base::NativeEvent& event) = 0; | 172 virtual void UpdateXRandRConfiguration(const base::NativeEvent& event) = 0; |
172 | 173 |
173 // Grabs the X server and refreshes XRandR-related resources. While | 174 // Grabs the X server and refreshes XRandR-related resources. While |
174 // the server is grabbed, other clients are blocked. Must be balanced | 175 // the server is grabbed, other clients are blocked. Must be balanced |
175 // by a call to UngrabServer(). | 176 // by a call to UngrabServer(). |
176 virtual void GrabServer() = 0; | 177 virtual void GrabServer() = 0; |
177 | 178 |
178 // Ungrabs the server and frees XRandR-related resources. | 179 // Ungrabs the server and frees XRandR-related resources. |
179 virtual void UngrabServer() = 0; | 180 virtual void UngrabServer() = 0; |
180 | 181 |
181 // Flushes all pending requests and waits for replies. | 182 // Flushes all pending requests and waits for replies. |
182 virtual void SyncWithServer() = 0; | 183 virtual void SyncWithServer() = 0; |
183 | 184 |
184 // Sets the window's background color to |color_argb|. | 185 // Sets the window's background color to |color_argb|. |
185 virtual void SetBackgroundColor(uint32 color_argb) = 0; | 186 virtual void SetBackgroundColor(uint32 color_argb) = 0; |
186 | 187 |
187 // Enables DPMS and forces it to the "on" state. | 188 // Enables DPMS and forces it to the "on" state. |
188 virtual void ForceDPMSOn() = 0; | 189 virtual void ForceDPMSOn() = 0; |
189 | 190 |
190 // Returns information about the current outputs. | 191 // Returns information about the current outputs. This method may block for |
191 // This method may block for 60 milliseconds or more. | 192 // 60 milliseconds or more. The returned outputs are not fully initialized; |
192 virtual std::vector<OutputSnapshot> GetOutputs( | 193 // the rest of the work happens in OutputConfigurator::GetOutputs(). |
193 const StateController* state_controller) = 0; | 194 virtual std::vector<OutputSnapshot> GetOutputs() = 0; |
| 195 |
| 196 // Adds |mode| to |output|. |
| 197 virtual void AddOutputMode(RROutput output, RRMode mode) = 0; |
194 | 198 |
195 // Calls XRRSetCrtcConfig() with the given options but some of our default | 199 // Calls XRRSetCrtcConfig() with the given options but some of our default |
196 // output count and rotation arguments. Returns true on success. | 200 // output count and rotation arguments. Returns true on success. |
197 virtual bool ConfigureCrtc(RRCrtc crtc, | 201 virtual bool ConfigureCrtc(RRCrtc crtc, |
198 RRMode mode, | 202 RRMode mode, |
199 RROutput output, | 203 RROutput output, |
200 int x, | 204 int x, |
201 int y) = 0; | 205 int y) = 0; |
202 | 206 |
203 // Called to set the frame buffer (underlying XRR "screen") size. Has | 207 // Called to set the frame buffer (underlying XRR "screen") size. Has |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 // determining the DPI of the screen and rationalizing which screen we | 268 // determining the DPI of the screen and rationalizing which screen we |
265 // need to use for the DPI calculation. | 269 // need to use for the DPI calculation. |
266 // See crbug.com/130188 for initial discussion. | 270 // See crbug.com/130188 for initial discussion. |
267 static const int kVerticalGap = 60; | 271 static const int kVerticalGap = 60; |
268 | 272 |
269 // Returns a pointer to the ModeInfo struct in |output| corresponding to | 273 // Returns a pointer to the ModeInfo struct in |output| corresponding to |
270 // |mode|, or NULL if the struct isn't present. | 274 // |mode|, or NULL if the struct isn't present. |
271 static const ModeInfo* GetModeInfo(const OutputSnapshot& output, | 275 static const ModeInfo* GetModeInfo(const OutputSnapshot& output, |
272 RRMode mode); | 276 RRMode mode); |
273 | 277 |
| 278 // Returns the mode within |output| that matches the given size with highest |
| 279 // refresh rate. Returns None if no matching output was found. |
| 280 static RRMode FindOutputModeMatchingSize(const OutputSnapshot& output, |
| 281 int width, |
| 282 int height); |
| 283 |
274 OutputConfigurator(); | 284 OutputConfigurator(); |
275 virtual ~OutputConfigurator(); | 285 virtual ~OutputConfigurator(); |
276 | 286 |
277 OutputState output_state() const { return output_state_; } | 287 OutputState output_state() const { return output_state_; } |
278 DisplayPowerState power_state() const { return power_state_; } | 288 DisplayPowerState power_state() const { return power_state_; } |
279 | 289 |
280 void set_state_controller(StateController* controller) { | 290 void set_state_controller(StateController* controller) { |
281 state_controller_ = controller; | 291 state_controller_ = controller; |
282 } | 292 } |
283 void set_mirroring_controller(SoftwareMirroringController* controller) { | 293 void set_mirroring_controller(SoftwareMirroringController* controller) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 | 352 |
343 const std::map<int, float>& GetMirroredDisplayAreaRatioMap() { | 353 const std::map<int, float>& GetMirroredDisplayAreaRatioMap() { |
344 return mirrored_display_area_ratio_map_; | 354 return mirrored_display_area_ratio_map_; |
345 } | 355 } |
346 | 356 |
347 // Configure outputs with |kConfigureDelayMs| delay, | 357 // Configure outputs with |kConfigureDelayMs| delay, |
348 // so that time-consuming ConfigureOutputs() won't be called multiple times. | 358 // so that time-consuming ConfigureOutputs() won't be called multiple times. |
349 void ScheduleConfigureOutputs(); | 359 void ScheduleConfigureOutputs(); |
350 | 360 |
351 private: | 361 private: |
352 // Configure outputs. | 362 // Returns currently-connected outputs. This method is a wrapper around |
| 363 // |delegate_->GetOutputs()| that does additional work, like finding the |
| 364 // mirror mode and setting user-preferred modes. Note that the server must |
| 365 // be grabbed via |delegate_->GrabServer()| first. |
| 366 std::vector<OutputSnapshot> GetOutputs(); |
| 367 |
| 368 // Helper method for GetOutputs() that initializes the passed-in outputs' |
| 369 // |mirror_mode| fields by looking for a mode in |internal_output| and |
| 370 // |external_output| having the same resolution. Returns false if a shared |
| 371 // mode wasn't found or created. |
| 372 // |
| 373 // |try_panel_fitting| allows creating a panel-fitting mode for |
| 374 // |internal_output| instead of only searching for a matching mode (note that |
| 375 // it may lead to a crash if |internal_info| is not capable of panel fitting). |
| 376 // |
| 377 // |preserve_aspect| limits the search/creation only to the modes having the |
| 378 // native aspect ratio of |external_output|. |
| 379 bool FindMirrorMode(OutputSnapshot* internal_output, |
| 380 OutputSnapshot* external_output, |
| 381 bool try_panel_fitting, |
| 382 bool preserve_aspect); |
| 383 |
| 384 // Configures outputs. |
353 void ConfigureOutputs(); | 385 void ConfigureOutputs(); |
354 | 386 |
355 // Notifies observers about an attempted state change. | 387 // Notifies observers about an attempted state change. |
356 void NotifyObservers(bool success, OutputState attempted_state); | 388 void NotifyObservers(bool success, OutputState attempted_state); |
357 | 389 |
358 // Switches to the state specified in |output_state| and |power_state|. | 390 // Switches to the state specified in |output_state| and |power_state|. |
359 // If the hardware mirroring failed and |mirroring_controller_| is set, | 391 // If the hardware mirroring failed and |mirroring_controller_| is set, |
360 // it switches to |STATE_DUAL_EXTENDED| and calls |SetSoftwareMirroring()| | 392 // it switches to |STATE_DUAL_EXTENDED| and calls |SetSoftwareMirroring()| |
361 // to enable software based mirroring. | 393 // to enable software based mirroring. |
362 // On success, updates |output_state_|, |power_state_|, and |cached_outputs_| | 394 // On success, updates |output_state_|, |power_state_|, and |cached_outputs_| |
(...skipping 23 matching lines...) Expand all Loading... |
386 | 418 |
387 // Returns the ratio between mirrored mode area and native mode area: | 419 // Returns the ratio between mirrored mode area and native mode area: |
388 // (mirror_mode_width * mirrow_mode_height) / (native_width * native_height) | 420 // (mirror_mode_width * mirrow_mode_height) / (native_width * native_height) |
389 float GetMirroredDisplayAreaRatio( | 421 float GetMirroredDisplayAreaRatio( |
390 const OutputConfigurator::OutputSnapshot& output); | 422 const OutputConfigurator::OutputSnapshot& output); |
391 | 423 |
392 StateController* state_controller_; | 424 StateController* state_controller_; |
393 SoftwareMirroringController* mirroring_controller_; | 425 SoftwareMirroringController* mirroring_controller_; |
394 scoped_ptr<Delegate> delegate_; | 426 scoped_ptr<Delegate> delegate_; |
395 | 427 |
| 428 // Used to enable modes which rely on panel fitting. |
| 429 bool is_panel_fitting_enabled_; |
| 430 |
396 // Key of the map is the touch display's id, and the value of the map is the | 431 // Key of the map is the touch display's id, and the value of the map is the |
397 // touch display's area ratio in mirror mode defined as : | 432 // touch display's area ratio in mirror mode defined as : |
398 // mirror_mode_area / native_mode_area. | 433 // mirror_mode_area / native_mode_area. |
399 // This is used for scaling touch event's radius when the touch display is in | 434 // This is used for scaling touch event's radius when the touch display is in |
400 // mirror mode : | 435 // mirror mode : |
401 // new_touch_radius = sqrt(area_ratio) * old_touch_radius | 436 // new_touch_radius = sqrt(area_ratio) * old_touch_radius |
402 std::map<int, float> mirrored_display_area_ratio_map_; | 437 std::map<int, float> mirrored_display_area_ratio_map_; |
403 | 438 |
404 // This is detected by the constructor to determine whether or not we should | 439 // This is detected by the constructor to determine whether or not we should |
405 // be enabled. If we aren't running on ChromeOS, we can't assume that the | 440 // be enabled. If we aren't running on ChromeOS, we can't assume that the |
(...skipping 23 matching lines...) Expand all Loading... |
429 scoped_ptr<base::OneShotTimer<OutputConfigurator> > configure_timer_; | 464 scoped_ptr<base::OneShotTimer<OutputConfigurator> > configure_timer_; |
430 | 465 |
431 DISALLOW_COPY_AND_ASSIGN(OutputConfigurator); | 466 DISALLOW_COPY_AND_ASSIGN(OutputConfigurator); |
432 }; | 467 }; |
433 | 468 |
434 typedef std::vector<OutputConfigurator::OutputSnapshot> OutputSnapshotList; | 469 typedef std::vector<OutputConfigurator::OutputSnapshot> OutputSnapshotList; |
435 | 470 |
436 } // namespace chromeos | 471 } // namespace chromeos |
437 | 472 |
438 #endif // CHROMEOS_DISPLAY_OUTPUT_CONFIGURATOR_H_ | 473 #endif // CHROMEOS_DISPLAY_OUTPUT_CONFIGURATOR_H_ |
OLD | NEW |