[Goodies-commits] r6891 - in xfce4-power-manager/trunk: . libxfpm panel-plugins/brightness src

Ali Abdallah aliov at xfce.org
Fri Mar 13 14:01:30 CET 2009


Author: aliov
Date: 2009-03-13 13:01:30 +0000 (Fri, 13 Mar 2009)
New Revision: 6891

Added:
   xfce4-power-manager/trunk/libxfpm/hal-battery.c
   xfce4-power-manager/trunk/libxfpm/hal-battery.h
   xfce4-power-manager/trunk/libxfpm/hal-manager.c
   xfce4-power-manager/trunk/libxfpm/hal-manager.h
   xfce4-power-manager/trunk/libxfpm/hal-marshal.c
   xfce4-power-manager/trunk/libxfpm/hal-marshal.h
   xfce4-power-manager/trunk/libxfpm/hal-marshal.list
Removed:
   xfce4-power-manager/trunk/libxfpm/hal-ctx.c
   xfce4-power-manager/trunk/libxfpm/hal-ctx.h
Modified:
   xfce4-power-manager/trunk/ChangeLog
   xfce4-power-manager/trunk/configure.ac.in
   xfce4-power-manager/trunk/libxfpm/Makefile.am
   xfce4-power-manager/trunk/libxfpm/hal-device.c
   xfce4-power-manager/trunk/libxfpm/hal-device.h
   xfce4-power-manager/trunk/libxfpm/hal-enum.h
   xfce4-power-manager/trunk/libxfpm/hal-power.c
   xfce4-power-manager/trunk/libxfpm/hal-power.h
   xfce4-power-manager/trunk/panel-plugins/brightness/Makefile.am
   xfce4-power-manager/trunk/panel-plugins/brightness/main.c
   xfce4-power-manager/trunk/src/Makefile.am
   xfce4-power-manager/trunk/src/xfpm-adapter.c
   xfce4-power-manager/trunk/src/xfpm-adapter.h
   xfce4-power-manager/trunk/src/xfpm-battery-info.c
   xfce4-power-manager/trunk/src/xfpm-battery-info.h
   xfce4-power-manager/trunk/src/xfpm-battery.c
   xfce4-power-manager/trunk/src/xfpm-battery.h
   xfce4-power-manager/trunk/src/xfpm-brightness-hal.c
   xfce4-power-manager/trunk/src/xfpm-cpu.c
   xfce4-power-manager/trunk/src/xfpm-lid-hal.c
   xfce4-power-manager/trunk/src/xfpm-supply.c
   xfce4-power-manager/trunk/src/xfpm-supply.h
Log:
Dropping the libhal dependency, just doing simple proxy calls to get informations from hald

Modified: xfce4-power-manager/trunk/ChangeLog
===================================================================
--- xfce4-power-manager/trunk/ChangeLog	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/ChangeLog	2009-03-13 13:01:30 UTC (rev 6891)
@@ -1,4 +1,7 @@
 
+2009-03-13 14:01 Ali aliov at xfce.org 
+	 * : Dropping the libhal dependency, just doing simple proxy calls to get informations from hald
+
 2009-03-11 20:38 Ali aliov at xfce.org 
 	 * : Implement critical battery level settings+the option to disable lock screen when suspend/hibernate
 

Modified: xfce4-power-manager/trunk/configure.ac.in
===================================================================
--- xfce4-power-manager/trunk/configure.ac.in	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/configure.ac.in	2009-03-13 13:01:30 UTC (rev 6891)
@@ -56,7 +56,6 @@
 m4_define([glib_minimum_version], [2.14.0]) 
 m4_define([dbus_minimum_version], [0.60])
 m4_define([dbus_glib_minimum_version], [0.70])
-m4_define([hal_minimum_version], [0.5.6])
 
 m4_define([xfconf_minimum_version], [4.6.0])
 m4_define([libxfcegui4_minimum_version],[4.6.0])
@@ -71,7 +70,6 @@
 XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [gtk_minimum_version])
 XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [glib_minimum_version])
 XDT_CHECK_PACKAGE([DBUS], [dbus-1], [dbus_minimum_version])
-XDT_CHECK_PACKAGE([HAL], [hal], [hal_minimum_version])
 XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [dbus_glib_minimum_version])
 XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0],[xfconf_minimum_version])
 XDT_CHECK_PACKAGE([LIBXFCE4GUI], [libxfcegui4-1.0],[libxfcegui4_minimum_version])

Modified: xfce4-power-manager/trunk/libxfpm/Makefile.am
===================================================================
--- xfce4-power-manager/trunk/libxfpm/Makefile.am	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/libxfpm/Makefile.am	2009-03-13 13:01:30 UTC (rev 6891)
@@ -4,15 +4,20 @@
 	libxfpmcommon.la
 
 libxfpmhal_la_SOURCES =			\
-	hal-ctx.c			\
-	hal-ctx.h			\
+	xfpm-string.c			\
+	xfpm-string.h			\
+	hal-marshal.c			\
+	hal-mardhal.h			\
+	hal-manager.c			\
+	hal-manager.h			\
 	hal-power.c			\
 	hal-power.h			\
 	hal-device.c			\
-	hal-device.h
+	hal-device.h			\
+	hal-battery.c			\
+	hal-battery.h
 
 libxfpmhal_la_CFLAGS =			\
-	$(HAL_CFLAGS)			\
 	$(GLIB_CFLAGS)			\
 	$(DBUS_GLIB_CFLAGS)
 
@@ -41,4 +46,24 @@
         $(GTK_CFLAGS)           	\
         $(GLIB_CFLAGS)          	\
         $(DBUS_CFLAGS)			\
-	$(LIBXFCE4UTIL_CFLAGS)
\ No newline at end of file
+	$(LIBXFCE4UTIL_CFLAGS)
+
+if MAINTAINER_MODE
+
+BUILT_SOURCES =				\
+	hal-marshal.c			\
+	hal-marshal.h
+
+hal-marshal.h: hal-marshal.list
+	glib-genmarshal --header --prefix="_hal_marshal" \
+            hal-marshal.list > tmp-marshal.h && \
+        cp tmp-marshal.h $(@F) && \
+        rm -f tmp-marshal.h tmp-marshal.h~
+
+hal-marshal.c: hal-marshal.h
+	glib-genmarshal --body --prefix="_hal_marshal" \
+            hal-marshal.list > tmp-marshal.c && \
+        cp tmp-marshal.c $(@F) && \
+        rm -f tmp-marshal.c tmp-marshal.c~
+
+endif
\ No newline at end of file

Added: xfce4-power-manager/trunk/libxfpm/hal-battery.c
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-battery.c	                        (rev 0)
+++ xfce4-power-manager/trunk/libxfpm/hal-battery.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -0,0 +1,582 @@
+/*
+ * * Copyright (C) 2008-2009 Ali <aliov at xfce.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include "hal-battery.h"
+#include "hal-manager.h"
+#include "hal-enum.h"
+
+#include "xfpm-string.h"
+
+/* Init */
+static void hal_battery_class_init (HalBatteryClass *klass);
+static void hal_battery_init       (HalBattery *device);
+static void hal_battery_finalize   (GObject *object);
+
+static void hal_battery_get_property(GObject *object,
+				    guint prop_id,
+				    GValue *value,
+				    GParamSpec *pspec);
+
+#define HAL_BATTERY_GET_PRIVATE(o) \
+(G_TYPE_INSTANCE_GET_PRIVATE((o), HAL_TYPE_BATTERY, HalBatteryPrivate))
+
+struct HalBatteryPrivate
+{
+    HalManager *manager;
+    
+    /* Properties read-only */
+    HalDeviceType type;
+    
+    gboolean  is_present;
+    gboolean  is_charging;
+    gboolean  is_discharging;
+    
+    gchar    *unit;
+    gchar    *technology;
+    gchar    *vendor;
+    gchar    *model;
+    guint     percentage;
+
+    guint32   current_charge;
+    guint32   last_full;
+    
+    guint32   reporting_design;
+    guint32   reporting_last_full;
+    
+    guint      time;
+    
+};
+
+enum
+{
+    PROP_0,
+    PROP_TYPE,
+    PROP_IS_PRESENT,
+    PROP_IS_CHARGING,
+    PROP_IS_DISCHARGING,
+    PROP_CURRENT_CHARGE,
+    PROP_PERCENTAGE,
+    PROP_REPORTING_DESIGN,
+    PROP_LAST_FULL,
+    PROP_REPORTING_LAST_FULL,
+    PROP_TIME,
+    PROP_TECHNOLOGY,
+    PROP_VENDOR,
+    PROP_MODEL,
+    PROP_UNIT
+};
+
+enum
+{
+    BATTERY_CHANGED,
+    LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE(HalBattery, hal_battery, HAL_TYPE_DEVICE)
+
+static void
+hal_battery_class_init(HalBatteryClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS(klass);
+
+    object_class->get_property = hal_battery_get_property;
+    object_class->finalize = hal_battery_finalize;
+
+    signals[BATTERY_CHANGED] =
+    	g_signal_new("battery-changed",
+		     HAL_TYPE_BATTERY,
+		     G_SIGNAL_RUN_LAST,
+		     G_STRUCT_OFFSET(HalBatteryClass, battery_changed),
+		     NULL, NULL,
+		     g_cclosure_marshal_VOID__VOID,
+		     G_TYPE_NONE, 0, G_TYPE_NONE);
+    
+    g_object_class_install_property(object_class,
+				    PROP_IS_PRESENT,
+				    g_param_spec_boolean("is-present",
+				    			 NULL, NULL,
+							 FALSE,
+							 G_PARAM_READABLE));
+
+    g_object_class_install_property(object_class,
+				    PROP_IS_CHARGING,
+				    g_param_spec_boolean("is-charging",
+							 NULL, NULL,
+							 FALSE,
+							 G_PARAM_READABLE));
+							 
+    g_object_class_install_property(object_class,
+				    PROP_IS_DISCHARGING,
+				    g_param_spec_boolean("is-discharging",
+							 NULL, NULL,
+							 FALSE,
+							 G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+				    PROP_CURRENT_CHARGE,
+				    g_param_spec_uint("current-charge",
+						      NULL, NULL,
+						      0,
+						      G_MAXUINT32,
+						      0,
+						      G_PARAM_READABLE));
+						      
+    g_object_class_install_property(object_class,
+				    PROP_LAST_FULL,
+				    g_param_spec_uint("last-full",
+						      NULL, NULL,
+						      0,
+						      G_MAXUINT32,
+						      0,
+						      G_PARAM_READABLE));
+						      
+     g_object_class_install_property(object_class,
+				    PROP_REPORTING_DESIGN,
+				    g_param_spec_uint("reporting-design",
+						      NULL, NULL,
+						      0,
+						      G_MAXUINT32,
+						      0,
+						      G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+				    PROP_REPORTING_LAST_FULL,
+				    g_param_spec_uint("reporting-last-full",
+						      NULL, NULL,
+						      0,
+						      G_MAXUINT32,
+						      0,
+						      G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+				    PROP_TIME,
+				    g_param_spec_uint("time",
+						      NULL, NULL,
+						      0,
+						      G_MAXINT,
+						      0,
+						      G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+				    PROP_TYPE,
+				    g_param_spec_uint("type",
+						      NULL, NULL,
+						      0,
+						      HAL_DEVICE_TYPE_UNKNOWN,
+						      HAL_DEVICE_TYPE_UNKNOWN,
+						      G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+				    PROP_PERCENTAGE,
+				    g_param_spec_uint("percentage",
+						      NULL, NULL,
+						      0,
+						      G_MAXINT,
+						      0,
+						      G_PARAM_READABLE));
+						      
+    g_object_class_install_property(object_class,
+				    PROP_TECHNOLOGY,
+				    g_param_spec_string("technology",
+							NULL, NULL,
+						        NULL,
+						        G_PARAM_READABLE));
+     g_object_class_install_property(object_class,
+				    PROP_VENDOR,
+				    g_param_spec_string("vendor",
+							NULL, NULL,
+						        NULL,
+						        G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+				    PROP_MODEL,
+				    g_param_spec_string("model",
+							NULL, NULL,
+						        NULL,
+						        G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+				    PROP_UNIT,
+				    g_param_spec_string("unit",
+							 NULL, NULL,
+							 FALSE,
+							 G_PARAM_READABLE));
+							 
+    g_type_class_add_private(klass,sizeof(HalBatteryPrivate));
+}
+
+static void
+hal_battery_init (HalBattery *battery)
+{
+
+    battery->priv = HAL_BATTERY_GET_PRIVATE(battery);
+    
+    battery->priv->manager = hal_manager_new ();
+    
+    battery->priv->is_present      = FALSE;
+    battery->priv->is_charging     = FALSE;
+    battery->priv->is_discharging  = FALSE;
+
+    battery->priv->unit            = NULL;
+    battery->priv->vendor          = NULL;
+    battery->priv->technology      = NULL;
+    battery->priv->model           = NULL;
+    battery->priv->type            = HAL_DEVICE_TYPE_UNKNOWN;
+    
+    battery->priv->percentage      = 0;
+    battery->priv->current_charge  = 0;
+    battery->priv->last_full       = 0;
+    battery->priv->time            = 0;
+    battery->priv->reporting_design = 0;
+    battery->priv->reporting_last_full = 0;
+}
+
+static void hal_battery_get_property(GObject *object,
+				    guint prop_id,
+				    GValue *value,
+				    GParamSpec *pspec)
+{
+    HalBattery *battery;
+    battery = HAL_BATTERY(object);
+
+    switch (prop_id)
+    {
+	case PROP_TYPE:
+		g_value_set_uint (value, battery->priv->type);
+		break;
+	case PROP_IS_PRESENT:
+		g_value_set_boolean (value, battery->priv->is_present);
+		break;
+	case PROP_IS_CHARGING:
+		g_value_set_boolean (value, battery->priv->is_charging);
+		break;
+	case PROP_IS_DISCHARGING:
+		g_value_set_boolean (value, battery->priv->is_discharging);
+		break;
+	case PROP_UNIT:
+		g_value_set_string (value, battery->priv->unit);
+		break;
+	case PROP_TECHNOLOGY:
+		g_value_set_string (value, battery->priv->technology);
+		break;
+	case PROP_VENDOR:
+		g_value_set_string (value, battery->priv->vendor);
+		break;
+	case PROP_MODEL:
+		g_value_set_string (value, battery->priv->model);
+		break;
+	case PROP_PERCENTAGE:
+		g_value_set_uint (value, battery->priv->percentage);
+		break;
+	case PROP_CURRENT_CHARGE:
+		g_value_set_uint (value, battery->priv->current_charge);
+		break;
+	case PROP_LAST_FULL:
+		g_value_set_uint (value, battery->priv->last_full);
+		break;
+	case PROP_REPORTING_DESIGN:
+		g_value_set_uint (value, battery->priv->reporting_design);
+		break;
+	case PROP_REPORTING_LAST_FULL:
+		g_value_set_uint (value, battery->priv->reporting_last_full);
+		break;	
+	case PROP_TIME:
+		g_value_set_uint (value, battery->priv->time);
+		break;
+	default:
+            G_OBJECT_WARN_INVALID_PROPERTY_ID(object,prop_id,pspec);
+            break;
+    }
+}
+
+static void
+hal_battery_finalize(GObject *object)
+{
+    HalBattery *battery;
+
+    battery = HAL_BATTERY(object);
+    
+    if ( battery->priv->manager )
+    	g_object_unref(battery->priv->manager);
+	
+    if ( battery->priv->technology )
+    	g_free (battery->priv->technology);
+	
+    if ( battery->priv->vendor )
+    	g_free (battery->priv->vendor);
+	
+    if ( battery->priv->model )
+    	g_free (battery->priv->model);
+	
+    if ( battery->priv->unit )
+    	g_free (battery->priv->unit);
+
+    G_OBJECT_CLASS(hal_battery_parent_class)->finalize(object);
+}
+
+static HalDeviceType
+hal_battery_type_enum_from_string(const gchar *string)
+{
+    if ( xfpm_strequal (string, "primary") )
+    {
+	return HAL_DEVICE_TYPE_PRIMARY;
+    }
+    else if ( xfpm_strequal (string, "ups") )
+    {
+	return HAL_DEVICE_TYPE_UPS;
+    }
+    else if ( xfpm_strequal (string, "mouse") )
+    {
+	return HAL_DEVICE_TYPE_MOUSE;
+    }
+    else if ( xfpm_strequal (string, "keyboard") )
+    {
+	return HAL_DEVICE_TYPE_KEYBOARD;
+    }
+    else if ( xfpm_strequal (string, "camera") )
+    {
+	return HAL_DEVICE_TYPE_CAMERA;
+    }
+    else if ( xfpm_strequal (string, "keyboard_mouse") )
+    {
+	return HAL_DEVICE_TYPE_KEYBOARD_MOUSE;
+    }
+    
+    return HAL_DEVICE_TYPE_UNKNOWN;
+}
+
+static HalDeviceType
+hal_battery_get_device_type (HalBattery *battery)
+{
+    gchar *udi = NULL;
+    gchar *type = NULL;
+    HalDeviceType type_enum = HAL_DEVICE_TYPE_UNKNOWN;
+    
+    g_object_get (G_OBJECT(battery), "udi", &udi, NULL);
+    
+    g_return_val_if_fail (udi != NULL, HAL_DEVICE_TYPE_UNKNOWN);
+    
+    type = hal_manager_get_device_property_string (battery->priv->manager, udi, "battery.type");
+    
+    if ( type )
+    {
+	type_enum  = hal_battery_type_enum_from_string(type);
+	g_free(type);
+    }
+ 
+    g_free (udi);
+    return type_enum;
+}
+
+static void
+hal_battery_refresh_all (HalBattery *battery)
+{
+    gchar *udi = NULL;
+    
+    g_object_get (G_OBJECT(battery), "udi", &udi, NULL);
+    
+    g_return_if_fail (udi != NULL);
+    
+    battery->priv->is_present = 
+    	hal_manager_get_device_property_bool(battery->priv->manager, udi, "battery.present");
+	
+    battery->priv->is_charging = 
+    	hal_manager_get_device_property_bool(battery->priv->manager, udi, "battery.rechargeable.is_charging");
+    
+    battery->priv->is_discharging = 
+    	hal_manager_get_device_property_bool(battery->priv->manager, udi, "battery.rechargeable.is_discharging");
+    
+    battery->priv->current_charge = 
+    	hal_manager_get_device_property_int(battery->priv->manager, udi, "battery.charge_level.current");
+	
+    battery->priv->last_full = 
+    	hal_manager_get_device_property_int(battery->priv->manager, udi, "battery.charge_level.last_full");
+    
+    if ( hal_manager_device_has_key (battery->priv->manager, udi, "battery.remaining_time") )
+    	battery->priv->time = 
+    		hal_manager_get_device_property_int(battery->priv->manager, udi, "battery.remaining_time");
+    else
+    	battery->priv->time = 0;
+    
+    //FIXME: calculate the percentage if it is not found on HAL
+    if ( hal_manager_device_has_key(battery->priv->manager, udi, "battery.charge_level.percentage") )
+     	battery->priv->percentage = 
+    		hal_manager_get_device_property_int(battery->priv->manager, udi, "battery.charge_level.percentage");
+    else battery->priv->percentage = 0;
+    
+    if ( hal_manager_device_has_key(battery->priv->manager, udi, "battery.reporting.last_full") )
+     	battery->priv->reporting_last_full = 
+    		hal_manager_get_device_property_int(battery->priv->manager, udi, "battery.reporting.last_full");
+		
+}
+
+static const gchar *
+_translate_technology (const gchar *tech)
+{
+    if ( xfpm_strequal (tech, "lithium-ion") )
+    {
+	return _("Lithium ion");
+    }
+    else if ( xfpm_strequal (tech, "lead-acid") )
+    {
+	return _("Lead acid");
+    }
+    else if ( xfpm_strequal (tech, "lithium-polymer") )
+    {
+	return _("Lithium polymer");
+    }
+    else if ( xfpm_strequal (tech, "nickel-metal-hydride") )
+    {
+	return _("Nickel metal hydride");
+    }
+    
+    return _("Unknown");
+}
+
+static const gchar *
+_translate_unit (const gchar *unit)
+{
+    if ( xfpm_strequal (unit, "mWh") )
+    {
+	return _("mWh");
+    }
+    else if ( xfpm_strequal (unit, "mAh") )
+    {
+	return _("mAh");
+    }
+    
+    return _("Unknown unit");
+}
+
+static void
+hal_battery_get_battery_info (HalBattery *battery)
+{
+    gchar *udi = NULL;
+    g_object_get (G_OBJECT(battery), "udi", &udi, NULL);
+    
+    g_return_if_fail (udi != NULL);
+    
+    if ( hal_manager_device_has_key (battery->priv->manager, udi, "battery.technology") )
+    {
+	gchar *tech = hal_manager_get_device_property_string (battery->priv->manager, udi, "battery.technology");
+	if ( tech )
+	{
+	    battery->priv->technology = g_strdup (_translate_technology (tech));
+	    g_free (tech);
+	}
+    }
+    
+    if ( hal_manager_device_has_key (battery->priv->manager, udi, "battery.vendor") )
+    {
+	gchar *vendor = hal_manager_get_device_property_string (battery->priv->manager, udi, "battery.vendor");
+	if ( vendor )
+	{
+	    battery->priv->vendor = g_strdup ( vendor);
+	    g_free (vendor);
+	}
+    }
+    
+    if ( hal_manager_device_has_key (battery->priv->manager, udi, "battery.model") )
+    {
+	gchar *model = hal_manager_get_device_property_string (battery->priv->manager, udi, "battery.model");
+	if ( model )
+	{
+	    battery->priv->model = g_strdup (model);
+	    g_free (model);
+	}
+    }
+    
+    battery->priv->reporting_design = hal_manager_get_device_property_int (battery->priv->manager, 
+									   udi, 
+							                   "battery.reporting.design");
+							      
+    if ( hal_manager_device_has_key (battery->priv->manager, udi, "battery.reporting.unit") )
+    {
+	gchar *unit = hal_manager_get_device_property_string (battery->priv->manager, udi, "battery.reporting.unit");
+	
+	if ( unit )
+	{
+	    battery->priv->unit = g_strdup(_translate_unit(unit));
+	    g_free(unit);	    
+	}
+    }
+}
+
+static void
+hal_battery_battery_changed_cb (HalBattery *battery, const gchar *key)
+{
+    if ( xfpm_strequal (key, "battery.present") ||
+    	 xfpm_strequal (key, "battery.rechargeable.is_charging") ||
+	 xfpm_strequal (key, "battery.rechargeable.is_discharging") ||
+	 xfpm_strequal (key, "battery.charge_level.current")    ||
+	 xfpm_strequal (key, "battery.remaining_time") ||
+	 xfpm_strequal (key, "battery.charge_level.percentage") )
+    {
+	hal_battery_refresh_all (battery);
+    	g_signal_emit (G_OBJECT (battery), signals[BATTERY_CHANGED], 0);
+    }
+    
+}
+
+
+static void
+hal_battery_property_modified_cb(HalBattery *battery, 
+			         const gchar *udi,
+				 const gchar *key, 
+			         gboolean is_removed,
+			         gboolean is_added,
+				 gpointer data)
+{
+    hal_battery_battery_changed_cb (battery, key);
+}
+
+HalBattery *
+hal_battery_new (const gchar *udi)
+{
+    HalBattery *battery = NULL;
+    
+    battery = g_object_new (HAL_TYPE_BATTERY, "udi", udi, NULL);
+    
+    battery->priv->type = hal_battery_get_device_type (battery);
+   
+    hal_battery_refresh_all (battery);
+    hal_battery_get_battery_info    (battery);
+	
+    hal_device_watch (HAL_DEVICE(battery));
+    g_signal_connect (G_OBJECT(battery), "device-changed",
+		      G_CALLBACK(hal_battery_property_modified_cb), battery);
+    return battery;
+}

Added: xfce4-power-manager/trunk/libxfpm/hal-battery.h
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-battery.h	                        (rev 0)
+++ xfce4-power-manager/trunk/libxfpm/hal-battery.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -0,0 +1,57 @@
+/*
+ * * Copyright (C) 2008-2009 Ali <aliov at xfce.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef __HAL_BATTERY_H
+#define __HAL_BATTERY_H
+
+#include <glib-object.h>
+
+#include "hal-device.h"
+#include "hal-enum.h"
+
+G_BEGIN_DECLS
+
+#define HAL_TYPE_BATTERY        (hal_battery_get_type () )
+#define HAL_BATTERY(o)          (G_TYPE_CHECK_INSTANCE_CAST((o), HAL_TYPE_BATTERY, HalBattery))
+#define HAL_IS_BATTERY(o)       (G_TYPE_CHECK_INSTANCE_TYPE((o), HAL_TYPE_BATTERY))
+
+typedef struct HalBatteryPrivate HalBatteryPrivate;
+
+typedef struct
+{
+    HalDevice		   parent;
+    HalBatteryPrivate	  *priv;
+    
+} HalBattery;
+
+typedef struct
+{
+    HalDeviceClass         parent_class;
+    
+    void                  (*battery_changed) (HalBattery *device);
+    
+} HalBatteryClass;
+
+GType        	  hal_battery_get_type        (void) G_GNUC_CONST;
+HalBattery       *hal_battery_new             (const gchar *udi);
+
+G_END_DECLS
+
+#endif /* __HAL_BATTERY_H */

Modified: xfce4-power-manager/trunk/libxfpm/hal-device.c
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-device.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/libxfpm/hal-device.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -23,32 +23,24 @@
 #endif
 
 #include <stdio.h>
-
-#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
-#endif
-
-#ifdef HAVE_STRING_H
 #include <string.h>
-#endif
 
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
+#include <dbus/dbus-glib.h>
 
-#include <glib.h>
-#include <glib/gi18n.h>
-
 #include "hal-device.h"
-#include "hal-ctx.h"
-#include "xfpm-string.h"
-#include "hal-enum.h"
+#include "hal-marshal.h"
 
 /* Init */
 static void hal_device_class_init (HalDeviceClass *klass);
 static void hal_device_init       (HalDevice *device);
 static void hal_device_finalize   (GObject *object);
 
+static void hal_device_set_property(GObject *object,
+				    guint prop_id,
+				    const GValue *value,
+				    GParamSpec *pspec);
+
 static void hal_device_get_property(GObject *object,
 				    guint prop_id,
 				    GValue *value,
@@ -59,50 +51,17 @@
 
 struct HalDevicePrivate
 {
-    HalCtx *ctx;
+    DBusGConnection *bus;
+    DBusGProxy      *proxy;
+    gchar           *udi;
     
-    /* Properties read-only */
-    HalDeviceType type;
-    
-    gboolean  is_present;
-    gboolean  is_charging;
-    gboolean  is_discharging;
-    
-    gchar    *unit;
-    gchar    *technology;
-    gchar    *udi;
-    gchar    *vendor;
-    gchar    *model;
-    guint     percentage;
-
-    guint32   current_charge;
-    guint32   last_full;
-    
-    guint32   reporting_design;
-    guint32   reporting_last_full;
-    
-    guint      time;
-    
+    gboolean         watch_added;
 };
 
 enum
 {
     PROP_0,
-    PROP_TYPE,
-    PROP_IS_PRESENT,
-    PROP_IS_CHARGING,
-    PROP_IS_DISCHARGING,
-    PROP_UDI,
-    PROP_CURRENT_CHARGE,
-    PROP_PERCENTAGE,
-    PROP_REPORTING_DESIGN,
-    PROP_LAST_FULL,
-    PROP_REPORTING_LAST_FULL,
-    PROP_TIME,
-    PROP_TECHNOLOGY,
-    PROP_VENDOR,
-    PROP_MODEL,
-    PROP_UNIT
+    PROP_UDI
 };
 
 enum
@@ -119,157 +78,51 @@
 hal_device_class_init(HalDeviceClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS(klass);
-
+    
+    object_class->set_property = hal_device_set_property;
     object_class->get_property = hal_device_get_property;
-    object_class->finalize = hal_device_finalize;
-
-    signals[DEVICE_CHANGED] =
-    	g_signal_new("device-changed",
-		     HAL_TYPE_DEVICE,
-		     G_SIGNAL_RUN_LAST,
-		     G_STRUCT_OFFSET(HalDeviceClass, device_changed),
-		     NULL, NULL,
-		     g_cclosure_marshal_VOID__VOID,
-		     G_TYPE_NONE, 0, G_TYPE_NONE);
     
+    signals[DEVICE_CHANGED] =
+	    g_signal_new("device-changed",
+			 HAL_TYPE_DEVICE,
+			 G_SIGNAL_RUN_LAST,
+			 G_STRUCT_OFFSET(HalDeviceClass, device_changed),
+			 NULL, NULL,
+			 _hal_marshal_VOID__STRING_STRING_BOOLEAN_BOOLEAN,
+			 G_TYPE_NONE, 4, 
+			 G_TYPE_STRING, G_TYPE_STRING,
+			 G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
+			 
     g_object_class_install_property(object_class,
-				    PROP_IS_PRESENT,
-				    g_param_spec_boolean("is-present",
-				    			 NULL, NULL,
-							 FALSE,
-							 G_PARAM_READABLE));
-
-    g_object_class_install_property(object_class,
-				    PROP_IS_CHARGING,
-				    g_param_spec_boolean("is-charging",
-							 NULL, NULL,
-							 FALSE,
-							 G_PARAM_READABLE));
-							 
-    g_object_class_install_property(object_class,
-				    PROP_IS_DISCHARGING,
-				    g_param_spec_boolean("is-discharging",
-							 NULL, NULL,
-							 FALSE,
-							 G_PARAM_READABLE));
-    g_object_class_install_property(object_class,
-				    PROP_CURRENT_CHARGE,
-				    g_param_spec_uint("current-charge",
-						      NULL, NULL,
-						      0,
-						      G_MAXUINT32,
-						      0,
-						      G_PARAM_READABLE));
-						      
-    g_object_class_install_property(object_class,
-				    PROP_LAST_FULL,
-				    g_param_spec_uint("last-full",
-						      NULL, NULL,
-						      0,
-						      G_MAXUINT32,
-						      0,
-						      G_PARAM_READABLE));
-						      
-     g_object_class_install_property(object_class,
-				    PROP_REPORTING_DESIGN,
-				    g_param_spec_uint("reporting-design",
-						      NULL, NULL,
-						      0,
-						      G_MAXUINT32,
-						      0,
-						      G_PARAM_READABLE));
-    g_object_class_install_property(object_class,
-				    PROP_REPORTING_LAST_FULL,
-				    g_param_spec_uint("reporting-last-full",
-						      NULL, NULL,
-						      0,
-						      G_MAXUINT32,
-						      0,
-						      G_PARAM_READABLE));
-    g_object_class_install_property(object_class,
-				    PROP_TIME,
-				    g_param_spec_uint("time",
-						      NULL, NULL,
-						      0,
-						      G_MAXINT,
-						      0,
-						      G_PARAM_READABLE));
-    g_object_class_install_property(object_class,
-				    PROP_TYPE,
-				    g_param_spec_uint("type",
-						      NULL, NULL,
-						      0,
-						      HAL_DEVICE_TYPE_UNKNOWN,
-						      HAL_DEVICE_TYPE_UNKNOWN,
-						      G_PARAM_READABLE));
-    g_object_class_install_property(object_class,
-				    PROP_PERCENTAGE,
-				    g_param_spec_uint("percentage",
-						      NULL, NULL,
-						      0,
-						      G_MAXINT,
-						      0,
-						      G_PARAM_READABLE));
-						      
-    g_object_class_install_property(object_class,
 				    PROP_UDI,
 				    g_param_spec_string("udi",
 							NULL, NULL,
 						        NULL,
-						        G_PARAM_READABLE));
-		
-    g_object_class_install_property(object_class,
-				    PROP_TECHNOLOGY,
-				    g_param_spec_string("technology",
-							NULL, NULL,
-						        NULL,
-						        G_PARAM_READABLE));
-     g_object_class_install_property(object_class,
-				    PROP_VENDOR,
-				    g_param_spec_string("vendor",
-							NULL, NULL,
-						        NULL,
-						        G_PARAM_READABLE));
-    g_object_class_install_property(object_class,
-				    PROP_MODEL,
-				    g_param_spec_string("model",
-							NULL, NULL,
-						        NULL,
-						        G_PARAM_READABLE));
-    g_object_class_install_property(object_class,
-				    PROP_UNIT,
-				    g_param_spec_string("unit",
-							 NULL, NULL,
-							 FALSE,
-							 G_PARAM_READABLE));
-							 
+						        G_PARAM_CONSTRUCT_ONLY | 
+							G_PARAM_WRITABLE |
+							G_PARAM_READABLE));
+    object_class->finalize = hal_device_finalize;
+
     g_type_class_add_private(klass,sizeof(HalDevicePrivate));
 }
 
-static void
-hal_device_init(HalDevice *device)
+static void hal_device_set_property(GObject *object,
+				    guint prop_id,
+				    const GValue *value,
+				    GParamSpec *pspec)
 {
-    device->priv = HAL_DEVICE_GET_PRIVATE(device);
+    HalDevice *device = (HalDevice *) object;
     
-    device->priv->ctx = hal_ctx_new();
+    switch (prop_id )
+    {
+	case PROP_UDI:
+	    device->priv->udi = g_strdup(g_value_get_string (value) );
+	    break;
+	default:
+	    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	    break;
+    }
     
-    device->priv->is_present      = FALSE;
-    device->priv->is_charging     = FALSE;
-    device->priv->is_discharging  = FALSE;
-
-    device->priv->unit            = NULL;
-    device->priv->vendor          = NULL;
-    device->priv->technology      = NULL;
-    device->priv->udi             = NULL;
-    device->priv->model           = NULL;
-    device->priv->type            = HAL_DEVICE_TYPE_UNKNOWN;
-    
-    device->priv->percentage      = 0;
-    device->priv->current_charge  = 0;
-    device->priv->last_full       = 0;
-    device->priv->time            = 0;
-    device->priv->reporting_design = 0;
-    device->priv->reporting_last_full = 0;
 }
 
 static void hal_device_get_property(GObject *object,
@@ -277,344 +130,144 @@
 				    GValue *value,
 				    GParamSpec *pspec)
 {
-    HalDevice *device;
-    device = HAL_DEVICE(object);
-
-    switch (prop_id)
+    HalDevice *device = (HalDevice *) object;
+    
+    switch (prop_id )
     {
-	case PROP_TYPE:
-		g_value_set_uint (value, device->priv->type);
-		break;
-	case PROP_IS_PRESENT:
-		g_value_set_boolean (value, device->priv->is_present);
-		break;
-	case PROP_IS_CHARGING:
-		g_value_set_boolean (value, device->priv->is_charging);
-		break;
-	case PROP_IS_DISCHARGING:
-		g_value_set_boolean (value, device->priv->is_discharging);
-		break;
-	case PROP_UNIT:
-		g_value_set_string (value, device->priv->unit);
-		break;
- 	case PROP_UDI:
-		g_value_set_string (value, device->priv->udi);
-		break;
-	case PROP_TECHNOLOGY:
-		g_value_set_string (value, device->priv->technology);
-		break;
-	case PROP_VENDOR:
-		g_value_set_string (value, device->priv->vendor);
-		break;
-	case PROP_MODEL:
-		g_value_set_string (value, device->priv->model);
-		break;
-	case PROP_PERCENTAGE:
-		g_value_set_uint (value, device->priv->percentage);
-		break;
-	case PROP_CURRENT_CHARGE:
-		g_value_set_uint (value, device->priv->current_charge);
-		break;
-	case PROP_LAST_FULL:
-		g_value_set_uint (value, device->priv->last_full);
-		break;
-	case PROP_REPORTING_DESIGN:
-		g_value_set_uint (value, device->priv->reporting_design);
-		break;
-	case PROP_REPORTING_LAST_FULL:
-		g_value_set_uint (value, device->priv->reporting_last_full);
-		break;	
-	case PROP_TIME:
-		g_value_set_uint (value, device->priv->time);
-		break;
+	case PROP_UDI:
+	    g_value_set_string (value, device->priv->udi);
+	    break;
 	default:
-            G_OBJECT_WARN_INVALID_PROPERTY_ID(object,prop_id,pspec);
-            break;
+	    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	    break;
     }
+    
 }
 
 static void
-hal_device_finalize(GObject *object)
+hal_device_property_modified_cb (DBusGProxy *proxy, 
+				 gint type, 
+				 GPtrArray *properties, 
+				 HalDevice *device)
 {
-    HalDevice *device;
-
-    device = HAL_DEVICE(object);
+    GValueArray *array;
+    const gchar *udi;
+    const gchar *key;
+    gboolean     is_added;
+    gboolean     is_removed;
+    int i;
     
-    if ( device->priv->ctx )
-    	g_object_unref(device->priv->ctx);
-	
-    if ( device->priv->udi)
-    	g_free(device->priv->udi);
-	
-    if ( device->priv->technology )
-    	g_free (device->priv->technology);
-	
-    if ( device->priv->vendor )
-    	g_free (device->priv->vendor);
-	
-    if ( device->priv->model )
-    	g_free (device->priv->model);
-	
-    if ( device->priv->unit )
-    	g_free (device->priv->unit);
-
-    G_OBJECT_CLASS(hal_device_parent_class)->finalize(object);
-}
-
-static HalDeviceType
-hal_device_type_enum_from_string(const gchar *string)
-{
-    if ( xfpm_strequal (string, "primary") )
-    {
-	return HAL_DEVICE_TYPE_PRIMARY;
-    }
-    else if ( xfpm_strequal (string, "ups") )
-    {
-	return HAL_DEVICE_TYPE_UPS;
-    }
-    else if ( xfpm_strequal (string, "mouse") )
-    {
-	return HAL_DEVICE_TYPE_MOUSE;
-    }
-    else if ( xfpm_strequal (string, "keyboard") )
-    {
-	return HAL_DEVICE_TYPE_KEYBOARD;
-    }
-    else if ( xfpm_strequal (string, "camera") )
-    {
-	return HAL_DEVICE_TYPE_CAMERA;
-    }
-    else if ( xfpm_strequal (string, "keyboard_mouse") )
-    {
-	return HAL_DEVICE_TYPE_KEYBOARD_MOUSE;
-    }
+    udi = dbus_g_proxy_get_path (proxy);
     
-    return HAL_DEVICE_TYPE_UNKNOWN;
-}
-
-static HalDeviceType
-hal_device_get_device_type(HalDevice *device)
-{
-    if ( hal_ctx_device_has_capability(device->priv->ctx, device->priv->udi, "battery") )
+    for ( i = 0; i < properties->len; i++ )
     {
-	gchar *type = hal_ctx_get_property_string(device->priv->ctx, device->priv->udi, "battery.type");
-	if ( type )
-	{
-	    HalDeviceType type_enum  = hal_device_type_enum_from_string(type);
-	    g_free(type);
-	    return type_enum;
-	}
-	else 
-		goto out;
+	array = g_ptr_array_index (properties, i);
+	if ( array->n_values != 3 )
+	    continue;
+	    
+	key = g_value_get_string (g_value_array_get_nth (array, 0));
+	is_removed = g_value_get_boolean (g_value_array_get_nth (array, 1));
+	is_added = g_value_get_boolean (g_value_array_get_nth (array, 2));
+	g_signal_emit (G_OBJECT(device), signals[DEVICE_CHANGED], 0, udi, key, is_added, is_removed);
     }
-    else if ( hal_ctx_device_has_capability(device->priv->ctx, device->priv->udi, "ac_adapter") )
-    {
-	return HAL_DEVICE_TYPE_ADAPTER;
-    }
-    
-out:
-    return HAL_DEVICE_TYPE_UNKNOWN;
 }
-
+				 
 static void
-hal_device_refresh_all_adapter (HalDevice *device)
+hal_device_add_watch (HalDevice *device)
 {
-    device->priv->is_present =
-    	hal_ctx_get_property_bool(device->priv->ctx, device->priv->udi, "ac_adapter.present");
-    
-}
+    GType array_gtype, gtype;
+    device->priv->proxy = dbus_g_proxy_new_for_name (device->priv->bus,
+						     "org.freedesktop.Hal",
+						     device->priv->udi,
+						     "org.freedesktop.Hal.Device");
 
-static void
-hal_device_refresh_all_battery (HalDevice *device)
-{
-    device->priv->is_present = 
-    	hal_ctx_get_property_bool(device->priv->ctx, device->priv->udi, "battery.present");
-	
-    device->priv->is_charging = 
-    	hal_ctx_get_property_bool(device->priv->ctx, device->priv->udi, "battery.rechargeable.is_charging");
-    
-    device->priv->is_discharging = 
-    	hal_ctx_get_property_bool(device->priv->ctx, device->priv->udi, "battery.rechargeable.is_discharging");
-    
-    device->priv->current_charge = 
-    	hal_ctx_get_property_int(device->priv->ctx, device->priv->udi, "battery.charge_level.current");
-	
-    device->priv->last_full = 
-    	hal_ctx_get_property_int(device->priv->ctx, device->priv->udi, "battery.charge_level.last_full");
-    
-    if ( hal_ctx_device_has_key(device->priv->ctx, device->priv->udi, "battery.remaining_time") )
-    	device->priv->time = 
-    		hal_ctx_get_property_int(device->priv->ctx, device->priv->udi, "battery.remaining_time");
-    else
-    	device->priv->time = 0;
-    
-    //FIXME: calculate the percentage if it is not found on HAL
-    if ( hal_ctx_device_has_key(device->priv->ctx, device->priv->udi, "battery.charge_level.percentage") )
-     	device->priv->percentage = 
-    		hal_ctx_get_property_int(device->priv->ctx, device->priv->udi, "battery.charge_level.percentage");
-    else device->priv->percentage = 0;
-    
-    if ( hal_ctx_device_has_key(device->priv->ctx, device->priv->udi, "battery.reporting.last_full") )
-     	device->priv->reporting_last_full = 
-    		hal_ctx_get_property_int(device->priv->ctx, device->priv->udi, "battery.reporting.last_full");
-		
-}
+    g_return_if_fail ( DBUS_IS_G_PROXY (device->priv->proxy) );
 
-static const gchar *
-_translate_technology (const gchar *tech)
-{
-    if ( xfpm_strequal (tech, "lithium-ion") )
-    {
-	return _("Lithium ion");
-    }
-    else if ( xfpm_strequal (tech, "lead-acid") )
-    {
-	return _("Lead acid");
-    }
-    else if ( xfpm_strequal (tech, "lithium-polymer") )
-    {
-	return _("Lithium polymer");
-    }
-    else if ( xfpm_strequal (tech, "nickel-metal-hydride") )
-    {
-	return _("Nickel metal hydride");
-    }
-    
-    return _("Unknown");
-}
+    gtype = dbus_g_type_get_struct ("GValueArray",
+				    G_TYPE_STRING,
+				    G_TYPE_BOOLEAN,
+				    G_TYPE_BOOLEAN,
+				    G_TYPE_INVALID);
 
-static const gchar *
-_translate_unit (const gchar *unit)
-{
-    if ( xfpm_strequal (unit, "mWh") )
-    {
-	return _("mWh");
-    }
-    else if ( xfpm_strequal (unit, "mAh") )
-    {
-	return _("mAh");
-    }
-    
-    return _("Unknown unit");
-}
+    array_gtype = dbus_g_type_get_collection ("GPtrArray", gtype);
 
-static void
-hal_device_get_battery_info (HalDevice *device)
-{
-    if ( hal_ctx_device_has_key (device->priv->ctx, device->priv->udi, "battery.technology") )
-    {
-	gchar *tech = hal_ctx_get_property_string (device->priv->ctx, device->priv->udi, "battery.technology");
-	if ( tech )
-	{
-	    device->priv->technology = g_strdup (_translate_technology (tech));
-	    g_free (tech);
-	}
-    }
+    dbus_g_object_register_marshaller (_hal_marshal_VOID__INT_BOXED,
+					G_TYPE_NONE, G_TYPE_INT,
+				        array_gtype, G_TYPE_INVALID);
     
-    if ( hal_ctx_device_has_key (device->priv->ctx, device->priv->udi, "battery.vendor") )
-    {
-	gchar *vendor = hal_ctx_get_property_string (device->priv->ctx, device->priv->udi, "battery.vendor");
-	if ( vendor )
-	{
-	    device->priv->vendor = g_strdup ( vendor);
-	    g_free (vendor);
-	}
-    }
+    				   
+    dbus_g_proxy_add_signal (device->priv->proxy, 
+			     "PropertyModified", 
+			     G_TYPE_INT,
+			     array_gtype, 
+			     G_TYPE_INVALID);
     
-    if ( hal_ctx_device_has_key (device->priv->ctx, device->priv->udi, "battery.model") )
-    {
-	gchar *model = hal_ctx_get_property_string (device->priv->ctx, device->priv->udi, "battery.model");
-	if ( model )
-	{
-	    device->priv->model = g_strdup (model);
-	    g_free (model);
-	}
-    }
+    dbus_g_proxy_connect_signal (device->priv->proxy, "PropertyModified",
+				 G_CALLBACK(hal_device_property_modified_cb), device, NULL);
     
-    device->priv->reporting_design = hal_ctx_get_property_int (device->priv->ctx, 
-							      device->priv->udi, 
-							      "battery.reporting.design");
-							      
-    if ( hal_ctx_device_has_key (device->priv->ctx, device->priv->udi, "battery.reporting.unit") )
-    {
-	gchar *unit = hal_ctx_get_property_string (device->priv->ctx, device->priv->udi, "battery.reporting.unit");
-	
-	if ( unit )
-	{
-	    device->priv->unit = g_strdup(_translate_unit(unit));
-	    g_free(unit);	    
-	}
-    }
+    device->priv->watch_added = TRUE;
 }
 
 static void
-hal_device_adapter_changed_cb (HalDevice *device, const gchar *key)
+hal_device_init(HalDevice *device)
 {
-    if ( xfpm_strequal (key, "ac_adapter.present") )
-    {
-    	hal_device_refresh_all_adapter(device);
-    	g_signal_emit(G_OBJECT(device), signals[DEVICE_CHANGED], 0);
-    }
+    device->priv = HAL_DEVICE_GET_PRIVATE(device);
     
-}
-
-static void
-hal_device_battery_changed_cb (HalDevice *device, const gchar *key)
-{
-    if ( xfpm_strequal (key, "battery.present") ||
-    	 xfpm_strequal (key, "battery.rechargeable.is_charging") ||
-	 xfpm_strequal (key, "battery.rechargeable.is_discharging") ||
-	 xfpm_strequal (key, "battery.charge_level.current")    ||
-	 xfpm_strequal (key, "battery.remaining_time") ||
-	 xfpm_strequal (key, "battery.charge_level.percentage") )
-    {
-	hal_device_refresh_all_battery(device);
-    	g_signal_emit(G_OBJECT(device), signals[DEVICE_CHANGED], 0);
-    }
+    device->priv->bus    	= NULL;
+    device->priv->proxy  	= NULL;
+    device->priv->udi           = NULL;
+    device->priv->watch_added 	= FALSE;
     
 }
 
-
 static void
-hal_device_property_modified(LibHalContext *ctx, 
-			     const gchar *udi,
-			     const gchar *key, 
-			     dbus_bool_t is_removed,
-			     dbus_bool_t is_added)
+hal_device_finalize(GObject *object)
 {
-    HalDevice *device = libhal_ctx_get_user_data(ctx);
+    HalDevice *device;
+
+    device = HAL_DEVICE(object);
     
-    if ( device->priv->type == HAL_DEVICE_TYPE_ADAPTER )
-    	hal_device_adapter_changed_cb (device, key);
-    else
-    	hal_device_battery_changed_cb (device, key);
+    if ( device->priv->udi )
+	g_free (device->priv->udi);
+	
+    if ( device->priv->bus )
+	dbus_g_connection_unref (device->priv->bus);
+	
+    if ( device->priv->watch_added )
+	dbus_g_proxy_disconnect_signal (device->priv->proxy, "PropertyModified",
+					G_CALLBACK(hal_device_property_modified_cb), device);
+	
+    if ( device->priv->proxy )
+	g_object_unref (device->priv->proxy);
+
+    G_OBJECT_CLASS(hal_device_parent_class)->finalize(object);
 }
 
 HalDevice *
-hal_device_new(const gchar *udi)
+hal_device_new (const gchar *udi)
 {
     HalDevice *device = NULL;
-    device = g_object_new(HAL_TYPE_DEVICE,NULL);
+    device = g_object_new (HAL_TYPE_DEVICE, "udi", udi, NULL);
+    return device;
+}
+
+gboolean
+hal_device_watch (HalDevice *device)
+{
+    GError *error = NULL;
+
+    device->priv->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
     
-    device->priv->udi = g_strdup(udi);
-    
-    if ( !hal_ctx_connect(device->priv->ctx)) goto out;
-    
-    device->priv->type = hal_device_get_device_type(device);
-   
-    if ( device->priv->type == HAL_DEVICE_TYPE_ADAPTER )
-    	hal_device_refresh_all_adapter(device);
-    else
+    if ( error )
     {
-    	hal_device_refresh_all_battery (device);
-	hal_device_get_battery_info    (device);
+	g_critical ("Unable to get bus system: %s\n", error->message);
+	g_error_free (error);
+	goto out;
     }
-	
-    hal_ctx_set_user_data(device->priv->ctx, device);
-    hal_ctx_set_device_property_callback(device->priv->ctx, 
-    					 hal_device_property_modified);
-    hal_ctx_watch_device(device->priv->ctx, device->priv->udi);
-    
+
+    hal_device_add_watch(device);
+
 out:
-    return device;
+    return device->priv->watch_added;
+    ;
 }

Modified: xfce4-power-manager/trunk/libxfpm/hal-device.h
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-device.h	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/libxfpm/hal-device.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -23,8 +23,6 @@
 
 #include <glib-object.h>
 
-#include "hal-enum.h"
-
 G_BEGIN_DECLS
 
 #define HAL_TYPE_DEVICE        (hal_device_get_type () )
@@ -42,13 +40,19 @@
 
 typedef struct
 {
-    GObjectClass          parent_class;
-    void                 (*device_changed) (HalDevice *device);
+    GObjectClass parent_class;
     
+    void		(*device_changed)   (HalDevice *device,
+					     const gchar *udi,
+					     const gchar *key,
+					     gboolean is_added,
+					     gboolean is_removed);
+    
 } HalDeviceClass;
 
 GType        	 hal_device_get_type        (void) G_GNUC_CONST;
 HalDevice       *hal_device_new             (const gchar *udi);
+gboolean         hal_device_watch           (HalDevice *device);
 
 G_END_DECLS
 

Modified: xfce4-power-manager/trunk/libxfpm/hal-enum.h
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-enum.h	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/libxfpm/hal-enum.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -23,7 +23,6 @@
 
 typedef enum
 {
-    HAL_DEVICE_TYPE_ADAPTER,
     HAL_DEVICE_TYPE_PRIMARY,
     HAL_DEVICE_TYPE_UPS,
     HAL_DEVICE_TYPE_MOUSE,

Added: xfce4-power-manager/trunk/libxfpm/hal-manager.c
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-manager.c	                        (rev 0)
+++ xfce4-power-manager/trunk/libxfpm/hal-manager.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -0,0 +1,394 @@
+/*
+ * * Copyright (C) 2008-2009 Ali <aliov at xfce.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <dbus/dbus-glib.h>
+#include <glib.h>
+
+#include "hal-manager.h"
+
+/* Init */
+static void hal_manager_class_init (HalManagerClass *klass);
+static void hal_manager_init       (HalManager *manager);
+static void hal_manager_finalize   (GObject *object);
+
+#define HAL_MANAGER_GET_PRIVATE(o) \
+(G_TYPE_INSTANCE_GET_PRIVATE((o), HAL_TYPE_MANAGER, HalManagerPrivate))
+
+struct HalManagerPrivate
+{
+    DBusGConnection *bus;
+    DBusGProxy      *proxy;
+    gboolean 	     connected;
+};
+
+enum
+{
+    DEVICE_ADDED,
+    DEVICE_REMOVED,
+    LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (HalManager, hal_manager, G_TYPE_OBJECT)
+
+static void
+hal_manager_class_init(HalManagerClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS(klass);
+    
+    signals[DEVICE_ADDED] =
+    	g_signal_new("device-added",
+		     HAL_TYPE_MANAGER,
+		     G_SIGNAL_RUN_LAST,
+		     G_STRUCT_OFFSET(HalManagerClass, device_added),
+		     NULL, NULL,
+		     g_cclosure_marshal_VOID__STRING,
+		     G_TYPE_NONE, 1, G_TYPE_STRING);
+		     
+    signals[DEVICE_REMOVED] =
+    	g_signal_new("device-removed",
+		     HAL_TYPE_MANAGER,
+		     G_SIGNAL_RUN_LAST,
+		     G_STRUCT_OFFSET(HalManagerClass, device_removed),
+		     NULL, NULL,
+		     g_cclosure_marshal_VOID__STRING,
+		     G_TYPE_NONE, 1, G_TYPE_STRING);
+    
+    object_class->finalize = hal_manager_finalize;
+
+
+    g_type_class_add_private (klass,sizeof(HalManagerPrivate));
+}
+
+static void
+hal_manager_init (HalManager *manager)
+{
+    manager->priv = HAL_MANAGER_GET_PRIVATE (manager);
+    
+    manager->priv->bus 	     = NULL;
+    manager->priv->proxy     = NULL;
+    manager->priv->connected = FALSE;
+}
+
+static void
+hal_manager_finalize(GObject *object)
+{
+    HalManager *manager;
+
+    manager = HAL_MANAGER(object);
+    
+    if ( manager->priv->proxy )
+	g_object_unref (manager->priv->proxy);
+	
+    if ( manager->priv->bus )
+	dbus_g_connection_unref (manager->priv->bus);
+
+    G_OBJECT_CLASS(hal_manager_parent_class)->finalize(object);
+}
+
+static void
+hal_manager_device_added_cb (DBusGProxy *proxy, const gchar *udi, HalManager *manager)
+{
+    g_signal_emit (G_OBJECT(manager), signals[DEVICE_ADDED], 0, udi);
+}
+
+static void
+hal_manager_device_removed_cb (DBusGProxy *proxy, const gchar *udi, HalManager *manager)
+{
+    g_signal_emit (G_OBJECT(manager), signals[DEVICE_REMOVED], 0, udi);
+}
+
+static void
+hal_manager_connect (HalManager *manager)
+{
+    GError *error = NULL;
+    
+    manager->priv->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+    
+    if ( error )
+    {
+	g_critical ("Failed to get bus system %s\n", error->message);
+	g_error_free (error);
+	goto out;
+    }
+    manager->priv->connected = TRUE;
+    
+    manager->priv->proxy = dbus_g_proxy_new_for_name (manager->priv->bus,
+		  				      "org.freedesktop.Hal",
+						      "/org/freedesktop/Hal/Manager",
+						      "org.freedesktop.Hal.Manager");
+    
+    if ( !manager->priv->proxy )
+    {
+	g_critical ("Unable to get proxy for \n");
+	goto out;
+    }
+    
+    dbus_g_proxy_add_signal (manager->priv->proxy, "DeviceAdded",
+			     G_TYPE_STRING, G_TYPE_INVALID);
+			     
+    dbus_g_proxy_connect_signal (manager->priv->proxy, "DeviceAdded",
+				 G_CALLBACK (hal_manager_device_added_cb), manager, NULL);
+
+    dbus_g_proxy_add_signal (manager->priv->proxy, "DeviceRemoved",
+			     G_TYPE_STRING, G_TYPE_INVALID);
+	
+    dbus_g_proxy_connect_signal (manager->priv->proxy, "DeviceRemoved",
+				 G_CALLBACK (hal_manager_device_removed_cb), manager, NULL);
+out:
+	;
+}
+
+HalManager *
+hal_manager_new(void)
+{
+    HalManager *manager = NULL;
+    manager = g_object_new (HAL_TYPE_MANAGER, NULL);
+    
+    hal_manager_connect (manager);
+    
+    return manager;
+}
+
+gchar **hal_manager_find_device_by_capability (HalManager *manager, const gchar *capability)
+{
+    g_return_val_if_fail (HAL_IS_MANAGER(manager), NULL);
+    g_return_val_if_fail (manager->priv->connected, NULL);
+    
+    gchar  **udi = NULL;
+    GError *error = NULL;
+    
+    dbus_g_proxy_call (manager->priv->proxy, "FindDeviceByCapability", &error, 
+		       G_TYPE_STRING, capability, 
+		       G_TYPE_INVALID,
+		       G_TYPE_STRV, &udi,
+		       G_TYPE_INVALID);
+    if ( error )
+    {
+	g_critical ("Error finding devices by capability %s\n", error->message);
+	g_error_free (error);
+    }
+    
+    return udi;
+}
+									 
+gboolean hal_manager_get_device_property_bool (HalManager *manager, const gchar *udi, const gchar *property)
+{
+    g_return_val_if_fail (HAL_IS_MANAGER(manager), FALSE);
+    g_return_val_if_fail (manager->priv->connected, FALSE);
+    
+    gboolean value = FALSE;
+    GError *error = NULL;
+    DBusGProxy *proxy = dbus_g_proxy_new_for_name (manager->priv->bus,
+						   "org.freedesktop.Hal",
+						   udi,
+						   "org.freedesktop.Hal.Device");
+    
+    if ( !proxy )
+    {
+	g_critical ("Unable to get proxy on interface %s\n", udi);
+	return value;
+    }
+    
+    dbus_g_proxy_call (proxy, "GetPropertyBoolean", &error,
+		       G_TYPE_STRING, property,
+		       G_TYPE_INVALID,
+		       G_TYPE_BOOLEAN, &value,
+		       G_TYPE_INVALID);
+		       
+    g_object_unref (proxy);
+    
+    if ( error )
+    {
+	g_critical ("Error getting bool property on device %s: %s\n", udi, error->message);
+	g_error_free (error);
+    }
+    
+    return value;
+}
+									 
+gint hal_manager_get_device_property_int (HalManager *manager, const gchar *udi, const gchar *property)
+{
+    g_return_val_if_fail (HAL_IS_MANAGER(manager), 0);
+    g_return_val_if_fail (manager->priv->connected, 0);
+    
+    gint value = 0;
+    GError *error = NULL;
+    DBusGProxy *proxy = dbus_g_proxy_new_for_name (manager->priv->bus,
+						   "org.freedesktop.Hal",
+						   udi,
+						   "org.freedesktop.Hal.Device");
+    
+    if ( !proxy )
+    {
+	g_critical ("Unable to get proxy on interface %s\n", udi);
+	return value;
+    }
+    
+    dbus_g_proxy_call (proxy, "GetPropertyInteger", &error,
+		       G_TYPE_STRING, property,
+		       G_TYPE_INVALID,
+		       G_TYPE_INT, &value,
+		       G_TYPE_INVALID);
+		       
+    g_object_unref (proxy);
+    
+    if ( error )
+    {
+	g_critical ("Error getting integer property on device %s: %s\n", udi, error->message);
+	g_error_free (error);
+    }
+    
+    return value;
+    
+    return 0;
+}
+									 
+gchar *hal_manager_get_device_property_string  (HalManager *manager, const gchar *udi, const gchar *property)
+{
+    g_return_val_if_fail (HAL_IS_MANAGER(manager), NULL);
+    g_return_val_if_fail (manager->priv->connected, NULL);
+    
+    gchar *value = NULL;
+    GError *error = NULL;
+    DBusGProxy *proxy = dbus_g_proxy_new_for_name (manager->priv->bus,
+						   "org.freedesktop.Hal",
+						   udi,
+						   "org.freedesktop.Hal.Device");
+    
+    if ( !proxy )
+    {
+	g_critical ("Unable to get proxy on interface %s\n", udi);
+	return value;
+    }
+    
+    dbus_g_proxy_call (proxy, "GetPropertyString", &error,
+		       G_TYPE_STRING, property,
+		       G_TYPE_INVALID,
+		       G_TYPE_STRING, &value,
+		       G_TYPE_INVALID);
+		       
+    g_object_unref (proxy);
+    
+    if ( error )
+    {
+	g_critical ("Error getting string property on device %s: %s\n", udi, error->message);
+	g_error_free (error);
+    }
+    
+    return value;
+    
+    return NULL;
+}
+
+gboolean hal_manager_device_has_key (HalManager *manager, const gchar *udi, const gchar *key)
+{
+    g_return_val_if_fail (HAL_IS_MANAGER(manager), FALSE);
+    g_return_val_if_fail (manager->priv->connected, FALSE);
+    
+    gboolean value = FALSE;
+    GError *error = NULL;
+    DBusGProxy *proxy = dbus_g_proxy_new_for_name (manager->priv->bus,
+						   "org.freedesktop.Hal",
+						   udi,
+						   "org.freedesktop.Hal.Device");
+    
+    if ( !proxy )
+    {
+	g_critical ("Unable to get proxy on interface %s\n", udi);
+	return value;
+    }
+    
+    dbus_g_proxy_call (proxy, "PropertyExists", &error,
+		       G_TYPE_STRING, key,
+		       G_TYPE_INVALID,
+		       G_TYPE_BOOLEAN, &value,
+		       G_TYPE_INVALID);
+		       
+    g_object_unref (proxy);
+    
+    if ( error )
+    {
+	g_critical ("Error getting property exists on device %s: %s\n", udi, error->message);
+	g_error_free (error);
+    }
+    
+    return value;
+    
+    return value;
+}
+									 
+gboolean hal_manager_device_has_capability (HalManager *manager, const gchar *udi, const gchar *capability)
+{
+    g_return_val_if_fail (HAL_IS_MANAGER(manager), FALSE);
+    g_return_val_if_fail (manager->priv->connected, FALSE);
+    
+    gboolean value = FALSE;
+    GError *error = NULL;
+    
+    DBusGProxy *proxy = dbus_g_proxy_new_for_name (manager->priv->bus,
+						   "org.freedesktop.Hal",
+						   udi,
+						   "org.freedesktop.Hal.Device");
+    
+    if ( !proxy )
+    {
+	g_critical ("Unable to get proxy on interface %s\n", udi);
+	return value;
+    }
+    
+    dbus_g_proxy_call (proxy, "QueryCapability", &error,
+		       G_TYPE_STRING, capability,
+		       G_TYPE_INVALID,
+		       G_TYPE_BOOLEAN, &value,
+		       G_TYPE_INVALID);
+		       
+    g_object_unref (proxy);
+    
+    if ( error )
+    {
+	g_critical ("Error getting querying capability on device %s: %s\n", udi, error->message);
+	g_error_free (error);
+    }
+    
+    return value;
+}
+
+void hal_manager_free_string_array (gchar **array)
+{
+    gint i;
+
+    if (array == NULL)	
+	    return;
+    
+    for (i=0; array[i]; i++) 
+	g_free (array[i]);
+    
+    g_free (array);
+}

Added: xfce4-power-manager/trunk/libxfpm/hal-manager.h
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-manager.h	                        (rev 0)
+++ xfce4-power-manager/trunk/libxfpm/hal-manager.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -0,0 +1,82 @@
+/*
+ * * Copyright (C) 2008-2009 Ali <aliov at xfce.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef __HAL_MANAGER_H
+#define __HAL_MANAGER_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define HAL_TYPE_MANAGER        (hal_manager_get_type () )
+#define HAL_MANAGER(o)          (G_TYPE_CHECK_INSTANCE_CAST((o), HAL_TYPE_MANAGER, HalManager))
+#define HAL_IS_MANAGER(o)       (G_TYPE_CHECK_INSTANCE_TYPE((o), HAL_TYPE_MANAGER))
+
+typedef struct HalManagerPrivate HalManagerPrivate;
+
+typedef struct
+{
+    GObject		  	parent;
+    HalManagerPrivate	       *priv;
+    
+} HalManager;
+
+typedef struct
+{
+    GObjectClass 		parent_class;
+    
+    void		        (*device_added)				(HalManager *manager,
+									 const gchar *udi);
+    void                        (*device_removed)			(HalManager *manager,
+									 const gchar *udi);
+    
+} HalManagerClass;
+
+GType        	  		hal_manager_get_type        		(void) G_GNUC_CONST;
+HalManager       	       *hal_manager_new            		(void);
+
+gchar 			      **hal_manager_find_device_by_capability 	(HalManager *manager,
+									 const gchar *capability);
+									 
+gboolean			hal_manager_get_device_property_bool    (HalManager *manager,
+									 const gchar *udi,
+									 const gchar *property);
+									 
+gint				hal_manager_get_device_property_int     (HalManager *manager,
+									 const gchar *udi,
+									 const gchar *property);
+									 
+gchar			       *hal_manager_get_device_property_string  (HalManager *manager,
+									 const gchar *udi,
+									 const gchar *property);
+
+gboolean                        hal_manager_device_has_key		(HalManager *manager,
+									 const gchar *udi,
+									 const gchar *key);
+									 
+gboolean                        hal_manager_device_has_capability	(HalManager *manager,
+									 const gchar *udi,
+									 const gchar *capability);
+									 
+void                            hal_manager_free_string_array           (gchar **array);
+
+G_END_DECLS
+
+#endif /* __HAL_MANAGER_H */

Added: xfce4-power-manager/trunk/libxfpm/hal-marshal.c
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-marshal.c	                        (rev 0)
+++ xfce4-power-manager/trunk/libxfpm/hal-marshal.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -0,0 +1,127 @@
+
+#include	<glib-object.h>
+
+
+#ifdef G_ENABLE_DEBUG
+#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
+#define g_marshal_value_peek_char(v)     g_value_get_char (v)
+#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
+#define g_marshal_value_peek_int(v)      g_value_get_int (v)
+#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
+#define g_marshal_value_peek_long(v)     g_value_get_long (v)
+#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
+#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
+#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
+#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
+#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
+#define g_marshal_value_peek_float(v)    g_value_get_float (v)
+#define g_marshal_value_peek_double(v)   g_value_get_double (v)
+#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
+#define g_marshal_value_peek_param(v)    g_value_get_param (v)
+#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
+#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
+#define g_marshal_value_peek_object(v)   g_value_get_object (v)
+#else /* !G_ENABLE_DEBUG */
+/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
+ *          Do not access GValues directly in your code. Instead, use the
+ *          g_value_get_*() functions
+ */
+#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
+#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
+#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
+#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
+#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
+#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
+#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
+#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
+#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
+#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
+#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
+#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
+#endif /* !G_ENABLE_DEBUG */
+
+
+/* NONE:INT,BOXED (hal-marshal.list:1) */
+void
+_hal_marshal_VOID__INT_BOXED (GClosure     *closure,
+                              GValue       *return_value G_GNUC_UNUSED,
+                              guint         n_param_values,
+                              const GValue *param_values,
+                              gpointer      invocation_hint G_GNUC_UNUSED,
+                              gpointer      marshal_data)
+{
+  typedef void (*GMarshalFunc_VOID__INT_BOXED) (gpointer     data1,
+                                                gint         arg_1,
+                                                gpointer     arg_2,
+                                                gpointer     data2);
+  register GMarshalFunc_VOID__INT_BOXED callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 3);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_VOID__INT_BOXED) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_marshal_value_peek_int (param_values + 1),
+            g_marshal_value_peek_boxed (param_values + 2),
+            data2);
+}
+
+/* NONE:STRING,STRING,BOOLEAN,BOOLEAN (hal-marshal.list:2) */
+void
+_hal_marshal_VOID__STRING_STRING_BOOLEAN_BOOLEAN (GClosure     *closure,
+                                                  GValue       *return_value G_GNUC_UNUSED,
+                                                  guint         n_param_values,
+                                                  const GValue *param_values,
+                                                  gpointer      invocation_hint G_GNUC_UNUSED,
+                                                  gpointer      marshal_data)
+{
+  typedef void (*GMarshalFunc_VOID__STRING_STRING_BOOLEAN_BOOLEAN) (gpointer     data1,
+                                                                    gpointer     arg_1,
+                                                                    gpointer     arg_2,
+                                                                    gboolean     arg_3,
+                                                                    gboolean     arg_4,
+                                                                    gpointer     data2);
+  register GMarshalFunc_VOID__STRING_STRING_BOOLEAN_BOOLEAN callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 5);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_VOID__STRING_STRING_BOOLEAN_BOOLEAN) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_marshal_value_peek_string (param_values + 1),
+            g_marshal_value_peek_string (param_values + 2),
+            g_marshal_value_peek_boolean (param_values + 3),
+            g_marshal_value_peek_boolean (param_values + 4),
+            data2);
+}
+

Added: xfce4-power-manager/trunk/libxfpm/hal-marshal.h
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-marshal.h	                        (rev 0)
+++ xfce4-power-manager/trunk/libxfpm/hal-marshal.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -0,0 +1,30 @@
+
+#ifndef ___hal_marshal_MARSHAL_H__
+#define ___hal_marshal_MARSHAL_H__
+
+#include	<glib-object.h>
+
+G_BEGIN_DECLS
+
+/* NONE:INT,BOXED (hal-marshal.list:1) */
+extern void _hal_marshal_VOID__INT_BOXED (GClosure     *closure,
+                                          GValue       *return_value,
+                                          guint         n_param_values,
+                                          const GValue *param_values,
+                                          gpointer      invocation_hint,
+                                          gpointer      marshal_data);
+#define _hal_marshal_NONE__INT_BOXED	_hal_marshal_VOID__INT_BOXED
+
+/* NONE:STRING,STRING,BOOLEAN,BOOLEAN (hal-marshal.list:2) */
+extern void _hal_marshal_VOID__STRING_STRING_BOOLEAN_BOOLEAN (GClosure     *closure,
+                                                              GValue       *return_value,
+                                                              guint         n_param_values,
+                                                              const GValue *param_values,
+                                                              gpointer      invocation_hint,
+                                                              gpointer      marshal_data);
+#define _hal_marshal_NONE__STRING_STRING_BOOLEAN_BOOLEAN	_hal_marshal_VOID__STRING_STRING_BOOLEAN_BOOLEAN
+
+G_END_DECLS
+
+#endif /* ___hal_marshal_MARSHAL_H__ */
+

Added: xfce4-power-manager/trunk/libxfpm/hal-marshal.list
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-marshal.list	                        (rev 0)
+++ xfce4-power-manager/trunk/libxfpm/hal-marshal.list	2009-03-13 13:01:30 UTC (rev 6891)
@@ -0,0 +1,2 @@
+NONE:INT,BOXED
+NONE:STRING,STRING,BOOLEAN,BOOLEAN

Modified: xfce4-power-manager/trunk/libxfpm/hal-power.c
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-power.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/libxfpm/hal-power.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -23,23 +23,14 @@
 #endif
 
 #include <stdio.h>
-
-#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
-#endif
-
-#ifdef HAVE_STRING_H
 #include <string.h>
-#endif
 
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-
 #include <glib.h>
 
-#include "hal-ctx.h"
+#include "hal-manager.h"
 #include "hal-power.h"
+#include "xfpm-string.h"
 
 /* Init */
 static void hal_power_class_init (HalPowerClass *klass);
@@ -51,14 +42,19 @@
 
 struct HalPowerPrivate
 {
-    GHashTable *hash  ;
-    HalCtx     *ctx   ;
+    GHashTable *hash  	;
+    HalManager *manager ;
+    
+    HalDevice  *adapter ;
+    gboolean    adapter_found;
 };
 
 enum
 {
-    DEVICE_ADDED,
-    DEVICE_REMOVED,
+    BATTERY_ADDED,
+    BATTERY_REMOVED,
+    ADAPTER_ADDED,
+    ADAPTER_REMOVED,
     LAST_SIGNAL
 };
 
@@ -70,78 +66,97 @@
  * Sanity check of the keys present of a battery device
  */
 static gboolean
-hal_power_chech_battery (HalPower *power, const gchar *udi)
+hal_power_check_battery (HalPower *power, const gchar *udi)
 {
-    if ( hal_ctx_device_has_key(power->priv->ctx, udi, "battery.present") &&
-	 hal_ctx_device_has_key(power->priv->ctx, udi, "battery.rechargeable.is_charging") &&
-         hal_ctx_device_has_key(power->priv->ctx, udi, "battery.rechargeable.is_discharging") &&
-         hal_ctx_device_has_key(power->priv->ctx, udi, "battery.charge_level.current") &&
-	 hal_ctx_device_has_key(power->priv->ctx, udi, "battery.charge_level.last_full") )
+    if ( hal_manager_device_has_key(power->priv->manager, udi, "battery.present") &&
+	 hal_manager_device_has_key(power->priv->manager, udi, "battery.rechargeable.is_charging") &&
+         hal_manager_device_has_key(power->priv->manager, udi, "battery.rechargeable.is_discharging") &&
+         hal_manager_device_has_key(power->priv->manager, udi, "battery.charge_level.current") &&
+	 hal_manager_device_has_key(power->priv->manager, udi, "battery.charge_level.last_full") )
 		 return TRUE;
     
     return FALSE;
 }
 
-static gboolean
-hal_power_is_power_device(HalPower *power, const gchar *udi)
+static HalBattery *
+hal_power_add_battery (HalPower *power, const gchar *udi)
 {
-    if ( hal_ctx_device_has_capability(power->priv->ctx, udi, "battery") ||
-    	 hal_ctx_device_has_capability(power->priv->ctx, udi, "ac_adapter") )
-	return TRUE;
+    HalBattery *battery;
+    battery  = hal_battery_new (udi);
     
-    return FALSE;
+    g_hash_table_insert (power->priv->hash, g_strdup(udi), battery );
+    
+    return battery ;
 }
 
-static HalDevice *
-hal_power_add_device(HalPower *power, const gchar *udi)
+static void
+hal_power_remove_battery (HalPower *power, HalBattery *battery, const gchar *udi)
 {
-    HalDevice *device;
-    device = hal_device_new (udi);
+    g_signal_emit (power, signals[BATTERY_REMOVED], 0, battery);
     
-    g_hash_table_insert (power->priv->hash, g_strdup(udi), device);
+    g_object_unref(battery );
     
-    return device;
+    if (!g_hash_table_remove(power->priv->hash, udi))
+    	g_warning ("Unable to removed object from hash\n");
 }
 
 static void
-hal_power_remove_device(HalPower *power, HalDevice *device, const gchar *udi)
+hal_power_remove_adapter (HalPower *power )
 {
-    g_object_unref(device);
-    if (!g_hash_table_remove(power->priv->hash, udi))
-    	g_warning ("Unable to removed object from hash\n");
+    g_signal_emit (G_OBJECT(power), signals[ADAPTER_REMOVED], 0);
+    g_object_unref (power->priv->adapter);
+    power->priv->adapter_found = FALSE;
 }
 
-static HalDevice *
-hal_power_get_device(HalPower *power, const gchar *udi)
+static HalBattery *
+hal_power_get_battery_from_hash (HalPower *power, const gchar *udi)
 {
-    HalDevice *device = NULL;
-    device = g_hash_table_lookup(power->priv->hash, udi);
-    return device;
+    HalBattery *battery = NULL;
+    
+    battery = g_hash_table_lookup(power->priv->hash, udi);
+    
+    return battery;
 }
 
 static void
-hal_power_device_added_cb (LibHalContext *context, const gchar *udi)
+hal_power_device_added_cb (HalManager *manager, const gchar *udi, HalPower *power)
 {
-    HalPower *power = libhal_ctx_get_user_data(context);
-    if ( !hal_power_is_power_device(power, udi) ) return;
-    
-    HalDevice *device = hal_power_add_device(power, udi);
-    
-    g_signal_emit(G_OBJECT(power), signals[DEVICE_ADDED], 0, device);
+    if ( hal_manager_device_has_capability (manager, udi, "battery") )
+    {
+	HalBattery *battery  = hal_power_add_battery (power, udi);
+        g_signal_emit (G_OBJECT(power), signals[BATTERY_ADDED], 0, battery);
+    }
+    else if ( hal_manager_device_has_capability (manager, udi, "ac_adapter") )
+    {
+	if ( !power->priv->adapter_found )
+	{
+	    power->priv->adapter = hal_device_new (udi);
+	    g_signal_emit (G_OBJECT(power), signals[ADAPTER_ADDED], 0, power->priv->adapter);
+	}
+    }
 }
 
 static void
-hal_power_device_removed_cb (LibHalContext *context, const gchar *udi)
+hal_power_device_removed_cb (HalManager *manager, const gchar *udi, HalPower *power)
 {
-    HalPower *power = libhal_ctx_get_user_data (context);
+    HalBattery *battery  = hal_power_get_battery_from_hash (power, udi);
     
-    HalDevice *device = hal_power_get_device (power, udi);
-    
-    if (device)
+    if (battery )
     {
-    	g_signal_emit(power, signals[DEVICE_REMOVED], 0, device);
-	hal_power_remove_device(power, device, udi);
+	hal_power_remove_battery (power, battery , udi);
     }
+    else if ( power->priv->adapter_found )
+    {
+	gchar *adapter_udi = NULL;
+	g_object_get (G_OBJECT(power->priv->adapter), "udi", &adapter_udi, NULL);
+	if (adapter_udi)
+	{
+	    if ( xfpm_strequal (udi, adapter_udi ) )
+		hal_power_remove_adapter (power);
+		
+	    g_free (adapter_udi);
+	}
+    }
 }
 
 static void
@@ -149,104 +164,112 @@
 {
     GObjectClass *object_class = G_OBJECT_CLASS(klass);
 
-    signals[DEVICE_ADDED] =
-    	g_signal_new("device-added",
+    signals[BATTERY_ADDED] =
+    	g_signal_new("battery-added",
 		     HAL_TYPE_POWER,
 		     G_SIGNAL_RUN_LAST,
-		     G_STRUCT_OFFSET(HalPowerClass, device_added),
+		     G_STRUCT_OFFSET(HalPowerClass, battery_added),
 		     NULL, NULL,
 		     g_cclosure_marshal_VOID__POINTER,
 		     G_TYPE_NONE, 1, G_TYPE_POINTER);
 		     
-    signals[DEVICE_REMOVED] =
-    	g_signal_new("device-removed",
+    signals[BATTERY_REMOVED] =
+    	g_signal_new("battery-removed",
 		     HAL_TYPE_POWER,
 		     G_SIGNAL_RUN_LAST,
-		     G_STRUCT_OFFSET(HalPowerClass, device_removed),
+		     G_STRUCT_OFFSET(HalPowerClass, battery_removed),
 		     NULL, NULL,
 		     g_cclosure_marshal_VOID__POINTER,
 		     G_TYPE_NONE, 1, G_TYPE_POINTER);
 		     
+    signals[ADAPTER_ADDED] =
+    	g_signal_new("adapter-added",
+		     HAL_TYPE_POWER,
+		     G_SIGNAL_RUN_LAST,
+		     G_STRUCT_OFFSET(HalPowerClass, adapter_added),
+		     NULL, NULL,
+		     g_cclosure_marshal_VOID__POINTER,
+		     G_TYPE_NONE, 1, G_TYPE_POINTER);
+		     
+    signals[ADAPTER_REMOVED] =
+    	g_signal_new("adapter-removed",
+		     HAL_TYPE_POWER,
+		     G_SIGNAL_RUN_LAST,
+		     G_STRUCT_OFFSET(HalPowerClass, adapter_removed),
+		     NULL, NULL,
+		     g_cclosure_marshal_VOID__VOID,
+		     G_TYPE_NONE, 0, G_TYPE_NONE);
+		     
     object_class->finalize = hal_power_finalize;
 
     g_type_class_add_private(klass,sizeof(HalPowerPrivate));
 }
 
 static void
-hal_power_get_batteries(HalPower *power)
+hal_power_get_batteries_internal (HalPower *power)
 {
-    gint number = 0;
     gchar **batteries = NULL;
     gint i;
     
-    batteries = hal_ctx_get_device_by_capability(power->priv->ctx, "battery", &number);
+    batteries = hal_manager_find_device_by_capability (power->priv->manager, "battery");
     
-    if ( !batteries || number == 0 ) 
+    if ( !batteries ) 
     	goto out;
     
     for ( i = 0; batteries[i]; i++ )
     {
-	if (!hal_power_chech_battery(power, batteries[i]))
+	if (!hal_power_check_battery(power, batteries[i]))
 		continue;
 		
-    	hal_power_add_device(power, batteries[i]);
+    	hal_power_add_battery (power, batteries[i]);
     }
-	
-    libhal_free_string_array(batteries);
     
+    hal_manager_free_string_array (batteries);
+    
 out:
     	;
     
 }
 
+
 static void
-hal_power_get_adapter(HalPower *power)
+hal_power_get_adapter_internal (HalPower *power)
 {
-    gint number = 0;
     gchar **adapter = NULL;
-    gint i = 0;
     
-    adapter = hal_ctx_get_device_by_capability(power->priv->ctx, "ac_adapter", &number);
+    adapter = hal_manager_find_device_by_capability (power->priv->manager, "ac_adapter");
     
-    if ( !adapter || number == 0 ) 
+    if ( !adapter ) 
     	goto out;
+
+    power->priv->adapter = hal_device_new (adapter[0]);
+    power->priv->adapter_found = TRUE;
     
-    if ( number > 1) 
-    	g_warning("More than one adapter were found on the system");
-    
-    hal_power_add_device (power, adapter[i]);
-    
-    libhal_free_string_array(adapter);
-    
+    hal_manager_free_string_array (adapter);
 out:
     	;
-    
 }
 
+
 static void
 hal_power_init(HalPower *power)
 {
     power->priv = HAL_POWER_GET_PRIVATE(power);
     
-    power->priv->ctx   = hal_ctx_new();
-    power->priv->hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+    power->priv->manager = hal_manager_new ();
+    power->priv->hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+    power->priv->adapter_found = FALSE;
+    power->priv->adapter = NULL;
     
-    if ( !hal_ctx_connect(power->priv->ctx) )
-    {
-    	g_critical("Unable to connect to HAL");
-	goto out;
-    }
+    g_signal_connect (power->priv->manager, "device-added", 
+		      G_CALLBACK(hal_power_device_added_cb), power);
     
-    hal_ctx_set_user_data (power->priv->ctx, power);
-    hal_ctx_set_device_added_callback (power->priv->ctx, hal_power_device_added_cb);
-    hal_ctx_set_device_removed_callback (power->priv->ctx, hal_power_device_removed_cb);
+    g_signal_connect (power->priv->manager, "device-removed",
+		      G_CALLBACK(hal_power_device_removed_cb), power);
    
     
-    hal_power_get_adapter (power);
-    hal_power_get_batteries (power);
-    
-out:
-	;
+    hal_power_get_adapter_internal (power);
+    hal_power_get_batteries_internal (power);
 }
 
 static void
@@ -259,8 +282,8 @@
     if (power->priv->hash)
     	g_hash_table_unref(power->priv->hash);
     
-    if ( power->priv->ctx )
-    	g_object_unref(power->priv->ctx);
+    if ( power->priv->manager )
+    	g_object_unref(power->priv->manager);
     
     G_OBJECT_CLASS(hal_power_parent_class)->finalize(object);
 }
@@ -277,11 +300,13 @@
  * Return an array of power devices, the array should be freed by the caller
  */
 GPtrArray *
-hal_power_get_devices (HalPower *power)
+hal_power_get_batteries (HalPower *power)
 {
+    g_return_val_if_fail (HAL_IS_POWER (power), NULL);
+    
     guint i;
     GPtrArray *array;
-    HalDevice *device;
+    HalBattery *battery;
    
     array = g_ptr_array_new ();
    
@@ -293,14 +318,28 @@
 	
     for ( i=0; i < g_list_length (list); i++)
     {
-       device = g_list_nth_data (list, i);
-       g_object_ref (device);
-       g_ptr_array_add (array, device);
+       battery = g_list_nth_data (list, i);
+       g_object_ref (battery );
+       g_ptr_array_add (array, battery);
     }
    
     g_list_free (list);
-
 out:
-
    return array;
 }
+
+gboolean hal_power_adapter_found (HalPower *power)
+{
+    g_return_val_if_fail (HAL_IS_POWER (power), FALSE);
+    
+    return power->priv->adapter_found;
+}
+
+const HalDevice *hal_power_get_adapter (HalPower *power)
+{
+    g_return_val_if_fail (HAL_IS_POWER (power), NULL);
+    g_return_val_if_fail (power->priv->adapter_found == TRUE, NULL);
+    
+    return (const HalDevice *)power->priv->adapter;
+    
+}

Modified: xfce4-power-manager/trunk/libxfpm/hal-power.h
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-power.h	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/libxfpm/hal-power.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -24,6 +24,7 @@
 #include <glib-object.h>
 
 #include "hal-device.h"
+#include "hal-battery.h"
 
 G_BEGIN_DECLS
 
@@ -35,26 +36,35 @@
 
 typedef struct
 {
-    GObject		  parent;
-    HalPowerPrivate	 *priv;
+    GObject		parent;
+    HalPowerPrivate    *priv;
     
 } HalPower;
 
 typedef struct
 {
-    GObjectClass parent_class;
+    GObjectClass 	parent_class;
     
-    void 	(*device_added)	       (HalPower *power,
-					const HalDevice *device);
-    void        (*device_removed)      (HalPower *power,
-    					const HalDevice *device);
+    void 		(*battery_added)	  (HalPower *power,
+						   const HalBattery *battery);
+					   
+    void        	(*battery_removed)        (HalPower *power,
+						   const HalBattery *battery);
+					   
+    void        	(*adapter_added)	  (HalPower *power,
+						   const HalDevice *device);
+					   
+    void        	(*adapter_removed)	  (HalPower *power);
     
 } HalPowerClass;
 
-GType        hal_power_get_type        (void) G_GNUC_CONST;
-HalPower    *hal_power_new             (void);
-GPtrArray   *hal_power_get_devices     (HalPower *power);
+GType        		hal_power_get_type        (void) G_GNUC_CONST;
+HalPower       	       *hal_power_new             (void);
 
+GPtrArray      	       *hal_power_get_batteries   (HalPower *power);
+gboolean                hal_power_adapter_found   (HalPower *power);
+const HalDevice        *hal_power_get_adapter     (HalPower *power);
+
 G_END_DECLS
 
 #endif /* __HAL_POWER_H */

Modified: xfce4-power-manager/trunk/panel-plugins/brightness/Makefile.am
===================================================================
--- xfce4-power-manager/trunk/panel-plugins/brightness/Makefile.am	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/panel-plugins/brightness/Makefile.am	2009-03-13 13:01:30 UTC (rev 6891)
@@ -9,15 +9,13 @@
 	$(LIBXFCE4PANEL_CFLAGS)       		\
 	$(LIBXFCE4UTIL_CFLAGS)        		\
 	$(GTK_CFLAGS)			      	\
-	$(GLIB_CFLAGS)			      	\
-	$(HAL_CFLAGS)
+	$(GLIB_CFLAGS)
 
 xfce4_brightness_plugin_LDADD =			\
 	$(LIBXFCE4PANEL_LIBS)   		\
 	$(LIBXFCE4UTIL_LIBS)			\
 	$(GTK_LIBS)   				\
-	$(GLIB_LIBS)				\
-	$(HAL_LIBS)
+	$(GLIB_LIBS)
 
 #
 # Desktop file

Modified: xfce4-power-manager/trunk/panel-plugins/brightness/main.c
===================================================================
--- xfce4-power-manager/trunk/panel-plugins/brightness/main.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/panel-plugins/brightness/main.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -29,8 +29,6 @@
 #include <libxfce4panel/xfce-panel-plugin.h>
 #include <libxfce4util/libxfce4util.h>
 
-#include <hal/libhal.h>
-
 static void
 register_plugin(XfcePanelPlugin *plugin)
 {

Modified: xfce4-power-manager/trunk/src/Makefile.am
===================================================================
--- xfce4-power-manager/trunk/src/Makefile.am	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/Makefile.am	2009-03-13 13:01:30 UTC (rev 6891)
@@ -49,7 +49,6 @@
 	$(GLIB_CFLAGS)				\
 	$(DBUS_CFLAGS)				\
 	$(DBUS_GLIB_CFLAGS)			\
-	$(HAL_CFLAGS)				\
 	$(LIBXFCE4GUI_CFLAGS)			\
 	$(LIBXFCE4UTIL_CFLAGS)			\
 	$(XFCONF_CFLAGS)			\
@@ -66,7 +65,6 @@
 	$(DBUS_GLIB_LIBS)			\
 	$(LIBXFCE4GUI_LIBS)			\
 	$(LIBXFCE4UTIL_LIBS)			\
-	$(HAL_LIBS)				\
 	$(XFCONF_LIBS)				\
 	$(LIBNOTIFY_LIBS)			\
 	$(DPMS_LIBS)		

Modified: xfce4-power-manager/trunk/src/xfpm-adapter.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-adapter.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-adapter.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -163,5 +163,4 @@
      g_return_if_fail ( XFPM_IS_ADAPTER (adapter));
     
     xfpm_tray_icon_set_tooltip (adapter->priv->icon, text);
-    
 }

Modified: xfce4-power-manager/trunk/src/xfpm-adapter.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-adapter.h	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-adapter.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -51,10 +51,12 @@
 
 GType        	  xfpm_adapter_get_type        (void) G_GNUC_CONST;
 XfpmAdapter      *xfpm_adapter_new             (const HalDevice *device);
+
 gboolean          xfpm_adapter_get_presence    (XfpmAdapter *adapter);
 
 void              xfpm_adapter_set_visible     (XfpmAdapter *adapter,
 						gboolean visible);
+						
 void              xfpm_adapter_set_tooltip     (XfpmAdapter *adapter,
 						const gchar *text);
 G_END_DECLS

Modified: xfce4-power-manager/trunk/src/xfpm-battery-info.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery-info.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-battery-info.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -24,7 +24,7 @@
 #include "xfpm-battery-info.h"
 
 static GtkWidget *
-xfpm_battery_info (HalDevice *device)
+xfpm_battery_info (HalBattery *device)
 {
     PangoFontDescription *pfd;
     
@@ -188,7 +188,7 @@
     return table;
 }
 
-GtkWidget *xfpm_battery_info_new (HalDevice *device, const gchar *icon_name)
+GtkWidget *xfpm_battery_info_new (HalBattery *device, const gchar *icon_name)
 {
     GtkWidget *info;
     GtkWidget *mainbox;

Modified: xfce4-power-manager/trunk/src/xfpm-battery-info.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery-info.h	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-battery-info.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -24,11 +24,11 @@
 #include <gtk/gtk.h>
 #include <glib.h>
 
-#include "libxfpm/hal-device.h"
+#include "libxfpm/hal-battery.h"
 
 G_BEGIN_DECLS
 
-GtkWidget 	*xfpm_battery_info_new 		(HalDevice *device, const gchar *icon_name);
+GtkWidget 	*xfpm_battery_info_new 		(HalBattery *device, const gchar *icon_name);
 
 G_END_DECLS
 

Modified: xfce4-power-manager/trunk/src/xfpm-battery.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-battery.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -54,7 +54,7 @@
 struct XfpmBatteryPrivate
 {
     XfpmTrayIcon  *icon;
-    HalDevice     *device;
+    HalBattery     *device;
 
     HalDeviceType    type;
     gchar 	    *icon_prefix;
@@ -437,7 +437,7 @@
 }
 
 static void
-xfpm_battery_device_changed_cb (HalDevice *device, XfpmBattery *battery)
+xfpm_battery_device_changed_cb (HalBattery *device, XfpmBattery *battery)
 {
     TRACE("start");
     xfpm_battery_refresh (battery);
@@ -487,20 +487,21 @@
 }
 
 XfpmBattery *
-xfpm_battery_new(const HalDevice *device)
+xfpm_battery_new(const HalBattery *device)
 {
     XfpmBattery *battery = NULL;
     
     battery = g_object_new(XFPM_TYPE_BATTERY, NULL);
     
-    battery->priv->device = (HalDevice *)g_object_ref(G_OBJECT(device));
+    battery->priv->device = (HalBattery *)g_object_ref(G_OBJECT(device));
     
     g_object_get(G_OBJECT(battery->priv->device), "type", &battery->priv->type, NULL);
     
     battery->priv->icon_prefix = _get_icon_prefix_from_enum_type(battery->priv->type);
     
     xfpm_battery_refresh (battery);
-    g_signal_connect (G_OBJECT(battery->priv->device), "device-changed",
+    
+    g_signal_connect (G_OBJECT(battery->priv->device), "battery-changed",
 		      G_CALLBACK(xfpm_battery_device_changed_cb), battery);
 		      
     g_signal_connect (G_OBJECT(xfpm_tray_icon_get_tray_icon(battery->priv->icon)), "popup-menu",
@@ -526,7 +527,7 @@
     xfpm_battery_refresh_visible_icon (battery);
 }
 
-const HalDevice	*
+const HalBattery*
 xfpm_battery_get_device (XfpmBattery *battery)
 {
     g_return_val_if_fail (XFPM_IS_BATTERY(battery), NULL);

Modified: xfce4-power-manager/trunk/src/xfpm-battery.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery.h	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-battery.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -24,7 +24,7 @@
 #include <glib-object.h>
 #include <gtk/gtk.h>
 
-#include "libxfpm/hal-device.h"
+#include "libxfpm/hal-battery.h"
 
 #include "xfpm-enum-glib.h"
 #include "xfpm-notify.h"
@@ -50,6 +50,7 @@
     
     void	        (*battery_state_changed)	(XfpmBattery *battery,
     					            	 XfpmBatteryState state);
+							 
     void                (*popup_battery_menu)		(XfpmBattery *battery,
 						         GtkStatusIcon *icon,
 							 guint button,
@@ -59,16 +60,24 @@
 } XfpmBatteryClass;
 
 GType        		 xfpm_battery_get_type           (void) G_GNUC_CONST;
-XfpmBattery    		*xfpm_battery_new                (const HalDevice *device);
+XfpmBattery    		*xfpm_battery_new                (const HalBattery *device);
+
 void                     xfpm_battery_set_adapter_presence(XfpmBattery *battery,
 							  gboolean adapter_present);
+							  
 void                     xfpm_battery_set_show_icon      (XfpmBattery *battery,
 							  XfpmShowIcon show_icon);
-const HalDevice		*xfpm_battery_get_device         (XfpmBattery *battery);
+							  
+const HalBattery	*xfpm_battery_get_device         (XfpmBattery *battery);
+
 XfpmBatteryState         xfpm_battery_get_state          (XfpmBattery *battery);
+
 GtkStatusIcon  		*xfpm_battery_get_status_icon    (XfpmBattery *battery);
+
 const gchar    		*xfpm_battery_get_icon_name      (XfpmBattery *battery);
+
 void            	 xfpm_battery_show_info          (XfpmBattery *battery);
+
 void                     xfpm_battery_set_critical_level (XfpmBattery *battery,
 							  guint8 critical_level);
 

Modified: xfce4-power-manager/trunk/src/xfpm-brightness-hal.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-brightness-hal.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-brightness-hal.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -36,6 +36,10 @@
 #include <errno.h>
 #endif
 
+#include <libxfce4util/libxfce4util.h>
+
+#include "libxfpm/xfpm-string.h"
+
 #include "xfpm-brightness-hal.h"
 
 /* Init */
@@ -48,7 +52,8 @@
 
 struct XfpmBrightnessHalPrivate
 {
-    gboolean hw_found;
+    //HalCtx   *ctx;
+    gboolean  hw_found;
 };
 
 G_DEFINE_TYPE(XfpmBrightnessHal, xfpm_brightness_hal, G_TYPE_OBJECT)
@@ -68,6 +73,9 @@
 xfpm_brightness_hal_init(XfpmBrightnessHal *brg)
 {
     brg->priv = XFPM_BRIGHTNESS_HAL_GET_PRIVATE(brg);
+    
+    //brg->priv->ctx 	= NULL;
+    brg->priv->hw_found = FALSE;
 }
 
 static void
@@ -80,11 +88,59 @@
     G_OBJECT_CLASS(xfpm_brightness_hal_parent_class)->finalize(object);
 }
 
+/*
+static void
+xfpm_brightness_hal_property_modified_cb (LibHalContext *ctx,
+					  const gchar *udi,
+					  const gchar *key, 
+					  dbus_bool_t is_removed,
+					  dbus_bool_t is_added)
+{
+    g_print("BRIGHTNESS: udi=%s key=%s is_removed=%s is_added=%s\n", 
+	    udi, key, xfpm_bool_to_string(is_removed), xfpm_bool_to_string(is_added) );
+    
+}
+
+static gboolean
+xfpm_brightness_hal_setup (XfpmBrightnessHal *brg)
+{
+    brg->priv->ctx = hal_ctx_new ();
+    
+    if ( !hal_ctx_connect(brg->priv->ctx) )
+    	return FALSE;
+
+    gchar **udi = NULL;
+    gint num = 0;
+    
+    udi = hal_ctx_get_device_by_capability (brg->priv->ctx, "laptop_panel", &num );
+    
+    if ( !udi )
+    	return FALSE;
+	
+    g_return_val_if_fail (num == 1, FALSE);
+    
+    hal_ctx_set_device_property_callback (brg->priv->ctx, xfpm_brightness_hal_property_modified_cb);
+    hal_ctx_set_user_data (brg->priv->ctx, brg);
+    
+    if ( hal_ctx_device_has_key (brg->priv->ctx, udi[0], "laptop_panel.num_levels") )
+    {
+	TRACE ("Found laptop_panel with udi=%s\n", udi[0]);
+	brg->priv->hw_found = TRUE;
+	hal_ctx_watch_device (brg->priv->ctx, udi[0] );
+    }
+		    
+    libhal_free_string_array (udi);
+    
+    return TRUE;
+}
+*/
 XfpmBrightnessHal *
 xfpm_brightness_hal_new(void)
 {
     XfpmBrightnessHal *brg = NULL;
     brg = g_object_new (XFPM_TYPE_BRIGHTNESS_HAL, NULL);
     
+    //xfpm_brightness_hal_setup (brg);
+    
     return brg;
 }

Modified: xfce4-power-manager/trunk/src/xfpm-cpu.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-cpu.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-cpu.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -201,7 +201,7 @@
 	    cpu->priv->cpu_governors |= CPU_PERFORMANCE;
     }
 
-    libhal_free_string_array (governors);
+    //libhal_free_string_array (governors);
     
     return TRUE;
     

Modified: xfce4-power-manager/trunk/src/xfpm-lid-hal.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-lid-hal.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-lid-hal.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -38,7 +38,8 @@
 
 #include <libxfce4util/libxfce4util.h>
 
-#include "libxfpm/hal-ctx.h"
+#include "libxfpm/hal-manager.h"
+#include "libxfpm/hal-device.h"
 #include "libxfpm/xfpm-string.h"
 
 #include "xfpm-lid-hal.h"
@@ -53,10 +54,9 @@
 
 struct XfpmLidHalPrivate
 {
-    HalCtx   *ctx;
-    
-    //gchar    *udi;
-    gboolean  hw_found;
+    HalManager *manager;
+    HalDevice  *device;
+    gboolean    hw_found;
 };
 
 enum
@@ -95,8 +95,9 @@
 {
     lid->priv = XFPM_LID_HAL_GET_PRIVATE(lid);
     
-    lid->priv->ctx      = NULL;
-    lid->priv->hw_found = FALSE;
+    lid->priv->manager      = NULL;
+    lid->priv->device       = NULL;
+    lid->priv->hw_found     = FALSE;
 }
 
 static void
@@ -106,26 +107,29 @@
 
     lid = XFPM_LID_HAL(object);
     
-    if ( lid->priv->ctx )
-    	g_object_unref (lid->priv->ctx);
+    if ( lid->priv->manager )
+    	g_object_unref (lid->priv->manager);
 
+    if ( lid->priv->device )
+    	g_object_unref (lid->priv->device);
+
     G_OBJECT_CLASS(xfpm_lid_hal_parent_class)->finalize(object);
 }
 
 static void
-xfpm_lid_property_modified_cb (LibHalContext *ctx,
+xfpm_lid_hal_device_changed_cb(HalDevice *device,
 			       const gchar *udi,
                                const gchar *key, 
-                               dbus_bool_t is_removed,
-                               dbus_bool_t is_added)
+                               gboolean is_removed,
+                               gboolean is_added,
+			       XfpmLidHal *lid)
 {
     if ( !xfpm_strequal (key, "button.state.value") )
     	return;
 	
     TRACE("Property modified key=%s  key=%s\n", key, udi);
-    XfpmLidHal *lid = libhal_ctx_get_user_data (ctx);
     
-    gboolean pressed = hal_ctx_get_property_bool (lid->priv->ctx, udi, key);
+    gboolean pressed = hal_manager_get_device_property_bool (lid->priv->manager, udi, key);
     
     if ( pressed )
     {
@@ -138,31 +142,24 @@
 static gboolean
 xfpm_lid_hal_setup (XfpmLidHal *lid)
 {
-    lid->priv->ctx = hal_ctx_new ();
+    lid->priv->manager = hal_manager_new ();
     
-    if ( !hal_ctx_connect(lid->priv->ctx) )
-    	return FALSE;
-
     gchar **udi = NULL;
-    gint num = 0;
     
-    udi = hal_ctx_get_device_by_capability (lid->priv->ctx, "button", &num );
+    udi = hal_manager_find_device_by_capability (lid->priv->manager, "button");
     
     if ( !udi )
     	return FALSE;
 	
-    hal_ctx_set_device_property_callback (lid->priv->ctx, xfpm_lid_property_modified_cb);
-    hal_ctx_set_user_data (lid->priv->ctx, lid);
-    
     int i;
     
     for ( i = 0; udi[i]; i++ )
     {
-	if ( hal_ctx_device_has_key (lid->priv->ctx, udi[i], "button.type" ) &&
-	     hal_ctx_device_has_key (lid->priv->ctx, udi[i], "button.has_state" ) )
+	if ( hal_manager_device_has_key (lid->priv->manager, udi[i], "button.type" ) &&
+	     hal_manager_device_has_key (lid->priv->manager, udi[i], "button.has_state" ) )
     	{
 	    gchar *button_type =
-	    	hal_ctx_get_property_string (lid->priv->ctx, udi[i], "button.type");
+	    	hal_manager_get_device_property_string (lid->priv->manager, udi[i], "button.type");
 		
 	    if ( !button_type )
 	    	continue;
@@ -170,16 +167,20 @@
 	    if ( xfpm_strequal (button_type, "lid") )
 	    {
 	    	lid->priv->hw_found = TRUE;
-		hal_ctx_watch_device (lid->priv->ctx, udi[i] );
+		lid->priv->device = hal_device_new (udi[i]);
+		g_signal_connect (lid->priv->device, "device-changed", 
+				  G_CALLBACK(xfpm_lid_hal_device_changed_cb), lid);
+		if ( !hal_device_watch (lid->priv->device) )
+		    g_critical ("Unable to watch lid button device: %s\n", udi[i]);
+		
 		g_free(button_type);
 		TRACE ("Found lid switch on device: %s\n", udi[i]);
-		goto out;
+		break;
 	    }
 	}
     }
         
-out:
-    libhal_free_string_array (udi);
+    hal_manager_free_string_array (udi);
     return TRUE;
 }
 
@@ -189,11 +190,8 @@
     XfpmLidHal *lid = NULL;
     lid = g_object_new (XFPM_TYPE_LID_HAL, NULL);
     
-    if ( !xfpm_lid_hal_setup (lid) )
-    	goto out;
-	
-	
-out:
+    xfpm_lid_hal_setup (lid);
+
     return lid;
 }
 

Modified: xfce4-power-manager/trunk/src/xfpm-supply.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-supply.c	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-supply.c	2009-03-13 13:01:30 UTC (rev 6891)
@@ -235,7 +235,7 @@
 	if ( !battery )
 	    continue;
 	    
-	const HalDevice *device = xfpm_battery_get_device (battery);
+	const HalBattery *device = xfpm_battery_get_device (battery);
 	g_object_get (G_OBJECT(device), "type", &type, "percentage", &percentage, NULL);
 	if ( type != HAL_DEVICE_TYPE_PRIMARY )
 	    continue;
@@ -409,7 +409,7 @@
 xfpm_supply_show_battery_notification (XfpmSupply *supply, XfpmBatteryState state, XfpmBattery *battery)
 {
     HalDeviceType type;
-    const HalDevice *device = xfpm_battery_get_device (battery);
+    const HalBattery *device = xfpm_battery_get_device (battery);
     
     if ( device )
 	g_object_get (G_OBJECT(device), "type", &type, NULL);
@@ -534,6 +534,7 @@
 }
 
 //FIXME: Change the name of this function
+
 static void
 xfpm_supply_set_adapter_presence (XfpmSupply *supply)
 {
@@ -555,7 +556,6 @@
     }
     
     g_list_free (list);
-    
 }
 
 static void
@@ -579,118 +579,63 @@
 }
 
 static void
-xfpm_supply_add_device (XfpmSupply *supply, const HalDevice *device)
+xfpm_supply_add_battery (XfpmSupply *supply, const HalBattery *device)
 {
-    HalDeviceType type;
     gchar *udi = NULL;
     
-    g_object_get(G_OBJECT(device), "type", &type, "udi", &udi, NULL);
+    g_object_get(G_OBJECT(device), "udi", &udi, NULL);
+
+    TRACE("New battery found %s", udi);
+
+    XfpmBattery *battery = xfpm_battery_new (device);
+    xfpm_battery_set_show_icon (battery, supply->priv->show_icon);
+    xfpm_battery_set_adapter_presence (battery, supply->priv->adapter_present);
+    xfpm_battery_set_critical_level (battery, supply->priv->critical_level);
+    g_hash_table_insert (supply->priv->hash, g_strdup(udi), battery);
     
-    if ( type == HAL_DEVICE_TYPE_ADAPTER )
-    {
-	TRACE("Adapter found %s", udi);
-	if ( supply->priv->adapter_found )
-	{
-	    TRACE("System with more than one AC adapter"); /* g_strange */
-	    goto out;
-	}
-	supply->priv->adapter = xfpm_adapter_new (device);
-	g_signal_connect (supply->priv->adapter, "adapter-changed", 
-			  G_CALLBACK (xfpm_supply_adapter_changed_cb), supply);
-			  
-	supply->priv->adapter_found = TRUE;
-	gboolean adapter_present; 
-	g_object_get (G_OBJECT(device), "is-present", &adapter_present, NULL);
-	supply->priv->adapter_present = adapter_present;
-	g_signal_emit (G_OBJECT(supply), signals[ON_BATTERY], 0, supply->priv->adapter_present);
-	xfpm_supply_set_adapter_presence (supply);
-    }
-    else
-    {
-	TRACE("New battery found %s", udi);
-	XfpmBattery *battery = xfpm_battery_new (device);
-	xfpm_battery_set_show_icon (battery, supply->priv->show_icon);
-	xfpm_battery_set_adapter_presence (battery, supply->priv->adapter_present);
-	xfpm_battery_set_critical_level (battery, supply->priv->critical_level);
-	g_hash_table_insert (supply->priv->hash, g_strdup(udi), battery);
-	
-	g_signal_connect (G_OBJECT(battery), "battery-state-changed",
-			  G_CALLBACK(xfpm_supply_battery_state_changed_cb), supply);
+    g_signal_connect (G_OBJECT(battery), "battery-state-changed",
+		      G_CALLBACK(xfpm_supply_battery_state_changed_cb), supply);
 
-	g_signal_connect (G_OBJECT(battery), "popup-battery-menu",
-			  G_CALLBACK(xfpm_supply_popup_battery_menu_cb), supply);
-    }
-out:
+    g_signal_connect (G_OBJECT(battery), "popup-battery-menu",
+		      G_CALLBACK(xfpm_supply_popup_battery_menu_cb), supply);
+
     if (udi)
     	g_free (udi);
 }
 
 static void
-xfpm_supply_remove_device(XfpmSupply *supply,  const HalDevice *device)
+xfpm_supply_remove_battery (XfpmSupply *supply,  const HalBattery *device)
 {
-    HalDeviceType type;
-    gchar *udi = NULL;
+    gchar *udi;
+    g_object_get(G_OBJECT(device), "udi", &udi, NULL);
     
-    g_object_get(G_OBJECT(device), "type", &type, "udi", &udi, NULL);
-    
-    if ( type == HAL_DEVICE_TYPE_ADAPTER )
+    XfpmBattery *battery = xfpm_supply_get_battery(supply, udi);
+	
+    if ( battery )
     {
-	if ( !supply->priv->adapter_found )
-	{
-	    g_warning ("No adapter found in the system to removed from the data\n");
-	    goto out;
-	}
-	TRACE("Adapter removed %s", udi);
-	g_object_unref (supply->priv->adapter);
-	supply->priv->adapter_found = FALSE;
+	TRACE("Removing battery %s", udi);
+	g_object_unref(battery);
+	if (!g_hash_table_remove(supply->priv->hash, udi))
+		g_critical ("Unable to removed battery object from hash\n");
     }
-    else 
-    {
-	XfpmBattery *battery = xfpm_supply_get_battery(supply, udi);
-	
-	if ( battery )
-	{
-	    TRACE("Removing battery %s", udi);
-	    g_object_unref(battery);
-	    if (!g_hash_table_remove(supply->priv->hash, udi))
-		    g_critical ("Unable to removed battery object from hash\n");
-	}
-    }
     
-out:
     if (udi)
     	g_free (udi);
 }
 
 static void
-xfpm_supply_monitor_start (XfpmSupply *supply)
+xfpm_supply_battery_added_cb (HalPower *power, const HalBattery *device, XfpmSupply *supply)
 {
-    GPtrArray *array = hal_power_get_devices (supply->priv->power);
-    
-    int i = 0;
-    for ( i = 0; i<array->len; i++ )
-    {
-	HalDevice *device;
-	device = (HalDevice *)g_ptr_array_index(array, i);
-	xfpm_supply_add_device (supply, device);
-    }
-    
-    g_ptr_array_free(array, TRUE);
+    xfpm_supply_add_battery (supply, device);
 }
 
 static void
-xfpm_supply_device_added_cb (HalPower *power, const HalDevice *device, XfpmSupply *supply)
+xfpm_supply_battery_removed_cb (HalPower *power, const HalBattery *device, XfpmSupply *supply)
 {
-    xfpm_supply_add_device (supply, device);
+    xfpm_supply_remove_battery (supply, device);
 }
 
 static void
-xfpm_supply_device_removed_cb (HalPower *power, const HalDevice *device, XfpmSupply *supply)
-{
-    xfpm_supply_remove_device (supply, device);
-}
-
-static void
 xfpm_supply_set_battery_show_tray_icon (XfpmSupply *supply)
 {
     GList *list = NULL;
@@ -739,6 +684,83 @@
 }
 
 static void
+xfpm_supply_add_adapter (XfpmSupply *supply, const HalDevice *device)
+{
+    supply->priv->adapter_found = TRUE;
+
+    supply->priv->adapter = xfpm_adapter_new (device);
+	g_signal_connect (supply->priv->adapter, "adapter-changed", 
+			  G_CALLBACK(xfpm_supply_adapter_changed_cb), supply);
+}
+
+static void
+xfpm_supply_get_adapter (XfpmSupply *supply)
+{
+    const HalDevice *device;
+    
+    if ( hal_power_adapter_found (supply->priv->power) )
+    {
+	device = hal_power_get_adapter (supply->priv->power);
+	if ( device )
+	{
+#ifdef DEBUG
+	    gchar *udi;
+	    g_object_get (G_OBJECT(device), "udi", &udi, NULL);
+	    TRACE ("Adapter found in the system with udi=%s\n", udi);
+	    g_free (udi);
+#endif
+	    xfpm_supply_add_adapter (supply, device);
+	}
+    }
+    else
+    {
+	supply->priv->adapter_found = FALSE;
+    }
+}
+
+static void
+xfpm_supply_removed_adapter (XfpmSupply *supply)
+{
+    supply->priv->adapter_found = FALSE;
+    g_object_unref (supply->priv->adapter);
+}
+
+static void
+xfpm_supply_adapter_added_cb (HalPower *power, const HalDevice *device, XfpmSupply *supply)
+{
+    if ( supply->priv->adapter_found )
+	return;
+	
+    xfpm_supply_add_adapter (supply, device);
+}
+
+static void
+xfpm_supply_adapter_removed_cb (HalPower *power, XfpmSupply *supply)
+{
+    if ( supply->priv->adapter_found )
+	xfpm_supply_removed_adapter (supply);
+}
+
+static void
+xfpm_supply_monitor_start (XfpmSupply *supply)
+{
+    //FIXME: Check the system formfactor
+    xfpm_supply_get_adapter (supply );
+    
+    GPtrArray *array = hal_power_get_batteries (supply->priv->power);
+    
+    int i = 0;
+    for ( i = 0; i<array->len; i++ )
+    {
+	HalBattery *device;
+	device = (HalBattery *)g_ptr_array_index(array, i);
+	xfpm_supply_add_battery (supply, device);
+    }
+    
+    g_ptr_array_free(array, TRUE);
+}
+
+static void
 xfpm_supply_property_changed_cb (XfconfChannel *channel, gchar *property, GValue *value, XfpmSupply *supply)
 {
     if ( G_VALUE_TYPE(value) == G_TYPE_INVALID )
@@ -829,10 +851,16 @@
 
     xfpm_supply_monitor_start(supply);
     
-    g_signal_connect(supply->priv->power, "device-added",
-		     G_CALLBACK(xfpm_supply_device_added_cb), supply);
+    g_signal_connect(supply->priv->power, "battery-added",
+		     G_CALLBACK(xfpm_supply_battery_added_cb), supply);
 		     
-    g_signal_connect(supply->priv->power, "device-removed",
-		     G_CALLBACK(xfpm_supply_device_removed_cb), supply);
+    g_signal_connect(supply->priv->power, "battery-removed",
+		     G_CALLBACK(xfpm_supply_battery_removed_cb), supply);
+		     
+    g_signal_connect(supply->priv->power, "adapter-added",
+		     G_CALLBACK(xfpm_supply_adapter_added_cb), supply);
+		     
+    g_signal_connect(supply->priv->power, "adapter-removed",
+		     G_CALLBACK(xfpm_supply_adapter_removed_cb), supply);
     return supply;
 }

Modified: xfce4-power-manager/trunk/src/xfpm-supply.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-supply.h	2009-03-13 10:28:27 UTC (rev 6890)
+++ xfce4-power-manager/trunk/src/xfpm-supply.h	2009-03-13 13:01:30 UTC (rev 6891)
@@ -50,15 +50,19 @@
     
     void                (*shutdown_request)	    (XfpmSupply *supply,
 						     XfpmShutdownRequest action);
+						     
     void	        (*block_shutdown)	    (XfpmSupply *supply,
     						     gboolean block);
+						     
     void                (*on_battery    )	    (XfpmSupply *supply,
 						     gboolean on_battery);
+						     
     void                (*on_low_battery)	    (XfpmSupply *supply);
 	
 } XfpmSupplyClass;
 
 GType   	         xfpm_supply_get_type       (void) G_GNUC_CONST;
+
 XfpmSupply     	        *xfpm_supply_new            (DbusHal *bus,
 						     XfconfChannel *channel);
 G_END_DECLS




More information about the Goodies-commits mailing list