5 from ScrolledText
import ScrolledText
6 from Dialog
import Dialog
11 class ShellWindow(ScrolledText
):
13 def __init__(self
, master
=None, shell
=None, **cnf
):
16 shell
= os
.environ
['SHELL']
20 args
= string
.split(shell
)
23 apply(ScrolledText
.__init
__, (self
, master
), cnf
)
25 self
.bind('<Return>', self
.inputhandler
)
26 self
.bind('<Control-c>', self
.sigint
)
27 self
.bind('<Control-t>', self
.sigterm
)
28 self
.bind('<Control-k>', self
.sigkill
)
29 self
.bind('<Control-d>', self
.sendeof
)
31 self
.pid
, self
.fromchild
, self
.tochild
= spawn(shell
, args
)
32 self
.tk
.createfilehandler(self
.fromchild
, READABLE
,
35 def outputhandler(self
, file, mask
):
36 data
= os
.read(file, BUFSIZE
)
38 self
.tk
.deletefilehandler(file)
39 pid
, sts
= os
.waitpid(self
.pid
, 0)
40 print 'pid', pid
, 'status', sts
45 msg
= "exit status %d" % detail
47 msg
= "killed by signal %d" % (cause
& 0x7f)
49 msg
= msg
+ " -- core dumped"
57 self
.insert(END
, data
)
58 self
.pos
= self
.index("end - 1 char")
59 self
.yview_pickplace(END
)
61 def inputhandler(self
, *args
):
65 self
.insert(END
, "\n")
66 line
= self
.get(self
.pos
, "end - 1 char")
67 self
.pos
= self
.index(END
)
68 os
.write(self
.tochild
, line
)
71 def sendeof(self
, *args
):
75 os
.close(self
.tochild
)
78 def sendsig(self
, sig
):
82 os
.kill(self
.pid
, sig
)
85 def sigint(self
, *args
):
86 return self
.sendsig(signal
.SIGINT
)
88 def sigquit(self
, *args
):
89 return self
.sendsig(signal
.SIGQUIT
)
91 def sigterm(self
, *args
):
92 return self
.sendsig(signal
.SIGTERM
)
94 def sigkill(self
, *args
):
95 return self
.sendsig(signal
.SIGKILL
)
99 text
="No active process",
105 MAXFD
= 100 # Max number of file descriptors (os.getdtablesize()???)
107 def spawn(prog
, args
):
108 p2cread
, p2cwrite
= os
.pipe()
109 c2pread
, c2pwrite
= os
.pipe()
118 if os
.dup(p2cread
) <> 0:
119 sys
.stderr
.write('popen2: bad read dup\n')
120 if os
.dup(c2pwrite
) <> 1:
121 sys
.stderr
.write('popen2: bad write dup\n')
122 if os
.dup(c2pwrite
) <> 2:
123 sys
.stderr
.write('popen2: bad write dup\n')
124 os
.closerange(3, MAXFD
)
126 os
.execvp(prog
, args
)
128 sys
.stderr
.write('execvp failed\n')
132 return pid
, c2pread
, p2cwrite
135 shell
= string
.join(sys
.argv
[1:])
139 w
= ShellWindow(root
, shell
=shell
)
141 w
= ShellWindow(root
)
142 w
.pack(expand
=1, fill
=BOTH
)
146 if __name__
== '__main__':