diff --git a/libegg/smclient/eggdesktopfile.c b/libegg/smclient/eggdesktopfile.c index 357e548..c185998 100644 --- a/libegg/smclient/eggdesktopfile.c +++ b/libegg/smclient/eggdesktopfile.c @@ -1440,6 +1440,7 @@ egg_set_desktop_file (const char *desktop_file_path) g_error_free (error); } +#if 0 if (egg_desktop_file) { /* Set localized application name and default window icon */ if (egg_desktop_file->name) @@ -1452,6 +1453,7 @@ egg_set_desktop_file (const char *desktop_file_path) gtk_window_set_default_icon_name (egg_desktop_file->icon); } } +#endif G_UNLOCK (egg_desktop_file); } diff --git a/libegg/smclient/eggsmclient-xsmp.c b/libegg/smclient/eggsmclient-xsmp.c index 1a56156..81af7d2 100644 --- a/libegg/smclient/eggsmclient-xsmp.c +++ b/libegg/smclient/eggsmclient-xsmp.c @@ -88,6 +88,8 @@ struct _EggSMClientXSMP char **restart_command; gboolean set_restart_command; int restart_style; + char **discard_command; + gboolean set_discard_command; guint idle; @@ -117,6 +119,9 @@ static void sm_client_xsmp_startup (EggSMClient *client, static void sm_client_xsmp_set_restart_command (EggSMClient *client, int argc, const char **argv); +static void sm_client_xsmp_set_discard_command (EggSMClient *client, + int argc, + const char **argv); static void sm_client_xsmp_will_quit (EggSMClient *client, gboolean will_quit); static gboolean sm_client_xsmp_end_session (EggSMClient *client, @@ -150,7 +155,7 @@ static SmProp *card8_prop (const char *name, static void set_properties (EggSMClientXSMP *xsmp, ...); static void delete_properties (EggSMClientXSMP *xsmp, ...); -static GPtrArray *generate_command (char **restart_command, +static GPtrArray *generate_command (char **argv, const char *client_id, const char *state_file); @@ -185,6 +190,7 @@ egg_sm_client_xsmp_class_init (EggSMClientXSMPClass *klass) sm_client_class->startup = sm_client_xsmp_startup; sm_client_class->set_restart_command = sm_client_xsmp_set_restart_command; + sm_client_class->set_discard_command = sm_client_xsmp_set_discard_command; sm_client_class->will_quit = sm_client_xsmp_will_quit; sm_client_class->end_session = sm_client_xsmp_end_session; } @@ -404,6 +410,24 @@ sm_client_xsmp_set_restart_command (EggSMClient *client, } static void +sm_client_xsmp_set_discard_command (EggSMClient *client, + int argc, + const char **argv) +{ + EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client; + int i; + + g_strfreev (xsmp->discard_command); + + xsmp->discard_command = g_new (char *, argc + 1); + for (i = 0; i < argc; i++) + xsmp->discard_command[i] = g_strdup (argv[i]); + xsmp->discard_command[i] = NULL; + + xsmp->set_discard_command = TRUE; +} + +static void sm_client_xsmp_will_quit (EggSMClient *client, gboolean will_quit) { @@ -771,7 +795,7 @@ save_state (EggSMClientXSMP *xsmp) GKeyFile *state_file; char *state_file_path, *data; EggDesktopFile *desktop_file; - GPtrArray *restart; + GPtrArray *restart, *discard; int offset, fd; /* We set xsmp->state before emitting save_state, but our caller is @@ -787,7 +811,18 @@ save_state (EggSMClientXSMP *xsmp) ptrarray_prop (SmRestartCommand, restart), NULL); g_ptr_array_free (restart, TRUE); - delete_properties (xsmp, SmDiscardCommand, NULL); + + if (xsmp->set_discard_command) + { + discard = generate_command (xsmp->discard_command, NULL, NULL); + set_properties (xsmp, + ptrarray_prop (SmDiscardCommand, discard), + NULL); + g_ptr_array_free (discard, TRUE); + } + else + delete_properties (xsmp, SmDiscardCommand, NULL); + return; } @@ -1041,14 +1076,14 @@ xsmp_shutdown_cancelled (SmcConn smc_conn, * then free the array, but not its contents. */ static GPtrArray * -generate_command (char **restart_command, const char *client_id, +generate_command (char **argv, const char *client_id, const char *state_file) { GPtrArray *cmd; int i; cmd = g_ptr_array_new (); - g_ptr_array_add (cmd, restart_command[0]); + g_ptr_array_add (cmd, argv[0]); if (client_id) { @@ -1062,8 +1097,8 @@ generate_command (char **restart_command, const char *client_id, g_ptr_array_add (cmd, (char *)state_file); } - for (i = 1; restart_command[i]; i++) - g_ptr_array_add (cmd, restart_command[i]); + for (i = 1; argv[i]; i++) + g_ptr_array_add (cmd, argv[i]); return cmd; } diff --git a/libegg/smclient/eggsmclient.c b/libegg/smclient/eggsmclient.c index efa901d..85aaee4 100644 --- a/libegg/smclient/eggsmclient.c +++ b/libegg/smclient/eggsmclient.c @@ -445,6 +445,27 @@ egg_sm_client_set_restart_command (EggSMClient *client, } /** + * egg_sm_client_set_discard_command: + * @client: the client + * @argc: the length of @argv + * @argv: argument vector + * + * Sets the command used to discard a custom state file if using + * egg_sm_client_set_restart_command(), which must be called before + * using this function. + **/ +void +egg_sm_client_set_discard_command (EggSMClient *client, + int argc, + const char **argv) +{ + g_return_if_fail (EGG_IS_SM_CLIENT (client)); + + if (EGG_SM_CLIENT_GET_CLASS (client)->set_discard_command) + EGG_SM_CLIENT_GET_CLASS (client)->set_discard_command (client, argc, argv); +} + +/** * egg_sm_client_will_quit: * @client: the client * @will_quit: whether or not the application is willing to quit diff --git a/libegg/smclient/eggsmclient.h b/libegg/smclient/eggsmclient.h index e620b75..f13bcec 100644 --- a/libegg/smclient/eggsmclient.h +++ b/libegg/smclient/eggsmclient.h @@ -72,6 +72,9 @@ struct _EggSMClientClass void (*set_restart_command) (EggSMClient *client, int argc, const char **argv); + void (*set_discard_command) (EggSMClient *client, + int argc, + const char **argv); void (*will_quit) (EggSMClient *client, gboolean will_quit); gboolean (*end_session) (EggSMClient *client, @@ -102,6 +105,9 @@ GKeyFile *egg_sm_client_get_state_file (EggSMClient *client); void egg_sm_client_set_restart_command (EggSMClient *client, int argc, const char **argv); +void egg_sm_client_set_discard_command (EggSMClient *client, + int argc, + const char **argv); /* Handling "quit_requested" signal */ void egg_sm_client_will_quit (EggSMClient *client,