SF.net SVN: geany: [1454] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Sun Apr 15 19:25:23 UTC 2007


Revision: 1454
          http://svn.sourceforge.net/geany/?rev=1454&view=rev
Author:   eht16
Date:     2007-04-15 12:25:22 -0700 (Sun, 15 Apr 2007)

Log Message:
-----------
Run print command asynchronously to prevent blocking of the main process (closes #1695786).

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/document.c
    trunk/src/keyfile.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-04-15 18:09:59 UTC (rev 1453)
+++ trunk/ChangeLog	2007-04-15 19:25:22 UTC (rev 1454)
@@ -6,6 +6,9 @@
    src/main.c, src/prefs.c:
    Added context actions to run custom commands on current selection or
    the current word below cursor.
+ * src/document.c, src/keyfile.c:
+   Run print command asynchronously to prevent blocking of the main
+   process (closes #1695786).
 
 
 2007-04-15  Nick Treleaven  <nick.treleaven at btinternet.com>

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2007-04-15 18:09:59 UTC (rev 1453)
+++ trunk/src/document.c	2007-04-15 19:25:22 UTC (rev 1454)
@@ -1329,7 +1329,7 @@
 void document_replace_sel(gint idx, const gchar *find_text, const gchar *replace_text, gint flags,
 						  gboolean escaped_chars)
 {
-	gint selection_end, selection_start, selection_mode, selected_lines, last_line;
+	gint selection_end, selection_start, selection_mode, selected_lines, last_line = 0;
 	gint max_column = 0, count = 0;
 	gboolean replaced = FALSE;
 
@@ -1735,7 +1735,8 @@
 {
 	gchar *cmdline;
 
-	if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_name == NULL) return;
+	if (! DOC_IDX_VALID(idx) || doc_list[idx].file_name == NULL)
+		return;
 
 	cmdline = g_strdup(app->tools_print_cmd);
 	cmdline = utils_str_replace(cmdline, "%f", doc_list[idx].file_name);
@@ -1743,19 +1744,29 @@
 	if (dialogs_show_question(_("The file \"%s\" will be printed with the following command:\n\n%s"),
 								doc_list[idx].file_name, cmdline))
 	{
-		gint rc;
-		// system() is not the best way, but the only one I found to get the following working:
-		// a2ps -1 --medium=A4 -o - %f | xfprint4
-		rc = system(cmdline);
-		if (rc != 0)
+		GError *error = NULL;
+
+#ifdef G_OS_WIN32
+		gchar *tmp_cmdline = cmdline;
+#else
+		// /bin/sh -c emulates the system() call and makes complex commands possible
+		// but only needed on non-win32 systems due to the lack of win32's shell capabilities
+		gchar *tmp_cmdline = g_strconcat("/bin/sh -c \"", cmdline, "\"", NULL);
+#endif
+
+		if (! g_spawn_command_line_async(tmp_cmdline, &error))
 		{
-			dialogs_show_msgbox(GTK_MESSAGE_ERROR, _("Printing of \"%s\" failed (return code: %d)."),
-								doc_list[idx].file_name, rc);
+			dialogs_show_msgbox(GTK_MESSAGE_ERROR, _("Printing of \"%s\" failed (return code: %s)."),
+								doc_list[idx].file_name, error->message);
+			g_error_free(error);
 		}
 		else
 		{
 			msgwin_status_add(_("File %s printed."), doc_list[idx].file_name);
 		}
+#ifndef G_OS_WIN32
+		g_free(tmp_cmdline);
+#endif
 	}
 	g_free(cmdline);
 }

Modified: trunk/src/keyfile.c
===================================================================
--- trunk/src/keyfile.c	2007-04-15 18:09:59 UTC (rev 1453)
+++ trunk/src/keyfile.c	2007-04-15 19:25:22 UTC (rev 1454)
@@ -470,7 +470,12 @@
 	g_free(tmp_string);
 
 	tmp_string2 = g_find_program_in_path(GEANY_DEFAULT_TOOLS_PRINTCMD);
+#ifdef G_OS_WIN32
+	// single quote paths on Win32 for g_spawn_command_line_async
+	tmp_string = g_strconcat("'", tmp_string2, "' '%f'", NULL);
+#else
 	tmp_string = g_strconcat(tmp_string2, " %f", NULL);
+#endif
 	app->tools_print_cmd = utils_get_setting_string(config, "tools", "print_cmd", tmp_string);
 	g_free(tmp_string);
 	g_free(tmp_string2);


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