Chromium Code Reviews| Index: ash/display/display_util_x11.cc |
| diff --git a/ash/display/display_util_x11.cc b/ash/display/display_util_x11.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1fc19c2a00fc449b50de62fe8b86f320d62276e7 |
| --- /dev/null |
| +++ b/ash/display/display_util_x11.cc |
| @@ -0,0 +1,95 @@ |
| +// Copyright (c) 2012 The Chromium 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 "ash/display/display_util_x11.h" |
| + |
| +#include <algorithm> |
| +#include <map> |
| +#include <X11/extensions/Xrandr.h> |
| + |
| +#include "ash/display/display_info.h" |
| +#include "base/logging.h" |
| +#include "chromeos/display/output_util.h" |
| + |
| +namespace ash { |
| +namespace internal { |
| +namespace { |
| + |
| +// A list of bogus sizes in mm that X detects and should be ignored. |
|
Daniel Erat
2013/07/31 17:34:05
nit: s/and should/and that should/
oshima
2013/07/31 21:59:49
Done.
|
| +// See crbug.com/136533. |
| +const unsigned long kInvalidDisplaySizeList[][2] = { |
|
Daniel Erat
2013/07/31 17:34:05
add a comment stating that this needs to be sorted
oshima
2013/07/31 21:59:49
Only requirement is the 1st element is minimum siz
|
| + {40, 30}, |
| + {50, 40}, |
| + {160, 90}, |
| + {160, 100}, |
| +}; |
| + |
| +// Resolution list are sorted by area and the larger one comes first. |
| +struct ResolutionSorter { |
| + bool operator()(const Resolution& a, const Resolution& b) { |
| + return a.size.width() * a.size.height() > b.size.width() * b.size.height(); |
| + } |
| +}; |
| + |
| +} // 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; |
| +} |
| + |
| +std::vector<Resolution> GetResolutionList( |
| + XRRScreenResources* screen_resources, |
| + XRROutputInfo* output_info) { |
| + typedef std::map<std::pair<int,int>, Resolution> ResolutionMap; |
| + |
| + ResolutionMap resolution_map; |
| + |
| + for (int i = 0; i < output_info->nmode; i++) { |
| + RRMode mode = output_info->modes[i]; |
| + const XRRModeInfo* info = chromeos::FindModeInfo(screen_resources, mode); |
| + DCHECK(info); |
| + // Just ignore bad entry on Release build. |
| + if (!info) |
| + continue; |
| + ResolutionMap::key_type size = std::make_pair(info->width, info->height); |
| + bool interlaced = (info->modeFlags & RR_Interlace) != 0; |
| + |
| + ResolutionMap::iterator iter = resolution_map.find(size); |
| + |
| + // Add new resolution if it's new size or override interlaced mode. |
| + if (iter == resolution_map.end()) { |
| + resolution_map.insert(ResolutionMap::value_type( |
|
Daniel Erat
2013/07/31 17:34:05
why not just do:
resolution_map[size] = Resolut
oshima
2013/07/31 21:59:49
That didn't work because Resolution doesn't have d
Daniel Erat
2013/07/31 22:10:17
ah, makes sense. this seems fine
|
| + size, |
| + Resolution(gfx::Size(info->width, info->height), interlaced))); |
| + } else if (iter->second.interlaced && !interlaced) { |
| + iter->second.interlaced = false; |
| + } |
| + } |
| + |
| + std::vector<Resolution> resolution_list; |
| + for (ResolutionMap::const_iterator iter = resolution_map.begin(); |
| + iter != resolution_map.end(); |
| + ++iter) { |
| + resolution_list.push_back(iter->second); |
| + } |
| + std::sort(resolution_list.begin(), resolution_list.end(), ResolutionSorter()); |
| + return resolution_list; |
| +} |
| + |
| +} // namespace internal |
| +} // namespace ash |