VirtualBox

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

Last change on this file since 70772 was 69500, checked in by vboxsync, 7 years ago

*: scm --update-copyright-year

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

© 2023 Oracle
ContactPrivacy policyTerms of Use