changeset 18526:09db6fec9dce

Allow having a callback after the child process terminates. Use the callback to remove the temporary file used by the pager.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Fri, 13 Jul 2007 16:50:03 +0000
parents 59c361c2f25b
children 9da6977fd813 da550279d390
files finch/libgnt/gnt.h finch/libgnt/gntmain.c finch/libgnt/gnttextview.c
diffstat 3 files changed, 36 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/finch/libgnt/gnt.h	Fri Jul 13 16:05:30 2007 +0000
+++ b/finch/libgnt/gnt.h	Fri Jul 13 16:50:03 2007 +0000
@@ -153,7 +153,8 @@
  * Spawn a different application that will consume the console.
  */
 gboolean gnt_giveup_console(const char *wd, char **argv, char **envp,
-		gint *stin, gint *stout, gint *sterr);
+		gint *stin, gint *stout, gint *sterr,
+		void (*callback)(int status, gpointer data), gpointer data);
 
 gboolean gnt_is_refugee(void);
 
--- a/finch/libgnt/gntmain.c	Fri Jul 13 16:05:30 2007 +0000
+++ b/finch/libgnt/gntmain.c	Fri Jul 13 16:50:03 2007 +0000
@@ -306,7 +306,7 @@
 	                                 But irssi does this, so I am going to assume the
 	                                 crashes were caused by some other stuff. */
 
-	g_printerr("gntmain: setting up IO\n");
+	g_printerr("gntmain: setting up IO (%d)\n", channel_read_callback);
 }
 
 static gboolean
@@ -643,9 +643,21 @@
 }
 
 #if GLIB_CHECK_VERSION(2,4,0)
+typedef struct
+{
+	void (*callback)(int status, gpointer data);
+	gpointer data;
+} ChildProcess;
+
 static void
 reap_child(GPid pid, gint status, gpointer data)
 {
+	ChildProcess *cp = data;
+	if (cp->callback) {
+		cp->callback(status, cp->data);
+	}
+	g_free(cp);
+	clean_pid();
 	wm->mode = GNT_KP_MODE_NORMAL;
 	clear();
 	setup_io();
@@ -654,10 +666,12 @@
 #endif
 
 gboolean gnt_giveup_console(const char *wd, char **argv, char **envp,
-		gint *stin, gint *stout, gint *sterr)
+		gint *stin, gint *stout, gint *sterr,
+		void (*callback)(int status, gpointer data), gpointer data)
 {
 #if GLIB_CHECK_VERSION(2,4,0)
 	GPid pid = 0;
+	ChildProcess *cp = NULL;
 
 	if (!g_spawn_async_with_pipes(wd, argv, envp,
 			G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
@@ -665,9 +679,12 @@
 			&pid, stin, stout, sterr, NULL))
 		return FALSE;
 
+	cp = g_new0(ChildProcess, 1);
+	cp->callback = callback;
+	cp->data = data;
 	g_source_remove(channel_read_callback);
 	wm->mode = GNT_KP_MODE_WAIT_ON_CHILD;
-	g_child_watch_add(pid, reap_child, NULL);
+	g_child_watch_add(pid, reap_child, cp);
 
 	return TRUE;
 #else
--- a/finch/libgnt/gnttextview.c	Fri Jul 13 16:05:30 2007 +0000
+++ b/finch/libgnt/gnttextview.c	Fri Jul 13 16:50:03 2007 +0000
@@ -26,6 +26,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 enum
 {
@@ -795,6 +796,13 @@
 	view->flags |= flag;
 }
 
+static void
+pager_end_cb(int status, gpointer data)
+{
+	unlink(data);
+	g_free(data);
+}
+
 static gboolean
 check_for_pager_cb(GntWidget *widget, const char *key, GntTextView *view)
 {
@@ -803,6 +811,7 @@
 	static char path[1024];
 	static int len = -1;
 	FILE *file;
+	gboolean ret;
 
 	if (combin == NULL) {
 		combin = gnt_key_translate(gnt_style_get_from_name("pager", "key"));
@@ -826,8 +835,11 @@
 	argv[0] = gnt_style_get_from_name("pager", "path");
 	argv[0] = argv[0] ? argv[0] : getenv("PAGER");
 	argv[0] = argv[0] ? argv[0] : "less";
-	argv[1] = path;
-	return gnt_giveup_console(NULL, argv, NULL, NULL, NULL, NULL);
+	argv[1] = g_strdup(path);
+	ret = gnt_giveup_console(NULL, argv, NULL, NULL, NULL, NULL, pager_end_cb, argv[1]);
+	if (!ret)
+		g_free(argv[1]);
+	return ret;
 }
 
 void gnt_text_view_attach_pager_widget(GntTextView *view, GntWidget *pager)