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

Ali Abdallah aliov at xfce.org
Fri Oct 17 08:29:09 CEST 2008


Author: aliov
Date: 2008-10-17 06:29:09 +0000 (Fri, 17 Oct 2008)
New Revision: 5654

Modified:
   xfce4-power-manager/trunk/src/xfpm-ac-adapter.c
   xfce4-power-manager/trunk/src/xfpm-ac-adapter.h
   xfce4-power-manager/trunk/src/xfpm-battery.c
   xfce4-power-manager/trunk/src/xfpm-battery.h
   xfce4-power-manager/trunk/src/xfpm-button.c
   xfce4-power-manager/trunk/src/xfpm-button.h
   xfce4-power-manager/trunk/src/xfpm-common.h
   xfce4-power-manager/trunk/src/xfpm-dbus-messages.c
   xfce4-power-manager/trunk/src/xfpm-dbus-messages.h
   xfce4-power-manager/trunk/src/xfpm-driver.c
   xfce4-power-manager/trunk/src/xfpm-hal.c
   xfce4-power-manager/trunk/src/xfpm-hal.h
   xfce4-power-manager/trunk/src/xfpm-settings.c
   xfce4-power-manager/trunk/src/xfpm-settings.h
Log:
Handling permission problems for suspend/hibernate

Modified: xfce4-power-manager/trunk/src/xfpm-ac-adapter.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-ac-adapter.c	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-ac-adapter.c	2008-10-17 06:29:09 UTC (rev 5654)
@@ -158,29 +158,6 @@
     priv->hal = xfpm_hal_new();
     priv->adapter_udi = 0 ;
     
-    GError *error = NULL;
-    
-    priv->can_hibernate = xfpm_hal_get_bool_info(priv->hal,
-                                                 HAL_ROOT_COMPUTER,
-                                                 "power_management.can_hibernate",
-                                                 &error);
-    if ( error )
-    {
-        XFPM_DEBUG("%s: \n",error->message);
-        g_error_free(error);
-        error = NULL;
-    }                                          
-
-    priv->can_suspend = xfpm_hal_get_bool_info(priv->hal,
-                                               HAL_ROOT_COMPUTER,
-                                               "power_management.can_suspend",
-                                               &error);
-    if ( error )
-    {
-        XFPM_DEBUG("%s: \n",error->message);
-        g_error_free(error);
-    }            
-    
     g_signal_connect(adapter,"size-changed",
                     G_CALLBACK(xfpm_ac_adapter_size_changed_cb),NULL);
     g_signal_connect(adapter,"popup-menu",
@@ -495,3 +472,17 @@
         }             
     }
 }   
+
+
+void           
+xfpm_ac_adapter_set_sleep_info (XfpmAcAdapter *adapter,
+                                gboolean can_hibernate,
+                                gboolean can_suspend)
+{
+    g_return_if_fail(XFPM_IS_AC_ADAPTER(adapter));
+    XfpmAcAdapterPrivate *priv;
+    priv = XFPM_AC_ADAPTER_GET_PRIVATE(adapter);
+    
+    priv->can_suspend = can_suspend;
+    priv->can_hibernate = can_hibernate;
+}

Modified: xfce4-power-manager/trunk/src/xfpm-ac-adapter.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-ac-adapter.h	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-ac-adapter.h	2008-10-17 06:29:09 UTC (rev 5654)
@@ -52,9 +52,11 @@
                                      gboolean critical);                               
 } XfpmAcAdapterClass;
 
-GType          xfpm_ac_adapter_get_type(void) G_GNUC_CONST;
-GtkStatusIcon *xfpm_ac_adapter_new     (gboolean visible);
-void           xfpm_ac_adapter_monitor (XfpmAcAdapter *adapter,
-                                        SystemFormFactor factor);
-
+GType          xfpm_ac_adapter_get_type       (void) G_GNUC_CONST;
+GtkStatusIcon *xfpm_ac_adapter_new            (gboolean visible);
+void           xfpm_ac_adapter_monitor        (XfpmAcAdapter *adapter,
+                                               SystemFormFactor factor);
+void           xfpm_ac_adapter_set_sleep_info (XfpmAcAdapter *adapter,
+                                               gboolean can_hibernate,
+                                               gboolean can_suspend);
 #endif

Modified: xfce4-power-manager/trunk/src/xfpm-battery.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery.c	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-battery.c	2008-10-17 06:29:09 UTC (rev 5654)
@@ -124,6 +124,8 @@
 {
     XfpmHal *hal;
     GHashTable *batteries;
+    gboolean can_hibernate;
+    gboolean can_suspend;
 };
                                 
 G_DEFINE_TYPE(XfpmBattery,xfpm_battery,G_TYPE_OBJECT)
@@ -232,33 +234,13 @@
     priv = XFPM_BATTERY_GET_PRIVATE(battery);
     
     priv->batteries = g_hash_table_new(g_str_hash,g_str_equal);
+    priv->can_hibernate = FALSE;
+    priv->can_suspend   = FALSE;
+    
     xfpm_battery_load_config(battery);
     
     priv->hal = xfpm_hal_new();
     
-    GError *error = NULL;
-    
-    battery->can_hibernate = xfpm_hal_get_bool_info(priv->hal,
-                                                    HAL_ROOT_COMPUTER,
-                                                    "power_management.can_hibernate",
-                                                    &error);
-    if ( error )
-    {
-        XFPM_DEBUG("%s: \n",error->message);
-        g_error_free(error);
-        error = NULL;
-    }                                          
-
-    battery->can_suspend = xfpm_hal_get_bool_info(priv->hal,
-                                                  HAL_ROOT_COMPUTER,
-                                                  "power_management.can_suspend",
-                                                  &error);
-    if ( error )
-    {
-        XFPM_DEBUG("%s: \n",error->message);
-        g_error_free(error);
-    }            
-    
     if (xfpm_hal_connect_to_signals(priv->hal,TRUE,TRUE,TRUE,FALSE) )
     {
         g_signal_connect(G_OBJECT(priv->hal),"xfpm-device-added",
@@ -274,7 +256,6 @@
                          battery);                 
         
     }
-    
     g_signal_connect(G_OBJECT(battery),"notify",
                         G_CALLBACK(xfpm_battery_notify_cb),NULL);
 }
@@ -788,6 +769,9 @@
                                              guint activate_time,
                                              XfpmBattery *batt)
 {
+    XfpmBatteryPrivate *priv;
+    priv = XFPM_BATTERY_GET_PRIVATE(batt);
+    
     GtkWidget *menu,*mi,*img;
 	
 	menu = gtk_menu_new();
@@ -796,7 +780,7 @@
 	img = gtk_image_new_from_icon_name("gpm-hibernate",GTK_ICON_SIZE_MENU);
 	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi),img);
 	gtk_widget_set_sensitive(mi,FALSE);
-	if ( batt->can_hibernate )
+	if ( priv->can_hibernate )
 	{
 		gtk_widget_set_sensitive(mi,TRUE);
 		g_signal_connect(mi,"activate",
@@ -812,7 +796,7 @@
 	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi),img);
 	
 	gtk_widget_set_sensitive(mi,FALSE);
-	if ( batt->can_suspend )
+	if ( priv->can_suspend )
     {	
 		gtk_widget_set_sensitive(mi,TRUE);
 		g_signal_connect(mi,"activate",
@@ -1057,7 +1041,7 @@
     g_return_if_fail(XFPM_IS_BATTERY(batt));
     
     XfpmBatteryPrivate *priv;
-    priv = XFPM_BATTERY_GET_PRIVATE(batt);
+    priv = XFPM_BATTERY_GET_PRIVATE(batt);     
     
     GtkStatusIcon *icon = NULL;
     
@@ -1088,3 +1072,17 @@
                        0);
 }                                       
 #endif
+
+void           
+xfpm_battery_set_sleep_info(XfpmBattery *batt,
+                            gboolean can_suspend,
+                            gboolean can_hibernate)
+{
+    g_return_if_fail(XFPM_IS_BATTERY(batt));
+    
+    XfpmBatteryPrivate *priv;
+    priv = XFPM_BATTERY_GET_PRIVATE(batt);                            
+    priv->can_hibernate = can_hibernate;
+    priv->can_suspend   = can_suspend;
+}                                        
+                                            

Modified: xfce4-power-manager/trunk/src/xfpm-battery.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery.h	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-battery.h	2008-10-17 06:29:09 UTC (rev 5654)
@@ -48,9 +48,6 @@
     XfpmActionRequest critical_action;
     XfpmShowIcon show_tray;
     
-    gboolean can_hibernate;
-    gboolean can_suspend;
-
 #ifdef HAVE_LIBNOTIFY
     gboolean notify_enabled;
 #endif        
@@ -79,6 +76,9 @@
                                        const gchar *icon_name,
                                        const gchar *error);     
 #endif
+void           xfpm_battery_set_sleep_info(XfpmBattery *batt,
+                                            gboolean can_suspend,
+                                            gboolean can_hibernate);
 G_END_DECLS
 
 #endif

Modified: xfce4-power-manager/trunk/src/xfpm-button.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-button.c	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-button.c	2008-10-17 06:29:09 UTC (rev 5654)
@@ -99,6 +99,9 @@
     gboolean sleep_button_has_state;
     
     gboolean device_found;
+    
+    gboolean can_suspend;
+    gboolean can_hibernate;
 };
 
 G_DEFINE_TYPE(XfpmButton,xfpm_button,G_TYPE_OBJECT)
@@ -180,6 +183,9 @@
     priv->have_sleep_bt         = FALSE;
     priv->sleep_button_has_state= FALSE;
     
+    priv->can_suspend = FALSE;
+    priv->can_hibernate = FALSE;
+    
     priv->hal = xfpm_hal_new();
     
     xfpm_button_load_config(bt);
@@ -312,13 +318,20 @@
 static void
 _proccess_action(XfpmButton *bt,XfpmActionRequest action)
 {
+    XfpmButtonPrivate *priv;
+    priv = XFPM_BUTTON_GET_PRIVATE(bt);
+    
     if ( action == XFPM_DO_SUSPEND )
     {
-         xfpm_button_do_suspend(bt);
+        if (!priv->can_suspend ) return;
+        
+        xfpm_button_do_suspend(bt);
     }
     else if ( action == XFPM_DO_HIBERNATE )
     {
-         xfpm_button_do_hibernate(bt);
+        if (!priv->can_hibernate ) return;
+        
+        xfpm_button_do_hibernate(bt);
     }
     else if ( action == XFPM_DO_SHUTDOWN )
     {
@@ -649,3 +662,15 @@
     
     return buttons;
 }
+
+void            
+xfpm_button_set_sleep_info (XfpmButton *button,gboolean can_hibernate,
+                            gboolean can_suspend)
+{
+    g_return_if_fail(XFPM_IS_BUTTON(button));
+    XfpmButtonPrivate *priv;
+    priv = XFPM_BUTTON_GET_PRIVATE(button);
+    
+    priv->can_suspend = can_suspend;
+    priv->can_hibernate = can_hibernate;
+}

Modified: xfce4-power-manager/trunk/src/xfpm-button.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-button.h	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-button.h	2008-10-17 06:29:09 UTC (rev 5654)
@@ -56,10 +56,12 @@
     
 } XfpmButtonClass;
 
-GType          xfpm_button_get_type(void) G_GNUC_CONST;
-XfpmButton     *xfpm_button_new(void);
-guint8          xfpm_button_get_available_buttons(XfpmButton *button);
-
+GType           xfpm_button_get_type              (void) G_GNUC_CONST;
+XfpmButton     *xfpm_button_new                   (void);
+guint8          xfpm_button_get_available_buttons (XfpmButton *button);
+void            xfpm_button_set_sleep_info        (XfpmButton *button,
+                                                   gboolean can_hibernate,
+                                                   gboolean can_suspend);
 G_END_DECLS
 
 #endif

Modified: xfce4-power-manager/trunk/src/xfpm-common.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-common.h	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-common.h	2008-10-17 06:29:09 UTC (rev 5654)
@@ -49,6 +49,7 @@
 #define BATT_STATE_NOTIFICATION_CFG "/xfce4-power-manager/battery-state-notification"  /* default TRUE */
 #define GENERAL_NOTIFICATION_CFG    "/xfce4-power-manager/general-notification"        /* default TRUE not yet used */
 #define SHOW_SLEEP_ERRORS_CFG       "/xfce4-power-manager/show-sleep-errors"
+#define SHOW_POWER_MANAGEMENT_ERROR "/xfce4-power-manager/show-power-management-error"
 #endif
 #define SHOW_TRAY_ICON_CFG          "/xfce4-power-manager/show-tray-icon"              /* default 0 = always,1 = when charging or discharging, 2 = when battery is present */
 

Modified: xfce4-power-manager/trunk/src/xfpm-dbus-messages.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-dbus-messages.c	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-dbus-messages.c	2008-10-17 06:29:09 UTC (rev 5654)
@@ -27,7 +27,7 @@
 #include "xfpm-debug.h"
 
 
-static gboolean
+gboolean
 xfpm_dbus_name_has_owner(DBusConnection *connection,const gchar *service)
 {
     DBusError error;

Modified: xfce4-power-manager/trunk/src/xfpm-dbus-messages.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-dbus-messages.h	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-dbus-messages.h	2008-10-17 06:29:09 UTC (rev 5654)
@@ -34,7 +34,8 @@
 
 DBusMessage *xfpm_dbus_new_message(const gchar *service  ,const gchar *remote_object,
                                    const gchar *interface,const gchar *method);
-                                   
+gboolean xfpm_dbus_name_has_owner(DBusConnection *connection,
+                                  const gchar *service);
 gboolean xfpm_dbus_send_message            (const gchar *signal);
 gboolean xfpm_dbus_send_message_with_reply (const gchar *signal,gint *get_reply);
 void     xfpm_dbus_send_nm_message         (const gchar *signal);

Modified: xfce4-power-manager/trunk/src/xfpm-driver.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-driver.c	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-driver.c	2008-10-17 06:29:09 UTC (rev 5654)
@@ -113,6 +113,9 @@
                                               guint action,
                                               gboolean critical,
                                               XfpmDriver *drv);
+static void xfpm_driver_load_config(XfpmDriver *drv);
+static void xfpm_driver_check(XfpmDriver *drv);
+static void xfpm_driver_load_all(XfpmDriver *drv);
 
 /* DBus message Filter and replies */
 static void xfpm_driver_send_reply(DBusConnection *conn,DBusMessage *mess);
@@ -130,8 +133,12 @@
     gboolean dialog_opened;
     
     SystemFormFactor formfactor;
+    gboolean can_use_power_management;
     gboolean can_suspend;
     gboolean can_hibernate;
+#ifdef HAVE_LIBNOTIFY    
+    gboolean show_power_management_error;
+#endif
     
     gboolean accept_sleep_request;
     
@@ -169,10 +176,14 @@
 {
     XfpmDriverPrivate *priv;
     priv = XFPM_DRIVER_GET_PRIVATE(drv);
+    
     priv->dialog_opened = FALSE;
     priv->cpufreq_control = FALSE;
     priv->buttons_control = FALSE;
     priv->lcd_brightness_control = FALSE;
+    priv->can_use_power_management = FALSE;
+    priv->can_hibernate = FALSE;
+    priv->can_suspend = FALSE;
     priv->accept_sleep_request = TRUE;
     priv->loop    = NULL;
     priv->cpu     = NULL;
@@ -548,6 +559,7 @@
                                priv->formfactor == SYSTEM_LAPTOP ? TRUE : FALSE,
                                priv->can_hibernate,
                                priv->can_suspend,
+                               priv->can_use_power_management,
                                with_dpms,
                                gov,
                                switch_buttons,
@@ -691,8 +703,7 @@
     g_timeout_add(100,(GSourceFunc)xfpm_driver_do_shutdown,drv); 
 }
 
-/* Currently the critical variable is ignored */
-
+/* Currently the critical argument is ignored */
 static void
 xfpm_driver_handle_action_request(GObject *object,XfpmActionRequest action,
                                   gboolean critical,XfpmDriver *drv)
@@ -715,22 +726,28 @@
     g_free(content);
     
 #endif    
+    if ( !priv->can_use_power_management )
+    {
+        XFPM_DEBUG("We cannot use power management interface\n");
+        return;
+    }
     if ( !priv->accept_sleep_request )
     {
         XFPM_DEBUG("Ignoring sleep request\n");
         return;
     }
 
-    /* Block any other event here */    
-    
+    /* Block any other event here */   
     priv->accept_sleep_request = FALSE;    
     
     switch ( action )
     {
         case XFPM_DO_SUSPEND:
+            if (!priv->can_suspend) return;
             xfpm_driver_suspend(drv,critical);
             break;
         case XFPM_DO_HIBERNATE:
+            if (!priv->can_hibernate) return;
             xfpm_driver_hibernate(drv,critical);
             break;
         case XFPM_DO_SHUTDOWN:
@@ -739,64 +756,9 @@
         default:
             break;
     } 
-    
 }
 
 static void
-xfpm_driver_send_reply(DBusConnection *conn,DBusMessage *mess)
-{
-    DBusMessage *reply;
-    reply = dbus_message_new_method_return(mess);
-    dbus_connection_send (conn, reply, NULL);
-    dbus_connection_flush (conn);
-    dbus_message_unref(reply);
-    
-}
-
-static DBusHandlerResult xfpm_driver_signal_filter
-    (DBusConnection *connection,DBusMessage *message,void *user_data) 
-{
-    XfpmDriver *drv = XFPM_DRIVER(user_data);
-    XfpmDriverPrivate *priv;
-    priv = XFPM_DRIVER_GET_PRIVATE(drv);
-    
-    if ( dbus_message_is_signal(message,"xfpm.power.manager","Customize" ) )
-    {
-        XFPM_DEBUG("message customize received\n");
-        /* don't block the signal filter so show the configuration dialog in a
-         * timeout function otherwise xfce4-power-manager -q will have no effect*/
-        g_timeout_add(100,(GSourceFunc)xfpm_driver_show_options_dialog,drv);
-        return DBUS_HANDLER_RESULT_HANDLED;
-    }    
-    
-    if ( dbus_message_is_signal(message,"xfpm.power.manager","Quit" ) )
-    {
-        XFPM_DEBUG("message quit received\n");
-        xfpm_driver_send_reply(connection,message);      
-        g_main_loop_quit(priv->loop);
-        g_object_unref(drv);
-        return DBUS_HANDLER_RESULT_HANDLED;
-    }    
-    
-    if ( dbus_message_is_signal(message,"xfpm.power.manager","Running" ) )
-    {
-        XFPM_DEBUG("message running received\n");
-        xfpm_driver_send_reply(connection,message);
-        return DBUS_HANDLER_RESULT_HANDLED;
-    }    
-    
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-XfpmDriver *
-xfpm_driver_new(void)
-{
-    XfpmDriver *driver = NULL;
-    driver =  g_object_new(XFPM_TYPE_DRIVER,NULL);
-    return driver;
-}
-
-static void
 _show_adapter_icon(XfpmBattery *batt,gboolean show,XfpmDriver *drv)
 {
     XFPM_DEBUG("start\n");
@@ -835,43 +797,110 @@
         priv->formfactor = SYSTEM_UNKNOWN;
     }
     libhal_free_string(factor);
-    
 }
 
-gboolean
-xfpm_driver_monitor (XfpmDriver *drv)
+static void
+xfpm_driver_load_config(XfpmDriver *drv)    
 {
-    g_return_val_if_fail (XFPM_IS_DRIVER(drv),FALSE);
-    XFPM_DEBUG("starting xfpm manager\n");
     XfpmDriverPrivate *priv;
     priv = XFPM_DRIVER_GET_PRIVATE(drv);
     
-    priv->loop = g_main_loop_new(NULL,FALSE);
+    XFPM_DEBUG("Loading configuration\n");
     
-    DBusError error;
+    GError *g_error = NULL;
+    if ( !xfconf_init(&g_error) )
+    {
+        g_critical("xfconf init failed: %s\n",g_error->message);
+        XFPM_DEBUG("Using default values\n");
+        g_error_free(g_error);
+#ifdef HAVE_LIBNOTIFY        
+        priv->show_power_management_error = TRUE;
+#endif        
+        return;
+    }
+    XfconfChannel *channel;
+    
+    channel = xfconf_channel_new(XFPM_CHANNEL_CFG);
+#ifdef HAVE_LIBNOTIFY
+    priv->show_power_management_error
+     = xfconf_channel_get_bool(channel,SHOW_POWER_MANAGEMENT_ERROR,TRUE);
+#endif
+    
+    g_object_unref(channel);
+    xfconf_shutdown();    
+    
+}
 
-    dbus_error_init(&error);
-    priv->conn = dbus_bus_get(DBUS_BUS_SESSION,&error);
-    if (!priv->conn) 
+#ifdef HAVE_LIBNOTIFY
+static void
+_disable_error(NotifyNotification *n,gchar *action,XfpmDriver *drv)
+{
+    if (strcmp(action,"ok")) return;
+    
+    GError *g_error = NULL;
+    if ( !xfconf_init(&g_error) )
     {
-       g_critical("Failed to connect to the DBus daemon: %s\n",error.message);
-       dbus_error_free(&error);
-       return FALSE;
+        g_critical("xfconf init failed: %s\n",g_error->message);
+        g_error_free(g_error);
+        return;
     }
-        
-    dbus_connection_setup_with_g_main(priv->conn,NULL);
-    dbus_bus_add_match(priv->conn, "type='signal',interface='xfpm.power.manager'",NULL);
-    dbus_connection_add_filter(priv->conn,xfpm_driver_signal_filter,drv,NULL);
+    XfconfChannel *channel;
     
-    priv->hal = xfpm_hal_new();
-    _get_system_form_factor(priv);
+    channel = xfconf_channel_new(XFPM_CHANNEL_CFG);
+    xfconf_channel_set_bool(channel,SHOW_POWER_MANAGEMENT_ERROR,FALSE);
     
+    g_object_unref(channel);
+    xfconf_shutdown();    
+    
+}
+#endif
+
+#ifdef HAVE_LIBNOTIFY
+static gboolean
+_show_power_management_error_message(XfpmDriver *drv)
+{
+     const gchar *error =
+                 _("Unable to use power management service, functionalities like hibernate and shutdown will not work "\
+                  "Possible reasons: you don't have permission or  "\
+                  "broken connection with the hardware abstract layer or the message bus daemon is not running");
+                             
+     xfpm_notify_with_action(_("Xfce power manager"),
+                            error,
+                            14000,
+                            NOTIFY_URGENCY_CRITICAL,
+                            NULL,
+                            "gpm-ac-adapter",
+                            _("Don't show this message again"),
+                            0,
+                            (NotifyActionCallback)_disable_error,
+                            drv);    
+     return FALSE;                       
+}
+#endif
+
+static void
+xfpm_driver_check(XfpmDriver *drv)
+{
+    XfpmDriverPrivate *priv;
+    priv = XFPM_DRIVER_GET_PRIVATE(drv);
+    
     GError *g_error = NULL;
+    
+    priv->can_use_power_management = xfpm_hal_power_management_can_be_used(priv->hal);
+    if ( !priv->can_use_power_management )
+    {
+#ifdef HAVE_LIBNOTIFY
+    g_timeout_add_seconds(8,(GSourceFunc)_show_power_management_error_message,drv);
+#endif                                       
+        XFPM_DEBUG("Unable to use HAL power management services\n");
+        /*We do return here, so can_suspend and can_hibernate stay FALSE*/
+        return;
+    }
+        
     priv->can_suspend = xfpm_hal_get_bool_info(priv->hal,
                                                HAL_ROOT_COMPUTER,
                                                "power_management.can_suspend",
                                                &g_error);
-                                               
     if ( g_error )
     {
         XFPM_DEBUG("%s: \n",g_error->message);
@@ -880,17 +909,25 @@
     }            
     
     priv->can_hibernate = xfpm_hal_get_bool_info(priv->hal,
-                                               HAL_ROOT_COMPUTER,
-                                               "power_management.can_hibernate",
-                                               &g_error);
-                                               
+                                                 HAL_ROOT_COMPUTER,
+                                                 "power_management.can_hibernate",
+                                                 &g_error);
     if ( g_error )
     {
         XFPM_DEBUG("%s: \n",g_error->message);
         g_error_free(g_error);
         g_error = NULL;
     }            
+}
+
+static void
+xfpm_driver_load_all(XfpmDriver *drv)
+{
+    XfpmDriverPrivate *priv;
+    priv = XFPM_DRIVER_GET_PRIVATE(drv);
     
+    GError *g_error = NULL;
+    
 #ifdef HAVE_DPMS    
     priv->dpms = xfpm_dpms_new();
 #endif  
@@ -931,6 +968,7 @@
     else
     {
         priv->buttons_control = TRUE;
+        xfpm_button_set_sleep_info(priv->bt,priv->can_hibernate,priv->can_suspend);
         g_signal_connect(priv->bt,"xfpm-action-request",
                         G_CALLBACK(xfpm_driver_handle_action_request),drv);
     }
@@ -943,12 +981,17 @@
         g_object_unref(priv->lcd);
     }
     
-    priv->batt = xfpm_battery_new();
-    g_signal_connect(priv->batt,"xfpm-show-adapter-icon",G_CALLBACK(_show_adapter_icon),drv);
+    /*We call the battery object to start monitoring after loading the Ac adapter*/
+    priv->batt = xfpm_battery_new(); 
+    xfpm_battery_set_sleep_info(priv->batt,priv->can_hibernate,priv->can_suspend); 
     g_signal_connect(priv->batt,"xfpm-action-request",
                         G_CALLBACK(xfpm_driver_handle_action_request),drv);
+    g_signal_connect(priv->batt,"xfpm-show-adapter-icon",G_CALLBACK(_show_adapter_icon),drv);
                         
     priv->adapter = xfpm_ac_adapter_new(FALSE);
+    xfpm_ac_adapter_set_sleep_info(XFPM_AC_ADAPTER(priv->adapter),
+                                    priv->can_hibernate,priv->can_suspend);
+    
     g_signal_connect(priv->adapter,"xfpm-ac-adapter-changed",
                     G_CALLBACK(xfpm_driver_ac_adapter_state_changed_cb),drv);
     g_signal_connect(priv->adapter,"xfpm-action-request",
@@ -959,8 +1002,104 @@
      * status for dpms and cpu lcd,...
      */                    
     xfpm_ac_adapter_monitor(XFPM_AC_ADAPTER(priv->adapter),priv->formfactor);
+
+    xfpm_battery_monitor(priv->batt);
+}
+
+static void
+xfpm_driver_send_reply(DBusConnection *conn,DBusMessage *mess)
+{
+    DBusMessage *reply;
+    reply = dbus_message_new_method_return(mess);
+    dbus_connection_send (conn, reply, NULL);
+    dbus_connection_flush (conn);
+    dbus_message_unref(reply);
+}
+
+static DBusHandlerResult xfpm_driver_signal_filter
+    (DBusConnection *connection,DBusMessage *message,void *user_data) 
+{
+    XfpmDriver *drv = XFPM_DRIVER(user_data);
+    XfpmDriverPrivate *priv;
+    priv = XFPM_DRIVER_GET_PRIVATE(drv);
     
-    xfpm_battery_monitor(priv->batt);
+    if ( dbus_message_is_signal(message,"xfpm.power.manager","Customize" ) )
+    {
+        XFPM_DEBUG("message customize received\n");
+        /* don't block the signal filter so show the configuration dialog in a
+         * timeout function otherwise xfce4-power-manager -q will have no effect*/
+        g_timeout_add(100,(GSourceFunc)xfpm_driver_show_options_dialog,drv);
+        return DBUS_HANDLER_RESULT_HANDLED;
+    }    
+    
+    if ( dbus_message_is_signal(message,"xfpm.power.manager","Quit" ) )
+    {
+        XFPM_DEBUG("message quit received\n");
+        xfpm_driver_send_reply(connection,message);      
+        g_main_loop_quit(priv->loop);
+        g_object_unref(drv);
+        return DBUS_HANDLER_RESULT_HANDLED;
+    }    
+    
+    if ( dbus_message_is_signal(message,"xfpm.power.manager","Running" ) )
+    {
+        XFPM_DEBUG("message running received\n");
+        xfpm_driver_send_reply(connection,message);
+        return DBUS_HANDLER_RESULT_HANDLED;
+    }    
+    
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+XfpmDriver *
+xfpm_driver_new(void)
+{
+    XfpmDriver *driver = NULL;
+    driver =  g_object_new(XFPM_TYPE_DRIVER,NULL);
+    return driver;
+}
+
+gboolean
+xfpm_driver_monitor (XfpmDriver *drv)
+{
+    g_return_val_if_fail (XFPM_IS_DRIVER(drv),FALSE);
+    XFPM_DEBUG("starting xfpm manager\n");
+    
+    XfpmDriverPrivate *priv;
+    priv = XFPM_DRIVER_GET_PRIVATE(drv);
+    
+    priv->loop = g_main_loop_new(NULL,FALSE);
+    
+    DBusError error;
+
+    dbus_error_init(&error);
+   
+    priv->conn = dbus_bus_get(DBUS_BUS_SESSION,&error);
+   
+    if (!priv->conn) 
+    {
+       g_critical("Failed to connect to the DBus daemon: %s\n",error.message);
+       dbus_error_free(&error);
+       return FALSE;
+    }
+        
+    dbus_connection_setup_with_g_main(priv->conn,NULL);
+    dbus_bus_add_match(priv->conn, "type='signal',interface='xfpm.power.manager'",NULL);
+    dbus_connection_add_filter(priv->conn,xfpm_driver_signal_filter,drv,NULL);
+    
+    priv->hal = xfpm_hal_new();
+    if ( !xfpm_hal_is_connected(priv->hal) )  
+    {
+        return FALSE;
+    }
+
+    xfpm_driver_load_config(drv);    
+    _get_system_form_factor(priv);
+    
+    xfpm_driver_check(drv);
+
+    xfpm_driver_load_all(drv);
+    
     g_main_loop_run(priv->loop);
     
     dbus_connection_remove_filter(priv->conn,xfpm_driver_signal_filter,NULL);

Modified: xfce4-power-manager/trunk/src/xfpm-hal.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-hal.c	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-hal.c	2008-10-17 06:29:09 UTC (rev 5654)
@@ -143,7 +143,6 @@
     {
         g_printerr("Error monitoring HAL events\n");
         priv->connected = FALSE;
-        
     } 
     else
     {
@@ -217,23 +216,30 @@
                                                      
 }
 
+
 static gboolean 
 xfpm_hal_monitor(XfpmHal *xfpm_hal) {
     
     XfpmHalPrivate *priv = XFPM_HAL_GET_PRIVATE(xfpm_hal);
-    
+
     DBusError error;
-    
     dbus_error_init(&error);
     
-    priv->ctx = libhal_ctx_new();
+    priv->connection = dbus_bus_get(DBUS_BUS_SYSTEM,&error);
     
-    priv->connection = dbus_bus_get(DBUS_BUS_SYSTEM,&error);
-    if ( dbus_error_is_set(&error) ) {
+    if ( !priv->connection || dbus_error_is_set(&error) )
+    {
         g_printerr("Unable to connect to DBus %s\n",error.message);
         return FALSE;
-    }    
+    }
     
+    if ( !xfpm_dbus_name_has_owner(priv->connection,HAL_DBUS_SERVICE) )
+    {
+        g_printerr("HAL is not running or not responding\n");
+        return FALSE;
+    }
+    priv->ctx = libhal_ctx_new();
+    
     dbus_connection_setup_with_g_main(priv->connection,NULL);
     
     libhal_ctx_set_dbus_connection(priv->ctx,priv->connection);
@@ -248,6 +254,57 @@
     return TRUE;
 }    
 
+gboolean xfpm_hal_is_connected(XfpmHal *hal)
+{
+    g_return_val_if_fail(XFPM_IS_HAL(hal),FALSE);
+    XfpmHalPrivate *priv;
+    priv = XFPM_HAL_GET_PRIVATE(hal);
+    
+    return (priv->connected);
+}
+    
+gboolean xfpm_hal_power_management_can_be_used(XfpmHal *hal)
+{
+    g_return_val_if_fail(XFPM_IS_HAL(hal),FALSE);
+    XfpmHalPrivate *priv;
+    priv = XFPM_HAL_GET_PRIVATE(hal);
+    
+    g_return_val_if_fail(priv->connected == TRUE,FALSE);
+    
+    DBusMessage *message;
+    DBusMessage *reply;
+    DBusError error;
+    
+    message = dbus_message_new_method_call(HAL_DBUS_SERVICE,
+                                           HAL_ROOT_COMPUTER,
+                                           HAL_DBUS_INTERFACE_POWER,
+                                           "JustToCheck");
+
+    if (!message)
+    {
+        return FALSE;
+    }
+                                           
+    dbus_error_init(&error);                                       
+                                           
+    reply = dbus_connection_send_with_reply_and_block(priv->connection,message,-1,&error);
+    dbus_message_unref(message);
+    
+    if ( reply ) dbus_message_unref(reply);
+    
+    if ( dbus_error_is_set(&error) )
+    {
+        /* This is the only one place in the program we will 
+         * be happy when we seeDBusError is set */
+        if (!strcmp(error.name,"org.freedesktop.DBus.Error.UnknownMethod"))
+        {
+            dbus_error_free(&error);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
 gboolean xfpm_hal_connect_to_signals(XfpmHal *hal,
                                     gboolean device_removed,
                                     gboolean device_added,

Modified: xfce4-power-manager/trunk/src/xfpm-hal.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-hal.h	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-hal.h	2008-10-17 06:29:09 UTC (rev 5654)
@@ -78,6 +78,8 @@
 
 GType                xfpm_hal_get_type                     (void);
 XfpmHal             *xfpm_hal_new                          (void);
+gboolean             xfpm_hal_is_connected                 (XfpmHal *hal);
+gboolean             xfpm_hal_power_management_can_be_used (XfpmHal *hal);
 gboolean             xfpm_hal_connect_to_signals           (XfpmHal *hal,
                                                             gboolean device_removed,
                                                             gboolean device_added,

Modified: xfce4-power-manager/trunk/src/xfpm-settings.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-settings.c	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-settings.c	2008-10-17 06:29:09 UTC (rev 5654)
@@ -374,9 +374,40 @@
 }
 /// End of Callback Setting Functions ///
 
+static XfpmActionRequest
+_combo_helper_function(XfconfChannel *channel,const gchar *config,
+                       gboolean can_suspend,gboolean can_hibernate,
+                       gboolean can_use_power_management,XfpmActionRequest action)
+{
+    if( !can_use_power_management && action != XFPM_DO_NOTHING ) 
+    {
+        xfconf_channel_set_uint(channel,config,XFPM_DO_NOTHING);
+        return XFPM_DO_NOTHING;
+    }
+    
+    if( !can_suspend && action == XFPM_DO_SUSPEND ) 
+    {
+        xfconf_channel_set_uint(channel,config,XFPM_DO_NOTHING);
+        return XFPM_DO_NOTHING;
+    }
+    
+    if( !can_hibernate && action == XFPM_DO_HIBERNATE )  
+    {
+        xfconf_channel_set_uint(channel,config,XFPM_DO_NOTHING);
+        return XFPM_DO_NOTHING;
+    }
+    
+    if ( action < XFPM_DO_NOTHING || action > XFPM_DO_SHUTDOWN )
+    {
+        xfconf_channel_set_uint(channel,config,XFPM_DO_NOTHING);
+        return XFPM_DO_NOTHING;
+    }
+    return action;
+}
+
 /// Settings frames ///
 static GtkWidget *
-xfpm_settings_battery(XfconfChannel *channel, gboolean can_hibernate)
+xfpm_settings_battery(XfconfChannel *channel, gboolean can_hibernate,gboolean can_power)
 {
     GtkWidget *table;
     GtkWidget *frame,*align;
@@ -409,15 +440,19 @@
     
     action = gtk_combo_box_new_text();
     gtk_combo_box_append_text(GTK_COMBO_BOX(action),_("Nothing"));
-    gtk_combo_box_append_text(GTK_COMBO_BOX(action),_("Shutdown"));
-    /* FIXME */
+    if ( can_power )
+    {
+        gtk_combo_box_append_text(GTK_COMBO_BOX(action),_("Shutdown"));
+    }
     if ( can_hibernate )
     {
         gtk_combo_box_append_text(GTK_COMBO_BOX(action),_("Hibernate"));
     }                           
-                               
-    gtk_combo_box_set_active(GTK_COMBO_BOX(action),
-                            xfconf_channel_get_uint(channel,CRITICAL_BATT_ACTION_CFG,0));
+    guint active = xfconf_channel_get_uint(channel,CRITICAL_BATT_ACTION_CFG,XFPM_DO_NOTHING);
+    active = _combo_helper_function(channel,CRITICAL_BATT_ACTION_CFG,FALSE,
+                                    can_hibernate,can_power,active);
+    gtk_combo_box_set_active(GTK_COMBO_BOX(action),active);
+    
     gtk_widget_show(action);
     g_signal_connect(action,"changed",G_CALLBACK(set_critical_action_cb),channel);
     gtk_table_attach(GTK_TABLE(table),action,1,2,1,2,GTK_SHRINK,GTK_SHRINK,0,0);
@@ -818,7 +853,7 @@
 
 
 static GtkWidget *
-xfpm_settings_keys(XfconfChannel *channel,gboolean can_hibernate,
+xfpm_settings_keys(XfconfChannel *channel,gboolean can_power,gboolean can_hibernate,
                    gboolean can_suspend,gboolean laptop,guint8 switch_buttons)
 {
     GtkWidget *table;
@@ -833,7 +868,7 @@
     table = gtk_table_new(3,2,TRUE);
     gtk_widget_show(table);
     
-    guint default_config;
+    guint active;
     /// Power Button
     if (  switch_buttons & POWER_SWITCH )
     {
@@ -841,15 +876,20 @@
         gtk_widget_show(label);
         gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
         GtkWidget *power_button;
-        default_config = xfconf_channel_get_uint(channel,POWER_SWITCH_CFG,0);
         power_button = gtk_combo_box_new_text();
         gtk_combo_box_append_text(GTK_COMBO_BOX(power_button),_("Nothing"));
         if ( can_suspend ) 
             gtk_combo_box_append_text(GTK_COMBO_BOX(power_button),_("Suspend"));
-         if ( can_hibernate )
+        if ( can_hibernate )
             gtk_combo_box_append_text(GTK_COMBO_BOX(power_button),_("Hibernate"));
-        gtk_combo_box_append_text(GTK_COMBO_BOX(power_button),_("Shutdown"));        
-        gtk_combo_box_set_active(GTK_COMBO_BOX(power_button),default_config);
+        if ( can_power)    
+            gtk_combo_box_append_text(GTK_COMBO_BOX(power_button),_("Shutdown"));        
+         
+        active = xfconf_channel_get_uint(channel,POWER_SWITCH_CFG,0);
+        active = _combo_helper_function(channel,POWER_SWITCH_CFG,can_suspend,
+                                    can_hibernate,can_power,active);    
+                                    
+        gtk_combo_box_set_active(GTK_COMBO_BOX(power_button),active);
         gtk_table_attach(GTK_TABLE(table),power_button,1,2,0,1,GTK_SHRINK,GTK_SHRINK,0,0);
         g_signal_connect(power_button,"changed",G_CALLBACK(set_power_button_action_cb),channel);
        
@@ -864,7 +904,7 @@
         gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
         
         GtkWidget *sleep_button;
-        default_config = xfconf_channel_get_uint(channel,SLEEP_SWITCH_CFG,0);
+        active = xfconf_channel_get_uint(channel,SLEEP_SWITCH_CFG,0);
         sleep_button = gtk_combo_box_new_text();
         
         gtk_combo_box_append_text(GTK_COMBO_BOX(sleep_button),_("Nothing"));
@@ -872,8 +912,11 @@
             gtk_combo_box_append_text(GTK_COMBO_BOX(sleep_button),_("Suspend"));
         if ( can_hibernate )
             gtk_combo_box_append_text(GTK_COMBO_BOX(sleep_button),_("Hibernate"));
-        gtk_combo_box_append_text(GTK_COMBO_BOX(sleep_button),_("Shutdown"));    
-        gtk_combo_box_set_active(GTK_COMBO_BOX(sleep_button),default_config);
+        if ( can_power )
+            gtk_combo_box_append_text(GTK_COMBO_BOX(sleep_button),_("Shutdown"));    
+        active = _combo_helper_function(channel,POWER_SWITCH_CFG,can_suspend,
+                                    can_hibernate,can_power,active);   
+        gtk_combo_box_set_active(GTK_COMBO_BOX(sleep_button),active);
         gtk_widget_show(sleep_button);
         gtk_table_attach(GTK_TABLE(table),sleep_button,1,2,1,2,GTK_SHRINK,GTK_SHRINK,0,0);
         g_signal_connect(sleep_button,"changed",G_CALLBACK(set_sleep_button_action_cb),channel);
@@ -886,15 +929,18 @@
         gtk_widget_show(label);
         gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,3);
         GtkWidget *lid_button;
-        default_config = xfconf_channel_get_uint(channel,LID_SWITCH_CFG,0);
+        active = xfconf_channel_get_uint(channel,LID_SWITCH_CFG,0);
         lid_button = gtk_combo_box_new_text();
         gtk_combo_box_append_text(GTK_COMBO_BOX(lid_button),_("Nothing"));
         if ( can_suspend ) 
             gtk_combo_box_append_text(GTK_COMBO_BOX(lid_button),_("Suspend"));
         if ( can_hibernate )
             gtk_combo_box_append_text(GTK_COMBO_BOX(lid_button),_("Hibernate"));
-        gtk_combo_box_append_text(GTK_COMBO_BOX(lid_button),_("Shutdown"));    
-        gtk_combo_box_set_active(GTK_COMBO_BOX(lid_button),default_config);
+        if ( can_power )    
+            gtk_combo_box_append_text(GTK_COMBO_BOX(lid_button),_("Shutdown"));    
+        active = _combo_helper_function(channel,POWER_SWITCH_CFG,can_suspend,
+                                    can_hibernate,can_power,active);       
+        gtk_combo_box_set_active(GTK_COMBO_BOX(lid_button),active);
         gtk_widget_show(lid_button);
         gtk_table_attach(GTK_TABLE(table),lid_button,1,2,2,3,GTK_SHRINK,GTK_SHRINK,0,0);
         g_signal_connect(lid_button,"changed",G_CALLBACK(set_lid_button_action_cb),channel);
@@ -1110,6 +1156,7 @@
 GtkWidget *
 xfpm_settings_new(XfconfChannel *channel,gboolean is_laptop,
                   gboolean can_hibernate,gboolean can_suspend,
+                  gboolean can_power,
                   gboolean dpms_capable,guint8 govs,
                   guint8 switch_buttons,gboolean lcd)
 {
@@ -1154,11 +1201,11 @@
     gtk_notebook_append_page(GTK_NOTEBOOK(nt),box,NULL);
 
     /// Battery settings
-    box = xfpm_settings_battery(channel,can_hibernate);
+    box = xfpm_settings_battery(channel,can_hibernate,can_power);
     gtk_notebook_append_page(GTK_NOTEBOOK(nt),box,NULL);
 
     /// Keyboard buttons settings
-    box = xfpm_settings_keys(channel,can_hibernate,can_suspend,is_laptop,switch_buttons);
+    box = xfpm_settings_keys(channel,can_power,can_hibernate,can_suspend,is_laptop,switch_buttons);
     gtk_notebook_append_page(GTK_NOTEBOOK(nt),box,NULL); 
     
     /// Dpms settings && LCD brightness settings DPMS existence is checked above

Modified: xfce4-power-manager/trunk/src/xfpm-settings.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-settings.h	2008-10-16 23:03:00 UTC (rev 5653)
+++ xfce4-power-manager/trunk/src/xfpm-settings.h	2008-10-17 06:29:09 UTC (rev 5654)
@@ -24,6 +24,7 @@
 
 GtkWidget *xfpm_settings_new(XfconfChannel *channel,gboolean is_laptop,
                              gboolean can_hibernate,gboolean can_suspend,
+                             gboolean can_power,
                              gboolean dpms_capable,guint8 govs,
                              guint8 switch_buttons,gboolean lcd);
 




More information about the Goodies-commits mailing list