Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2068)

Unified Diff: ash/display/display_change_observer_x11.cc

Issue 21297003: Add ability to set resolution on external display (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: adraddressed comment, adjusted test Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/display/display_change_observer_x11.h ('k') | ash/display/display_change_observer_x11_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/display/display_change_observer_x11.cc
diff --git a/ash/display/display_change_observer_x11.cc b/ash/display/display_change_observer_x11.cc
index 8fa1730143e61969bfd0bebb771b51a9abd0a587..860a5ea4996905c796694331098a2cb8f882b0b3 100644
--- a/ash/display/display_change_observer_x11.cc
+++ b/ash/display/display_change_observer_x11.cc
@@ -15,6 +15,7 @@
#include "ash/display/display_info.h"
#include "ash/display/display_layout_store.h"
#include "ash/display/display_manager.h"
+#include "ash/display/display_util_x11.h"
#include "ash/shell.h"
#include "base/command_line.h"
#include "base/message_loop/message_pump_aurax11.h"
@@ -26,40 +27,15 @@
namespace ash {
namespace internal {
-
namespace {
// The DPI threshold to detect high density screen.
// Higher DPI than this will use device_scale_factor=2.
-// Note: This value has to be kept in sync with the mouse/touchpad driver
-// which controls mouse pointer acceleration. If you need to update this value,
-// please update the bug (crosbug.com/31628) first and make sure that the
-// driver will use the same value.
-// This value also has to be kept in sync with the value in
-// chromeos/display/output_configurator.cc. See crbug.com/130188
const unsigned int kHighDensityDPIThreshold = 160;
// 1 inch in mm.
const float kInchInMm = 25.4f;
-XRRModeInfo* FindMode(XRRScreenResources* screen_resources, XID current_mode) {
- for (int m = 0; m < screen_resources->nmode; m++) {
- XRRModeInfo *mode = &screen_resources->modes[m];
- if (mode->id == current_mode)
- return mode;
- }
- return NULL;
-}
-
-// A list of bogus sizes in mm that X detects and should be ignored.
-// See crbug.com/136533.
-const unsigned long kInvalidDisplaySizeList[][2] = {
- {40, 30},
- {50, 40},
- {160, 90},
- {160, 100},
-};
-
int64 GetDisplayId(XID output, size_t output_index) {
int64 display_id;
if (chromeos::GetDisplayId(output, output_index, &display_id))
@@ -69,24 +45,6 @@ int64 GetDisplayId(XID output, size_t output_index) {
} // namespace
-bool ShouldIgnoreSize(unsigned long mm_width, unsigned long mm_height) {
- // Ignore if the reported display is smaller than minimum size.
- if (mm_width <= kInvalidDisplaySizeList[0][0] ||
- mm_height <= kInvalidDisplaySizeList[0][1]) {
- LOG(WARNING) << "Smaller than minimum display size";
- return true;
- }
- for (unsigned long i = 1 ; i < arraysize(kInvalidDisplaySizeList); ++i) {
- const unsigned long* size = kInvalidDisplaySizeList[i];
- if (mm_width == size[0] && mm_height == size[1]) {
- LOG(WARNING) << "Black listed display size detected:"
- << size[0] << "x" << size[1];
- return true;
- }
- }
- return false;
-}
-
DisplayChangeObserverX11::DisplayChangeObserverX11()
: xdisplay_(base::MessagePumpAuraX11::GetDefaultXDisplay()),
x_root_window_(DefaultRootWindow(xdisplay_)),
@@ -116,6 +74,21 @@ chromeos::OutputState DisplayChangeObserverX11::GetStateForDisplayIds(
chromeos::STATE_DUAL_MIRROR : chromeos::STATE_DUAL_EXTENDED;
}
+bool DisplayChangeObserverX11::GetResolutionForDisplayId(int64 display_id,
+ int* width,
+ int* height) const {
+
+ gfx::Size resolution;
+ if (!Shell::GetInstance()->display_manager()->
+ GetSelectedResolutionForDisplayId(display_id, &resolution)) {
+ return false;
+ }
+
+ *width = resolution.width();
+ *height = resolution.height();
+ return true;
+}
+
void DisplayChangeObserverX11::OnDisplayModeChanged() {
XRRScreenResources* screen_resources =
XRRGetScreenResources(xdisplay_, x_root_window_);
@@ -151,13 +124,14 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() {
XRRFreeOutputInfo(output_info);
continue;
}
- XRRCrtcInfo* crtc_info = crtc_info_map[output_info->crtc];
+ const XRRCrtcInfo* crtc_info = crtc_info_map[output_info->crtc];
if (!crtc_info) {
LOG(WARNING) << "Crtc not found for output: output_index="
<< output_index;
continue;
}
- XRRModeInfo* mode = FindMode(screen_resources, crtc_info->mode);
+ const XRRModeInfo* mode =
+ chromeos::FindModeInfo(screen_resources, crtc_info->mode);
if (!mode) {
LOG(WARNING) << "Could not find a mode for the output: output_index="
<< output_index;
@@ -173,6 +147,10 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() {
gfx::Rect display_bounds(
crtc_info->x, crtc_info->y, mode->width, mode->height);
+ std::vector<Resolution> resolutions;
+ if (!is_internal)
+ resolutions = GetResolutionList(screen_resources, output_info);
+
XRRFreeOutputInfo(output_info);
std::string name = is_internal ?
@@ -195,6 +173,7 @@ void DisplayChangeObserverX11::OnDisplayModeChanged() {
displays.back().set_device_scale_factor(device_scale_factor);
displays.back().SetBounds(display_bounds);
displays.back().set_native(true);
+ displays.back().set_resolutions(resolutions);
}
// Free all allocated resources.
« no previous file with comments | « ash/display/display_change_observer_x11.h ('k') | ash/display/display_change_observer_x11_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698