forked from enlightenment/efl
From: Mathieu Taillefumier <mathieu.taillefumier@free.fr>
Subject: Re: [E-devel] [PATCH][Ecore] second version of the backlight functions Add backlight support impl - thanks mathieu SVN revision: 57158
This commit is contained in:
parent
c83d7b3eb6
commit
95ea487188
|
@ -1,3 +1,7 @@
|
||||||
|
2011-02-09 Mathieu Taillefumier
|
||||||
|
|
||||||
|
* Add xrandr backlight support to ecore_x
|
||||||
|
|
||||||
2011-01-29 Carsten Haitzler (The Rasterman)
|
2011-01-29 Carsten Haitzler (The Rasterman)
|
||||||
|
|
||||||
1.0.0 release
|
1.0.0 release
|
||||||
|
|
|
@ -1904,3 +1904,185 @@ ecore_x_randr_screen_reset(Ecore_X_Window root)
|
||||||
Ecore_X_Randr_Unset);
|
Ecore_X_Randr_Unset);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief set up the backlight level to the given level.
|
||||||
|
* @param root the window's screen which will be set.
|
||||||
|
* @param level of the backlight between 0 and 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
ecore_x_randr_screen_backlight_level_set(Ecore_X_Window root,
|
||||||
|
double level)
|
||||||
|
{
|
||||||
|
#ifdef ECORE_XRANDR
|
||||||
|
RANDR_CHECK_1_2_RET();
|
||||||
|
Atom _backlight;
|
||||||
|
XRRScreenResources *resources = NULL;
|
||||||
|
Ecore_X_Randr_Output output;
|
||||||
|
int o;
|
||||||
|
|
||||||
|
if ((level < 0) || (level > 1))
|
||||||
|
{
|
||||||
|
ERR("Wrong value for the backlight level. It should be between 0 and 1.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To make sure that the _backlight atomic property still exists.
|
||||||
|
*/
|
||||||
|
_backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
|
||||||
|
if (_backlight == None)
|
||||||
|
{
|
||||||
|
WRN("Backlight setting is not supported on this server or driver");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the ressources */
|
||||||
|
resources = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root);
|
||||||
|
if (!resources) return;
|
||||||
|
|
||||||
|
for (o = 0; o < resources->noutput; o++)
|
||||||
|
{
|
||||||
|
output = resources->outputs[o];
|
||||||
|
if (ecore_x_randr_output_backlight_level_get(root, output) >= 0)
|
||||||
|
{
|
||||||
|
ecore_x_randr_output_backlight_level_set(root, output, level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
XRRFreeScreenResources(resources);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief get the backlight level of the given output
|
||||||
|
* @param root window which's screen should be queried
|
||||||
|
* @param output from which the backlight level should be retrieved
|
||||||
|
* @return the backlight level
|
||||||
|
*/
|
||||||
|
|
||||||
|
EAPI double
|
||||||
|
ecore_x_randr_output_backlight_level_get(Ecore_X_Window root,
|
||||||
|
Ecore_X_Randr_Output output)
|
||||||
|
{
|
||||||
|
#ifdef ECORE_XRANDR
|
||||||
|
RANDR_CHECK_1_2_RET(-1);
|
||||||
|
Atom actual_type;
|
||||||
|
Atom _backlight;
|
||||||
|
XRRPropertyInfo *info = NULL;
|
||||||
|
double dvalue;
|
||||||
|
int actual_format;
|
||||||
|
long value, max, min;
|
||||||
|
unsigned long nitems;
|
||||||
|
unsigned long bytes_after;
|
||||||
|
unsigned char *prop = NULL;
|
||||||
|
|
||||||
|
/* set backlight variable if not already done */
|
||||||
|
|
||||||
|
_backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
|
||||||
|
if (_backlight == None)
|
||||||
|
{
|
||||||
|
ERR("Backlight property is not suppported on this server or driver");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_ecore_x_randr_output_validate(root, output))
|
||||||
|
{
|
||||||
|
ERR("Invalid output");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (XRRGetOutputProperty(_ecore_x_disp, output, _backlight,
|
||||||
|
0, 4, False, False, None,
|
||||||
|
&actual_type, &actual_format,
|
||||||
|
&nitems, &bytes_after, &prop) != Success)
|
||||||
|
{
|
||||||
|
WRN("Backlight not supported on this output");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((actual_type != XA_INTEGER) || (nitems != 1) || (actual_format != 32)) return -1;
|
||||||
|
|
||||||
|
value = *((long *)prop);
|
||||||
|
free (prop);
|
||||||
|
|
||||||
|
/* I have the current value of the backlight */
|
||||||
|
/* Now retrieve the min and max intensities of the output */
|
||||||
|
info = XRRQueryOutputProperty(_ecore_x_disp, output, _backlight);
|
||||||
|
if (info)
|
||||||
|
{
|
||||||
|
dvalue = -1;
|
||||||
|
if ((info->range) && (info->num_values == 2))
|
||||||
|
{
|
||||||
|
/* finally convert the current value in the interval [0..1] */
|
||||||
|
min = info->values[0];
|
||||||
|
max = info->values[1];
|
||||||
|
dvalue = ((double)(value - min)) / ((double)(max - min));
|
||||||
|
}
|
||||||
|
free(info);
|
||||||
|
return dvalue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief set the backlight level of a given output
|
||||||
|
* @param root window which's screen should be queried
|
||||||
|
* @param output that should be set
|
||||||
|
* @param level for which the backlight should be set
|
||||||
|
* @return EINA_TRUE in case of success
|
||||||
|
*/
|
||||||
|
|
||||||
|
EAPI Eina_Bool
|
||||||
|
ecore_x_randr_output_backlight_level_set(Ecore_X_Window root,
|
||||||
|
Ecore_X_Randr_Output output,
|
||||||
|
double level)
|
||||||
|
{
|
||||||
|
#ifdef ECORE_XRANDR
|
||||||
|
RANDR_CHECK_1_2_RET(EINA_FALSE);
|
||||||
|
Atom _backlight;
|
||||||
|
XRRPropertyInfo *info = NULL;
|
||||||
|
double min, max, tmp;
|
||||||
|
long new;
|
||||||
|
|
||||||
|
if ((level < 0) || (level > 1))
|
||||||
|
{
|
||||||
|
ERR("Backlight level should be between 0 and 1");
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_ecore_x_randr_output_validate(root, output))
|
||||||
|
{
|
||||||
|
ERR("Wrong output value");
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
|
||||||
|
if (_backlight == None)
|
||||||
|
{
|
||||||
|
WRN("Backlight property is not suppported on this server or driver");
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
info = XRRQueryOutputProperty(_ecore_x_disp, output, _backlight);
|
||||||
|
if (info)
|
||||||
|
{
|
||||||
|
if ((info->range) && (info->num_values == 2))
|
||||||
|
{
|
||||||
|
min = info->values[0];
|
||||||
|
max = info->values[1];
|
||||||
|
tmp = (level * (max - min)) + min;
|
||||||
|
new = tmp;
|
||||||
|
if (new > max) new = max;
|
||||||
|
if (new < min) new = min;
|
||||||
|
XRRChangeOutputProperty(_ecore_x_disp, output, _backlight, XA_INTEGER, 32,
|
||||||
|
PropModeReplace, (unsigned char *)&new, 1);
|
||||||
|
XFlush(_ecore_x_disp);
|
||||||
|
}
|
||||||
|
free(info);
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue