SF.net SVN: geany: [1347] trunk
eht16 at users.sourceforge.net
eht16 at xxxxx
Thu Mar 1 10:54:38 UTC 2007
Revision: 1347
http://svn.sourceforge.net/geany/?rev=1347&view=rev
Author: eht16
Date: 2007-03-01 02:54:37 -0800 (Thu, 01 Mar 2007)
Log Message:
-----------
Applied patch from Jeff Pohlmeyer to improve the custom command execution code(thanks).
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/tools.c
trunk/src/utils.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-02-28 17:24:22 UTC (rev 1346)
+++ trunk/ChangeLog 2007-03-01 10:54:37 UTC (rev 1347)
@@ -1,3 +1,10 @@
+2007-03-01 Enrico Tröger <enrico.troeger at uvena.de>
+
+ * src/tools.c, src/utils.c:
+ Applied patch from Jeff Pohlmeyer to improve the custom command
+ execution code(thanks).
+
+
2007-02-28 Nick Treleaven <nick.treleaven at btinternet.com>
* src/msgwindow.c, src/msgwindow.h, src/search.c:
Modified: trunk/src/tools.c
===================================================================
--- trunk/src/tools.c 2007-02-28 17:24:22 UTC (rev 1346)
+++ trunk/src/tools.c 2007-03-01 10:54:37 UTC (rev 1347)
@@ -536,23 +536,35 @@
gint idx = GPOINTER_TO_INT(data);
gchar *msg = NULL;
GString *str = g_string_sized_new(256);
+ GIOStatus rv;
+ GError *err = NULL;
- while (g_io_channel_read_line(ioc, &msg, NULL, NULL, NULL) && msg != NULL)
+ do
{
- g_string_append(str, msg);
- g_free(msg);
- }
- /// without the following if we replace the selection several hundred times with "" because
- /// we get to often in this callback but I don't know why
- if (str->len > 0)
- {
+ rv = g_io_channel_read_line(ioc, &msg, NULL, NULL, &err);
+ if (msg != NULL)
+ {
+ g_string_append(str, msg);
+ g_free(msg);
+ }
+ if (err != NULL)
+ {
+ geany_debug("%s: %s", __func__, err->message);
+ g_error_free(err);
+ err = NULL;
+ }
+ } while (rv == G_IO_STATUS_NORMAL || rv == G_IO_STATUS_AGAIN);
+
+ if (rv == G_IO_STATUS_EOF)
+ { // Command completed successfully
sci_replace_sel(doc_list[idx].sci, str->str);
}
+ else
+ { // Something went wrong?
+ g_warning("%s: %s\n", __func__, "Incomplete command output");
+ }
g_string_free(str, TRUE);
-
- return TRUE;
}
-
return FALSE;
}
@@ -599,11 +611,9 @@
NULL, NULL, &pid, &stdin_fd, &stdout_fd, &stderr_fd, &error))
{
gchar *sel;
- gint len;
+ gint len, remaining, wrote;
// use GIOChannel to monitor stdout
- /// TODO there is something wrong with the whole channel code because the callback is
- /// called about several hundred times
utils_set_up_io_channel(stdout_fd, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
cc_iofunc, GINT_TO_POINTER(idx));
// copy program's stderr to Geany's stdout to help error tracking
@@ -616,7 +626,17 @@
sci_get_selected_text(doc_list[idx].sci, sel);
// write data to the command
- write(stdin_fd, sel, len - 1);
+ remaining = len - 1;
+ do
+ {
+ wrote = write(stdin_fd, sel, remaining);
+ if (wrote < 0)
+ {
+ g_warning("%s: %s: %m\n", __func__, "Failed sending data to command");
+ break;
+ }
+ remaining -= wrote;
+ } while (remaining > 0);
close(stdin_fd);
g_free(sel);
}
Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c 2007-02-28 17:24:22 UTC (rev 1346)
+++ trunk/src/utils.c 2007-03-01 10:54:37 UTC (rev 1347)
@@ -1211,14 +1211,16 @@
GIOChannel *utils_set_up_io_channel(gint fd, GIOCondition cond, GIOFunc func, gpointer data)
{
GIOChannel *ioc;
- GError *error = NULL;
- const gchar *encoding;
+ //const gchar *encoding;
ioc = g_io_channel_unix_new(fd);
g_io_channel_set_flags(ioc, G_IO_FLAG_NONBLOCK, NULL);
+ g_io_channel_set_encoding(ioc, NULL, NULL);
+/*
if (! g_get_charset(&encoding))
{ // hope this works reliably
+ GError *error = NULL;
g_io_channel_set_encoding(ioc, encoding, &error);
if (error)
{
@@ -1227,6 +1229,7 @@
return ioc;
}
}
+*/
// "auto-close" ;-)
g_io_channel_set_close_on_unref(ioc, 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