Index: ui/base/x/x11_util.cc |
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc |
index 6a5056919dea6d9447d8c6bf3bd009bb4555e295..a82d515218e98734fba040b339fdeeec7becf33c 100644 |
--- a/ui/base/x/x11_util.cc |
+++ b/ui/base/x/x11_util.cc |
@@ -317,14 +317,6 @@ class XButtonMap { |
DISALLOW_COPY_AND_ASSIGN(XButtonMap); |
}; |
-bool IsRandRAvailable() { |
- int randr_version_major = 0; |
- int randr_version_minor = 0; |
- static bool is_randr_available = XRRQueryVersion( |
- GetXDisplay(), &randr_version_major, &randr_version_minor); |
- return is_randr_available; |
-} |
- |
bool IsShapeAvailable() { |
int dummy; |
static bool is_shape_available = |
@@ -333,53 +325,6 @@ bool IsShapeAvailable() { |
} |
-// Get the EDID data from the |output| and stores to |prop|. |nitem| will store |
-// the number of characters |prop| will have. It doesn't take the ownership of |
-// |prop|, so caller must release it by XFree(). |
-// Returns true if EDID property is successfully obtained. Otherwise returns |
-// false and does not touch |prop| and |nitems|. |
-bool GetEDIDProperty(XID output, unsigned long* nitems, unsigned char** prop) { |
- if (!IsRandRAvailable()) |
- return false; |
- |
- static Atom edid_property = GetAtom(RR_PROPERTY_RANDR_EDID); |
- |
- Display* display = GetXDisplay(); |
- |
- bool has_edid_property = false; |
- int num_properties = 0; |
- Atom* properties = XRRListOutputProperties(display, output, &num_properties); |
- for (int i = 0; i < num_properties; ++i) { |
- if (properties[i] == edid_property) { |
- has_edid_property = true; |
- break; |
- } |
- } |
- XFree(properties); |
- if (!has_edid_property) |
- return false; |
- |
- Atom actual_type; |
- int actual_format; |
- unsigned long bytes_after; |
- XRRGetOutputProperty(display, |
- output, |
- edid_property, |
- 0, // offset |
- 128, // length |
- false, // _delete |
- false, // pending |
- AnyPropertyType, // req_type |
- &actual_type, |
- &actual_format, |
- nitems, |
- &bytes_after, |
- prop); |
- DCHECK_EQ(XA_INTEGER, actual_type); |
- DCHECK_EQ(8, actual_format); |
- return true; |
-} |
- |
} // namespace |
bool XDisplayExists() { |
@@ -1297,194 +1242,6 @@ void FreePixmap(Display* display, XID pixmap) { |
XFreePixmap(display, pixmap); |
} |
-bool GetOutputDeviceData(XID output, |
- uint16* manufacturer_id, |
- uint16* product_code, |
- std::string* human_readable_name) { |
- unsigned long nitems = 0; |
- unsigned char *prop = NULL; |
- if (!GetEDIDProperty(output, &nitems, &prop)) |
- return false; |
- |
- bool result = ParseOutputDeviceData( |
- prop, nitems, manufacturer_id, product_code, human_readable_name); |
- XFree(prop); |
- return result; |
-} |
- |
-bool ParseOutputDeviceData(const unsigned char* prop, |
- unsigned long nitems, |
- uint16* manufacturer_id, |
- uint16* product_code, |
- std::string* human_readable_name) { |
- // See http://en.wikipedia.org/wiki/Extended_display_identification_data |
- // for the details of EDID data format. We use the following data: |
- // bytes 8-9: manufacturer EISA ID, in big-endian |
- // bytes 10-11: represents product code, in little-endian |
- // bytes 54-125: four descriptors (18-bytes each) which may contain |
- // the display name. |
- const unsigned int kManufacturerOffset = 8; |
- const unsigned int kManufacturerLength = 2; |
- const unsigned int kProductCodeOffset = 10; |
- const unsigned int kProductCodeLength = 2; |
- const unsigned int kDescriptorOffset = 54; |
- const unsigned int kNumDescriptors = 4; |
- const unsigned int kDescriptorLength = 18; |
- // The specifier types. |
- const unsigned char kMonitorNameDescriptor = 0xfc; |
- |
- if (manufacturer_id) { |
- if (nitems < kManufacturerOffset + kManufacturerLength) |
- return false; |
- |
- *manufacturer_id = |
- *reinterpret_cast<const uint16*>(prop + kManufacturerOffset); |
-#if defined(ARCH_CPU_LITTLE_ENDIAN) |
- *manufacturer_id = base::ByteSwap(*manufacturer_id); |
-#endif |
- } |
- |
- if (product_code) { |
- if (nitems < kProductCodeOffset + kProductCodeLength) |
- return false; |
- |
- *product_code = base::ByteSwapToLE16( |
- *reinterpret_cast<const uint16*>(prop + kProductCodeOffset)); |
- } |
- |
- if (!human_readable_name) |
- return true; |
- |
- human_readable_name->clear(); |
- for (unsigned int i = 0; i < kNumDescriptors; ++i) { |
- if (nitems < kDescriptorOffset + (i + 1) * kDescriptorLength) |
- break; |
- |
- const unsigned char* desc_buf = |
- prop + kDescriptorOffset + i * kDescriptorLength; |
- // If the descriptor contains the display name, it has the following |
- // structure: |
- // bytes 0-2, 4: \0 |
- // byte 3: descriptor type, defined above. |
- // bytes 5-17: text data, ending with \r, padding with spaces |
- // we should check bytes 0-2 and 4, since it may have other values in |
- // case that the descriptor contains other type of data. |
- if (desc_buf[0] == 0 && desc_buf[1] == 0 && desc_buf[2] == 0 && |
- desc_buf[4] == 0) { |
- if (desc_buf[3] == kMonitorNameDescriptor) { |
- std::string found_name( |
- reinterpret_cast<const char*>(desc_buf + 5), kDescriptorLength - 5); |
- TrimWhitespaceASCII(found_name, TRIM_TRAILING, human_readable_name); |
- break; |
- } |
- } |
- } |
- |
- if (human_readable_name->empty()) |
- return false; |
- |
- // Verify if the |human_readable_name| consists of printable characters only. |
- for (size_t i = 0; i < human_readable_name->size(); ++i) { |
- char c = (*human_readable_name)[i]; |
- if (!isascii(c) || !isprint(c)) { |
- human_readable_name->clear(); |
- return false; |
- } |
- } |
- |
- return true; |
-} |
- |
-bool GetOutputOverscanFlag(XID output, bool* flag) { |
- unsigned long nitems = 0; |
- unsigned char *prop = NULL; |
- if (!GetEDIDProperty(output, &nitems, &prop)) |
- return false; |
- |
- bool found = ParseOutputOverscanFlag(prop, nitems, flag); |
- XFree(prop); |
- return found; |
-} |
- |
-bool ParseOutputOverscanFlag(const unsigned char* prop, |
- unsigned long nitems, |
- bool *flag) { |
- // See http://en.wikipedia.org/wiki/Extended_display_identification_data |
- // for the extension format of EDID. Also see EIA/CEA-861 spec for |
- // the format of the extensions and how video capability is encoded. |
- // - byte 0: tag. should be 02h. |
- // - byte 1: revision. only cares revision 3 (03h). |
- // - byte 4-: data block. |
- const unsigned int kExtensionBase = 128; |
- const unsigned int kExtensionSize = 128; |
- const unsigned int kNumExtensionsOffset = 126; |
- const unsigned int kDataBlockOffset = 4; |
- const unsigned char kCEAExtensionTag = '\x02'; |
- const unsigned char kExpectedExtensionRevision = '\x03'; |
- const unsigned char kExtendedTag = 7; |
- const unsigned char kExtendedVideoCapabilityTag = 0; |
- const unsigned int kPTOverscan = 4; |
- const unsigned int kITOverscan = 2; |
- const unsigned int kCEOverscan = 0; |
- |
- if (nitems <= kNumExtensionsOffset) |
- return false; |
- |
- unsigned char num_extensions = prop[kNumExtensionsOffset]; |
- |
- for (size_t i = 0; i < num_extensions; ++i) { |
- // Skip parsing the whole extension if size is not enough. |
- if (nitems < kExtensionBase + (i + 1) * kExtensionSize) |
- break; |
- |
- const unsigned char* extension = prop + kExtensionBase + i * kExtensionSize; |
- unsigned char tag = extension[0]; |
- unsigned char revision = extension[1]; |
- if (tag != kCEAExtensionTag || revision != kExpectedExtensionRevision) |
- continue; |
- |
- unsigned char timing_descriptors_start = |
- std::min(extension[2], static_cast<unsigned char>(kExtensionSize)); |
- const unsigned char* data_block = extension + kDataBlockOffset; |
- while (data_block < extension + timing_descriptors_start) { |
- // A data block is encoded as: |
- // - byte 1 high 3 bits: tag. '07' for extended tags. |
- // - byte 1 remaining bits: the length of data block. |
- // - byte 2: the extended tag. '0' for video capability. |
- // - byte 3: the capability. |
- unsigned char tag = data_block[0] >> 5; |
- unsigned char payload_length = data_block[0] & 0x1f; |
- if (static_cast<unsigned long>(data_block + payload_length - prop) > |
- nitems) |
- break; |
- |
- if (tag != kExtendedTag || payload_length < 2) { |
- data_block += payload_length + 1; |
- continue; |
- } |
- |
- unsigned char extended_tag_code = data_block[1]; |
- if (extended_tag_code != kExtendedVideoCapabilityTag) { |
- data_block += payload_length + 1; |
- continue; |
- } |
- |
- // The difference between preferred, IT, and CE video formats |
- // doesn't matter. Sets |flag| to true if any of these flags are true. |
- if ((data_block[2] & (1 << kPTOverscan)) || |
- (data_block[2] & (1 << kITOverscan)) || |
- (data_block[2] & (1 << kCEOverscan))) { |
- *flag = true; |
- } else { |
- *flag = false; |
- } |
- return true; |
- } |
- } |
- |
- return false; |
-} |
- |
bool GetWindowManagerName(std::string* wm_name) { |
DCHECK(wm_name); |
int wm_window = 0; |