VirtualBox

source: vbox/trunk/src/VBox/Debugger/VBoxDbgConsole.h@ 64226

Last change on this file since 64226 was 62480, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.5 KB
Line 
1/* $Id: VBoxDbgConsole.h 62480 2016-07-22 18:29:41Z vboxsync $ */
2/** @file
3 * VBox Debugger GUI - Console.
4 */
5
6/*
7 * Copyright (C) 2006-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ___Debugger_VBoxDbgConsole_h
19#define ___Debugger_VBoxDbgConsole_h
20
21#include "VBoxDbgBase.h"
22
23#include <QTextEdit>
24#include <QComboBox>
25#include <QTimer>
26#include <QEvent>
27
28#include <iprt/critsect.h>
29#include <iprt/semaphore.h>
30#include <iprt/thread.h>
31
32
33class VBoxDbgConsoleOutput : public QTextEdit
34{
35 Q_OBJECT
36
37public:
38 /**
39 * Constructor.
40 *
41 * @param pParent Parent Widget.
42 * @param pszName Widget name.
43 */
44 VBoxDbgConsoleOutput(QWidget *pParent = NULL, const char *pszName = NULL);
45
46 /**
47 * Destructor
48 */
49 virtual ~VBoxDbgConsoleOutput();
50
51 /**
52 * Appends text.
53 * This differs from QTextEdit::append() in that it won't start on a new paragraph
54 * unless the previous char was a newline ('\n').
55 *
56 * @param rStr The text string to append.
57 * @param fClearSelection Whether to clear selected text before appending.
58 * If @c false the selection and window position
59 * are preserved.
60 */
61 virtual void appendText(const QString &rStr, bool fClearSelection);
62
63 /** The action to switch to black-on-white color scheme. */
64 QAction *m_pBlackOnWhiteAction;
65 /** The action to switch to green-on-black color scheme. */
66 QAction *m_pGreenOnBlackAction;
67
68 /** The action to switch to Courier font. */
69 QAction *m_pCourierFontAction;
70 /** The action to switch to Monospace font. */
71 QAction *m_pMonospaceFontAction;
72
73protected:
74 typedef enum { kGreenOnBlack, kBlackOnWhite } VBoxDbgConsoleColor;
75
76 /**
77 * Context menu event.
78 * This adds custom menu items for the output view.
79 *
80 * @param pEvent Pointer to the event.
81 */
82 virtual void contextMenuEvent(QContextMenuEvent *pEvent);
83
84 /** The current line (paragraph) number. */
85 unsigned m_uCurLine;
86 /** The position in the current line. */
87 unsigned m_uCurPos;
88 /** The handle to the GUI thread. */
89 RTNATIVETHREAD m_hGUIThread;
90 /** The current color scheme (foreground on background). */
91 VBoxDbgConsoleColor m_enmColorScheme;
92
93private slots:
94 /**
95 * The green-on-black color scheme context-menu item was triggered.
96 */
97 void setColorGreenOnBlack();
98
99 /**
100 * The black-on-white color scheme context-menu item was triggered.
101 */
102 void setColorBlackOnWhite();
103
104 /**
105 * The courier font family context-menu item was triggered.
106 */
107 void setFontCourier();
108
109 /**
110 * The monospace font family context-menu item was triggered.
111 */
112 void setFontMonospace();
113};
114
115
116/**
117 * The Debugger Console Input widget.
118 *
119 * This is a combobox which only responds to <return>.
120 */
121class VBoxDbgConsoleInput : public QComboBox
122{
123 Q_OBJECT
124
125public:
126 /**
127 * Constructor.
128 *
129 * @param pParent Parent Widget.
130 * @param pszName Widget name.
131 */
132 VBoxDbgConsoleInput(QWidget *pParent = NULL, const char *pszName = NULL);
133
134 /**
135 * Destructor
136 */
137 virtual ~VBoxDbgConsoleInput();
138
139 /**
140 * We overload this method to get signaled upon returnPressed().
141 *
142 * See QComboBox::setLineEdit for full description.
143 * @param pEdit The new line edit widget.
144 * @remark This won't be called during the constructor.
145 */
146 virtual void setLineEdit(QLineEdit *pEdit);
147
148signals:
149 /**
150 * New command submitted.
151 */
152 void commandSubmitted(const QString &rCommand);
153
154private slots:
155 /**
156 * Returned was pressed.
157 *
158 * Will emit commandSubmitted().
159 */
160 void returnPressed();
161
162protected:
163 /** The handle to the GUI thread. */
164 RTNATIVETHREAD m_hGUIThread;
165};
166
167
168/**
169 * The Debugger Console.
170 */
171class VBoxDbgConsole : public VBoxDbgBaseWindow
172{
173 Q_OBJECT
174
175public:
176 /**
177 * Constructor.
178 *
179 * @param a_pDbgGui Pointer to the debugger gui object.
180 * @param a_pParent Parent Widget.
181 */
182 VBoxDbgConsole(VBoxDbgGui *a_pDbgGui, QWidget *a_pParent = NULL);
183
184 /**
185 * Destructor
186 */
187 virtual ~VBoxDbgConsole();
188
189protected slots:
190 /**
191 * Handler called when a command is submitted.
192 * (Enter or return pressed in the combo box.)
193 *
194 * @param rCommand The submitted command.
195 */
196 void commandSubmitted(const QString &rCommand);
197
198 /**
199 * Updates the output with what's currently in the output buffer.
200 * This is called by a timer or a User event posted by the debugger thread.
201 */
202 void updateOutput();
203
204 /**
205 * Changes the focus to the input field.
206 */
207 void actFocusToInput();
208
209 /**
210 * Changes the focus to the output viewer widget.
211 */
212 void actFocusToOutput();
213
214protected:
215 /**
216 * Override the closeEvent so we can choose delete the window when
217 * it is closed.
218 *
219 * @param a_pCloseEvt The close event.
220 */
221 virtual void closeEvent(QCloseEvent *a_pCloseEvt);
222
223 /**
224 * Lock the object.
225 */
226 void lock();
227
228 /**
229 * Unlocks the object.
230 */
231 void unlock();
232
233protected:
234 /** @name Debug Console Backend.
235 * @{
236 */
237
238
239 /**
240 * Checks if there is input.
241 *
242 * @returns true if there is input ready.
243 * @returns false if there not input ready.
244 * @param pBack Pointer to VBoxDbgConsole::m_Back.
245 * @param cMillies Number of milliseconds to wait on input data.
246 */
247 static DECLCALLBACK(bool) backInput(PDBGCBACK pBack, uint32_t cMillies);
248
249 /**
250 * Read input.
251 *
252 * @returns VBox status code.
253 * @param pBack Pointer to VBoxDbgConsole::m_Back.
254 * @param pvBuf Where to put the bytes we read.
255 * @param cbBuf Maximum nymber of bytes to read.
256 * @param pcbRead Where to store the number of bytes actually read.
257 * If NULL the entire buffer must be filled for a
258 * successful return.
259 */
260 static DECLCALLBACK(int) backRead(PDBGCBACK pBack, void *pvBuf, size_t cbBuf, size_t *pcbRead);
261
262 /**
263 * Write (output).
264 *
265 * @returns VBox status code.
266 * @param pBack Pointer to VBoxDbgConsole::m_Back.
267 * @param pvBuf What to write.
268 * @param cbBuf Number of bytes to write.
269 * @param pcbWritten Where to store the number of bytes actually written.
270 * If NULL the entire buffer must be successfully written.
271 */
272 static DECLCALLBACK(int) backWrite(PDBGCBACK pBack, const void *pvBuf, size_t cbBuf, size_t *pcbWritten);
273
274 /**
275 * @copydoc FNDBGCBACKSETREADY
276 */
277 static DECLCALLBACK(void) backSetReady(PDBGCBACK pBack, bool fReady);
278
279 /**
280 * The Debugger Console Thread
281 *
282 * @returns VBox status code (ignored).
283 * @param Thread The thread handle.
284 * @param pvUser Pointer to the VBoxDbgConsole object.s
285 */
286 static DECLCALLBACK(int) backThread(RTTHREAD Thread, void *pvUser);
287
288 /** @} */
289
290protected:
291 /**
292 * Processes GUI command posted by the console thread.
293 *
294 * Qt3 isn't thread safe on any platform, meaning there is no locking, so, as
295 * a result we have to be very careful. All operations on objects which we share
296 * with the main thread has to be posted to it so it can perform it.
297 */
298 bool event(QEvent *pEvent);
299
300protected:
301 /** The output widget. */
302 VBoxDbgConsoleOutput *m_pOutput;
303 /** The input widget. */
304 VBoxDbgConsoleInput *m_pInput;
305 /** A hack to restore focus to the combobox after a command execution. */
306 bool m_fInputRestoreFocus;
307 /** The input buffer. */
308 char *m_pszInputBuf;
309 /** The amount of input in the buffer. */
310 size_t m_cbInputBuf;
311 /** The allocated size of the buffer. */
312 size_t m_cbInputBufAlloc;
313
314 /** The output buffer. */
315 char *m_pszOutputBuf;
316 /** The amount of output in the buffer. */
317 size_t m_cbOutputBuf;
318 /** The allocated size of the buffer. */
319 size_t m_cbOutputBufAlloc;
320 /** The timer object used to process output in a delayed fashion. */
321 QTimer *m_pTimer;
322 /** Set when an output update is pending. */
323 bool volatile m_fUpdatePending;
324
325 /** The debugger console thread. */
326 RTTHREAD m_Thread;
327 /** The event semaphore used to signal the debug console thread about input. */
328 RTSEMEVENT m_EventSem;
329 /** The critical section used to lock the object. */
330 RTCRITSECT m_Lock;
331 /** When set the thread will cause the debug console thread to terminate. */
332 bool volatile m_fTerminate;
333 /** Has the thread terminated?
334 * Used to do the right thing in closeEvent; the console is dead if the
335 * thread has terminated. */
336 bool volatile m_fThreadTerminated;
337
338 /** The debug console backend structure.
339 * Use VBOXDBGCONSOLE_FROM_DBGCBACK to convert the DBGCBACK pointer to a object pointer. */
340 struct VBoxDbgConsoleBack
341 {
342 DBGCBACK Core;
343 VBoxDbgConsole *pSelf;
344 } m_Back;
345
346 /**
347 * Converts a pointer to VBoxDbgConsole::m_Back to VBoxDbgConsole pointer.
348 * @todo find a better way because offsetof is undefined on objects and g++ gets very noisy because of that.
349 */
350# define VBOXDBGCONSOLE_FROM_DBGCBACK(pBack) ( ((struct VBoxDbgConsoleBack *)(pBack))->pSelf )
351
352 /** Change focus to the input field. */
353 QAction *m_pFocusToInput;
354 /** Change focus to the output viewer widget. */
355 QAction *m_pFocusToOutput;
356};
357
358
359/**
360 * Simple event class for push certain operations over
361 * onto the GUI thread.
362 */
363class VBoxDbgConsoleEvent : public QEvent
364{
365public:
366 typedef enum { kUpdate, kInputEnable, kTerminatedUser, kTerminatedOther } VBoxDbgConsoleEventType;
367 enum { kEventNumber = QEvent::User + 42 };
368
369 VBoxDbgConsoleEvent(VBoxDbgConsoleEventType enmCommand)
370 : QEvent((QEvent::Type)kEventNumber), m_enmCommand(enmCommand)
371 {
372 }
373
374 VBoxDbgConsoleEventType command() const
375 {
376 return m_enmCommand;
377 }
378
379private:
380 VBoxDbgConsoleEventType m_enmCommand;
381};
382
383
384#endif
385
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette