Remove old randr code.
Signed-off-by: Christopher Michael <cp.michael@samsung.com> SVN revision: 83437
This commit is contained in:
parent
c951fb5a2d
commit
3888089a7f
|
@ -1,103 +0,0 @@
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif /* ifdef HAVE_CONFIG_H */
|
|
||||||
|
|
||||||
#include "ecore_x_private.h"
|
|
||||||
#include "ecore_x_randr.h"
|
|
||||||
|
|
||||||
static Eina_Bool _randr_available = EINA_FALSE;
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
static int _randr_major, _randr_minor;
|
|
||||||
int _randr_version;
|
|
||||||
#define RANDR_1_1 ((1 << 16) | 1)
|
|
||||||
#define RANDR_1_2 ((1 << 16) | 2)
|
|
||||||
#define RANDR_1_3 ((1 << 16) | 3)
|
|
||||||
|
|
||||||
#define RANDR_VALIDATE_ROOT(screen, \
|
|
||||||
root) ((screen = \
|
|
||||||
XRRRootToScreen(_ecore_x_disp, \
|
|
||||||
root)) != -1)
|
|
||||||
|
|
||||||
#define Ecore_X_Randr_Unset -1
|
|
||||||
|
|
||||||
XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display * dpy,
|
|
||||||
Window window);
|
|
||||||
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
|
|
||||||
void
|
|
||||||
_ecore_x_randr_init(void)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
_randr_major = 1;
|
|
||||||
_randr_minor = 3;
|
|
||||||
_randr_version = 0;
|
|
||||||
|
|
||||||
_ecore_x_randr_get_screen_resources = NULL;
|
|
||||||
if (XRRQueryVersion(_ecore_x_disp, &_randr_major, &_randr_minor))
|
|
||||||
{
|
|
||||||
_randr_version = (_randr_major << 16) | _randr_minor;
|
|
||||||
if (_randr_version >= RANDR_1_3)
|
|
||||||
_ecore_x_randr_get_screen_resources = XRRGetScreenResourcesCurrent;
|
|
||||||
else if (_randr_version == RANDR_1_2)
|
|
||||||
_ecore_x_randr_get_screen_resources = XRRGetScreenResources;
|
|
||||||
|
|
||||||
_randr_available = EINA_TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_randr_available = EINA_FALSE;
|
|
||||||
|
|
||||||
#else
|
|
||||||
_randr_available = EINA_FALSE;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Query whether randr is available or not.
|
|
||||||
*
|
|
||||||
* @return @c EINA_TRUE, if extension is available, @c EINA_FALSE otherwise.
|
|
||||||
*/
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_query(void)
|
|
||||||
{
|
|
||||||
return _randr_available;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @return version of the RandR extension supported by the server or, in case
|
|
||||||
* RandR extension is not available, Ecore_X_Randr_Unset (=-1).
|
|
||||||
* bit version information: 31 MAJOR 16 | 15 MINOR 0
|
|
||||||
*/
|
|
||||||
EAPI int
|
|
||||||
ecore_x_randr_version_get(void)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
||||||
if (_randr_available)
|
|
||||||
{
|
|
||||||
return _randr_version;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return Ecore_X_Randr_Unset;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
Eina_Bool
|
|
||||||
_ecore_x_randr_root_validate(Ecore_X_Window root)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
Ecore_X_Randr_Screen scr = -1;
|
|
||||||
if (root && RANDR_VALIDATE_ROOT(scr, root))
|
|
||||||
return EINA_TRUE;
|
|
||||||
else
|
|
||||||
return EINA_FALSE;
|
|
||||||
|
|
||||||
#else
|
|
||||||
return EINA_FALSE;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
#ifndef ECORE_X_INLINE_X
|
|
||||||
#define ECORE_X_INLINE_X
|
|
||||||
Eina_Bool _ecore_x_randr_root_validate(Ecore_X_Window root);
|
|
||||||
Eina_Bool _ecore_x_randr_output_validate(Ecore_X_Window root,
|
|
||||||
Ecore_X_Randr_Output
|
|
||||||
output);
|
|
||||||
#endif
|
|
|
@ -1,334 +0,0 @@
|
||||||
/*
|
|
||||||
* vim:ts=8:sw=3:sts=8:expandtab:cino=>5n-3f0^-2{2
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif /* ifdef HAVE_CONFIG_H */
|
|
||||||
|
|
||||||
#include "ecore_x_private.h"
|
|
||||||
#include "ecore_x_randr.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define Ecore_X_Randr_None 0
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
|
|
||||||
#define RANDR_1_1 ((1 << 16) | 1)
|
|
||||||
|
|
||||||
#define RANDR_VALIDATE_ROOT(screen, \
|
|
||||||
root) ((screen = \
|
|
||||||
XRRRootToScreen(_ecore_x_disp, \
|
|
||||||
root)) != -1)
|
|
||||||
#define RANDR_CHECK_1_1_RET(ret) if (_randr_version < RANDR_1_1) \
|
|
||||||
return ret
|
|
||||||
|
|
||||||
extern XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display *
|
|
||||||
dpy,
|
|
||||||
Window
|
|
||||||
window);
|
|
||||||
extern int _randr_version;
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @param root window which's primary output will be queried
|
|
||||||
*/
|
|
||||||
EAPI Ecore_X_Randr_Orientation
|
|
||||||
ecore_x_randr_screen_primary_output_orientations_get(Ecore_X_Window root)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
Rotation rot = Ecore_X_Randr_None, crot;
|
|
||||||
|
|
||||||
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
||||||
rot =
|
|
||||||
XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
|
|
||||||
root), &crot);
|
|
||||||
return rot;
|
|
||||||
#else /* ifdef ECORE_XRANDR */
|
|
||||||
return Ecore_X_Randr_None;
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @param root window which's primary output will be queried
|
|
||||||
* @return the current orientation of the root window's screen primary output
|
|
||||||
*/
|
|
||||||
EAPI Ecore_X_Randr_Orientation
|
|
||||||
ecore_x_randr_screen_primary_output_orientation_get(Ecore_X_Window root)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
Rotation crot = Ecore_X_Randr_None;
|
|
||||||
XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
|
|
||||||
root), &crot);
|
|
||||||
return crot;
|
|
||||||
#else /* ifdef ECORE_XRANDR */
|
|
||||||
return Ecore_X_Randr_None;
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Sets a given screen's primary output's orientation.
|
|
||||||
*
|
|
||||||
* @param root Window which's screen's primary output will be queried.
|
|
||||||
* @param orientation orientation which should be set for the root window's
|
|
||||||
* screen primary output.
|
|
||||||
* @return @c EINA_TRUE if the primary output's orientation could be
|
|
||||||
* successfully altered.
|
|
||||||
*/
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_screen_primary_output_orientation_set(
|
|
||||||
Ecore_X_Window root,
|
|
||||||
Ecore_X_Randr_Orientation
|
|
||||||
orientation)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
XRRScreenConfiguration *xrr_screen_cfg = NULL;
|
|
||||||
int sizeid;
|
|
||||||
Rotation crot;
|
|
||||||
Eina_Bool ret = EINA_FALSE;
|
|
||||||
if (!(xrr_screen_cfg = XRRGetScreenInfo(_ecore_x_disp, root)))
|
|
||||||
return EINA_FALSE;
|
|
||||||
|
|
||||||
sizeid = XRRConfigCurrentConfiguration(xrr_screen_cfg, &crot);
|
|
||||||
if (!XRRSetScreenConfig(_ecore_x_disp, xrr_screen_cfg, root, sizeid,
|
|
||||||
orientation, CurrentTime))
|
|
||||||
ret = EINA_TRUE;
|
|
||||||
|
|
||||||
if (xrr_screen_cfg)
|
|
||||||
XRRFreeScreenConfigInfo(xrr_screen_cfg);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
#else /* ifdef ECORE_XRANDR */
|
|
||||||
return EINA_FALSE;
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief gets a screen's primary output's possible sizes
|
|
||||||
* @param root window which's primary output will be queried
|
|
||||||
* @param num number of sizes reported as supported by the screen's primary output
|
|
||||||
* @return an array of sizes reported as supported by the screen's primary output or - if query failed - NULL
|
|
||||||
*/
|
|
||||||
EAPI Ecore_X_Randr_Screen_Size_MM *
|
|
||||||
ecore_x_randr_screen_primary_output_sizes_get(Ecore_X_Window root,
|
|
||||||
int *num)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
Ecore_X_Randr_Screen_Size_MM *ret = NULL;
|
|
||||||
XRRScreenSize *sizes;
|
|
||||||
int i, n;
|
|
||||||
|
|
||||||
/* we don't have to free sizes, because they're hold in a cache inside X*/
|
|
||||||
sizes =
|
|
||||||
XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
|
|
||||||
root), &n);
|
|
||||||
if ((!sizes) || (n <= 0)) return NULL;
|
|
||||||
ret = calloc(n, sizeof(Ecore_X_Randr_Screen_Size_MM));
|
|
||||||
if (!ret)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (num)
|
|
||||||
*num = n;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
ret[i].width = sizes[i].width;
|
|
||||||
ret[i].height = sizes[i].height;
|
|
||||||
ret[i].width_mm = sizes[i].mwidth;
|
|
||||||
ret[i].height_mm = sizes[i].mheight;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
#else /* ifdef ECORE_XRANDR */
|
|
||||||
return NULL;
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI void
|
|
||||||
ecore_x_randr_screen_primary_output_current_size_get(Ecore_X_Window root,
|
|
||||||
int *w,
|
|
||||||
int *h,
|
|
||||||
int *w_mm,
|
|
||||||
int *h_mm,
|
|
||||||
int *size_index)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
XRRScreenSize *sizes;
|
|
||||||
XRRScreenConfiguration *sc = NULL;
|
|
||||||
int idx;
|
|
||||||
Rotation orientation;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
if (!(sc = XRRGetScreenInfo(_ecore_x_disp, root)))
|
|
||||||
{
|
|
||||||
ERR("Couldn't get screen information for %d", root);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = XRRConfigCurrentConfiguration(sc, &orientation);
|
|
||||||
|
|
||||||
sizes =
|
|
||||||
XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
|
|
||||||
root), &n);
|
|
||||||
if ((idx < n) && (idx >= 0))
|
|
||||||
{
|
|
||||||
if (w)
|
|
||||||
*w = sizes[idx].width;
|
|
||||||
|
|
||||||
if (h)
|
|
||||||
*h = sizes[idx].height;
|
|
||||||
|
|
||||||
if (w_mm)
|
|
||||||
*w_mm = sizes[idx].mwidth;
|
|
||||||
|
|
||||||
if (h_mm)
|
|
||||||
*h_mm = sizes[idx].mheight;
|
|
||||||
|
|
||||||
if (size_index)
|
|
||||||
*size_index = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
XRRFreeScreenConfigInfo(sc);
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Sets a given screen's primary output size, but disables all other
|
|
||||||
* outputs at the same time.
|
|
||||||
*
|
|
||||||
* @param root Window which's primary output will be queried.
|
|
||||||
* @param size_index Within the list of sizes reported as supported by the root
|
|
||||||
* window's screen primary output.
|
|
||||||
* @return @c EINA_TRUE on success, @c EINA_FALSE on failure due to e.g.
|
|
||||||
* invalid times.
|
|
||||||
*/
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_screen_primary_output_size_set(Ecore_X_Window root,
|
|
||||||
int size_index)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
XRRScreenConfiguration *sc = NULL;
|
|
||||||
Eina_Bool ret = EINA_FALSE;
|
|
||||||
int nsizes = 0;
|
|
||||||
|
|
||||||
if (size_index >= 0 && _ecore_x_randr_root_validate(root))
|
|
||||||
{
|
|
||||||
XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
|
|
||||||
root), &nsizes);
|
|
||||||
|
|
||||||
if (size_index < nsizes)
|
|
||||||
{
|
|
||||||
sc = XRRGetScreenInfo(_ecore_x_disp, root);
|
|
||||||
if (!XRRSetScreenConfig(_ecore_x_disp, sc,
|
|
||||||
root, size_index,
|
|
||||||
ECORE_X_RANDR_ORIENTATION_ROT_0, CurrentTime))
|
|
||||||
{
|
|
||||||
ret = EINA_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sc)
|
|
||||||
XRRFreeScreenConfigInfo(sc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
#else /* ifdef ECORE_XRANDR */
|
|
||||||
return EINA_FALSE;
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @param root window which's primary output will be queried
|
|
||||||
* @return currently used refresh rate or - if request failed or RandRR is not available - 0.0
|
|
||||||
*/
|
|
||||||
EAPI Ecore_X_Randr_Refresh_Rate
|
|
||||||
ecore_x_randr_screen_primary_output_current_refresh_rate_get(
|
|
||||||
Ecore_X_Window root)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
Ecore_X_Randr_Refresh_Rate ret = 0.0;
|
|
||||||
XRRScreenConfiguration *sc = NULL;
|
|
||||||
|
|
||||||
if (!_ecore_x_randr_root_validate(root) ||
|
|
||||||
!(sc = XRRGetScreenInfo(_ecore_x_disp, root)))
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = XRRConfigCurrentRate(sc);
|
|
||||||
if (sc)
|
|
||||||
XRRFreeScreenConfigInfo(sc);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
#else /* ifdef ECORE_XRANDR */
|
|
||||||
return 0.0;
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @param root window which's primary output will be queried
|
|
||||||
* @param size_index referencing the size to query valid refresh rates for
|
|
||||||
* @return currently used refresh rate or - if request failed or RandRR is not available - NULL
|
|
||||||
*/
|
|
||||||
EAPI Ecore_X_Randr_Refresh_Rate *
|
|
||||||
ecore_x_randr_screen_primary_output_refresh_rates_get(Ecore_X_Window root,
|
|
||||||
int size_index,
|
|
||||||
int *num)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
Ecore_X_Randr_Refresh_Rate *ret = NULL, *rates = NULL;
|
|
||||||
Ecore_X_Randr_Screen scr;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
if (num
|
|
||||||
&& RANDR_VALIDATE_ROOT(scr, root)
|
|
||||||
&& (rates = XRRRates(_ecore_x_disp, scr, size_index, &n)))
|
|
||||||
{
|
|
||||||
if (rates && (ret = malloc(sizeof(Ecore_X_Randr_Refresh_Rate) * n)))
|
|
||||||
{
|
|
||||||
memcpy(ret, rates, (sizeof(Ecore_X_Randr_Refresh_Rate) * n));
|
|
||||||
*num = n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
#else /* ifdef ECORE_XRANDR */
|
|
||||||
return NULL;
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
}
|
|
||||||
|
|
||||||
//>= 1.1
|
|
||||||
/*
|
|
||||||
* @brief Sets the current primary output's refresh rate.
|
|
||||||
*
|
|
||||||
* @param root Window which's primary output will be queried.
|
|
||||||
* @param size_index Referencing the size to be set.
|
|
||||||
* @param rate The refresh rate to be set.
|
|
||||||
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
|
|
||||||
*/
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_screen_primary_output_refresh_rate_set(
|
|
||||||
Ecore_X_Window root,
|
|
||||||
int size_index,
|
|
||||||
Ecore_X_Randr_Refresh_Rate
|
|
||||||
rate)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
RANDR_CHECK_1_1_RET(EINA_FALSE);
|
|
||||||
Eina_Bool ret = EINA_FALSE;
|
|
||||||
XRRScreenConfiguration *sc = NULL;
|
|
||||||
|
|
||||||
if (!(sc = XRRGetScreenInfo(_ecore_x_disp, root)))
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (!XRRSetScreenConfigAndRate(_ecore_x_disp, sc,
|
|
||||||
root, size_index,
|
|
||||||
RR_Rotate_0, rate, CurrentTime))
|
|
||||||
ret = EINA_TRUE;
|
|
||||||
|
|
||||||
XRRFreeScreenConfigInfo(sc);
|
|
||||||
return ret;
|
|
||||||
#else /* ifdef ECORE_XRANDR */
|
|
||||||
return EINA_FALSE;
|
|
||||||
#endif /* ifdef ECORE_XRANDR */
|
|
||||||
}
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,463 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2006-2009 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
|
||||||
* to deal in the Software without restriction, including without limitation
|
|
||||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
|
||||||
* license, and/or sell copies of the Software, and to permit persons to whom
|
|
||||||
* the Software is furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice (including the next
|
|
||||||
* paragraph) shall be included in all copies or substantial portions of the
|
|
||||||
* Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
/* Original Author: Adam Jackson <ajax@nwnk.net> */
|
|
||||||
/* Heavily modified by: Leif Middelschulte <leif.middelschulte@gmail.com> */
|
|
||||||
|
|
||||||
#include "Ecore_X.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* TODO:
|
|
||||||
* - see other TODO's within this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ECORE_X_RANDR_EDID_VERSION_10 ((1 << 8) | 0)
|
|
||||||
#define ECORE_X_RANDR_EDID_VERSION_11 ((1 << 8) | 1)
|
|
||||||
#define ECORE_X_RANDR_EDID_VERSION_12 ((1 << 8) | 2)
|
|
||||||
#define ECORE_X_RANDR_EDID_VERSION_13 ((1 << 8) | 3)
|
|
||||||
#define ECORE_X_RANDR_EDID_VERSION_14 ((1 << 8) | 4)
|
|
||||||
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER 0x08
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_TYPE 0x14
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR 0x12
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR 0x13
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_DPMS 0x18
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_COLORSPACE 0x18
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK 0x36
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE 3
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT 5
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO_PREFERRED 15
|
|
||||||
#define _ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO 14
|
|
||||||
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_DIGITAL 0x80
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_DIGITAL_INTERFACE 0x0f
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_DIGITAL_TMDS_DFP_10 0x01
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_ANALOGOUS 0x18
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_444 0x10
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_422 0x08
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_PREFERRED 0xe0
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_DPMS 0xE0
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_DPMS_STANDBY 0x80
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_DPMS_SUSPEND 0x40
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_DPMS_OFF 0x20
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_INTERFACE_TYPE 0x0f
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_4_3 0x80
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_9 0x40
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_10 0x20
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_5_4 0x10
|
|
||||||
#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_15_9 0x08
|
|
||||||
|
|
||||||
#define _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX 13
|
|
||||||
|
|
||||||
typedef enum _Ecore_X_Randr_Edid_Aspect_Ratio_Preferred {
|
|
||||||
ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_4_3 = 0x00,
|
|
||||||
ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_9 = 0x01,
|
|
||||||
ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_10 = 0x02,
|
|
||||||
ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_5_4 = 0x03,
|
|
||||||
ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_15_9 = 0x04
|
|
||||||
} Ecore_X_Randr_Edid_Aspect_Ratio_Preferred;
|
|
||||||
|
|
||||||
/* Some convenience loops */
|
|
||||||
#define _ECORE_X_RANDR_EDID_FOR_EACH_EXTENSION_BLOCK(edid, edid_length, extension_block_iter) \
|
|
||||||
for (extension_block_iter = edid; extension_block_iter < (edid + edid_length); extension_block_iter += 128)
|
|
||||||
|
|
||||||
#define _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter) \
|
|
||||||
_ECORE_X_RANDR_EDID_FOR_EACH_EXTENSION_BLOCK(edid, edid_length, cea_block_iter) \
|
|
||||||
if (cea_block_iter[0] == 0x02)
|
|
||||||
|
|
||||||
/* The following macro is to be used with caution as it inherits another loop.
|
|
||||||
* Therefore using a 'break;' statement will lead to continuation in the
|
|
||||||
* inherent 'Extension block'-loop.
|
|
||||||
*/
|
|
||||||
#define _ECORE_X_RANDR_EDID_FOR_EACH_CEA_DETAILED_BLOCK(edid, edid_length, cea_block_iter, detailed_block_iter) \
|
|
||||||
_ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter) \
|
|
||||||
for (detailed_block_iter = cea_block_iter + cea_block_iter[2]; detailed_block_iter + 18 < cea_block_iter + 127; detailed_block_iter += 18) \
|
|
||||||
if (detailed_block_iter[0])
|
|
||||||
|
|
||||||
#define _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \
|
|
||||||
for (block = edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK; block <= (edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK + (3 * 18)); block += 18)
|
|
||||||
|
|
||||||
#define _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) \
|
|
||||||
_ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \
|
|
||||||
if ((block[0] == 0) && (block[1] == 0))
|
|
||||||
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_edid_has_valid_header(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
const unsigned char header[] =
|
|
||||||
{ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 };
|
|
||||||
if (!edid) return EINA_FALSE;
|
|
||||||
if (edid_length < 8) return EINA_FALSE;
|
|
||||||
if (!memcmp(edid, header, 8)) return EINA_TRUE;
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI int
|
|
||||||
ecore_x_randr_edid_version_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
if ((edid_length > _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR) &&
|
|
||||||
(ecore_x_randr_edid_has_valid_header(edid, edid_length)))
|
|
||||||
return (edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR] << 8) |
|
|
||||||
edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR];
|
|
||||||
return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI int
|
|
||||||
ecore_x_randr_edid_manufacturer_model_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
if ((edid_length > 0x0b) &&
|
|
||||||
(ecore_x_randr_edid_has_valid_header(edid, edid_length)))
|
|
||||||
return (int)(edid[0x0a] + (edid[0x0b] << 8));
|
|
||||||
return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI int
|
|
||||||
ecore_x_randr_edid_manufacturer_serial_number_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
if ((edid_length > 0x0f) &&
|
|
||||||
(ecore_x_randr_edid_has_valid_header(edid, edid_length)))
|
|
||||||
return (int)(edid[0x0c] + (edid[0x0d] << 8) +
|
|
||||||
(edid[0x0e] << 16) + (edid[0x0f] << 24));
|
|
||||||
return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI char *
|
|
||||||
ecore_x_randr_edid_manufacturer_name_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
if ((edid_length > (_ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER + 1)) &&
|
|
||||||
(ecore_x_randr_edid_has_valid_header(edid, edid_length)))
|
|
||||||
{
|
|
||||||
unsigned char *x;
|
|
||||||
char *name;
|
|
||||||
|
|
||||||
x = (edid + _ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER);
|
|
||||||
name = malloc(sizeof(char) * 4);
|
|
||||||
if (!name) return NULL;
|
|
||||||
name[0] = ((x[0] & 0x7c) >> 2) + '@';
|
|
||||||
name[1] = ((x[0] & 0x03) << 3) + ((x[1] & 0xe0) >> 5) + '@';
|
|
||||||
name[2] = (x[1] & 0x1f) + '@';
|
|
||||||
name[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] = 0;
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI char *
|
|
||||||
ecore_x_randr_edid_display_name_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
unsigned char *block = NULL;
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
|
|
||||||
_ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
|
|
||||||
{
|
|
||||||
if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfc)
|
|
||||||
{
|
|
||||||
char *name, *p;
|
|
||||||
const char *edid_name;
|
|
||||||
|
|
||||||
edid_name = (const char *)block + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
|
|
||||||
name = malloc(_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX + 1);
|
|
||||||
if (!name) return NULL;
|
|
||||||
strncpy(name, edid_name, _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
|
|
||||||
name[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
|
|
||||||
for (p = name; *p; p++)
|
|
||||||
{
|
|
||||||
if ((*p < ' ') || (*p > '~')) *p = 0;
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Ecore_X_Randr_Edid_Aspect_Ratio
|
|
||||||
ecore_x_randr_edid_display_aspect_ratio_preferred_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
unsigned char *block = NULL;
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
_ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
|
|
||||||
{
|
|
||||||
if ((block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfd) &&
|
|
||||||
(block[10] == 0x04))
|
|
||||||
{
|
|
||||||
Ecore_X_Randr_Edid_Aspect_Ratio_Preferred preferred_ratio =
|
|
||||||
(Ecore_X_Randr_Edid_Aspect_Ratio_Preferred)
|
|
||||||
((block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO_PREFERRED] &
|
|
||||||
_ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_PREFERRED) >> 5);
|
|
||||||
switch (preferred_ratio)
|
|
||||||
{
|
|
||||||
case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_4_3:
|
|
||||||
return ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3;
|
|
||||||
|
|
||||||
case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_9:
|
|
||||||
return ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9;
|
|
||||||
|
|
||||||
case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_10:
|
|
||||||
return ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10;
|
|
||||||
|
|
||||||
case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_5_4:
|
|
||||||
return ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4;
|
|
||||||
|
|
||||||
case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_15_9:
|
|
||||||
return ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Ecore_X_Randr_Edid_Aspect_Ratio
|
|
||||||
ecore_x_randr_edid_display_aspect_ratios_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
Ecore_X_Randr_Edid_Aspect_Ratio ret = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
unsigned char *block = NULL;
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
_ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
|
|
||||||
{
|
|
||||||
if ((block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfd) &&
|
|
||||||
(block[10] == 0x04))
|
|
||||||
{
|
|
||||||
if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_4_3)
|
|
||||||
ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3;
|
|
||||||
if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_9)
|
|
||||||
ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9;
|
|
||||||
if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_10)
|
|
||||||
ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10;
|
|
||||||
if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_5_4)
|
|
||||||
ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4;
|
|
||||||
if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_15_9)
|
|
||||||
ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI char *
|
|
||||||
ecore_x_randr_edid_display_ascii_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
unsigned char *block = NULL;
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
|
|
||||||
_ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
|
|
||||||
{
|
|
||||||
if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfe)
|
|
||||||
{
|
|
||||||
char *ascii, *p;
|
|
||||||
const char *edid_ascii = (const char *)block +
|
|
||||||
_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
|
|
||||||
/*
|
|
||||||
* TODO: Two of these in a row, in the third and fourth slots,
|
|
||||||
* seems to be specified by SPWG: http://www.spwg.org/
|
|
||||||
*/
|
|
||||||
ascii = malloc(_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX + 1);
|
|
||||||
if (!ascii) return NULL;
|
|
||||||
strncpy(ascii, edid_ascii, _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
|
|
||||||
ascii[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
|
|
||||||
for (p = ascii; *p; p++)
|
|
||||||
{
|
|
||||||
if ((*p < ' ') || (*p > '~')) *p = 0;
|
|
||||||
}
|
|
||||||
return ascii;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI char *
|
|
||||||
ecore_x_randr_edid_display_serial_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
unsigned char *block = NULL;
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
|
|
||||||
_ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
|
|
||||||
{
|
|
||||||
if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xff)
|
|
||||||
{
|
|
||||||
char *serial, *p;
|
|
||||||
const char *edid_serial = (const char *)block +
|
|
||||||
_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
|
|
||||||
/*
|
|
||||||
* TODO: Two of these in a row, in the third and fourth slots,
|
|
||||||
* seems to be specified by SPWG: http://www.spwg.org/
|
|
||||||
*/
|
|
||||||
serial = malloc(_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX + 1);
|
|
||||||
if (!serial) return NULL;
|
|
||||||
strncpy(serial, edid_serial, _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
|
|
||||||
serial[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
|
|
||||||
for (p = serial; *p; p++)
|
|
||||||
{
|
|
||||||
if ((*p < ' ') || (*p > '~')) *p = 0;
|
|
||||||
}
|
|
||||||
return serial;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_edid_info_has_valid_checksum(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
unsigned char *cea_block_iter = NULL;
|
|
||||||
char sum = 0;
|
|
||||||
int i;
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
|
|
||||||
if (edid_length < 128) return EINA_FALSE;
|
|
||||||
|
|
||||||
/* Check the EDID block itself */
|
|
||||||
for (i = 0; i < 128; i++)
|
|
||||||
sum += edid[i];
|
|
||||||
if (sum) return EINA_FALSE;
|
|
||||||
|
|
||||||
/* Check the cea extension blocks */
|
|
||||||
_ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter)
|
|
||||||
{
|
|
||||||
for (i = 0, sum = 0; i < 128; i++)
|
|
||||||
sum += cea_block_iter[i];
|
|
||||||
}
|
|
||||||
if (sum) return EINA_FALSE;
|
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_edid_dpms_available_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
|
|
||||||
return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
|
|
||||||
_ECORE_X_RANDR_EDID_MASK_DPMS);
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_edid_dpms_standby_available_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
|
|
||||||
if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] & _ECORE_X_RANDR_EDID_MASK_DPMS)
|
|
||||||
return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
|
|
||||||
_ECORE_X_RANDR_EDID_MASK_DPMS_STANDBY);
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_edid_dpms_suspend_available_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
|
|
||||||
if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] & _ECORE_X_RANDR_EDID_MASK_DPMS)
|
|
||||||
return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
|
|
||||||
_ECORE_X_RANDR_EDID_MASK_DPMS_SUSPEND);
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_edid_dpms_off_available_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
|
|
||||||
if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] & _ECORE_X_RANDR_EDID_MASK_DPMS)
|
|
||||||
return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
|
|
||||||
_ECORE_X_RANDR_EDID_MASK_DPMS_OFF);
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Eina_Bool
|
|
||||||
ecore_x_randr_edid_display_type_digital_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
|
|
||||||
return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_TYPE] &
|
|
||||||
_ECORE_X_RANDR_EDID_MASK_DIGITAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Ecore_X_Randr_Edid_Display_Colorscheme
|
|
||||||
ecore_x_randr_edid_display_colorscheme_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
Ecore_X_Randr_Edid_Display_Colorscheme colorscheme = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return colorscheme;
|
|
||||||
if (ecore_x_randr_edid_display_type_digital_get(edid, edid_length))
|
|
||||||
{
|
|
||||||
colorscheme = ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_4_4_4;
|
|
||||||
if (edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE] &
|
|
||||||
_ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_444)
|
|
||||||
colorscheme |= ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_4_4;
|
|
||||||
if (edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE] &
|
|
||||||
_ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_422)
|
|
||||||
colorscheme |= ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_2_2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
colorscheme = edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE] & _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_ANALOGOUS;
|
|
||||||
return colorscheme;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Ecore_X_Randr_Edid_Display_Interface_Type
|
|
||||||
ecore_x_randr_edid_display_interface_type_get(unsigned char *edid,
|
|
||||||
unsigned long edid_length)
|
|
||||||
{
|
|
||||||
Ecore_X_Randr_Edid_Display_Interface_Type type = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
int version = ecore_x_randr_edid_version_get(edid, edid_length);
|
|
||||||
|
|
||||||
if (version < ECORE_X_RANDR_EDID_VERSION_13) return type;
|
|
||||||
type = edid[_ECORE_X_RANDR_EDID_OFFSET_TYPE] &
|
|
||||||
_ECORE_X_RANDR_EDID_MASK_INTERFACE_TYPE;
|
|
||||||
if (type > ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DISPLAY_PORT)
|
|
||||||
type = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
/*
|
|
||||||
* vim:ts=8:sw=3:sts=8:expandtab:cino=>5n-3f0^-2{2
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "ecore_x_private.h"
|
|
||||||
#include "ecore_x_randr.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define Ecore_X_Randr_None 0
|
|
||||||
#define Ecore_X_Randr_Unset -1
|
|
||||||
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
|
|
||||||
#define RANDR_1_3 ((1 << 16) | 3)
|
|
||||||
#define RANDR_CHECK_1_3_RET(ret) if (_randr_version < RANDR_1_3) \
|
|
||||||
return ret
|
|
||||||
|
|
||||||
extern XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display *
|
|
||||||
dpy,
|
|
||||||
Window
|
|
||||||
window);
|
|
||||||
extern int _randr_version;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @param root window which's screen should be queried
|
|
||||||
* @return Ecore_X_Randr_Ouptut_Id or - if query failed or none is set - Ecore_X_Randr_None
|
|
||||||
*/
|
|
||||||
EAPI Ecore_X_Randr_Output
|
|
||||||
ecore_x_randr_primary_output_get(Ecore_X_Window root)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
RANDR_CHECK_1_3_RET(Ecore_X_Randr_None);
|
|
||||||
if (!_ecore_x_randr_root_validate(root))
|
|
||||||
return Ecore_X_Randr_None;
|
|
||||||
|
|
||||||
return XRRGetOutputPrimary(_ecore_x_disp, root);
|
|
||||||
#else
|
|
||||||
return Ecore_X_Randr_None;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @param root window which's screen should be queried
|
|
||||||
* @param output that should be set as given root window's screen primary output
|
|
||||||
*/
|
|
||||||
EAPI void
|
|
||||||
ecore_x_randr_primary_output_set(Ecore_X_Window root,
|
|
||||||
Ecore_X_Randr_Output output)
|
|
||||||
{
|
|
||||||
#ifdef ECORE_XRANDR
|
|
||||||
RANDR_CHECK_1_3_RET();
|
|
||||||
|
|
||||||
if (_ecore_x_randr_output_validate(root, output))
|
|
||||||
{
|
|
||||||
XRRSetOutputPrimary(_ecore_x_disp, root, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue