Index: src/platform/monitor_reconfig/monitor_reconfigure_main.h |
diff --git a/src/platform/monitor_reconfig/monitor_reconfigure_main.h b/src/platform/monitor_reconfig/monitor_reconfigure_main.h |
index 0b602d02fdf8524904750c3db69569ce9e163f81..3aa17d0a1be923c8d80797c44904d28413ee0a3f 100644 |
--- a/src/platform/monitor_reconfig/monitor_reconfigure_main.h |
+++ b/src/platform/monitor_reconfig/monitor_reconfigure_main.h |
@@ -6,6 +6,8 @@ |
#define MONITOR_RECONFIGURE_MONITOR_RECONFIGURE_MAIN_H_ |
#include <map> |
+#include <string> |
+#include <vector> |
#include <X11/Xlib.h> |
#include <X11/extensions/Xrandr.h> |
@@ -23,38 +25,58 @@ class MonitorReconfigureMain { |
// Main entry point |
void Run(); |
- // Returns whether an external monitor is connected |
- bool IsExternalMonitorConnected(); |
- |
private: |
- // Finds the max resolution mode for the given |output| |
- XRRModeInfo* FindMaxResolution(XRROutputInfo* output); |
- |
- // Finds the best matching resolution as compared to the |matching_mode| |
- XRRModeInfo* FindBestMatchingResolution(XRRModeInfo* matching_mode); |
- |
- // Initializes the |notebook_output_| and |external_output_| fields |
+ // Initializes the |lcd_output_| and |external_output_| members. |
void DetermineOutputs(); |
- // Sets the resolution of the notebook's screen, the external monitor's |
- // screen, and the overall virtual screen to the given size. |
- void SetResolutions(XRRModeInfo* notebook_mode, |
- XRRModeInfo* external_mode, |
- XRRModeInfo* overall_screen_size); |
- |
- // Inline helper functions for FindBestMatchingResolution |
- inline bool IsEqual(XRRModeInfo*, XRRModeInfo*); |
- inline bool IsBiggerOrEqual(XRRModeInfo*, XRRModeInfo*); |
- inline bool IsBetterMatching(XRRModeInfo* target, XRRModeInfo* to_match, |
- XRRModeInfo* previous_best); |
+ // Returns whether an external monitor is connected |
+ bool IsExternalMonitorConnected(); |
- // Mapping between mode XID's and mode information structures |
+ // Comparator used by SortModeByResolution(). |
+ // Returns true if |mode_a| has more pixels than |mode_b| and false otherwise. |
+ class ModeResolutionComparator { |
+ public: |
+ bool operator()(XRRModeInfo* mode_a, XRRModeInfo* mode_b) const { |
+ return mode_a->width * mode_a->height > mode_b->width * mode_b->height; |
+ } |
+ }; |
+ |
+ // Sorts |output_info|'s modes by decreasing number of pixels, storing the |
+ // results in |modes_out|. |
+ void SortModesByResolution(const XRROutputInfo& output_info, |
+ std::vector<XRRModeInfo*>* modes_out); |
+ |
+ // Find resolutions to use. |
+ bool FindBestResolutions( |
+ std::string* lcd_resolution, |
+ std::string* external_resolution, |
+ std::string* screen_resolution); |
+ |
+ // Find resolutions to use that are reasonably close together. |
+ // |larger_device_modes| and |smaller_device_modes| should be sorted by |
+ // descending resolution. We choose the highest resolution from |
+ // |smaller_device_modes| and the lowest resolution from |larger_device_modes| |
+ // that's at least as high as the resolution from the smaller device. |
+ // |screen_resolution| gets set to |smaller_resolution| to avoid clipping. |
+ bool FindNearestResolutions( |
+ const std::vector<XRRModeInfo*>& larger_device_modes, |
+ const std::vector<XRRModeInfo*>& smaller_device_modes, |
+ std::string* larger_resolution, |
+ std::string* smaller_resolution, |
+ std::string* screen_resolution); |
+ |
+ // Set the resolution for a particular display or for the screen. |
+ bool SetDeviceResolution(const std::string& device_name, |
+ const std::string& resolution); |
+ bool SetScreenResolution(const std::string& resolution); |
+ |
+ // Mapping between mode XIDs and mode information structures. |
std::map<int, XRRModeInfo*> mode_map_; |
// X Resources needed between functions |
Display* display_; |
XRRScreenResources* screen_info_; |
- XRROutputInfo* notebook_output_; |
+ XRROutputInfo* lcd_output_; |
XRROutputInfo* external_output_; |
}; |