[Xfce4-commits] r30319 - xfce4-session/trunk/xfce4-session
Brian Tarricone
kelnos at xfce.org
Thu Jul 16 09:16:26 CEST 2009
Author: kelnos
Date: 2009-07-16 07:16:26 +0000 (Thu, 16 Jul 2009)
New Revision: 30319
Modified:
xfce4-session/trunk/xfce4-session/shutdown.c
xfce4-session/trunk/xfce4-session/shutdown.h
xfce4-session/trunk/xfce4-session/xfsm-global.h
xfce4-session/trunk/xfce4-session/xfsm-shutdown-helper.c
xfce4-session/trunk/xfce4-session/xfsm-shutdown-helper.h
Log:
query HAL if suspend/hibernate are supported
also clear up internal confusion by getting rid of the
XfsmShutdownCommand type and just using XfsmShutdownType everywhere
Modified: xfce4-session/trunk/xfce4-session/shutdown.c
===================================================================
--- xfce4-session/trunk/xfce4-session/shutdown.c 2009-07-15 15:41:36 UTC (rev 30318)
+++ xfce4-session/trunk/xfce4-session/shutdown.c 2009-07-16 07:16:26 UTC (rev 30319)
@@ -548,6 +548,11 @@
gtk_widget_set_sensitive (hibernate_button, FALSE);
}
+ if (suspend_button && !xfsm_shutdown_helper_supports (shutdown_helper, XFSM_SHUTDOWN_SUSPEND))
+ gtk_widget_hide (suspend_button);
+ if (hibernate_button && !xfsm_shutdown_helper_supports (shutdown_helper, XFSM_SHUTDOWN_HIBERNATE))
+ gtk_widget_hide (hibernate_button);
+
/* save portion of the root window covered by the dialog */
if (!accessibility && shutdown_helper != NULL)
{
Modified: xfce4-session/trunk/xfce4-session/shutdown.h
===================================================================
--- xfce4-session/trunk/xfce4-session/shutdown.h 2009-07-15 15:41:36 UTC (rev 30318)
+++ xfce4-session/trunk/xfce4-session/shutdown.h 2009-07-16 07:16:26 UTC (rev 30319)
@@ -24,16 +24,7 @@
#include <glib.h>
-/* */
-typedef enum
-{
- XFSM_SHUTDOWN_ASK = 0,
- XFSM_SHUTDOWN_LOGOUT,
- XFSM_SHUTDOWN_HALT,
- XFSM_SHUTDOWN_REBOOT,
- XFSM_SHUTDOWN_SUSPEND,
- XFSM_SHUTDOWN_HIBERNATE,
-} XfsmShutdownType;
+#include "xfsm-global.h"
/* prototypes */
extern gboolean shutdownDialog(const gchar *sessionName,
Modified: xfce4-session/trunk/xfce4-session/xfsm-global.h
===================================================================
--- xfce4-session/trunk/xfce4-session/xfsm-global.h 2009-07-15 15:41:36 UTC (rev 30318)
+++ xfce4-session/trunk/xfce4-session/xfsm-global.h 2009-07-16 07:16:26 UTC (rev 30319)
@@ -28,6 +28,15 @@
#include <xfce4-session/xfsm-splash-screen.h>
+typedef enum
+{
+ XFSM_SHUTDOWN_ASK = 0,
+ XFSM_SHUTDOWN_LOGOUT,
+ XFSM_SHUTDOWN_HALT,
+ XFSM_SHUTDOWN_REBOOT,
+ XFSM_SHUTDOWN_SUSPEND,
+ XFSM_SHUTDOWN_HIBERNATE,
+} XfsmShutdownType;
typedef struct _FailsafeClient FailsafeClient;
struct _FailsafeClient
Modified: xfce4-session/trunk/xfce4-session/xfsm-shutdown-helper.c
===================================================================
--- xfce4-session/trunk/xfce4-session/xfsm-shutdown-helper.c 2009-07-15 15:41:36 UTC (rev 30318)
+++ xfce4-session/trunk/xfce4-session/xfsm-shutdown-helper.c 2009-07-16 07:16:26 UTC (rev 30319)
@@ -67,7 +67,7 @@
static struct
{
- XfsmShutdownCommand command;
+ XfsmShutdownType command;
gchar * name;
} command_name_map[] = {
{ XFSM_SHUTDOWN_HALT, "Shutdown" },
@@ -88,18 +88,12 @@
};
-
-static gboolean
-xfsm_shutdown_helper_hal_check (XfsmShutdownHelper *helper,
- GError **error)
+static DBusConnection *
+xfsm_shutdown_helper_dbus_connect (GError **error)
{
DBusConnection *connection;
- DBusMessage *message;
- DBusMessage *result;
DBusError derror;
- g_return_val_if_fail (helper && (!error || !*error), FALSE);
-
/* initialize the error */
dbus_error_init (&derror);
@@ -111,9 +105,31 @@
if (error)
dbus_set_g_error (error, &derror);
dbus_error_free (&derror);
- return FALSE;
+ return NULL;
}
+ return connection;
+}
+
+
+static gboolean
+xfsm_shutdown_helper_hal_check (XfsmShutdownHelper *helper,
+ GError **error)
+{
+ DBusConnection *connection;
+ DBusMessage *message;
+ DBusMessage *result;
+ DBusError derror;
+
+ g_return_val_if_fail (helper && (!error || !*error), FALSE);
+
+ connection = xfsm_shutdown_helper_dbus_connect (error);
+ if (!connection)
+ return FALSE;
+
+ /* initialize the error */
+ dbus_error_init (&derror);
+
/* this is a simple trick to check whether we are allowed to
* use the org.freedesktop.Hal.Device.SystemPowerManagement
* interface without shutting down/rebooting now.
@@ -166,7 +182,7 @@
static gboolean
xfsm_shutdown_helper_hal_send (XfsmShutdownHelper *helper,
- XfsmShutdownCommand command,
+ XfsmShutdownType command,
GError **error)
{
DBusConnection *connection;
@@ -201,20 +217,13 @@
return FALSE;
}
+ connection = xfsm_shutdown_helper_dbus_connect (error);
+ if(!connection)
+ return FALSE;
+
/* initialize the error */
dbus_error_init (&derror);
- /* connect to the system message bus */
- connection = dbus_bus_get (DBUS_BUS_SYSTEM, &derror);
- if (G_UNLIKELY (connection == NULL))
- {
- g_warning (G_STRLOC ": Failed to connect to the system message bus: %s", derror.message);
- if (error)
- dbus_set_g_error (error, &derror);
- dbus_error_free (&derror);
- return FALSE;
- }
-
/* send the appropriate message to HAL, telling it to shutdown or reboot the system */
message = dbus_message_new_method_call ("org.freedesktop.Hal",
"/org/freedesktop/Hal/devices/computer",
@@ -245,6 +254,65 @@
+static gboolean
+xfsm_shutdown_helper_check_hal_property (const gchar *object_path,
+ const gchar *property_name)
+{
+ DBusConnection *connection;
+ DBusMessage *message;
+ DBusMessage *result;
+ DBusError derror;
+ dbus_bool_t response = FALSE;
+
+ connection = xfsm_shutdown_helper_dbus_connect (NULL);
+ if (!connection)
+ return FALSE;
+
+ message = dbus_message_new_method_call ("org.freedesktop.Hal",
+ object_path,
+ "org.freedesktop.Hal.Device",
+ "GetPropertyBoolean");
+ dbus_message_append_args (message,
+ DBUS_TYPE_STRING, &property_name,
+ DBUS_TYPE_INVALID);
+
+ dbus_error_init(&derror);
+ result = dbus_connection_send_with_reply_and_block (connection, message, -1, &derror);
+ dbus_message_unref (message);
+
+ if (G_UNLIKELY (result == NULL))
+ {
+ g_warning (G_STRLOC ": Failed to contact HAL: %s", derror.message);
+ dbus_error_free (&derror);
+ return FALSE;
+ }
+
+ if (!result)
+ return FALSE;
+
+ if (dbus_set_error_from_message (&derror, result))
+ {
+ dbus_error_free (&derror);
+ response = FALSE;
+ }
+ else
+ {
+ if (!dbus_message_get_args (result, &derror,
+ DBUS_TYPE_BOOLEAN, &response,
+ DBUS_TYPE_INVALID))
+ {
+ dbus_error_free (&derror);
+ response = FALSE;
+ }
+ }
+
+ dbus_message_unref (result);
+
+ return response;
+}
+
+
+
XfsmShutdownHelper*
xfsm_shutdown_helper_spawn (GError **error)
{
@@ -517,15 +585,16 @@
gboolean
xfsm_shutdown_helper_send_command (XfsmShutdownHelper *helper,
- XfsmShutdownCommand command,
+ XfsmShutdownType command,
GError **error)
{
- static gchar *command_table[] = { "POWEROFF", "REBOOT" };
+ const gchar *command_str = NULL;
gchar response[256];
g_return_val_if_fail (helper != NULL, FALSE);
g_return_val_if_fail (!helper->need_password, FALSE);
g_return_val_if_fail (!error || !*error, FALSE);
+ g_return_val_if_fail (command != XFSM_SHUTDOWN_ASK, FALSE);
/* check if we can use HAL to perform the requested action */
if (G_LIKELY (helper->use_hal))
@@ -536,20 +605,30 @@
else
{
/* we don't support hibernate or suspend without HAL */
- if (command == XFSM_SHUTDOWN_SUSPEND || command == XFSM_SHUTDOWN_HIBERNATE)
+ switch (command)
{
- if (error)
- {
- g_set_error (error, DBUS_GERROR, DBUS_GERROR_SERVICE_UNKNOWN,
- _("Suspend and Hibernate are only supported through HAL, which is unavailable"));
- }
- return FALSE;
+ case XFSM_SHUTDOWN_HALT:
+ command_str = "POWEROFF";
+ break;
+
+ case XFSM_SHUTDOWN_REBOOT:
+ command_str = "REBOOT";
+ break;
+
+ case XFSM_SHUTDOWN_SUSPEND:
+ case XFSM_SHUTDOWN_HIBERNATE:
+ if (error)
+ {
+ g_set_error (error, DBUS_GERROR, DBUS_GERROR_SERVICE_UNKNOWN,
+ _("Suspend and Hibernate are only supported through HAL, which is unavailable"));
+ }
+ /* fall through */
+ default:
+ return FALSE;
}
/* send it to our associated sudo'ed process */
- /* -2 is not a magic number, it's to get the right offset in command_table array */
- /* because in enum, XFSM_SHUTDOWN_HALT = 2 and XFSM_SHUTDOWN_REBOOT = 3 */
- fprintf (helper->outfile, "%s\n", command_table[command - 2]);
+ fprintf (helper->outfile, "%s\n", command_str);
fflush (helper->outfile);
if (ferror (helper->outfile))
@@ -590,6 +669,52 @@
+gboolean
+xfsm_shutdown_helper_supports (XfsmShutdownHelper *helper,
+ XfsmShutdownType shutdown_type)
+{
+ if (helper->use_hal)
+ {
+ switch (shutdown_type)
+ {
+ case XFSM_SHUTDOWN_SUSPEND:
+ if (xfsm_shutdown_helper_check_hal_property ("/org/freedesktop/Hal/devices/computer",
+ "power_management.can_suspend"))
+ {
+ return TRUE;
+ }
+ return FALSE;
+
+ case XFSM_SHUTDOWN_HIBERNATE:
+ if (xfsm_shutdown_helper_check_hal_property ("/org/freedesktop/Hal/devices/computer",
+ "power_management.can_hibernate"))
+ {
+ return TRUE;
+ }
+ return FALSE;
+
+ default:
+ return TRUE;
+ }
+ }
+ else
+ {
+ switch (shutdown_type)
+ {
+ case XFSM_SHUTDOWN_SUSPEND:
+ case XFSM_SHUTDOWN_HIBERNATE:
+ return FALSE;
+
+ default:
+ return TRUE;
+ }
+ }
+
+ g_assert_not_reached();
+}
+
+
+
void
xfsm_shutdown_helper_destroy (XfsmShutdownHelper *helper)
{
Modified: xfce4-session/trunk/xfce4-session/xfsm-shutdown-helper.h
===================================================================
--- xfce4-session/trunk/xfce4-session/xfsm-shutdown-helper.h 2009-07-15 15:41:36 UTC (rev 30318)
+++ xfce4-session/trunk/xfce4-session/xfsm-shutdown-helper.h 2009-07-16 07:16:26 UTC (rev 30319)
@@ -24,14 +24,9 @@
#include <glib.h>
+#include "xfsm-global.h"
-typedef enum
-{
- XFSM_SHUTDOWN_COMMAND_POWEROFF = 0,
- XFSM_SHUTDOWN_COMMAND_REBOOT = 1,
-} XfsmShutdownCommand;
-
typedef struct _XfsmShutdownHelper XfsmShutdownHelper;
@@ -43,9 +38,12 @@
const gchar *password);
gboolean xfsm_shutdown_helper_send_command (XfsmShutdownHelper *helper,
- XfsmShutdownCommand command,
+ XfsmShutdownType command,
GError **error);
+gboolean xfsm_shutdown_helper_supports (XfsmShutdownHelper *helper,
+ XfsmShutdownType shutdown_type);
+
void xfsm_shutdown_helper_destroy (XfsmShutdownHelper *helper);
#endif /* !__XFSM_SHUTDOWN_HELPER_H__ */
More information about the Xfce4-commits
mailing list