Hi Carsten,
so if you can provide an updated patch... that'd be awesome :)
Sorry I am late :-(. I thought I send the last version version earlier but I might have made a mistake. The last version of the patch includes the following modifications
- fix some typo and some comments. - the intensity is now set to be between (0,1) following Leif advise- I suppressed the global variable _backlight and declared it inside all three functions. It avoids a problem if the backlight atomic changes value.
Mathieu
Add xrandr support for backlight property in ecore_x ChangeLog | 4 src/lib/ecore_x/xlib/ecore_x_randr_12.c | 197 ++++++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+) Index: src/lib/ecore_x/xlib/ecore_x_randr_12.c =================================================================== --- src/lib/ecore_x/xlib/ecore_x_randr_12.c (revision 56959) +++ src/lib/ecore_x/xlib/ecore_x_randr_12.c (working copy) @@ -1904,3 +1904,200 @@ Ecore_X_Randr_Unset); #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(); + static Atom _backlight = None; + 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"); + } + + /* Clearly the server does not support it. */ + if (_backlight == None) + { + ERR("Backlight property is not suppported 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); + unsigned long nitems; + unsigned long bytes_after; + unsigned char *prop = NULL; + Atom actual_type; + int actual_format; + long value, max, min; + double dvalue; + XRRPropertyInfo *info = NULL; + static int _backlight = None; + /* 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\n"); + 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)) + value = -1; + else + value = *((long *)prop); + free (prop); + + /* + * Copy the result of the previous operation + * the value will rescaled if value is different from -1 + */ + dvalue = value; + + /* 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) + { + 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; +#else + return -1; +#endif +} + +/* + * @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); + XRRPropertyInfo *info = NULL; + double min, max, tmp; + long new; + static Atom _backlight = None; + + 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; + } + return EINA_FALSE; +#else + return EINA_FALSE; +#endif +} Index: ChangeLog =================================================================== --- ChangeLog (revision 56959) +++ ChangeLog (working copy) @@ -1,3 +1,7 @@ +2011-02-09 Mathieu Taillefumier + + * Add xrandr backlight support to ecore_x + 2011-01-29 Carsten Haitzler (The Rasterman) 1.0.0 release
------------------------------------------------------------------------------ The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE: Pinpoint memory and threading errors before they happen. Find and fix more than 250 security defects in the development cycle. Locate bottlenecks in serial and parallel code that limit performance. http://p.sf.net/sfu/intel-dev2devfeb
_______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel