diff -urN gnome-session-2.27.4/capplet/gsm-properties-dialog.c ../SUNWgnome-session-2.26.1.p12.hacked/gnome-session-2.27.4/capplet/gsm-properties-dialog.c --- gnome-session-2.27.4/capplet/gsm-properties-dialog.c 2009-07-01 13:45:30.000000000 +0100 +++ ../SUNWgnome-session-2.26.1.p12.hacked/gnome-session-2.27.4/capplet/gsm-properties-dialog.c 2009-07-21 14:49:15.145840020 +0100 @@ -35,6 +35,8 @@ #include "gsm-util.h" #include "gsp-app.h" #include "gsp-app-manager.h" +#include +#include #define GSM_PROPERTIES_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_PROPERTIES_DIALOG, GsmPropertiesDialogPrivate)) @@ -45,6 +47,10 @@ #define GTKBUILDER_FILE "session-properties.ui" +#define GSM_SERVICE_DBUS "org.gnome.SessionManager" +#define GSM_PATH_DBUS "/org/gnome/SessionManager" +#define GSM_INTERFACE_DBUS "org.gnome.SessionManager" + #define CAPPLET_TREEVIEW_WIDGET_NAME "session_properties_treeview" #define CAPPLET_ADD_WIDGET_NAME "session_properties_add_button" #define CAPPLET_DELETE_WIDGET_NAME "session_properties_delete_button" @@ -1246,10 +1253,113 @@ } static void +display_error (const char *message) +{ + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, "%s", message); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); +} + +static DBusGConnection * +get_session_bus (void) +{ + DBusGConnection *bus; + GError *error = NULL; + + bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); + + if (bus == NULL) { + g_warning ("Couldn't connect to session bus: %s", error->message); + g_error_free (error); + } + + return bus; +} + +static DBusGProxy * +get_sm_proxy (void) +{ + DBusGConnection *connection; + DBusGProxy *sm_proxy; + + connection = get_session_bus (); + if (connection == NULL) { + display_error (_("Could not connect to the session manager")); + return NULL; + } + + sm_proxy = dbus_g_proxy_new_for_name (connection, + GSM_SERVICE_DBUS, + GSM_PATH_DBUS, + GSM_INTERFACE_DBUS); + + if (sm_proxy == NULL) { + display_error (_("Could not connect to the session manager")); + return NULL; + } + + return sm_proxy; +} + +static char* +save_session (void) +{ + DBusGProxy *sm_proxy; + GError *error; + gboolean res = FALSE; + + sm_proxy = get_sm_proxy (); + if (sm_proxy == NULL) { + return NULL; + } + + error = NULL; + res = dbus_g_proxy_call (sm_proxy, + "SaveSession", + &error, + G_TYPE_INVALID, + G_TYPE_INVALID); + + if (!res) { + if (error != NULL) { + g_warning ("Failed to call save session: %s", + error->message); + g_error_free (error); + } else { + g_warning ("Failed to call save session"); + } + } + + if (sm_proxy != NULL) { + g_object_unref (sm_proxy); + } + + if (res) + return "Session saved successfully!"; +} + +static void on_save_session_clicked (GtkWidget *widget, GsmPropertiesDialog *dialog) { - g_debug ("Session saving is not implemented yet!"); + GtkWidget *message; + char *status=NULL; + + status = save_session (); + + if (status) { + message = gtk_message_dialog_new (GTK_WINDOW (dialog), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_OK, + status); + gtk_dialog_run (GTK_DIALOG (message)); + gtk_widget_destroy (message); + } } static void diff -urN -x '*.orig' gnome-session-2.26.1/gnome-session/gsm-manager.c ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/gsm-manager.c --- gnome-session-2.26.1/gnome-session/gsm-manager.c 2009-04-16 11:41:55.315470790 +0100 +++ ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/gsm-manager.c 2009-04-16 11:42:51.278978139 +0100 @@ -1913,6 +1913,18 @@ } static void +on_xsmp_client_save_request (GsmXSMPClient *client, + gboolean show_dialog, + GsmManager *manager) +{ + GError *error; + + g_debug ("GsmManager: save_request"); + error = NULL; + gsm_session_save (manager->priv->clients, &error); +} + +static void on_store_client_added (GsmStore *store, const char *id, GsmManager *manager) @@ -1933,6 +1945,10 @@ "logout-request", G_CALLBACK (on_xsmp_client_logout_request), manager); + g_signal_connect (client, + "save-request", + G_CALLBACK (on_xsmp_client_save_request), + manager); } g_signal_connect (client, @@ -2831,6 +2847,29 @@ } gboolean +gsm_manager_save_session (GsmManager *manager, + GError **error) +{ + g_debug ("GsmManager: SaveSession called"); + + g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE); + + if (manager->priv->phase != GSM_MANAGER_PHASE_RUNNING) { + g_set_error (error, + GSM_MANAGER_ERROR, + GSM_MANAGER_ERROR_NOT_IN_RUNNING, + "SaveSession interface is only available during the Running phase"); + return FALSE; + } + + g_debug ("GsmManager: SaveSession, saving"); + + maybe_save_session (manager); + + return TRUE; +} + +gboolean gsm_manager_can_shutdown (GsmManager *manager, gboolean *shutdown_available, GError **error) diff -urN -x '*.orig' gnome-session-2.26.1/gnome-session/gsm-manager.h ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/gsm-manager.h --- gnome-session-2.26.1/gnome-session/gsm-manager.h 2009-04-14 16:31:45.000000000 +0100 +++ ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/gsm-manager.h 2009-04-16 11:42:51.294073611 +0100 @@ -152,6 +152,9 @@ gboolean gsm_manager_shutdown (GsmManager *manager, GError **error); +gboolean gsm_manager_save_session (GsmManager *manager, + GError **error); + gboolean gsm_manager_can_shutdown (GsmManager *manager, gboolean *shutdown_available, GError **error); diff -urN -x '*.orig' gnome-session-2.26.1/gnome-session/gsm-xsmp-client.c ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/gsm-xsmp-client.c --- gnome-session-2.26.1/gnome-session/gsm-xsmp-client.c 2009-04-14 16:31:45.000000000 +0100 +++ ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/gsm-xsmp-client.c 2009-04-16 11:42:51.311373196 +0100 @@ -69,6 +69,7 @@ enum { REGISTER_REQUEST, LOGOUT_REQUEST, + SAVE_REQUEST, LAST_SIGNAL }; @@ -1011,6 +1012,17 @@ g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + signals[SAVE_REQUEST] = + g_signal_new ("save-request", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsmXSMPClientClass, save_request), + NULL, + NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, + 1, G_TYPE_BOOLEAN); + g_object_class_install_property (object_class, PROP_ICE_CONNECTION, diff -urN -x '*.orig' gnome-session-2.26.1/gnome-session/gsm-xsmp-client.h ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/gsm-xsmp-client.h --- gnome-session-2.26.1/gnome-session/gsm-xsmp-client.h 2009-04-14 16:31:45.000000000 +0100 +++ ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/gsm-xsmp-client.h 2009-04-16 11:42:51.323164917 +0100 @@ -54,7 +54,8 @@ char **client_id); gboolean (*logout_request) (GsmXSMPClient *client, gboolean prompt); - + gboolean (*save_request) (GsmXSMPClient *client, + gboolean prompt); void (*saved_state) (GsmXSMPClient *client); diff -urN -x '*.orig' gnome-session-2.26.1/gnome-session/org.gnome.SessionManager.xml ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/org.gnome.SessionManager.xml --- gnome-session-2.26.1/gnome-session/org.gnome.SessionManager.xml 2009-04-14 16:31:45.000000000 +0100 +++ ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/gnome-session/org.gnome.SessionManager.xml 2009-04-16 11:42:51.333867423 +0100 @@ -256,6 +256,14 @@ + + + + Request to save session + + + + diff -urN -x '*.orig' gnome-session-2.26.1/tools/gnome-session-save.c ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/tools/gnome-session-save.c --- gnome-session-2.26.1/tools/gnome-session-save.c 2009-04-14 16:31:45.000000000 +0100 +++ ../SUNWgnome-session-2.26.1.p13/gnome-session-2.26.1/tools/gnome-session-save.c 2009-04-16 11:44:36.581278915 +0100 @@ -240,11 +240,48 @@ } } +static gboolean +save_session (void) +{ + DBusGProxy *sm_proxy; + GError *error; + gboolean res = FALSE; + + sm_proxy = get_sm_proxy (); + if (sm_proxy == NULL) { + return TRUE; + } + + error = NULL; + res = dbus_g_proxy_call (sm_proxy, + "SaveSession", + &error, + G_TYPE_INVALID, + G_TYPE_INVALID); + + if (!res) { + if (error != NULL) { + g_warning ("Failed to call save session: %s", + error->message); + g_error_free (error); + } else { + g_warning ("Failed to call save session"); + } + } + + if (sm_proxy != NULL) { + g_object_unref (sm_proxy); + } + + return (!res); +} + int main (int argc, char *argv[]) { GError *error; int conflicting_options; + int exit_status = 0; /* Initialize the i18n stuff */ bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR); @@ -279,6 +316,9 @@ logout_dialog = TRUE; } + if (argc == 1) + exit_status = save_session (); + if (logout) { do_logout (GSM_LOGOUT_MODE_NO_CONFIRMATION); } else if (force_logout) { @@ -289,5 +329,5 @@ do_shutdown_dialog (); } - return 0; + return exit_status; }