blob: 8a45fe2989bd590ebd6d6fcd77fcfad74fd1a7df [file] [log] [blame]
// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <map>
#include <string>
#include <vector>
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#include "monitor_reconfig/resolution_selector.h"
namespace monitor_reconfig {
// MonitorReconfigureMain is the class responsible for setting the external
// monitor to the max resolution based on the modes supported by the native
// monitor and the external monitor.
class MonitorReconfigureMain {
// |window| is the root window.
MonitorReconfigureMain(Display* display,
Window window,
XRRScreenResources* screen_info);
~MonitorReconfigureMain() {
// Main entry point.
void Run();
// Initializes the |lcd_output_| and |external_output_| members.
void DetermineOutputs();
// Returns whether an external monitor is connected.
bool IsExternalMonitorConnected();
// Sorts |output_info|'s modes by decreasing number of pixels, storing the
// results in |modes_out|.
void SortModesByResolution(RROutput output,
std::vector<ResolutionSelector::Mode>* modes_out);
// Set the resolution for a particular device or for the screen.
bool SetDeviceResolution(RROutput output,
const XRROutputInfo* output_info,
const ResolutionSelector::Mode& resolution);
bool SetScreenResolution(const ResolutionSelector::Mode& resolution);
// Disable output to a device.
bool DisableDevice(RROutput output,
const XRROutputInfo* output_info);
// Mapping between mode XIDs and mode information structures.
std::map<int, XRRModeInfo*> mode_map_;
// X Resources needed between functions.
Display* display_;
Window window_;
XRRScreenResources* screen_info_;
RROutput lcd_output_;
XRROutputInfo* lcd_output_info_;
RROutput external_output_;
XRROutputInfo* external_output_info_;
} // namespace monitor_reconfig