[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