Index: src/terminal-app.h =================================================================== --- src/terminal-app.h (revision 3380) +++ src/terminal-app.h (working copy) @@ -93,6 +93,7 @@ gboolean terminal_app_handle_options (TerminalApp *app, TerminalOptions *options, + gboolean allow_resume, GError **error); void terminal_app_edit_profile (TerminalApp *app, Index: src/terminal-options.c =================================================================== --- src/terminal-options.c (revision 3380) +++ src/terminal-options.c (working copy) @@ -636,10 +636,6 @@ TerminalOptions *options = data; InitialTab *it; - /* make sure we have some window in case no options were given */ - if (options->initial_windows == NULL) - it = ensure_top_tab (options); - if (options->execute) { if (options->exec_argv == NULL) @@ -662,6 +658,25 @@ return TRUE; } +/** + * terminal_options_parse: + * @working_directory: the default working directory + * @display_name: the default X display name + * @startup_id: the startup notification ID + * @env: the environment as variable=value pairs + * @ignore_unknown_options: whether to ignore unknown options when parsing + * the arguments + * @argcp: (inout) address of the argument count. Changed if any arguments were handled + * @argvp: (inout) address of the argument vector. Any parameters understood by + * the terminal #GOptionContext are removed + * @error: a #GError to fill in + * @...: a %NULL terminated list of extra #GOptionGroups + * + * Parses the argument vector *@argvp. + * + * Returns: a new #TerminalOptions containing the windows and tabs to open, + * or %NULL on error. + */ TerminalOptions * terminal_options_parse (const char *working_directory, const char *display_name, @@ -758,6 +773,17 @@ return NULL; } +/** + * terminal_options_merge_config: + * @options: + * @key_file: a #GKeyFile containing to merge the options from + * @error: a #GError to fill in + * + * Merges the saved options from @key_file into @options. + * + * Returns: %TRUE if @key_file was a valid key file containing a stored + * terminal configuration, or %FALSE on error + */ gboolean terminal_options_merge_config (TerminalOptions *options, GKeyFile *key_file, @@ -864,7 +890,25 @@ return TRUE; } +/** + * terminal_options_ensure_window: + * @options: + * + * Ensure that @options will contain at least one window to open. + */ void +terminal_options_ensure_window (TerminalOptions *options) +{ + ensure_top_window (options); +} + +/** + * terminal_options_free: + * @options: + * + * Frees @options. + */ +void terminal_options_free (TerminalOptions *options) { g_list_foreach (options->initial_windows, (GFunc) initial_window_free, NULL); Index: src/terminal-options.h =================================================================== --- src/terminal-options.h (revision 3380) +++ src/terminal-options.h (working copy) @@ -97,12 +97,14 @@ int *argcp, char ***argvp, GError **error, - ...); + ...) G_GNUC_NULL_TERMINATED; gboolean terminal_options_merge_config (TerminalOptions *options, GKeyFile *key_file, GError **error); +void terminal_options_ensure_window (TerminalOptions *options); + void terminal_options_free (TerminalOptions *options); G_END_DECLS Index: src/terminal.c =================================================================== --- src/terminal.c (revision 3380) +++ src/terminal.c (working copy) @@ -475,7 +475,7 @@ terminal_app_initialize (options->use_factory); g_signal_connect (terminal_app_get (), "quit", G_CALLBACK (gtk_main_quit), NULL); - terminal_app_handle_options (terminal_app_get (), options, NULL); + terminal_app_handle_options (terminal_app_get (), options, TRUE /* allow resume */, NULL); terminal_options_free (options); /* Now change directory to $HOME so we don't prevent unmounting, e.g. if the @@ -499,7 +499,7 @@ static gboolean handle_new_terminal_event (TerminalOptions *options) { - terminal_app_handle_options (terminal_app_get (), options, NULL); + terminal_app_handle_options (terminal_app_get (), options, FALSE /* no resume */, NULL); return FALSE; } Index: src/terminal-app.c =================================================================== --- src/terminal-app.c (revision 3380) +++ src/terminal-app.c (working copy) @@ -1643,9 +1643,24 @@ return global_app; } +/** + * terminal_app_handle_options: + * @app: + * @options: a #TerminalOptions + * @allow_resume: whether to merge the terminal configuration from the + * saved session on resume + * @error: a #GError to fill in + * + * Processes @options. It loads or saves the terminal configuration, or + * opens the specified windows and tabs. + * + * Returns: %TRUE if @options could be successfully handled, or %FALSE on + * error + */ gboolean terminal_app_handle_options (TerminalApp *app, TerminalOptions *options, + gboolean allow_resume, GError **error) { GList *lw; @@ -1673,6 +1688,27 @@ /* fall-through on success */ } +#ifdef WITH_SMCLIENT +{ + EggSMClient *sm_client; + + sm_client = egg_sm_client_get (); + + if (allow_resume && egg_sm_client_is_resumed (sm_client)) + { + GKeyFile *key_file; + + key_file = egg_sm_client_get_state_file (sm_client); + if (key_file != NULL && + !terminal_options_merge_config (options, key_file, error)) + return FALSE; + } +} +#endif + + /* Make sure we option at least one window */ + terminal_options_ensure_window (options); + for (lw = options->initial_windows; lw != NULL; lw = lw->next) { InitialWindow *iw = lw->data;