Revision: 4699 http://geany.svn.sourceforge.net/geany/?rev=4699&view=rev Author: statc Date: 2010-02-23 19:34:44 +0000 (Tue, 23 Feb 2010)
Log Message: ----------- Properly handle the case when "Preferences > General > Misc > Use project-based session files" check button is unchecked. An addition to r4693.
Modified Paths: -------------- branches/sm/src/sm.c
Modified: branches/sm/src/sm.c =================================================================== --- branches/sm/src/sm.c 2010-02-23 19:34:23 UTC (rev 4698) +++ branches/sm/src/sm.c 2010-02-23 19:34:44 UTC (rev 4699) @@ -72,6 +72,8 @@ static void sm_set_constant_props(SmcConn smcon); static void sm_store_props(const char * argv0, const char * libsm_client_id); static void sm_set_runtime_props(SmcConn smcon); +static void sm_cmd_props(); +static void sm_files_props();
static void sm_save_yourself_callback(SmcConn smcon, SmPointer client_data, int save_type, Bool shutdown, int interact_style, Bool fast); @@ -388,8 +390,6 @@ static void sm_set_runtime_props(SmcConn smcon) { GArray * arr = g_array_new(FALSE, FALSE, sizeof(SmPropValue)); - GOptionEntry * optentry; - SmPropValue val; SmProp * prop; SmProp restart_command_prop, clone_command_prop; gint i; @@ -397,7 +397,49 @@ g_array_append_val(arr, sm_program_val); g_array_append_val(arr, sm_client_id_arg_val);
- /* Handle command-line options */ + sm_cmd_props(arr); + sm_files_props(arr); + + restart_command_prop.name = SmRestartCommand; + restart_command_prop.type = SmLISTofARRAY8; + restart_command_prop.num_vals = arr->len; + restart_command_prop.vals = (SmPropValue *)arr->data; + prop = &restart_command_prop; + SmcSetProperties(smcon, 1, &prop); + + /* We should not specify client ID in SmCloneCommand, + * so "remove" the corresponding element from `arr'. */ + ((SmPropValue *)arr->data)[1] = sm_program_val; + clone_command_prop.name = SmCloneCommand; + clone_command_prop.type = SmLISTofARRAY8; + clone_command_prop.num_vals = arr->len - 1; + clone_command_prop.vals = ((SmPropValue *)arr->data) + 1; + prop = &clone_command_prop; + SmcSetProperties(smcon, 1, &prop); + + for (i = 2; i < (gint)arr->len; i++) + g_free(((SmPropValue *)arr->data)[i].value); + g_array_free(arr, TRUE); +} + + +/* + * Append SmPropValues containing Geany command line parameters to the specified array. + * + * @param arr An array of SmPropValues + * + * In order to determine which command line options to handle, global @c optentries_aux array + * is used. + * + * Each appended SmPropValue will store a dynamically allocated string, which must + * be freed by the caller with @c g_free(). + */ +static void sm_cmd_props(GArray * arr) +{ + GOptionEntry *optentry; + SmPropValue val; + gint i; + for (i = 0, optentry = optentries; optentry->long_name; i++, optentry++) { if (optentries_aux[i].persist_upon_restart) @@ -410,26 +452,45 @@ val.length = strlen(val.value); g_array_append_val(arr, val); } - /* elements are freed after `arr' is used */ g_array_free(arr2, TRUE); } } +}
- /* Handle opened files */ + +/* + * Append SmPropValues containing command line options to restore opened files and project, + * to the specified array. + * + * @param arr An array of SmPropValues + * + * Each appended SmPropValue will store a dynamically allocated string, which must + * be freed by the caller with @c g_free(). + */ +static void sm_files_props(GArray * arr) +{ + gboolean store_project = TRUE, store_files = TRUE; + SmPropValue val; + gint i; + if (cl_options.load_session) - { /* Files will be restored by Geany session management facilities. */ - } - else if (app->project) + store_project = store_files = FALSE; + + if (store_project && app->project) { - /* Files will be restored when the project is reopened. */ gchar * locale_filename = utils_get_locale_from_utf8(app->project->file_name); val.value = g_strconcat("--project=", locale_filename, NULL); val.length = strlen(val.value); g_free(locale_filename); g_array_append_val(arr, val); + + if (project_prefs.project_session) + /* Files will be restored when the project is reopened. */ + store_files = FALSE; } - else + + if (store_files) { /* Specify file names in the command line */ const gint page_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)); @@ -452,27 +513,6 @@ } } } - - restart_command_prop.name = SmRestartCommand; - restart_command_prop.type = SmLISTofARRAY8; - restart_command_prop.num_vals = arr->len; - restart_command_prop.vals = (SmPropValue *)arr->data; - prop = &restart_command_prop; - SmcSetProperties(smcon, 1, &prop); - - /* We should not specify client ID in SmCloneCommand, - * so "remove" the corresponding element from `arr'. */ - ((SmPropValue *)arr->data)[1] = sm_program_val; - clone_command_prop.name = SmCloneCommand; - clone_command_prop.type = SmLISTofARRAY8; - clone_command_prop.num_vals = arr->len - 1; - clone_command_prop.vals = ((SmPropValue *)arr->data) + 1; - prop = &clone_command_prop; - SmcSetProperties(smcon, 1, &prop); - - for (i = 2; i < (gint)arr->len; i++) - g_free(((SmPropValue *)arr->data)[i].value); - g_array_free(arr, TRUE); }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.