Hello,

Since the merge window is open, I would like to submit this patch for ecore. To 
make it short, it is a modified version of the patch I send two weeks ago. It 
implement backlight control through xrand extension. 

Mathieu
Index: xlib/ecore_x_randr_12.c
===================================================================
--- xlib/ecore_x_randr_12.c	(revision 56606)
+++ xlib/ecore_x_randr_12.c	(working copy)
@@ -1904,3 +1904,149 @@
                                          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 in the init part the module.
+    *  Initialize it if not already initialized 
+    */
+
+   if((level < 0)||(level > 100))
+     {
+       WRN("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");
+       return;
+     }
+   
+   /* get the ressources */
+   XRRScreenResources  *resources = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root);
+   
+   int o;
+  
+   if (!resources) return;
+   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) != -1)
+	 {
+	   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 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;
+   
+   if(_backlight == None)
+     _backlight = XInternAtom (_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
+   if(_backlight == None)
+     {
+       ERR("Backlight property is not suppported on this server");
+       return -1;
+     }
+
+   if(!_ecore_x_randr_output_validate(root, 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)
+     value = -1;
+   else
+     value = *((long *) prop);
+   free (prop);
+   return 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;
+  
+  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
+}
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires 
February 28th, so secure your free ArcSight Logger TODAY! 
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to