Hello,

I modified my previous patch that adds the necessary functions for controlling 
the backlight levels. I fixed an small inconsistency in the function returning 
the backlight level. Since my previous patch is not already applied, could one 
you consider this modified version instead. 

I should point out that these two functions are already defined in the API of 
Ecore 1.0.0 but there are not implemented. So it might be a good idea to add 
the functions in Ecore 1.0.0 since there is not API break. 

For the ChangeLog 

09-02-2011 Mathieu Taillefumier
           Add the functions for controlling the backlight level in Ecore. They 
are implemented using the xrandr extension. 

Mathieu
Index: src/lib/ecore_x/xlib/ecore_x_randr_12.c
===================================================================
--- src/lib/ecore_x/xlib/ecore_x_randr_12.c	(revision 56841)
+++ src/lib/ecore_x/xlib/ecore_x_randr_12.c	(working copy)
@@ -36,6 +36,7 @@
                                                                    Window
                                                                    window);
 extern int _randr_version;
+static Ecore_X_Atom _backlight;
 #endif
 
 /**
@@ -82,7 +83,7 @@
    int i;
    Eina_Bool ret = EINA_FALSE;
 
-   if ((crtc == Ecore_X_Randr_None) || 
+   if ((crtc == Ecore_X_Randr_None) ||
        (crtc == Ecore_X_Randr_Unset))
       return ret;
 
@@ -837,7 +838,7 @@
      }
    if (crtc_info)
       XRRFreeCrtcInfo(crtc_info);
-   
+
    if (res)
       XRRFreeScreenResources(res);
 
@@ -867,10 +868,10 @@
      }
    if (crtc_info)
       XRRFreeCrtcInfo(crtc_info);
-   
+
    if (res)
       XRRFreeScreenResources(res);
-   
+
    return ret;
 #else
    return Ecore_X_Randr_None;
@@ -1904,3 +1905,162 @@
                                          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 100
+ */
+
+EAPI void
+ecore_x_randr_screen_backlight_level_set(Ecore_X_Window root, double level)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+   /*
+    *  maybe move this should be in the init part the module.
+    *  Initialize it if not already initialized
+    */
+
+   if((level < 0)||(level > 100))
+     {
+       ERR("Wrong value for the backlight level. It should be between 0 and 100.");
+       return;
+     }
+
+   if(_backlight == None)
+     _backlight = XInternAtom (_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
+
+   /* 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 */
+   XRRScreenResources  *resources = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root);
+
+   if (!resources) return;
+   int o;
+   for (o = 0; o < resources->noutput; o++)
+     {
+       Ecore_X_Randr_Output 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;
+   Atom actual_type;
+   int actual_format;
+   long value;
+
+   /* set backlight variable if not already done */
+   if(_backlight == None)
+     _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);
+
+   /* I have the current value of the backlight */
+   /* Now retrieve the min and max intensities of the output */
+   XRRPropertyInfo *info =  XRRQueryOutputProperty (_ecore_x_disp, output, _backlight);
+   if (info)
+     {
+       if (info->range && info->num_values == 2)
+         {
+           /* finally convert the current value in percent to be user friendly */
+           long min = info->values[0];
+           long max = info->values[1];
+           value = (value-min)*100/(max-min);
+         }
+       free(info);
+     }
+   return ((double)value);
+#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);
+   if(!_ecore_x_randr_output_validate(root, output))
+     return EINA_FALSE;
+
+   XRRPropertyInfo *info =  XRRQueryOutputProperty (_ecore_x_disp, output, _backlight);
+   if (info)
+     {
+       if (info->range && info->num_values == 2)
+         {
+           double min = info->values[0];
+           double max = info->values[1];
+           double tmp = (level * (max - min) / 100) + min;
+           long 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
+}
------------------------------------------------------------------------------
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

Reply via email to