Example #1
0
def main():
    parser = OptionParser(usage="usage: %prog command")
    (options, args) = parser.parse_args()
    if len(args) != 1:
        parser.print_help()
        sys.exit(1)

    win = Gtk.Window()
    textview = Gtk.TextView()
    textview.modify_font(Pango.FontDescription("Monospace"))
    textview.show()
    sw = Gtk.ScrolledWindow()
    sw.add(textview)
    sw.show()
    win.add(sw)
    win.set_default_size(Gdk.Screen.width() * 2 / 3,
                         Gdk.Screen.height() * 2 / 3)
    win.show()

    ## launch process
    proc = subprocess.Popen(args[0], shell=True, stdout=subprocess.PIPE,
                            bufsize=1, close_fds=True)
    win.set_title("%s (running)" % args[0])
    # print proc.stdout, type(proc.stdout), dir(proc.stdout)
    chan = GObject.IOChannel(filedes=proc.stdout.fileno())
    chan.set_flags(GObject.IO_FLAG_NONBLOCK)
    sink = tasklet.run(process_stdout_sink(chan, textview.get_buffer(),
                                           textview))

    ## child watch
    yield (tasklet.WaitForProcess(proc.pid),
           tasklet.WaitForSignal(win, "destroy"))

    if isinstance(tasklet.get_event(), tasklet.WaitForSignal):
        killproc(proc.pid)
        Gtk.main_quit()
    else:
        ## stop reader
        yield tasklet.Message("quit", dest=sink)
        win.set_title("%s (completed)" % args[0])
        yield tasklet.WaitForSignal(win, "destroy")
        tasklet.get_event()
        Gtk.main_quit()