Re: libseed-list interpreter, reading stdout
- From: "Alan Knowles" <alan akbkhome com>
- To: "Jonatan Liljedahl" <j r liljedahl gmail com>
- Cc: libseed-list gnome org
- Subject: Re: libseed-list interpreter, reading stdout
- Date: Mon, 05 Jul 2010 13:09:12 +0800
Committed.
--- On 03/Jul/2010, Jonatan Liljedahl wrote:
> It seems that GLib.set_print_handler and family actually does work,
> except that Seeds 'print' builtin doesn't use g_print() but puts().
>
> This patch fixes it, and makes it consistent with 'printerr' (which
> already uses g_printerr()).
>
> diff --git a/libseed/seed-builtins.c b/libseed/seed-builtins.c
> index 41e1d5a..6bd84da 100644
> --- a/libseed/seed-builtins.c
> +++ b/libseed/seed-builtins.c
> @@ -225,7 +225,7 @@ seed_print (JSContextRef ctx,
>
> buf = seed_value_to_string (ctx, arguments[0], exception);
>
> - puts (buf);
> + g_print ("%s\n", buf);
> g_free (buf);
>
> return JSValueMakeUndefined (ctx);
>
>
> Alan Knowles wrote:
> > I ended up giving up when doing something similar.
> >
> > Since I was doing all sorts of GIR calls, I would often segfault the whole application by running the wrong thing in the sandbox.
> >
> > I ended up using a vte, and running another instance of seed and using a temporary file..
> > http://devel.akbkhome.com/seed/Vte.html
> >
> > Regards
> > Alan
> >
> > --- On 29/Jun/2010, Jonatan Liljedahl wrote:
> >> Hi,
> >> I'm making an interpreter program that creates a gtk window with a
> >> textview for log output, and listens on stdin. Every line that comes in
> >> is appended to a buffer until ^E is encountered, then the buffer is
> >> evaluated.
> >>
> >> I use this as a plugin for gedit, so that I can select text in a
> >> document and evaluate it in the seed interpreter while it's running, and
> >> since it's running a gtk mainloop I can use all stuff that needs this,
> >> like creating windows, setting up timers, etc "live".. (Right now it
> >> also parses the code through my AlgoScript parser, but it would be easy
> >> to bypass this for a flexible seed live-coding environment.)
> >>
> >> Now to the problem, for print() I can simply set ctx.global.print =
> >> myprint, where the latter is a function that appends text to the log
> >> window instead. But this doesn't work in all cases, since any imported
> >> module gets the default original print function in their context again,
> >> and also any errors or warnings printed from the C code still gets to
> >> stdout.. (like g_warning())
> >>
> >> One solution would be to use GLib.set_print_handler(),
> >> set_printerr_handler() and set_log_handler(), but these doesn't seem to
> >> work (probably needs some wrapper to call a supplied JS callback).
> >>
> >> So instead I want to just capture stdout, which would work for
> >> everything. I know how to capture stdout from a child process, but how
> >> do I capture my own stdout? I tried stuff like this:
> >>
> >> //var fd = os.dup(1);
> >> var fd = 1;
> >> var stdout = GLib.io_channel_unix_new(fd);
> >> GLib.io_channel_set_flags(stdout,GLib.IOFlags.NONBLOCK);
> >> GLib.io_add_watch(stdout, 0, GLib.IOCondition.IN, function(source,
> >> condition, data) {
> >> var x = new GLib.String;
> >> GLib.io_channel_read_line_string(source,x);
> >> _print(x.str);
> >> return true;
> >> });
> >>
> >> But all I can make it do is to redirect everything from stdin to this
> >> watcher (why this happens I don't understand), still triggering my
> >> stdin-watcher but only giving it empty strings..
> >>
> >> /Jonatan
> >> _______________________________________________
> >> libseed-list mailing list
> >> libseed-list gnome org
> >> http://mail.gnome.org/mailman/listinfo/libseed-list
> >
> > _______________________________________________
> > libseed-list mailing list
> > libseed-list gnome org
> > http://mail.gnome.org/mailman/listinfo/libseed-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]