[Goodies-commits] r5658 - xfce4-power-manager/trunk/src

Ali Abdallah aliov at xfce.org
Fri Oct 17 10:54:38 CEST 2008


Author: aliov
Date: 2008-10-17 08:54:38 +0000 (Fri, 17 Oct 2008)
New Revision: 5658

Modified:
   xfce4-power-manager/trunk/src/xfpm-lcd-brightness.c
Log:
Added support for lcd brightness when control is not done by hardware

Modified: xfce4-power-manager/trunk/src/xfpm-lcd-brightness.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-lcd-brightness.c	2008-10-17 07:31:28 UTC (rev 5657)
+++ xfce4-power-manager/trunk/src/xfpm-lcd-brightness.c	2008-10-17 08:54:38 UTC (rev 5658)
@@ -70,6 +70,14 @@
 
 static void xfpm_lcd_brightness_get_device(XfpmLcdBrightness *lcd);
 
+static void xfpm_lcd_brightness_increase(XfpmLcdBrightness *lcd);
+static void xfpm_lcd_brightness_decrease(XfpmLcdBrightness *lcd);
+
+static void xfpm_lcd_brightness_handle_device_condition_cb(XfpmHal *hal,
+                                                           const gchar *udi,
+                                                           const gchar *condition_name,
+                                                           const gchar *condition_detail,
+                                                           XfpmLcdBrightness *lcd);
 static void xfpm_lcd_brightness_notify_cb(GObject *object,
                                           GParamSpec *arg1,
                                           gpointer data);
@@ -79,8 +87,10 @@
     
     XfpmHal *hal;
     gboolean device_exists;
+    gboolean brightness_in_hardware;
     gchar *udi;
     gint max_brightness;
+    gint step;
 
 };
 
@@ -128,8 +138,10 @@
     
     priv->hal = xfpm_hal_new();
     priv->device_exists = FALSE;
+    priv->brightness_in_hardware = TRUE; 
     priv->udi = NULL;
     priv->max_brightness = -1;
+    priv->step = 0;
     
     xfpm_lcd_brightness_load_config(lcd);
     xfpm_lcd_brightness_get_device(lcd);
@@ -138,6 +150,14 @@
     {
         g_signal_connect(G_OBJECT(lcd),"notify",
                          G_CALLBACK(xfpm_lcd_brightness_notify_cb),NULL);
+        if (!priv->brightness_in_hardware )
+        {
+            if (xfpm_hal_connect_to_signals(priv->hal,FALSE,FALSE,FALSE,TRUE) )
+            {
+                g_signal_connect(priv->hal,"xfpm-device-condition",
+                            G_CALLBACK(xfpm_lcd_brightness_handle_device_condition_cb),lcd);
+            }
+        }                 
     }
     
 }
@@ -286,12 +306,28 @@
 }
 
 static void
+_get_steps(XfpmLcdBrightness *lcd)
+{
+    XfpmLcdBrightnessPrivate *priv;
+    priv = XFPM_LCD_BRIGHTNESS_GET_PRIVATE(lcd);
+    
+    if ( priv->max_brightness <= 9 )
+    {
+        priv->step = 1;
+        return;
+    }
+    
+    priv->step = priv->max_brightness/10; /* 77 for example will give 7 step, so that's okay */
+    XFPM_DEBUG("Found approximate lcd brightness steps = %d\n",priv->step);
+}
+
+static void
 xfpm_lcd_brightness_get_device(XfpmLcdBrightness *lcd)
 {
     XfpmLcdBrightnessPrivate *priv;
     priv = XFPM_LCD_BRIGHTNESS_GET_PRIVATE(lcd);
-    
-    gchar **udi;
+
+    gchar **udi = NULL;
     gint num;
     GError *error = NULL;
     udi = xfpm_hal_get_device_udi_by_capability(priv->hal,"laptop_panel",&num,&error);
@@ -325,11 +361,122 @@
             g_error_free(error);
             return;
         }
+        XFPM_DEBUG("Max screen luminosity = %d\n",priv->max_brightness);
         priv->device_exists = TRUE;
     }
+    
+    if ( xfpm_hal_device_have_key(priv->hal,priv->udi,"laptop_panel.brightness_in_hardware") )
+    {
+        priv->brightness_in_hardware = xfpm_hal_get_bool_info(priv->hal,priv->udi,
+                                            "laptop_panel.brightness_in_hardware",&error);
+        if ( error )
+        {
+            XFPM_DEBUG("error getting max brigthness level: %s\n",error->message);
+            g_error_free(error);
+            priv->brightness_in_hardware = TRUE; /* we always assume that control is in hardware */
+            _get_steps(lcd);
+            return;
+        }                                    
+    }
+    
 }
 
 static void
+xfpm_lcd_brightness_increase(XfpmLcdBrightness *lcd)
+{
+    XfpmLcdBrightnessPrivate *priv;
+    priv = XFPM_LCD_BRIGHTNESS_GET_PRIVATE(lcd);
+    GError *error = NULL;
+    gint32 level =
+        xfpm_hal_get_brightness(priv->hal,priv->udi,&error);
+        
+    if ( error )
+    {
+        XFPM_DEBUG("Get brightness failed: %s\n",error->message);
+        g_error_free(error);
+        return;
+    }
+    
+    if ( level != priv->max_brightness -1 )
+    {
+        gint32 set = priv->step + level;
+        if ( set > priv->max_brightness -1 )
+        {
+            set = priv->max_brightness -1;
+        }
+        XFPM_DEBUG("Setting brightness=%d\n",set);
+        xfpm_hal_set_brightness(priv->hal,priv->udi,set,&error);
+        if ( error )
+        {
+            XFPM_DEBUG("Error setting brigthness level: %s\n",error->message);
+            g_error_free(error);
+            return;
+        }
+    }
+}
+
+static void
+xfpm_lcd_brightness_decrease(XfpmLcdBrightness *lcd)
+{
+    XfpmLcdBrightnessPrivate *priv;
+    priv = XFPM_LCD_BRIGHTNESS_GET_PRIVATE(lcd);
+    GError *error = NULL;
+    gint32 level =
+        xfpm_hal_get_brightness(priv->hal,priv->udi,&error);
+        
+    if ( error )
+    {
+        XFPM_DEBUG("Get brightness failed: %s\n",error->message);
+        g_error_free(error);
+        return;
+    }
+    
+    if ( level != 1 )
+    {
+        gint32 set =  level - priv->step;
+        
+        if ( set < 0 )
+        {
+            set = 1;
+        }
+        XFPM_DEBUG("Setting brightness=%d\n",set);
+        xfpm_hal_set_brightness(priv->hal,priv->udi,set,&error);
+        if ( error )
+        {
+            XFPM_DEBUG("Error setting brigthness level: %s\n",error->message);
+            g_error_free(error);
+            return;
+        }
+    }
+}
+
+static void 
+xfpm_lcd_brightness_handle_device_condition_cb(XfpmHal *hal,
+                                               const gchar *udi,
+                                               const gchar *condition_name,
+                                               const gchar *condition_detail,
+                                               XfpmLcdBrightness *lcd)
+{
+    if ( !lcd->brightness_control_enabled ) return;
+        
+    if ( xfpm_hal_device_have_capability(hal,udi,"button") )
+    {
+        if ( !strcmp(condition_name,"ButtonPressed") )
+        {
+            if ( !strcmp(condition_detail,"brightness-down") )
+            {
+                xfpm_lcd_brightness_decrease(lcd);
+            }
+            else if ( !strcmp(condition_name,"brightness-up") )
+            {
+                xfpm_lcd_brightness_increase(lcd);
+            }
+        }
+    }
+}                                                           
+                                                           
+
+static void
 xfpm_lcd_brightness_notify_cb(GObject *object,GParamSpec *arg1,gpointer data)
 {
     XfpmLcdBrightness *lcd;




More information about the Goodies-commits mailing list