diff -uNr old-lxsession-0.4.4//lxsession-logout/dbus-interface.c lxsession-0.4.4/lxsession-logout/dbus-interface.c --- old-lxsession-0.4.4//lxsession-logout/dbus-interface.c 2010-03-28 20:20:12.000000000 +0200 +++ lxsession-0.4.4/lxsession-logout/dbus-interface.c 2010-07-25 23:39:52.059867576 +0200 @@ -54,7 +54,7 @@ } /* Send a message. */ -static DBusMessage * dbus_send_message(DBusMessage * message) +static DBusMessage * dbus_send_message(DBusMessage * message, char * * error_text) { /* Get a connection handle. */ DBusConnection * connection = dbus_connect(); @@ -68,36 +68,25 @@ dbus_message_unref(message); if (reply == NULL) { - g_warning(G_STRLOC ": DBUS: %s", error.message); + if ((error.name == NULL) || (strcmp(error.name, DBUS_ERROR_NO_REPLY) != 0)) + { + if (error_text != NULL) + *error_text = g_strdup(error.message); + g_warning(G_STRLOC ": DBUS: %s", error.message); + } dbus_error_free(&error); } return reply; } -/* Send a message with no reply expected. */ -static gboolean dbus_send_message_without_reply(DBusMessage * message) -{ - /* Get a connection handle. */ - DBusConnection * connection = dbus_connect(); - if (connection == NULL) - return FALSE; - - /* Send the message in the blind. */ - dbus_bool_t status = dbus_connection_send(connection, message, NULL); - dbus_message_unref(message); - if ( ! status) - g_warning(G_STRLOC ": DBUS: dbus_connection_send failed\n"); - return status; -} - /* Read a result for a method that returns void. */ -static gboolean dbus_read_result_void(DBusMessage * reply) +static char * dbus_read_result_void(DBusMessage * reply) { if (reply != NULL) dbus_message_unref(reply); /* No result. Assume success. */ - return TRUE; + return NULL; } /* Read a result for a method that returns boolean. */ @@ -144,19 +133,21 @@ static gboolean dbus_ConsoleKit_query(const char * const query) { #ifdef HAVE_DBUS - return dbus_read_result_boolean(dbus_send_message(dbus_ConsoleKit_formulate_message(query))); + return dbus_read_result_boolean(dbus_send_message(dbus_ConsoleKit_formulate_message(query), NULL)); #else return FALSE; #endif } /* Send a specified message to the ConsoleKit interface and process a void result. */ -static gboolean dbus_ConsoleKit_command(const char * const command) +static char * dbus_ConsoleKit_command(const char * const command) { #ifdef HAVE_DBUS - return dbus_read_result_void(dbus_send_message(dbus_ConsoleKit_formulate_message(command))); + char * error = NULL; + dbus_read_result_void(dbus_send_message(dbus_ConsoleKit_formulate_message(command), &error)); + return error; #else - return FALSE; + return NULL; #endif } @@ -173,49 +164,49 @@ } /* Invoke the Stop method on ConsoleKit. */ -gboolean dbus_ConsoleKit_Stop(void) +char * dbus_ConsoleKit_Stop(void) { return dbus_ConsoleKit_command("Stop"); } /* Invoke the Restart method on ConsoleKit. */ -gboolean dbus_ConsoleKit_Restart(void) +char * dbus_ConsoleKit_Restart(void) { return dbus_ConsoleKit_command("Restart"); } -/*** DeviceKit Power mechanism ***/ +/*** UPower mechanism ***/ #ifdef HAVE_DBUS -/* Formulate a message to the DeviceKit Power interface. */ -static DBusMessage * dbus_DeviceKit_formulate_command(const char * const command) +/* Formulate a message to the UPower interface. */ +static DBusMessage * dbus_UPower_formulate_command(const char * const command) { return dbus_message_new_method_call( - "org.freedesktop.DeviceKit.Power", - "/org/freedesktop/DeviceKit/Power", - "org.freedesktop.DeviceKit.Power", + "org.freedesktop.UPower", + "/org/freedesktop/UPower", + "org.freedesktop.UPower", command); } #endif -/* Send a specified message to the DeviceKit interface and process a boolean result. */ -static gboolean dbus_DeviceKit_query(const char * const query) +/* Send a specified message to the UPower interface and process a boolean result. */ +static gboolean dbus_UPower_query(const char * const query) { #ifdef HAVE_DBUS /* Formulate a message to the Properties interface. */ DBusMessage * message = dbus_message_new_method_call( - "org.freedesktop.DeviceKit.Power", - "/org/freedesktop/DeviceKit/Power", + "org.freedesktop.UPower", + "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", "Get"); - const char * const interface_name = "org.freedesktop.DeviceKit.Power"; + const char * const interface_name = "org.freedesktop.UPower"; dbus_message_append_args(message, DBUS_TYPE_STRING, &interface_name, DBUS_TYPE_STRING, &query, DBUS_TYPE_INVALID); /* Send the message. */ - DBusMessage * reply = dbus_send_message(message); + DBusMessage * reply = dbus_send_message(message, NULL); if (reply == NULL) return FALSE; @@ -237,39 +228,40 @@ #endif } -/* Send a specified message to the DeviceKit interface and process a void result. */ -static gboolean dbus_DeviceKit_command(const char * const command) +/* Send a specified message to the UPower interface and process a void result. */ +static char * dbus_UPower_command(const char * const command) { #ifdef HAVE_DBUS - return dbus_read_result_void(dbus_send_message(dbus_DeviceKit_formulate_command(command))); -// return dbus_send_message_without_reply(dbus_DeviceKit_formulate_command(command)); It seems they don't send a reply; to be checked out + char * error = NULL; + dbus_read_result_void(dbus_send_message(dbus_UPower_formulate_command(command), &error)); + return error; #else - return FALSE; + return NULL; #endif } -/* Read the can-suspend property of DeviceKit/Power. */ -gboolean dbus_DeviceKit_CanSuspend(void) +/* Read the can-suspend property of UPower. */ +gboolean dbus_UPower_CanSuspend(void) { - return dbus_DeviceKit_query("CanSuspend"); + return dbus_UPower_query("CanSuspend"); } -/* Read the can-hibernate property of DeviceKit/Power. */ -gboolean dbus_DeviceKit_CanHibernate(void) +/* Read the can-hibernate property of UPower. */ +gboolean dbus_UPower_CanHibernate(void) { - return dbus_DeviceKit_query("CanHibernate"); + return dbus_UPower_query("CanHibernate"); } -/* Invoke the Suspend method on DeviceKit/Power. */ -gboolean dbus_DeviceKit_Suspend(void) +/* Invoke the Suspend method on UPower. */ +char * dbus_UPower_Suspend(void) { - return dbus_DeviceKit_command("Suspend"); + return dbus_UPower_command("Suspend"); } -/* Invoke the Hibernate method on DeviceKit/Power. */ -gboolean dbus_DeviceKit_Hibernate(void) +/* Invoke the Hibernate method on UPower. */ +char * dbus_UPower_Hibernate(void) { - return dbus_DeviceKit_command("Hibernate"); + return dbus_UPower_command("Hibernate"); } /*** HAL mechanism ***/ @@ -318,7 +310,7 @@ DBusMessage * message = dbus_HAL_formulate_string_property_query(property); if (message == NULL) return FALSE; - DBusMessage * reply = dbus_send_message(message); + DBusMessage * reply = dbus_send_message(message, NULL); if (reply == NULL) return FALSE; dbus_message_unref(reply); @@ -332,20 +324,20 @@ static gboolean dbus_HAL_boolean_query(const char * const property) { #ifdef HAVE_DBUS - return dbus_read_result_boolean(dbus_send_message(dbus_HAL_formulate_boolean_property_query(property))); + return dbus_read_result_boolean(dbus_send_message(dbus_HAL_formulate_boolean_property_query(property), NULL)); #else return FALSE; #endif } /* Send a specified message to the HAL interface and process a void result. */ -static gboolean dbus_HAL_command(const char * const command) +static char * dbus_HAL_command(const char * const command) { #ifdef HAVE_DBUS /* Formulate the message. */ DBusMessage * message = dbus_HAL_formulate_message(command); if (message == NULL) - return FALSE; + return NULL; /* Suspend has an argument. */ if (strcmp(command, "Suspend") == 0) @@ -355,9 +347,11 @@ } /* Send the message and wait for a reply. */ - return dbus_read_result_void(dbus_send_message(message)); + char * error = NULL; + dbus_read_result_void(dbus_send_message(message, &error)); + return error; #else - return FALSE; + return NULL; #endif } @@ -386,25 +380,25 @@ } /* Invoke the Shutdown method on HAL. */ -gboolean dbus_HAL_Shutdown(void) +char * dbus_HAL_Shutdown(void) { return dbus_HAL_command("Shutdown"); } /* Invoke the Reboot method on HAL. */ -gboolean dbus_HAL_Reboot(void) +char * dbus_HAL_Reboot(void) { return dbus_HAL_command("Reboot"); } /* Invoke the Suspend method on HAL. */ -gboolean dbus_HAL_Suspend(void) +char * dbus_HAL_Suspend(void) { return dbus_HAL_command("Suspend"); } /* Invoke the Hibernate method on HAL. */ -gboolean dbus_HAL_Hibernate(void) +char * dbus_HAL_Hibernate(void) { return dbus_HAL_command("Hibernate"); } diff -uNr old-lxsession-0.4.4//lxsession-logout/dbus-interface.h lxsession-0.4.4/lxsession-logout/dbus-interface.h --- old-lxsession-0.4.4//lxsession-logout/dbus-interface.h 2010-03-06 11:20:19.000000000 +0100 +++ lxsession-0.4.4/lxsession-logout/dbus-interface.h 2010-07-25 23:39:52.068871814 +0200 @@ -24,14 +24,14 @@ /* Interface to ConsoleKit for shutdown and reboot. */ extern gboolean dbus_ConsoleKit_CanStop(void); extern gboolean dbus_ConsoleKit_CanRestart(void); -extern gboolean dbus_ConsoleKit_Stop(void); -extern gboolean dbus_ConsoleKit_Restart(void); +extern char * dbus_ConsoleKit_Stop(void); +extern char * dbus_ConsoleKit_Restart(void); -/* Interface to DeviceKit/Power for suspend and hibernate. */ -extern gboolean dbus_DeviceKit_CanSuspend(void); -extern gboolean dbus_DeviceKit_CanHibernate(void); -extern gboolean dbus_DeviceKit_Suspend(void); -extern gboolean dbus_DeviceKit_Hibernate(void); +/* Interface to UPower for suspend and hibernate. */ +extern gboolean dbus_UPower_CanSuspend(void); +extern gboolean dbus_UPower_CanHibernate(void); +extern char * dbus_UPower_Suspend(void); +extern char * dbus_UPower_Hibernate(void); /* Interface to HAL for shutdown, reboot, suspend, and hibernate. * HAL is being replaced by the above two mechanisms; this support is legacy. */ @@ -39,9 +39,9 @@ extern gboolean dbus_HAL_CanReboot(void); extern gboolean dbus_HAL_CanSuspend(void); extern gboolean dbus_HAL_CanHibernate(void); -gboolean dbus_HAL_Shutdown(void); -gboolean dbus_HAL_Reboot(void); -gboolean dbus_HAL_Suspend(void); -gboolean dbus_HAL_Hibernate(void); +extern char * dbus_HAL_Shutdown(void); +extern char * dbus_HAL_Reboot(void); +extern char * dbus_HAL_Suspend(void); +extern char * dbus_HAL_Hibernate(void); #endif diff -uNr old-lxsession-0.4.4//lxsession-logout/lxsession-logout.c lxsession-0.4.4/lxsession-logout/lxsession-logout.c --- old-lxsession-0.4.4//lxsession-logout/lxsession-logout.c 2010-07-25 23:39:12.933867740 +0200 +++ lxsession-0.4.4/lxsession-logout/lxsession-logout.c 2010-07-25 23:50:55.106114634 +0200 @@ -53,6 +53,7 @@ typedef struct { GPid lxsession_pid; /* Process ID of lxsession */ + GtkWidget * error_label; /* Text of an error, if we get one */ int shutdown_available : 1; /* Shutdown is available */ int reboot_available : 1; /* Reboot is available */ @@ -62,20 +63,21 @@ int shutdown_ConsoleKit : 1; /* Shutdown is available via ConsoleKit */ int reboot_ConsoleKit : 1; /* Reboot is available via ConsoleKit */ - int suspend_DeviceKit : 1; /* Suspend is available via DeviceKit */ - int hibernate_DeviceKit : 1; /* Hibernate is available via DeviceKit */ + int suspend_UPower : 1; /* Suspend is available via UPower */ + int hibernate_UPower : 1; /* Hibernate is available via UPower */ int shutdown_HAL : 1; /* Shutdown is available via HAL */ int reboot_HAL : 1; /* Reboot is available via HAL */ int suspend_HAL : 1; /* Suspend is available via HAL */ int hibernate_HAL : 1; /* Hibernate is available via HAL */ int switch_user_GDM : 1; /* Switch User is available via GDM */ int switch_user_KDM : 1; /* Switch User is available via KDM */ - int ltsp : 1; /* under LTSP environment */ + int ltsp : 1; /* Shutdown and reboot is accomplished via LTSP */ } HandlerContext; static gboolean lock_screen(void); static gboolean verify_running(char * display_manager, char * executable); static void logout_clicked(GtkButton * button, HandlerContext * handler_context); +static void change_root_property(GtkWidget* w, const char* prop_name, const char* value); static void shutdown_clicked(GtkButton * button, HandlerContext * handler_context); static void reboot_clicked(GtkButton * button, HandlerContext * handler_context); static void suspend_clicked(GtkButton * button, HandlerContext * handler_context); @@ -187,6 +189,7 @@ gtk_main_quit(); } +/* Replace a property on the root window. */ static void change_root_property(GtkWidget* w, const char* prop_name, const char* value) { GdkDisplay* dpy = gtk_widget_get_display(w); @@ -199,59 +202,81 @@ /* Handler for "clicked" signal on Shutdown button. */ static void shutdown_clicked(GtkButton * button, HandlerContext * handler_context) { - if (G_UNLIKELY(handler_context->ltsp)) + char * error_result = NULL; + gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL); + + if (handler_context->ltsp) { change_root_property(GTK_WIDGET(button), "LTSP_LOGOUT_ACTION", "HALT"); kill(handler_context->lxsession_pid, SIGTERM); } else if (handler_context->shutdown_ConsoleKit) - dbus_ConsoleKit_Stop(); + error_result = dbus_ConsoleKit_Stop(); else if (handler_context->shutdown_HAL) - dbus_HAL_Shutdown(); - gtk_main_quit(); + error_result = dbus_HAL_Shutdown(); + if (error_result != NULL) + gtk_label_set_text(GTK_LABEL(handler_context->error_label), error_result); + else gtk_main_quit(); } /* Handler for "clicked" signal on Reboot button. */ static void reboot_clicked(GtkButton * button, HandlerContext * handler_context) { - if (G_UNLIKELY(handler_context->ltsp)) + char * error_result = NULL; + gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL); + + if (handler_context->ltsp) { change_root_property(GTK_WIDGET(button), "LTSP_LOGOUT_ACTION", "REBOOT"); kill(handler_context->lxsession_pid, SIGTERM); } else if (handler_context->reboot_ConsoleKit) - dbus_ConsoleKit_Restart(); + error_result = dbus_ConsoleKit_Restart(); else if (handler_context->reboot_HAL) - dbus_HAL_Reboot(); - gtk_main_quit(); + error_result = dbus_HAL_Reboot(); + if (error_result != NULL) + gtk_label_set_text(GTK_LABEL(handler_context->error_label), error_result); + else gtk_main_quit(); } /* Handler for "clicked" signal on Suspend button. */ static void suspend_clicked(GtkButton * button, HandlerContext * handler_context) { lock_screen(); - if (handler_context->suspend_DeviceKit) - dbus_DeviceKit_Suspend(); + char * error_result = NULL; + gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL); + + if (handler_context->suspend_UPower) + error_result = dbus_UPower_Suspend(); else if (handler_context->suspend_HAL) - dbus_HAL_Suspend(); - gtk_main_quit(); + error_result = dbus_HAL_Suspend(); + if (error_result != NULL) + gtk_label_set_text(GTK_LABEL(handler_context->error_label), error_result); + else gtk_main_quit(); } /* Handler for "clicked" signal on Hibernate button. */ static void hibernate_clicked(GtkButton * button, HandlerContext * handler_context) { lock_screen(); - if (handler_context->hibernate_DeviceKit) - dbus_DeviceKit_Hibernate(); + char * error_result = NULL; + gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL); + + if (handler_context->hibernate_UPower) + error_result = dbus_UPower_Hibernate(); else if (handler_context->hibernate_HAL) - dbus_HAL_Hibernate(); - gtk_main_quit(); + error_result = dbus_HAL_Hibernate(); + if (error_result != NULL) + gtk_label_set_text(GTK_LABEL(handler_context->error_label), error_result); + else gtk_main_quit(); } /* Handler for "clicked" signal on Switch User button. */ static void switch_user_clicked(GtkButton * button, HandlerContext * handler_context) { + lock_screen(); + gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL); if (handler_context->switch_user_GDM) g_spawn_command_line_sync("gdmflexiserver --startnew", NULL, NULL, NULL, NULL); else if (handler_context->switch_user_KDM) @@ -386,19 +411,17 @@ handler_context.reboot_ConsoleKit = TRUE; } -#ifdef LATENT_DEVICEKIT_SUPPORT - /* Initialize capabilities of the DeviceKit mechanism. */ - if (dbus_DeviceKit_CanSuspend()) + /* Initialize capabilities of the UPower mechanism. */ + if (dbus_UPower_CanSuspend()) { handler_context.suspend_available = TRUE; - handler_context.suspend_DeviceKit = TRUE; + handler_context.suspend_UPower = TRUE; } - if (dbus_DeviceKit_CanHibernate()) + if (dbus_UPower_CanHibernate()) { handler_context.hibernate_available = TRUE; - handler_context.hibernate_DeviceKit = TRUE; + handler_context.hibernate_UPower = TRUE; } -#endif /* Initialize capabilities of the HAL mechanism. */ if (!handler_context.shutdown_available && dbus_HAL_CanShutdown()) @@ -597,6 +620,11 @@ g_signal_connect(G_OBJECT(cancel_button), "clicked", G_CALLBACK(cancel_clicked), NULL); gtk_box_pack_start(GTK_BOX(controls), cancel_button, FALSE, FALSE, 4); + /* Create the error text. */ + handler_context.error_label = gtk_label_new(""); + gtk_label_set_justify(GTK_LABEL(handler_context.error_label), GTK_JUSTIFY_CENTER); + gtk_box_pack_start(GTK_BOX(controls), handler_context.error_label, FALSE, FALSE, 4); + /* Show everything. */ gtk_widget_show_all(window);