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

Ali Abdallah aliov at xfce.org
Wed Oct 15 15:51:11 CEST 2008


Author: aliov
Date: 2008-10-15 13:51:10 +0000 (Wed, 15 Oct 2008)
New Revision: 5632

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-icon.c
   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-driver.c
   xfce4-power-manager/trunk/src/xfpm-enums.h
   xfce4-power-manager/trunk/src/xfpm-hal.c
   xfce4-power-manager/trunk/src/xfpm-marshal.list
Log:
Filter Dbus errors,optimization,synchronize suspend/hibernate

Modified: xfce4-power-manager/trunk/src/xfpm-ac-adapter.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-ac-adapter.c	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-ac-adapter.c	2008-10-15 13:51:10 UTC (rev 5632)
@@ -54,6 +54,9 @@
 #include "xfpm-hal.h"
 #include "xfpm-driver.h"
 #include "xfpm-ac-adapter.h"
+#include "xfpm-marshal.h"
+#include "xfpm-enums.h"
+#include "xfpm-enum-types.h"
 #include "xfpm-notify.h"
 #include "xfpm-debug.h"
 
@@ -83,7 +86,10 @@
                                                 gboolean is_removed,
                                                 gboolean is_added,
                                                 XfpmAcAdapter *adapter);
-                                                
+static void xfpm_ac_adapter_hibernate_callback(GtkWidget *widget,
+                                               XfpmAcAdapter *adapter);
+static void xfpm_ac_adapter_suspend_callback(GtkWidget *widget,
+                                             XfpmAcAdapter *adapter);  
 static void xfpm_ac_adapter_popup_menu(GtkStatusIcon *tray_icon,
                                        guint button,
                                        guint activate_time,
@@ -106,6 +112,7 @@
 enum 
 {
     XFPM_AC_ADAPTER_CHANGED,
+    XFPM_ACTION_REQUEST,
     LAST_SIGNAL
 };
 
@@ -128,6 +135,15 @@
                                                    g_cclosure_marshal_VOID__BOOLEAN,
                                                    G_TYPE_NONE,1,G_TYPE_BOOLEAN);
     
+    signals[XFPM_ACTION_REQUEST] = g_signal_new("xfpm-action-request",
+                                               XFPM_TYPE_AC_ADAPTER,
+                                               G_SIGNAL_RUN_LAST,
+                                               G_STRUCT_OFFSET(XfpmAcAdapterClass,adapter_action_request),
+                                               NULL,NULL,
+                                               _xfpm_marshal_VOID__ENUM_BOOLEAN ,
+                                               G_TYPE_NONE,2,
+                                               XFPM_TYPE_ACTION_REQUEST,G_TYPE_BOOLEAN);
+                                               
     g_type_class_add_private(klass,sizeof(XfpmAcAdapterPrivate));
     
 }
@@ -187,6 +203,11 @@
 static gboolean
 xfpm_ac_adapter_size_changed_cb(GtkStatusIcon *adapter,gint size,gpointer data)
 {
+    if ( size > 128 )
+    {
+        size = 48;
+    }
+
     GdkPixbuf *icon;
     icon = xfpm_load_icon("gpm-ac-adapter",size);
     
@@ -205,7 +226,7 @@
     XfpmAcAdapterPrivate *priv;
     priv = XFPM_AC_ADAPTER_GET_PRIVATE(adapter);
     
-    /* then the ac kernel module is not loaded */
+    /* then most probably the ac kernel module is not loaded */
     if ( priv->factor == SYSTEM_LAPTOP )
     {
         priv->present = TRUE; /* assuming present */
@@ -359,41 +380,6 @@
 }
 
 static void
-xfpm_ac_adapter_report_sleep_errors(XfpmAcAdapter *adapter,const gchar *error,
-                                    const gchar *icon_name)
-{
-#ifdef HAVE_LIBNOTIFY
-    xfpm_notify_simple("Xfce power manager",
-                       error,
-                       14000,
-                       NOTIFY_URGENCY_CRITICAL,
-                       GTK_STATUS_ICON(adapter),
-                       icon_name,
-                       0);
-#endif
-}
-
-static gboolean
-xfpm_ac_adapter_do_hibernate(XfpmAcAdapter *adapter)
-{
-    XfpmAcAdapterPrivate *priv;
-    priv = XFPM_AC_ADAPTER_GET_PRIVATE(adapter);
-    
-    GError *error = NULL;
-    guint8 critical;
-    gboolean ret =
-    xfpm_hal_hibernate(priv->hal,&error,&critical);
-     
-    if ( !ret && critical == 1) {
-        xfpm_ac_adapter_report_sleep_errors(adapter,error->message,"gpm-hibernate");
-        g_error_free(error);
-    }
-    
-    return FALSE;
-    
-}
-
-static void
 xfpm_ac_adapter_hibernate_callback(GtkWidget *widget,XfpmAcAdapter *adapter)
 {
     gboolean ret = 
@@ -403,31 +389,10 @@
     
     if ( ret ) 
     {
-        xfpm_lock_screen();
-        g_timeout_add_seconds(4,(GSourceFunc)xfpm_ac_adapter_do_hibernate,adapter);
+        g_signal_emit(G_OBJECT(adapter),signals[XFPM_ACTION_REQUEST],0,XFPM_DO_HIBERNATE,FALSE);
 	}
 }
 
-static gboolean
-xfpm_ac_adapter_do_suspend(XfpmAcAdapter *adapter)
-{
-    XfpmAcAdapterPrivate *priv;
-    priv = XFPM_AC_ADAPTER_GET_PRIVATE(adapter);
-    
-    GError *error = NULL;
-    guint8 critical = 0;
-    gboolean ret =
-    xfpm_hal_suspend(priv->hal,&error,&critical);
-    
-    if ( !ret && critical == 1 ) 
-    {
-        xfpm_ac_adapter_report_sleep_errors(adapter,error->message,"gpm-suspend");
-        g_error_free(error);
-    }
-    
-    return FALSE;
-}
-
 static void
 xfpm_ac_adapter_suspend_callback(GtkWidget *widget,XfpmAcAdapter *adapter)
 {
@@ -438,8 +403,7 @@
     
     if ( ret ) 
     {
-        xfpm_lock_screen();
-        g_timeout_add_seconds(3,(GSourceFunc)xfpm_ac_adapter_do_suspend,adapter);
+        g_signal_emit(G_OBJECT(adapter),signals[XFPM_ACTION_REQUEST],0,XFPM_DO_SUSPEND,FALSE);
     }
 }
 

Modified: xfce4-power-manager/trunk/src/xfpm-ac-adapter.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-ac-adapter.h	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-ac-adapter.h	2008-10-15 13:51:10 UTC (rev 5632)
@@ -27,6 +27,7 @@
 
 #define XFPM_TYPE_AC_ADAPTER    (xfpm_ac_adapter_get_type())
 #define XFPM_AC_ADAPTER(o)      (G_TYPE_CHECK_INSTANCE_CAST(o,XFPM_TYPE_AC_ADAPTER,XfpmAcAdapter))
+#define XFPM_IS_AC_ADAPTER(o)   (G_TYPE_CHECK_INSTANCE_TYPE(o,XFPM_TYPE_AC_ADAPTER))
 
 typedef struct XfpmAcAdapterPrivate XfpmAcAdapterPrivate;
 
@@ -44,6 +45,9 @@
     /* signals */
     void   (*ac_adapter_changed)  (XfpmAcAdapter *xfpm_adapter,
                                    gboolean  present);
+    void  (*adapter_action_request) (XfpmAcAdapter *adapter,
+                                     XfpmActionRequest action,
+                                     gboolean critical);                               
 } XfpmAcAdapterClass;
 
 GType          xfpm_ac_adapter_get_type(void) G_GNUC_CONST;

Modified: xfce4-power-manager/trunk/src/xfpm-battery-icon.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery-icon.c	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-battery-icon.c	2008-10-15 13:51:10 UTC (rev 5632)
@@ -237,6 +237,11 @@
 xfpm_battery_icon_size_change_cb(XfpmBatteryIcon *battery_icon,gint size,gpointer data)
 {
     XFPM_DEBUG("size change event %d\n",size);
+    if ( size > 128 )
+    {
+        /* Reduce the size until we get the correct size of the system tray */
+        size = 48;
+    }
     
     gchar *icon_name;
     g_object_get(G_OBJECT(battery_icon),"icon-name",&icon_name,NULL);

Modified: xfce4-power-manager/trunk/src/xfpm-battery.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery.c	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-battery.c	2008-10-15 13:51:10 UTC (rev 5632)
@@ -55,6 +55,7 @@
 #include "xfpm-common.h"
 #include "xfpm-enum-types.h"
 #include "xfpm-notify.h"
+#include "xfpm-marshal.h"
 
 #define XFPM_BATTERY_GET_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE(o,XFPM_TYPE_BATTERY,XfpmBatteryPrivate))
 
@@ -108,11 +109,8 @@
 static gboolean xfpm_battery_check(XfpmBattery *batt,
                                     const gchar *udi);
 
-static gboolean xfpm_battery_do_hibernate(XfpmBattery *batt);
 static void xfpm_battery_hibernate_callback(GtkWidget *widget,
                                             XfpmBattery *batt);
-static gboolean xfpm_battery_do_suspend(XfpmBattery *batt);
-
 static void xfpm_battery_suspend_callback(GtkWidget *widget,
                                           XfpmBattery *batt);
 static void xfpm_battery_popup_tray_icon_menu(GtkStatusIcon *tray_icon,
@@ -135,6 +133,7 @@
 enum 
 {
     XFPM_SHOW_ADAPTER_ICON,
+    XFPM_ACTION_REQUEST,
     LAST_SIGNAL
 };
 
@@ -170,7 +169,16 @@
                                                    NULL,NULL,
                                                    g_cclosure_marshal_VOID__BOOLEAN,
                                                    G_TYPE_NONE,1,G_TYPE_BOOLEAN);
-    
+                                                   
+    signals[XFPM_ACTION_REQUEST] = g_signal_new("xfpm-action-request",
+                                               XFPM_TYPE_BATTERY,
+                                               G_SIGNAL_RUN_LAST,
+                                               G_STRUCT_OFFSET(XfpmBatteryClass,battery_action_request),
+                                               NULL,NULL,
+                                               _xfpm_marshal_VOID__ENUM_BOOLEAN ,
+                                               G_TYPE_NONE,2,
+                                               XFPM_TYPE_ACTION_REQUEST,G_TYPE_BOOLEAN);
+                                                   
     g_object_class_install_property(gobject_class,
                                     PROP_AC_ADAPTER,
                                     g_param_spec_boolean("on-ac-adapter",
@@ -194,8 +202,8 @@
                                     g_param_spec_enum("critical-action",
                                                       "Critical action",
                                                       "Battery critical charge action",
-                                                      XFPM_TYPE_CRITICAL_ACTION,
-                                                      0,
+                                                      XFPM_TYPE_ACTION_REQUEST,
+                                                      XFPM_DO_NOTHING,
                                                       G_PARAM_READWRITE));
     
 #ifdef HAVE_LIBNOTIFY    
@@ -570,7 +578,7 @@
         XFPM_DEBUG("Using default values\n");
         g_error_free(g_error);
         batt->critical_level  = 10;
-        batt->critical_action = NOTHING;
+        batt->critical_action = XFPM_DO_NOTHING;
 #ifdef HAVE_LIBNOTIFY
         batt->notify_enabled = TRUE;
 #endif
@@ -583,7 +591,7 @@
     channel = xfconf_channel_new(XFPM_CHANNEL_CFG);
     
     batt->critical_level  =  xfconf_channel_get_uint(channel,CRITICAL_BATT_CFG,10);
-    batt->critical_action = xfconf_channel_get_uint(channel,CRITICAL_BATT_ACTION_CFG,NOTHING);
+    batt->critical_action = xfconf_channel_get_uint(channel,CRITICAL_BATT_ACTION_CFG,XFPM_DO_NOTHING);
     batt->show_tray = xfconf_channel_get_uint(channel,SHOW_TRAY_ICON_CFG,ALWAYS);
     batt->power_save = xfconf_channel_get_bool(channel,POWER_SAVE_CFG,FALSE);
 #ifdef HAVE_LIBNOTIFY
@@ -759,7 +767,7 @@
         XFPM_DEBUG("param:%s value:%s\n",arg1->name,content);
         g_free(content);
 #endif  
-        if ( batt->critical_action == NOTHING )
+        if ( batt->critical_action == XFPM_DO_NOTHING )
         {
             return;
         }
@@ -772,122 +780,21 @@
             {
                 return;
             }
-            if ( batt->critical_action == HIBERNATE )
+            if ( batt->critical_action == XFPM_DO_HIBERNATE )
             {
-                XFPM_DEBUG("Hibernating the system\n");
-                g_timeout_add_seconds(4,(GSourceFunc)xfpm_battery_do_hibernate,batt);
+                XFPM_DEBUG("Sending Hibernate\n");
+                g_signal_emit(G_OBJECT(batt),signals[XFPM_ACTION_REQUEST],0,XFPM_DO_HIBERNATE,TRUE);
                 return;
             }
-            if ( batt->critical_action == SHUTDOWN )
+            if ( batt->critical_action == XFPM_DO_SHUTDOWN )
             {
-                XfpmBatteryPrivate *priv;
-                priv = XFPM_BATTERY_GET_PRIVATE(batt);
-                g_timeout_add_seconds(4,(GSourceFunc)xfpm_hal_shutdown,priv->hal);
+                g_signal_emit(G_OBJECT(batt),signals[XFPM_ACTION_REQUEST],0,XFPM_DO_SHUTDOWN,TRUE);
             }
         }
     }
 }
 
-#ifdef HAVE_LIBNOTIFY
 static void
-set_sleep_errors(NotifyNotification *n,gchar *action,XfpmBattery *batt)
-{
-    if ( strcmp(action,"ok") )
-    {
-        g_object_unref(n);
-        return;
-    }
-    
-    g_object_unref(n);
-    
-    XfconfChannel *channel;
-    GError *g_error = NULL;
-    if ( !xfconf_init(&g_error) )
-    {
-        g_critical("xfconf init failed: %s\n",g_error->message);
-        g_error_free(g_error);
-        return;
-    }
-
-    channel = xfconf_channel_new(XFPM_CHANNEL_CFG);
-    
-    if ( !xfconf_channel_set_bool(channel,SHOW_SLEEP_ERRORS_CFG,FALSE) )
-    {
-        g_critical("Cannot set property %s\n",SHOW_SLEEP_ERRORS_CFG);
-    }
-    batt->show_sleep_errors = FALSE;
-    g_object_unref(channel);
-    xfconf_shutdown();
-}
-#endif
-
-static void
-xfpm_battery_report_sleep_errors(XfpmBattery *batt,const gchar *error,
-                                const gchar *icon_name, gboolean simple)
-{
-#ifdef HAVE_LIBNOTIFY
-    XfpmBatteryPrivate *priv;
-    priv = XFPM_BATTERY_GET_PRIVATE(batt);
-    
-    GtkStatusIcon *icon = NULL;
-    
-    GList *icons_list;
-    int i=0;
-    icons_list = g_hash_table_get_values(priv->batteries);
-    for ( i = 0 ; i < g_list_length(icons_list) ; i++ )
-    {
-        icon = g_list_nth_data(icons_list,i);
-        if ( icon ) break;
-    }
-    if ( simple ) 
-    {
-        xfpm_notify_simple("Xfce power manager",
-                           error,
-                           14000,
-                           NOTIFY_URGENCY_CRITICAL,
-                           icon != NULL ? GTK_STATUS_ICON(icon) : NULL,
-                           icon_name,
-                           0);
-    }
-    /* we don't show message than have been disabled from the user*/
-    else if ( batt->show_sleep_errors ) 
-    {
-        XFPM_DEBUG("Notify with action\n");
-        xfpm_notify_with_action("Xfce power manager",
-                               error,
-                               14000,
-                               NOTIFY_URGENCY_CRITICAL,
-                               icon != NULL ? GTK_STATUS_ICON(icon) : NULL,
-                               icon_name,
-                               _("don't show this message again"),
-                               0,
-                               (NotifyActionCallback)set_sleep_errors,
-                               batt);
-    }
-#endif
-}
-
-static gboolean
-xfpm_battery_do_hibernate(XfpmBattery *batt)
-{
-    XfpmBatteryPrivate *priv;
-    priv = XFPM_BATTERY_GET_PRIVATE(batt);
-    
-    GError *error = NULL;
-    guint8 critical;
-    gboolean ret =
-    xfpm_hal_hibernate(priv->hal,&error,&critical);
-     
-    if ( !ret ) {
-        xfpm_battery_report_sleep_errors(batt,error->message,"gpm-hibernate",critical == 1 ? TRUE : FALSE);
-        g_error_free(error);
-    }
-    
-    return FALSE;
-    
-}
-
-static void
 xfpm_battery_hibernate_callback(GtkWidget *widget,XfpmBattery *batt)
 {
     gboolean ret = 
@@ -897,30 +804,10 @@
     
     if ( ret ) 
     {
-        xfpm_lock_screen();
-        g_timeout_add_seconds(4,(GSourceFunc)xfpm_battery_do_hibernate,batt);
+        g_signal_emit(G_OBJECT(batt),signals[XFPM_ACTION_REQUEST],0,XFPM_DO_HIBERNATE,FALSE);
 	}
 }
 
-static gboolean
-xfpm_battery_do_suspend(XfpmBattery *batt)
-{
-    XfpmBatteryPrivate *priv;
-    priv = XFPM_BATTERY_GET_PRIVATE(batt);
-    
-    GError *error = NULL;
-    guint8 critical = 0;
-    gboolean ret =
-    xfpm_hal_suspend(priv->hal,&error,&critical);
-    
-    if ( !ret ) 
-    {
-        xfpm_battery_report_sleep_errors(batt,error->message,"gpm-suspend",critical == 1 ? TRUE : FALSE );
-        g_error_free(error);
-    }
-    
-    return FALSE;
-}
 
 static void
 xfpm_battery_suspend_callback(GtkWidget *widget,XfpmBattery *batt)
@@ -932,8 +819,7 @@
     
     if ( ret ) 
     {
-        xfpm_lock_screen();
-        g_timeout_add_seconds(3,(GSourceFunc)xfpm_battery_do_suspend,batt);
+        g_signal_emit(G_OBJECT(batt),signals[XFPM_ACTION_REQUEST],0,XFPM_DO_SUSPEND,FALSE);
     }
 }
 
@@ -1201,3 +1087,34 @@
     xfpm_battery_get_devices(batt);
     xfpm_battery_refresh(batt);
 }
+
+
+#ifdef HAVE_LIBNOTIFY
+void           xfpm_battery_show_error(XfpmBattery *batt,
+                                       const gchar *icon_name,
+                                       const gchar *error)
+{
+    g_return_if_fail(XFPM_IS_BATTERY(batt));
+    
+    XfpmBatteryPrivate *priv;
+    priv = XFPM_BATTERY_GET_PRIVATE(batt);
+    
+    GtkStatusIcon *icon = NULL;
+    
+    GList *icons_list;
+    int i=0;
+    icons_list = g_hash_table_get_values(priv->batteries);
+    for ( i = 0 ; i < g_list_length(icons_list) ; i++ )
+    {
+        icon = g_list_nth_data(icons_list,i);
+        if ( icon ) break;
+    }
+    xfpm_notify_simple("Xfce power manager",
+                       error,
+                       14000,
+                       NOTIFY_URGENCY_CRITICAL,
+                       icon != NULL ? GTK_STATUS_ICON(icon) : NULL,
+                       icon_name,
+                       0);
+}                                       
+#endif

Modified: xfce4-power-manager/trunk/src/xfpm-battery.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery.h	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-battery.h	2008-10-15 13:51:10 UTC (rev 5632)
@@ -34,6 +34,7 @@
 
 #define XFPM_TYPE_BATTERY    (xfpm_battery_get_type())
 #define XFPM_BATTERY(o)      (G_TYPE_CHECK_INSTANCE_CAST(o,XFPM_TYPE_BATTERY,XfpmBattery))
+#define XFPM_IS_BATTERY(o)   (G_TYPE_CHECK_INSTANCE_TYPE(o,XFPM_TYPE_BATTERY))
 
 typedef struct XfpmBatteryPrivate XfpmBatteryPrivate;
 
@@ -44,12 +45,11 @@
     
     gboolean ac_adapter_present;
     guint critical_level;
-    XfpmCriticalAction critical_action;
+    XfpmActionRequest critical_action;
     XfpmShowIcon show_tray;
     
     gboolean can_hibernate;
     gboolean can_suspend;
-    gboolean show_sleep_errors;
     gboolean power_save;
     
 #ifdef HAVE_LIBNOTIFY
@@ -62,9 +62,12 @@
 {
     GObjectClass parent_class;
     
-    /* signal */
-    void  (*show_adapter_icon)    (XfpmBattery *batt,
-                                   gboolean show);
+    /* signals */
+    void  (*show_adapter_icon)      (XfpmBattery *batt,
+                                     gboolean show);
+    void  (*battery_action_request) (XfpmBattery *batt,
+                                     XfpmActionRequest action,
+                                     gboolean critical);
                                    
 } XfpmBatteryClass;
 
@@ -72,6 +75,11 @@
 XfpmBattery   *xfpm_battery_new     (void);
 void           xfpm_battery_monitor (XfpmBattery *batt);
 
+#ifdef HAVE_LIBNOTIFY
+void           xfpm_battery_show_error(XfpmBattery *batt,
+                                       const gchar *icon_name,
+                                       const gchar *error);     
+#endif
 G_END_DECLS
 
 #endif

Modified: xfce4-power-manager/trunk/src/xfpm-button.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-button.c	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-button.c	2008-10-15 13:51:10 UTC (rev 5632)
@@ -48,7 +48,9 @@
 #include "xfpm-debug.h"
 #include "xfpm-common.h"
 #include "xfpm-notify.h"
+#include "xfpm-enums.h"
 #include "xfpm-enum-types.h"
+#include "xfpm-marshal.h"
 
 #define XFPM_BUTTON_GET_PRIVATE(o) \
 (G_TYPE_INSTANCE_GET_PRIVATE(o,XFPM_TYPE_BUTTON,XfpmButtonPrivate))
@@ -65,10 +67,9 @@
                                            guint prop_id,
                                            GValue *value,
                                            GParamSpec *pspec);
+
 static void xfpm_button_do_suspend(XfpmButton *bt);
 static void xfpm_button_do_hibernate(XfpmButton *bt);
-static gboolean xfpm_button_hibernate(XfpmButton *bt);
-static gboolean xfpm_button_suspend(XfpmButton *bt);
 
 static void xfpm_button_lid_pressed(XfpmButton *bt,const gchar *udi);
 static void xfpm_button_power_pressed(XfpmButton *bt,const gchar *udi);
@@ -102,6 +103,14 @@
 
 G_DEFINE_TYPE(XfpmButton,xfpm_button,G_TYPE_OBJECT)
 
+enum 
+{
+    XFPM_ACTION_REQUEST,
+    LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0,}; 
+
 enum
 {
     PROP_0,
@@ -118,13 +127,22 @@
     gobject_class->set_property = xfpm_button_set_property;
     gobject_class->get_property = xfpm_button_get_property;
 
+    signals[XFPM_ACTION_REQUEST] = g_signal_new("xfpm-action-request",
+                                               XFPM_TYPE_BUTTON,
+                                               G_SIGNAL_RUN_LAST,
+                                               G_STRUCT_OFFSET(XfpmButtonClass,button_action_request),
+                                               NULL,NULL,
+                                               _xfpm_marshal_VOID__ENUM_BOOLEAN ,
+                                               G_TYPE_NONE,2,
+                                               XFPM_TYPE_ACTION_REQUEST,G_TYPE_BOOLEAN);
+                                                   
     g_object_class_install_property(gobject_class,
                                     PROP_LID_ACTION,
                                     g_param_spec_enum("lid-switch-action",
                                                       "lid switch action",
                                                       "lid switch action",
-                                                      XFPM_TYPE_BUTTON_ACTION,
-                                                      BUTTON_DO_NOTHING,
+                                                      XFPM_TYPE_ACTION_REQUEST,
+                                                      XFPM_DO_NOTHING,
                                                       G_PARAM_READWRITE));    
     
     g_object_class_install_property(gobject_class,
@@ -132,16 +150,16 @@
                                     g_param_spec_enum("sleep-switch-action",
                                                       "sleep switch action",
                                                       "sleep switch action",
-                                                      XFPM_TYPE_BUTTON_ACTION,
-                                                      BUTTON_DO_NOTHING,
+                                                      XFPM_TYPE_ACTION_REQUEST,
+                                                      XFPM_DO_NOTHING,
                                                       G_PARAM_READWRITE));    
     g_object_class_install_property(gobject_class,
                                     PROP_LID_ACTION,
                                     g_param_spec_enum("power-switch-action",
                                                       "power switch action",
                                                       "power switch action",
-                                                      XFPM_TYPE_BUTTON_ACTION,
-                                                      BUTTON_DO_NOTHING,
+                                                      XFPM_TYPE_ACTION_REQUEST,
+                                                      XFPM_DO_NOTHING,
                                                       G_PARAM_READWRITE));                                                      
     
     g_type_class_add_private(klass,sizeof(XfpmButtonPrivate));
@@ -264,67 +282,45 @@
     return FALSE;
 }
 
-static gboolean
-xfpm_button_suspend(XfpmButton *bt)
+static void
+xfpm_button_do_hibernate(XfpmButton *bt)
 {
     XfpmButtonPrivate *priv;
     priv = XFPM_BUTTON_GET_PRIVATE(bt);
     
-    guint8 critical;
-
-    xfpm_hal_suspend(priv->hal,NULL,&critical);
-    g_timeout_add(10,(GSourceFunc)_unblock_handler,priv);
+    g_signal_handler_block(priv->hal,priv->handler_id);
     
-    return FALSE;
-}
-
-static gboolean
-xfpm_button_hibernate(XfpmButton *bt)
-{
-    XfpmButtonPrivate *priv;
-    priv = XFPM_BUTTON_GET_PRIVATE(bt);
-    guint8 critical;
+    g_signal_emit(G_OBJECT(bt),signals[XFPM_ACTION_REQUEST],0,XFPM_DO_HIBERNATE,FALSE);
     
-    xfpm_hal_hibernate(priv->hal,NULL,&critical);
     g_timeout_add(10,(GSourceFunc)_unblock_handler,priv);
     
-    return FALSE;
 }
 
 static void
-xfpm_button_do_hibernate(XfpmButton *bt)
-{
-    XfpmButtonPrivate *priv;
-    priv = XFPM_BUTTON_GET_PRIVATE(bt);
-    
-    g_signal_handler_block(priv->hal,priv->handler_id);
-    g_timeout_add_seconds(2,(GSourceFunc)xfpm_button_hibernate,bt);
-}
-
-static void
 xfpm_button_do_suspend(XfpmButton *bt)
 {
     XfpmButtonPrivate *priv;
     priv = XFPM_BUTTON_GET_PRIVATE(bt);
     
     g_signal_handler_block(priv->hal,priv->handler_id);
-    g_timeout_add_seconds(2,(GSourceFunc)xfpm_button_suspend,bt);
+    
+    g_signal_emit(G_OBJECT(bt),signals[XFPM_ACTION_REQUEST],0,XFPM_DO_SUSPEND,FALSE);
+    
+    g_timeout_add(10,(GSourceFunc)_unblock_handler,priv);
 }
 
 static void
-_proccess_action(XfpmButton *bt,XfpmButtonAction action)
+_proccess_action(XfpmButton *bt,XfpmActionRequest action)
 {
-    if ( action == BUTTON_DO_SUSPEND )
+    if ( action == XFPM_DO_SUSPEND )
     {
-         xfpm_lock_screen();
          xfpm_button_do_suspend(bt);
     }
-    else if ( action == BUTTON_DO_HIBERNATE )
+    else if ( action == XFPM_DO_HIBERNATE )
     {
-         xfpm_lock_screen();
          xfpm_button_do_hibernate(bt);
     }
-    else if ( action == BUTTON_DO_SHUTDOWN )
+    else if ( action == XFPM_DO_SHUTDOWN )
     {
         XfpmButtonPrivate *priv;
         priv = XFPM_BUTTON_GET_PRIVATE(bt);
@@ -338,7 +334,7 @@
 static void
 xfpm_button_lid_pressed(XfpmButton *bt,const gchar *udi)
 {
-    if ( bt->lid_action == BUTTON_DO_NOTHING )
+    if ( bt->lid_action == XFPM_DO_NOTHING )
     {
         return;
     }
@@ -374,7 +370,7 @@
 static void
 xfpm_button_power_pressed(XfpmButton *bt,const gchar *udi)
 {
-    if ( bt->power_action == BUTTON_DO_NOTHING )
+    if ( bt->power_action == XFPM_DO_NOTHING )
     {
         return;
     }
@@ -413,7 +409,7 @@
     XfpmButtonPrivate *priv;
     priv = XFPM_BUTTON_GET_PRIVATE(bt);
     
-    if ( bt->sleep_action == BUTTON_DO_NOTHING )
+    if ( bt->sleep_action == XFPM_DO_NOTHING )
     {
         return;
     }
@@ -487,18 +483,18 @@
         g_critical("xfconf init failed: %s\n",g_error->message);
         XFPM_DEBUG("Using default values\n");
         g_error_free(g_error);
-        bt->lid_action = BUTTON_DO_NOTHING;
-        bt->sleep_action = BUTTON_DO_NOTHING;
-        bt->power_action = BUTTON_DO_NOTHING;
+        bt->lid_action = XFPM_DO_NOTHING;
+        bt->sleep_action = XFPM_DO_NOTHING;
+        bt->power_action = XFPM_DO_NOTHING;
         return;
     }
     XfconfChannel *channel;
     
     channel = xfconf_channel_new(XFPM_CHANNEL_CFG);
 
-    bt->lid_action   = xfconf_channel_get_uint(channel,LID_SWITCH_CFG,BUTTON_DO_NOTHING);
-    bt->sleep_action   = xfconf_channel_get_uint(channel,SLEEP_SWITCH_CFG,BUTTON_DO_NOTHING);
-    bt->power_action = xfconf_channel_get_uint(channel,POWER_SWITCH_CFG,BUTTON_DO_NOTHING);
+    bt->lid_action   = xfconf_channel_get_uint(channel,LID_SWITCH_CFG,XFPM_DO_NOTHING);
+    bt->sleep_action   = xfconf_channel_get_uint(channel,SLEEP_SWITCH_CFG,XFPM_DO_NOTHING);
+    bt->power_action = xfconf_channel_get_uint(channel,POWER_SWITCH_CFG,XFPM_DO_NOTHING);
     
     g_object_unref(channel);
     xfconf_shutdown();    

Modified: xfce4-power-manager/trunk/src/xfpm-button.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-button.h	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-button.h	2008-10-15 13:51:10 UTC (rev 5632)
@@ -39,9 +39,9 @@
     GObject parent;
     XfpmButtonPrivate *priv;
     
-    XfpmButtonAction lid_action;
-    XfpmButtonAction power_action;
-    XfpmButtonAction sleep_action;
+    XfpmActionRequest lid_action;
+    XfpmActionRequest power_action;
+    XfpmActionRequest sleep_action;
     
 } XfpmButton;
 
@@ -50,6 +50,10 @@
 {
     GObjectClass parent_class;
     
+    void  (*button_action_request) (XfpmButton *bt,
+                                    XfpmActionRequest action,
+                                    gboolean critical);
+    
 } XfpmButtonClass;
 
 GType          xfpm_button_get_type(void) G_GNUC_CONST;

Modified: xfce4-power-manager/trunk/src/xfpm-driver.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-driver.c	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-driver.c	2008-10-15 13:51:10 UTC (rev 5632)
@@ -91,6 +91,21 @@
                                             
 static gboolean xfpm_driver_show_options_dialog(XfpmDriver *drv);
 
+/* Function that receives events suspend/hibernate,shutdown for all
+ * Xfce power manager componenents and syncronize them
+ */
+#ifdef HAVE_LIBNOTIFY
+static void xfpm_driver_report_sleep_errors(XfpmDriver *driver,
+                                            const gchar *icon_name,
+                                            const gchar *error);
+#endif
+static gboolean xfpm_driver_do_suspend(gpointer data);
+static gboolean xfpm_driver_do_hibernate(gpointer data);
+static void xfpm_driver_handle_action_request(GObject *object,
+                                              guint action,
+                                              gboolean critical,
+                                              XfpmDriver *drv);
+
 /* DBus message Filter and replies */
 static void xfpm_driver_send_reply(DBusConnection *conn,DBusMessage *mess);
 static DBusHandlerResult xfpm_driver_signal_filter
@@ -110,6 +125,8 @@
     gboolean can_suspend;
     gboolean can_hibernate;
     
+    gboolean accept_sleep_request;
+    
     gboolean cpufreq_control;
     gboolean buttons_control;
     gboolean lcd_brightness_control;
@@ -148,6 +165,7 @@
     priv->cpufreq_control = FALSE;
     priv->buttons_control = FALSE;
     priv->lcd_brightness_control = FALSE;
+    priv->accept_sleep_request = TRUE;
     priv->loop    = NULL;
     priv->cpu     = NULL;
     priv->adapter = NULL;
@@ -519,7 +537,135 @@
     return FALSE;
 }
 
+#ifdef HAVE_LIBNOTIFY
 static void
+xfpm_driver_report_sleep_errors(XfpmDriver *driver,const gchar *icon_name,const gchar *error)
+{
+    XfpmDriverPrivate *priv;
+    priv = XFPM_DRIVER_GET_PRIVATE(driver);
+    
+    gboolean adapter_visible;
+    g_object_get(G_OBJECT(priv->adapter),"visible",&adapter_visible,NULL);
+    
+    if ( adapter_visible )
+    {
+         xfpm_notify_simple("Xfce power manager",
+                           error,
+                           14000,
+                           NOTIFY_URGENCY_CRITICAL,
+                           GTK_STATUS_ICON(priv->adapter),
+                           icon_name,
+                           0);
+        
+    }
+    else  /* the battery object will take care */
+    {
+        xfpm_battery_show_error(priv->batt,icon_name,error);
+    }
+        
+}
+#endif
+
+static gboolean
+xfpm_driver_do_suspend(gpointer data)
+{
+    XfpmDriver *drv = XFPM_DRIVER(data);
+    XfpmDriverPrivate *priv;
+    GError *error = NULL;
+    guint8 critical;
+    
+    priv = XFPM_DRIVER_GET_PRIVATE(drv);
+    
+    xfpm_hal_suspend(priv->hal,&error,&critical);
+    if ( error )
+    {
+        XFPM_DEBUG("error suspend: %s\n",error->message);
+        if ( critical == 1)
+        xfpm_driver_report_sleep_errors(drv,"gpm-suspend",error->message);
+        g_error_free(error);
+    }
+    
+    priv->accept_sleep_request = TRUE;
+    
+    return FALSE;
+    
+}
+
+static gboolean
+xfpm_driver_do_hibernate(gpointer data)
+{
+    XfpmDriver *drv = XFPM_DRIVER(data);
+    XfpmDriverPrivate *priv;
+    GError *error = NULL;
+    guint8 critical;
+    
+    priv = XFPM_DRIVER_GET_PRIVATE(drv);
+    
+    xfpm_hal_hibernate(priv->hal,&error,&critical);
+    
+    if ( error )
+    {
+        XFPM_DEBUG("error hibernate: %s\n",error->message);
+        if ( critical == 1)
+        xfpm_driver_report_sleep_errors(drv,"gpm-hibernate",error->message);
+        g_error_free(error);
+    }
+        
+    priv->accept_sleep_request = TRUE;
+    return FALSE;
+    
+}
+
+static void
+xfpm_driver_handle_action_request(GObject *object,XfpmActionRequest action,
+                                  gboolean critical,XfpmDriver *drv)
+{
+    g_return_if_fail(XFPM_IS_DRIVER(drv));
+    
+    XfpmDriverPrivate *priv;
+    priv = XFPM_DRIVER_GET_PRIVATE(drv);
+#ifdef DEBUG
+    gchar *content;
+    GValue value = { 0, };
+    g_value_init(&value,XFPM_TYPE_ACTION_REQUEST);
+    g_value_set_enum(&value,action);
+    content = g_strdup_value_contents(&value);
+        
+    if ( XFPM_IS_BATTERY(object) ) XFPM_DEBUG("Action %s request from the Battery object\n",content);
+    if ( XFPM_IS_AC_ADAPTER(object) ) XFPM_DEBUG("Action %s request from the adapter object\n",content);
+    if ( XFPM_IS_BUTTON(object) ) XFPM_DEBUG("Action %s request from the Button object\n",content);
+    
+    g_free(content);
+    
+#endif    
+    if ( !priv->accept_sleep_request )
+    {
+        XFPM_DEBUG("Ignoring sleep request\n");
+        return;
+    }
+
+    /* Block any other event here */    
+    priv->accept_sleep_request = FALSE;    
+    
+    switch ( action )
+    {
+        case XFPM_DO_SUSPEND:
+            //xfpm_lock_screen();
+            g_timeout_add_seconds(2,(GSourceFunc)xfpm_driver_do_suspend,drv);
+            break;
+        case XFPM_DO_HIBERNATE:
+            //xfpm_lock_screen();
+            g_timeout_add_seconds(2,(GSourceFunc)xfpm_driver_do_hibernate,drv);
+            break;
+        case XFPM_DO_SHUTDOWN:
+            break;    
+        default:
+            break;
+    }        
+    
+}
+
+static void
 xfpm_driver_send_reply(DBusConnection *conn,DBusMessage *mess)
 {
     DBusMessage *reply;
@@ -708,6 +854,8 @@
     else
     {
         priv->buttons_control = TRUE;
+        g_signal_connect(priv->bt,"xfpm-action-request",
+                        G_CALLBACK(xfpm_driver_handle_action_request),drv);
     }
     
     priv->lcd = xfpm_lcd_brightness_new();
@@ -720,11 +868,15 @@
     
     priv->batt = xfpm_battery_new();
     g_signal_connect(priv->batt,"xfpm-show-adapter-icon",G_CALLBACK(_show_adapter_icon),drv);
-    
+    g_signal_connect(priv->batt,"xfpm-action-request",
+                        G_CALLBACK(xfpm_driver_handle_action_request),drv);
+                        
     priv->adapter = xfpm_ac_adapter_new(FALSE);
     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",
+                        G_CALLBACK(xfpm_driver_handle_action_request),drv);
+                        
     /* This will give a signal concerning the AC adapter presence,
      * so we get the callback and then we set up the ac adapter
      * status for dpms and cpu lcd,...

Modified: xfce4-power-manager/trunk/src/xfpm-enums.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-enums.h	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-enums.h	2008-10-15 13:51:10 UTC (rev 5632)
@@ -5,13 +5,14 @@
 #include <config.h>
 #endif
 
-/* Action to taken when battery charge level is critical */
 typedef enum
 {
-    NOTHING,
-    SHUTDOWN,
-    HIBERNATE
-} XfpmCriticalAction;
+    XFPM_DO_NOTHING,
+    XFPM_DO_SUSPEND,
+    XFPM_DO_HIBERNATE,
+    XFPM_DO_SHUTDOWN
+    
+} XfpmActionRequest;
 
 /* Icon tray */
 typedef enum
@@ -55,15 +56,4 @@
     
 } XfpmCpuGovernor;
 
-
-/* button switch control */
-typedef enum
-{
-    BUTTON_DO_NOTHING,
-    BUTTON_DO_SUSPEND,
-    BUTTON_DO_HIBERNATE,
-    BUTTON_DO_SHUTDOWN
-
-} XfpmButtonAction;
-
 #endif

Modified: xfce4-power-manager/trunk/src/xfpm-hal.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-hal.c	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-hal.c	2008-10-15 13:51:10 UTC (rev 5632)
@@ -504,12 +504,33 @@
     return TRUE;
 }
 
+static gboolean
+_filter_error_message(const gchar *error)
+{
+    if(!strcmp("No back-end for your operating system",error))
+    {
+        return TRUE;
+    }
+    else if (!strcmp("No hibernate script found",error) )
+    {
+        return TRUE;
+    }
+    else if (!strcmp("No suspend method found",error) )
+    {
+        return TRUE;
+    }
+    else if (!strcmp("No hibernate method found",error))
+    {
+        return TRUE;
+    }
+    return FALSE;
+}
 
 gboolean   
 xfpm_hal_hibernate(XfpmHal *xfpm_hal,GError **gerror,guint8 *critical) 
 {
     g_return_val_if_fail(XFPM_IS_HAL(xfpm_hal),FALSE);
-     
+
     XfpmHalPrivate *priv;
     priv = XFPM_HAL_GET_PRIVATE(xfpm_hal);
     
@@ -518,7 +539,7 @@
 	DBusMessage *mess,*reply;
 	DBusError error;
 	gint exit_code;
-
+    
 	mess = xfpm_dbus_new_message(HAL_DBUS_SERVICE,
                                  HAL_ROOT_COMPUTER,
                                  HAL_DBUS_INTERFACE_POWER,
@@ -531,19 +552,26 @@
 	}	
 	
 	dbus_error_init(&error);
+
 	reply = dbus_connection_send_with_reply_and_block(priv->connection,
                                                     mess,
                                                     SLEEP_TIMEOUT,
                                                     &error);
-
     dbus_message_unref(mess);
              	
     if ( dbus_error_is_set(&error) )
     {
         XFPM_DEBUG("error=%s\n",error.message);
         dbus_set_g_error(gerror,&error);
+        if ( _filter_error_message(error.message) )
+        {
+            *critical = 1;
+        }
+        else 
+        {
+            *critical = 0;
+        }
         dbus_error_free(&error);
-        *critical = 0;
         return FALSE;
     }
     
@@ -571,7 +599,7 @@
         }
         if ( exit_code > 1 ) 
         {
-            g_set_error(gerror,0,0,_("Failed to hibernate"));
+            g_set_error(gerror,0,0,_("System failed to hibernate"));
             return FALSE;
         }                 
         break;
@@ -616,7 +644,6 @@
 	dbus_message_append_args(mess,DBUS_TYPE_INT32,&seconds,DBUS_TYPE_INVALID);
 
     dbus_error_init(&error);
-    	
 	reply = dbus_connection_send_with_reply_and_block(priv->connection,
                                                     mess,
                                                     SLEEP_TIMEOUT,
@@ -627,8 +654,15 @@
     {
         XFPM_DEBUG("error=%s\n",error.message);
         dbus_set_g_error(gerror,&error);
+        if ( _filter_error_message(error.message) )
+        {
+            *critical = 1;
+        }
+        else 
+        {
+            *critical = 0;
+        }
         dbus_error_free(&error);
-        *critical = 0;
         return FALSE;
     }
     
@@ -656,7 +690,7 @@
         }
         if ( exit_code > 1 ) 
         {
-            g_set_error(gerror,0,0,_("Failed to suspend"));
+            g_set_error(gerror,0,0,_("System failed to suspend"));
             return FALSE;
         }                 
         break;

Modified: xfce4-power-manager/trunk/src/xfpm-marshal.list
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-marshal.list	2008-10-15 07:48:17 UTC (rev 5631)
+++ xfce4-power-manager/trunk/src/xfpm-marshal.list	2008-10-15 13:51:10 UTC (rev 5632)
@@ -2,3 +2,5 @@
 VOID:STRING,STRING
 VOID:STRING,STRING,STRING
 VOID:STRING,STRING,BOOLEAN,BOOLEAN
+VOID:ENUM,BOOLEAN
+




More information about the Goodies-commits mailing list