new exciting GTK Main Control Window
[pygdb.git] / DbgTerminal.py
1 #!/usr/bin/python
2 #shuber, 2008-06-04
3
4 __author__ = "shuber"
5
6
7 import gtk
8 import pty
9 import string
10 import time
11 import threading
12 import vte
13
14 import ClientIOTerminal
15
16
17
18 class DbgTerminal (vte.Terminal):
19
20 lastrow = 0
21 history = []
22
23
24 def __init__(self, clientCmd):
25
26 vte.Terminal.__init__(self)
27
28 #Start debugger
29 self.clientCmd = clientCmd
30 self.fork_command( self.getDbgCommand(), self.getDbgArgv())
31
32 #Open pseudo-terminal where to-be-debugged process reads/writes to
33 self.client_ptymaster, self.client_ptyslave = pty.openpty()
34 self.setDbgPty(self.client_ptyslave)
35
36 #Set up terminal window and initialize debugger
37 self.connect("cursor-moved", self.contents_changed)
38 self.connect("eof", lambda *w: gtk.main_quit())
39
40
41 def contents_changed(self, term):
42 c,r = term.get_cursor_position()
43
44 if self.lastrow < r:
45 text = self.get_text_range(self.lastrow,0,r-1,-1,lambda *w:True)
46 self.history += string.split(text, "\n")
47 self.lastrow = r
48
49 def waitForDbgNewline(self):
50 r = self.lastrow
51 while not self.lastrow > r:
52 gtk.main_iteration()
53
54 def getHistoryLen(self):
55 return len(self.history)
56
57 def waitForDbgRx(self, rx, start=None):
58
59 if start == None:
60 start = self.getHistoryLen()
61 if start < 0:
62 start = 0
63
64 while True:
65 for no in range(start, self.getHistoryLen()):
66 line = self.history[no]
67 if rx.search(line):
68 return no, line
69
70 start = self.getHistoryLen()
71 self.waitForDbgNewline()
72
73
74 def getDbgCommand(self):
75 return self.getDbgArgv()[0];
76
77 def getDbgArgv(self):
78 raise NotImplementedError()
79
80 def setDbgPty(self, pty):
81 raise NotImplementedError()
82
83 def setDbgRun(self):
84 raise NotImplementedError()
85
86 def setDbgQuit(self):
87 raise NotImplementedError()
88
89 def setDbgContinue(self):
90 raise NotImplementedError()
91
92 def setDbgBreakpoint(self, file, lineno):
93 raise NotImplementedError()
94
95 def getDbgExpression(self, expr):
96 raise NotImplementedError()
97
98 def getDbgLastLine(self):
99 if len(self.history) == 0:
100 return None
101
102 return self.history[-1]
103
104 def feed_dbg(self, text):
105 self.feed_child(text)
106
107
108
109
110
111
112 class DbgWindow (gtk.Window):
113
114 clientIOWnd = None
115
116
117 def __init__(self, terminal):
118
119 #Set up some members
120 self.terminal = terminal
121
122 #Set up GTK stuff
123 gtk.Window.__init__(self)
124 self.connect("destroy", lambda *w: gtk.main_quit())
125
126 #Set title and add terminal
127 self.set_title("Debugger I/O")
128 self.terminal.history = []
129 self.terminal.history_length = 5
130 self.add(self.terminal)
131
132 #Show the window
133 self.show_all()
134
135 def toggleClientIOWindow(self):
136 if not self.clientIOWnd:
137 self.clientIOWnd = ClientIOTerminal.ClientIOWindow(self, self.terminal.client_ptymaster)
138 else:
139 self.clientIOWnd.destroy()
140 self.clientIOWnd = None
141
142 def isClientIOWindowExisting(self):
143 return self.clientIOWnd != None
144
145
146
147
148 def launchDebugger(wnd, term):
149
150 wnd.toggleClientIOWindow()
151
152 term.setDbgBreakpoint("main.cpp", 15)
153 term.setDbgRun()
154 res = term.getDbgExpression("a")
155 print "Result = ", res
156
157 term.setDbgQuit()
158
159
160