summaryrefslogtreecommitdiffstats
path: root/gapk.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2013-06-27 14:56:13 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2013-06-27 14:56:13 +0200
commitaffb2e277df4fcf015a687a8a50b7c4f06497d80 (patch)
tree042a16b46b70bbd74ddc45b18154d39691fc606e /gapk.c
parent8a4ebdee31e20f4b41a96520510002f1b193745f (diff)
downloadgapk-affb2e277df4fcf015a687a8a50b7c4f06497d80.tar.bz2
gapk-affb2e277df4fcf015a687a8a50b7c4f06497d80.tar.xz
send output to a textview
Diffstat (limited to 'gapk.c')
-rw-r--r--gapk.c74
1 files changed, 58 insertions, 16 deletions
diff --git a/gapk.c b/gapk.c
index 27d8cba..31cfb89 100644
--- a/gapk.c
+++ b/gapk.c
@@ -4,6 +4,7 @@
struct apk_window {
GtkWidget *mainwin;
GtkWidget *vbox;
+ GtkWidget *textview;
GtkWidget *progress;
GtkWidget *buttonbox;
GtkWidget *button;
@@ -26,12 +27,31 @@ static gboolean progress_io_cb(GIOChannel *io, GIOCondition condition, gpointer
return TRUE;
}
+static gboolean output_io_cb(GIOChannel *io, GIOCondition condition, gpointer data)
+{
+ GtkTextBuffer *viewbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(data));
+ GtkTextIter iter;
+ GError *err = NULL;
+ gchar *line;
+ gsize len;
+ g_io_channel_read_line(io, &line, &len, NULL, &err);
+ if (line != NULL) {
+ gtk_text_buffer_get_end_iter(viewbuf, &iter);
+ gtk_text_buffer_insert(viewbuf, &iter, line, len);
+ g_free(line);
+ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(data), &iter, 0.0,
+ FALSE, 0, 0);
+ }
+ return TRUE;
+}
+
struct apk_window win;
-struct apk_window *win_init(int progress_fd)
+struct apk_window *win_init(int progress_fd, int out_fd, int err_fd)
{
- GIOChannel *io;
+ GIOChannel *progress_io, *out_io, *err_io;
+ GtkWidget *scrollwin = gtk_scrolled_window_new(NULL, NULL);
win.mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width(GTK_CONTAINER(win.mainwin), 10);
@@ -39,8 +59,16 @@ struct apk_window *win_init(int progress_fd)
win.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
+ gtk_widget_set_size_request(scrollwin, 640, 400);
+ win.textview = gtk_text_view_new();
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(win.textview), FALSE);
+ gtk_container_add(GTK_CONTAINER(scrollwin), win.textview);
+ gtk_widget_show(scrollwin);
+
+ gtk_box_pack_start(GTK_BOX(win.vbox), scrollwin, TRUE, TRUE, 0);
+ gtk_widget_show(win.textview);
+
win.progress = gtk_progress_bar_new();
- gtk_widget_set_size_request(win.progress, 300, -1);
gtk_box_pack_start(GTK_BOX(win.vbox), win.progress, FALSE, FALSE, 0);
gtk_widget_show(win.progress);
@@ -58,9 +86,14 @@ struct apk_window *win_init(int progress_fd)
gtk_widget_show(win.mainwin);
- io = g_io_channel_unix_new(progress_fd);
- g_printf("watching fd %i\n", progress_fd);
- g_io_add_watch(io, G_IO_IN, progress_io_cb, win.progress);
+ progress_io = g_io_channel_unix_new(progress_fd);
+ g_io_add_watch(progress_io, G_IO_IN, progress_io_cb, win.progress);
+
+ out_io = g_io_channel_unix_new(out_fd);
+ g_io_add_watch(out_io, G_IO_IN, output_io_cb, win.textview);
+
+ err_io = g_io_channel_unix_new(err_fd);
+ g_io_add_watch(err_io, G_IO_IN, output_io_cb, win.textview);
return &win;
}
@@ -78,18 +111,20 @@ void child_watch_cb(GPid pid, gint status, gpointer data)
g_spawn_close_pid(pid);
}
+#define PIPE_READ 0
+#define PIPE_WRITE 1
+
int main(int argc, char *argv[])
{
char **apk_argv;
- int progress_pipe[2];
+ int pipe_progress[2], pipe_stdout[2], pipe_stderr[2];
int i, n = 0;
char fd_str[32];
- GError *err = NULL;
GPid child_pid;
gtk_init(&argc, &argv);
- if (pipe(progress_pipe) < 0)
+ if (pipe(pipe_progress) < 0)
return 1;
apk_argv = g_malloc(sizeof(char *) * (argc + 4));
@@ -97,21 +132,28 @@ int main(int argc, char *argv[])
return 2;
apk_argv[n++] = "apk";
apk_argv[n++] = "--progress-fd";
- snprintf(fd_str, sizeof(fd_str)-1, "%i", progress_pipe[1]);
+ snprintf(fd_str, sizeof(fd_str)-1, "%i", pipe_progress[PIPE_WRITE]);
apk_argv[n++] = fd_str;
apk_argv[n++] = "--no-progress";
for (i = 0; i< argc-1; i++)
apk_argv[i + n] = argv[i+1];
apk_argv[i + n] = NULL;
- win_init(progress_pipe[0]);
- g_spawn_async(NULL, apk_argv, NULL, G_SPAWN_LEAVE_DESCRIPTORS_OPEN
- | G_SPAWN_SEARCH_PATH | G_SPAWN_CHILD_INHERITS_STDIN
- | G_SPAWN_DO_NOT_REAP_CHILD, child_setup,
- &progress_pipe[0], &child_pid, &err);
- close(progress_pipe[1]);
+ g_spawn_async_with_pipes(NULL, apk_argv, NULL,
+ G_SPAWN_LEAVE_DESCRIPTORS_OPEN
+ | G_SPAWN_SEARCH_PATH
+ | G_SPAWN_CHILD_INHERITS_STDIN
+ | G_SPAWN_DO_NOT_REAP_CHILD,
+ child_setup, &pipe_progress[PIPE_READ],
+ &child_pid,
+ NULL, pipe_stdout, pipe_stderr,
+ NULL);
+ close(pipe_progress[PIPE_WRITE]);
g_child_watch_add(child_pid, child_watch_cb, &win);
+ win_init(pipe_progress[PIPE_READ], pipe_stdout[PIPE_READ],
+ pipe_stderr[PIPE_READ]);
+
gtk_main();
return 0;
}