SF.net SVN: geany:[4549] branches/sm/src/sm.c
statc at users.sourceforge.net
statc at xxxxx
Sun Jan 24 20:24:52 UTC 2010
Revision: 4549
http://geany.svn.sourceforge.net/geany/?rev=4549&view=rev
Author: statc
Date: 2010-01-24 20:24:52 +0000 (Sun, 24 Jan 2010)
Log Message:
-----------
Use `GeanyDocument.file_name's instead of `GeanyDocument.real_path's in restart command like Geany session management facilities do.
Modified Paths:
--------------
branches/sm/src/sm.c
Modified: branches/sm/src/sm.c
===================================================================
--- branches/sm/src/sm.c 2010-01-24 20:24:33 UTC (rev 4548)
+++ branches/sm/src/sm.c 2010-01-24 20:24:52 UTC (rev 4549)
@@ -59,6 +59,7 @@
#include "main.h" /* for cl_options */
#include "ui_utils.h" /* access main_widgets.notebook to iterate over opened docs */
#include "document.h"
+#include "utils.h"
static void ice_connection_watch(IceConn icecon, IcePointer client_data, Bool opening,
@@ -390,26 +391,31 @@
static void sm_set_runtime_props(SmcConn smcon)
{
const gint page_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook));
- gint page;
GArray * arr;
- gint arr_real_len;
+ gint arr_real_len, arr_filenames_begin;
SmProp restart_command_prop, clone_command_prop;
SmPropValue * val;
SmProp * prop;
+ gint i;
/*
- * Allocate space for `page_count+4' elements:
+ * Allocate space for `page_count+5' elements:
* * two elements for program name and client ID;
* * possibly one element for "--no-session" option;
* * possibly one element for "--new-instance" option;
+ * * possible one element for "--" to separate options and filenames;
* * max `page_count' elements for file paths.
- * Store the number of actually used elements in `arr_real_len'.
+ * The number of actually used elements is saved in `arr_real_len'.
+ * Variable `arr_filenames_begin' stores the index in the array where
+ * the list of filenames begin. If there are no filenames in `arr',
+ * the value is -1.
*/
- arr = g_array_sized_new(FALSE, FALSE, sizeof(SmPropValue), page_count+4);
+ arr = g_array_sized_new(FALSE, FALSE, sizeof(SmPropValue), page_count + 5);
arr_real_len = 0;
+ arr_filenames_begin = -1;
((SmPropValue *)arr->data)[arr_real_len++] = sm_program_val;
((SmPropValue *)arr->data)[arr_real_len++] = sm_client_id_arg_val;
@@ -441,15 +447,29 @@
}
else
{
- /* specify file names in the command line */
- for (page = 0; page < page_count; page++)
+ /* Specify file names in the command line */
+
+ val = ((SmPropValue *)arr->data) + arr_real_len++;
+ val->length = 2; /* length of "--" */
+ val->value = "--";
+
+ arr_filenames_begin = arr_real_len;
+
+ /*
+ * NOTE: compare this cycle with the one inside
+ * configuration_save_session_files() function in keyfile.c.
+ */
+ for (i = 0; i < page_count; i++)
{
- GeanyDocument * doc = document_get_from_page(page);
- if (doc->real_path)
+ GeanyDocument * doc = document_get_from_page(i);
+ if (doc && doc->real_path)
{
+ /* this string will be freed when `arr' is no longer needed */
+ gchar * locale_filename = utils_get_locale_from_utf8(doc->file_name);
+
val = ((SmPropValue *)arr->data) + arr_real_len++;
- val->length = strlen(doc->real_path);
- val->value = doc->real_path;
+ val->length = strlen(locale_filename);
+ val->value = locale_filename;
}
}
}
@@ -470,10 +490,14 @@
clone_command_prop.name = SmCloneCommand;
clone_command_prop.type = SmLISTofARRAY8;
clone_command_prop.num_vals = arr_real_len - 1;
- clone_command_prop.vals = (SmPropValue *)arr->data + 1;
+ clone_command_prop.vals = ((SmPropValue *)arr->data) + 1;
prop = &clone_command_prop;
SmcSetProperties(smcon, 1, &prop);
+
+ if (arr_filenames_begin != -1)
+ for (i = arr_filenames_begin; i < arr_real_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.
More information about the Commits
mailing list