summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--configure.in1
-rw-r--r--src/reaper.c27
-rw-r--r--src/reaper.h2
-rw-r--r--src/vte.c3
5 files changed, 33 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index f4b19fb4..c8874a9f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2004-05-02 nalin
+ * src/reaper.c(vte_reaper_add_child): pass the global reaper in as
+ data when adding the child source, not the terminal which called us.
+ Stop accepting a data argument, because we'd discard it anyway. Return
+ the ID of the source which is added, if that happens.
+ * configure.in: define VTE_INVALID_SOURCE for internal use.
+
2004-05-01 nalin
* README: add pointers to info on bidirectional text and shaping.
diff --git a/configure.in b/configure.in
index 52b2b8b6..51b59ed2 100644
--- a/configure.in
+++ b/configure.in
@@ -231,6 +231,7 @@ fi
# Miscellaneous definitions.
AC_DEFINE(VTE_UTF8_BPC,6,[Maximum number of bytes used per UTF-8 character.])
+AC_DEFINE(VTE_INVALID_SOURCE,-1,[A number which can never be a valid source ID.])
AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE",[Package name.])
# Check for headers.
diff --git a/src/reaper.c b/src/reaper.c
index 118319f4..5c27752f 100644
--- a/src/reaper.c
+++ b/src/reaper.c
@@ -87,6 +87,10 @@ vte_reaper_emit_signal(GIOChannel *channel, GIOCondition condition,
g_assert(data == singleton_reaper);
read(singleton_reaper->iopipe[0], &info, sizeof(info));
if (info.signum == SIGCHLD) {
+ if (_vte_debug_on(VTE_DEBUG_SIGNALS)) {
+ fprintf(stderr, "Reaper emitting child-exited "
+ "signal.\n");
+ }
g_signal_emit_by_name(data, "child-exited",
info.pid, info.status);
}
@@ -97,26 +101,41 @@ vte_reaper_emit_signal(GIOChannel *channel, GIOCondition condition,
static void
vte_reaper_child_watch_cb(GPid pid, gint status, gpointer data)
{
+ if (_vte_debug_on(VTE_DEBUG_SIGNALS)) {
+ fprintf(stderr, "Reaper emitting child-exited signal.\n");
+ }
g_signal_emit_by_name(data, "child-exited", pid, status);
}
#endif
+static void
+vte_reaper_child_watch_destroyed(gpointer data)
+{
+ /* no-op */
+}
+
/**
* vte_reaper_add_child:
* @pid: the ID of a child process which will be monitored
- * @data: callback data
*
* Ensures that child-exited signals will be emitted when @pid exits. This is
* necessary for correct operation when running with glib versions >= 2.4.
*
+ * Returns: the new source ID
+ *
* Since 0.11.11
*/
-void
-vte_reaper_add_child(GPid pid, gpointer data)
+int
+vte_reaper_add_child(GPid pid)
{
#if GLIB_CHECK_VERSION(2,4,0)
- g_child_watch_add(pid, vte_reaper_child_watch_cb, data);
+ return g_child_watch_add_full(G_PRIORITY_HIGH,
+ pid,
+ vte_reaper_child_watch_cb,
+ vte_reaper_get(),
+ vte_reaper_child_watch_destroyed);
#endif
+ return VTE_INVALID_SOURCE;
}
static void
diff --git a/src/reaper.h b/src/reaper.h
index d8abf10a..73355817 100644
--- a/src/reaper.h
+++ b/src/reaper.h
@@ -58,7 +58,7 @@ GType vte_reaper_get_type(void);
VteReaperClass))
VteReaper *vte_reaper_get(void);
-void vte_reaper_add_child(GPid pid, gpointer data);
+int vte_reaper_add_child(GPid pid);
G_END_DECLS
diff --git a/src/vte.c b/src/vte.c
index f0ea0ed8..5deb58af 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -111,7 +111,6 @@ typedef gunichar wint_t;
#define VTE_REGCOMP_FLAGS REG_EXTENDED
#define VTE_REGEXEC_FLAGS 0
#define VTE_INPUT_CHUNK_SIZE 0x1000
-#define VTE_INVALID_SOURCE -1
#define VTE_INVALID_BYTE '?'
#define VTE_COALESCE_TIMEOUT 2
@@ -7138,7 +7137,7 @@ _vte_terminal_fork_basic(VteTerminal *terminal, const char *command,
/* Catch a child-exited signal from the child pid. */
reaper = vte_reaper_get();
- vte_reaper_add_child((GPid) pid, terminal);
+ vte_reaper_add_child((GPid) pid);
g_object_ref(G_OBJECT(reaper));
if (VTE_IS_REAPER(terminal->pvt->pty_reaper)) {
g_signal_handlers_disconnect_by_func(terminal->pvt->pty_reaper,