168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#ifndef BASE_X11_EDID_PARSER_X11_H_
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define BASE_X11_EDID_PARSER_X11_H_
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <string>
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/base_export.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/basictypes.h"
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)typedef unsigned long XID;
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// EDID (Extended Display Identification Data) is a format for monitor
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// metadata. This provides a parser for the data and an interface to get it
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// from XRandR.
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace base {
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Get the EDID data from the |output| and stores to |prop|. |nitem| will store
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// the number of characters |prop| will have. It doesn't take the ownership of
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// |prop|, so caller must release it by XFree().
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Returns true if EDID property is successfully obtained. Otherwise returns
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// false and does not touch |prop| and |nitems|.
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)BASE_EXPORT bool GetEDIDProperty(XID output,
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                 unsigned long* nitems,
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                 unsigned char** prop);
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Gets the EDID data from |output| and generates the display id through
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// |GetDisplayIdFromEDID|.
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)BASE_EXPORT bool GetDisplayId(XID output, size_t index,
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                              int64* display_id_out);
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Generates the display id for the pair of |prop| with |nitems| length and
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// |index|, and store in |display_id_out|. Returns true if the display id is
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// successfully generated, or false otherwise.
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)BASE_EXPORT bool GetDisplayIdFromEDID(const unsigned char* prop,
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                      unsigned long nitems,
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                      size_t index,
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                      int64* display_id_out);
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Parses |prop| as EDID data and stores extracted data into |manufacturer_id|
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// and |human_readable_name| and returns true. NULL can be passed for unwanted
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// output parameters. Some devices (especially internal displays) may not have
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// the field for |human_readable_name|, and it will return true in that case.
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)BASE_EXPORT bool ParseOutputDeviceData(const unsigned char* prop,
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                       unsigned long nitems,
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                       uint16* manufacturer_id,
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                       std::string* human_readable_name);
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace base
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // BASE_X11_EDID_PARSER_X11_H_
55