a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/* $Id$ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @file
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * VBox Debugger GUI - Console.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
20e679981773e64a87a10aef7107d697712dffbcvboxsync * Copyright (C) 2006-2014 Oracle Corporation
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * available from http://www.virtualbox.org. This file is free software;
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * you can redistribute it and/or modify it under the terms of the GNU
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * General Public License (GPL) as published by the Free Software
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Header Files *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define LOG_GROUP LOG_GROUP_DBGG
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include "VBoxDbgConsole.h"
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QLabel>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QApplication>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QFont>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QLineEdit>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QHBoxLayout>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QAction>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QContextMenuEvent>
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync#include <QMenu>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/dbg.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/cfgm.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/err.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/thread.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/tcp.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/log.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/assert.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/asm.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/alloc.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/string.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g C o n s o l e O u t p u t
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g C o n s o l e O u t p u t
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g C o n s o l e O u t p u t
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsoleOutput::VBoxDbgConsoleOutput(QWidget *pParent/* = NULL*/, const char *pszName/* = NULL*/)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync : QTextEdit(pParent), m_uCurLine(0), m_uCurPos(0), m_hGUIThread(RTThreadNativeSelf())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setReadOnly(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setUndoRedoEnabled(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setOverwriteMode(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setPlainText("");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setTextInteractionFlags(Qt::TextBrowserInteraction);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setAutoFormatting(QTextEdit::AutoAll);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setTabChangesFocus(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setAcceptRichText(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /*
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * Font.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * Create actions for font menu items.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pCourierFontAction = new QAction(tr("Courier"), this);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pCourierFontAction->setCheckable(true);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pCourierFontAction->setShortcut(Qt::ControlModifier + Qt::Key_D);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync connect(m_pCourierFontAction, SIGNAL(triggered()), this, SLOT(setFontCourier()));
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pMonospaceFontAction = new QAction(tr("Monospace"), this);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pMonospaceFontAction->setCheckable(true);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pMonospaceFontAction->setShortcut(Qt::ControlModifier + Qt::Key_M);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync connect(m_pMonospaceFontAction, SIGNAL(triggered()), this, SLOT(setFontMonospace()));
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /* Create action group for grouping of exclusive font menu items. */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QActionGroup *pActionFontGroup = new QActionGroup(this);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pActionFontGroup->addAction(m_pCourierFontAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pActionFontGroup->addAction(m_pMonospaceFontAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pActionFontGroup->setExclusive(true);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /*
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * Color scheme.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * Create actions for color-scheme menu items.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pGreenOnBlackAction = new QAction(tr("Green On Black"), this);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pGreenOnBlackAction->setCheckable(true);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pGreenOnBlackAction->setShortcut(Qt::ControlModifier + Qt::Key_1);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync connect(m_pGreenOnBlackAction, SIGNAL(triggered()), this, SLOT(setColorGreenOnBlack()));
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pBlackOnWhiteAction = new QAction(tr("Black On White"), this);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pBlackOnWhiteAction->setCheckable(true);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pBlackOnWhiteAction->setShortcut(Qt::ControlModifier + Qt::Key_2);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync connect(m_pBlackOnWhiteAction, SIGNAL(triggered()), this, SLOT(setColorBlackOnWhite()));
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /* Create action group for grouping of exclusive color-scheme menu items. */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QActionGroup *pActionColorGroup = new QActionGroup(this);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pActionColorGroup->addAction(m_pGreenOnBlackAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pActionColorGroup->addAction(m_pBlackOnWhiteAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pActionColorGroup->setExclusive(true);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /*
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * Set the defaults (which syncs with the menu item checked state).
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync setFontCourier();
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync setColorGreenOnBlack();
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync NOREF(pszName);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync}
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncVBoxDbgConsoleOutput::~VBoxDbgConsoleOutput()
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync{
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync Assert(m_hGUIThread == RTThreadNativeSelf());
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync}
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncvoid
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncVBoxDbgConsoleOutput::contextMenuEvent(QContextMenuEvent *pEvent)
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync{
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /*
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * Create the context menu and add the menu items.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QMenu *pMenu = createStandardContextMenu();
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QMenu *pColorMenu = pMenu->addMenu(tr("Co&lor Scheme"));
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pColorMenu->addAction(m_pGreenOnBlackAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pColorMenu->addAction(m_pBlackOnWhiteAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QMenu *pFontMenu = pMenu->addMenu(tr("&Font Family"));
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pFontMenu->addAction(m_pCourierFontAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pFontMenu->addAction(m_pMonospaceFontAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync pMenu->exec(pEvent->globalPos());
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync delete pMenu;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync}
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncvoid
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncVBoxDbgConsoleOutput::setColorGreenOnBlack()
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync{
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync setStyleSheet("QTextEdit { background-color: black; color: rgb(0, 224, 0) }");
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_enmColorScheme = kGreenOnBlack;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /* This is used both as a trigger as well as called independently from code.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync When used as a trigger, the checked is done automatically by Qt. */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync if (!m_pGreenOnBlackAction->isChecked())
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pGreenOnBlackAction->setChecked(true);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync}
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncvoid
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncVBoxDbgConsoleOutput::setColorBlackOnWhite()
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync{
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync setStyleSheet("QTextEdit { background-color: white; color: black }");
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_enmColorScheme = kBlackOnWhite;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync if (!m_pBlackOnWhiteAction->isChecked())
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pBlackOnWhiteAction->setChecked(true);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync}
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncvoid
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncVBoxDbgConsoleOutput::setFontCourier()
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#ifdef Q_WS_MAC
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QFont Font("Monaco", 10, QFont::Normal, FALSE);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Font.setStyleStrategy(QFont::NoAntialias);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QFont Font = font();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Font.setStyleHint(QFont::TypeWriter);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Font.setFamily("Courier [Monotype]");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setFont(Font);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync if (!m_pCourierFontAction->isChecked())
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pCourierFontAction->setChecked(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncvoid
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncVBoxDbgConsoleOutput::setFontMonospace()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QFont Font = font();
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync Font.setStyleHint(QFont::TypeWriter);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync Font.setStyleStrategy(QFont::PreferAntialias);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync Font.setFamily("Monospace [Monotype]");
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync setFont(Font);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync if (!m_pMonospaceFontAction->isChecked())
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync m_pMonospaceFontAction->setChecked(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsyncVBoxDbgConsoleOutput::appendText(const QString &rStr, bool fClearSelection)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_hGUIThread == RTThreadNativeSelf());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (rStr.isEmpty() || rStr.isNull() || !rStr.length())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
84d5c8366b54a7c31e7f80287f2f00f199e567c0vboxsync * Insert all in one go and make sure it's visible.
84d5c8366b54a7c31e7f80287f2f00f199e567c0vboxsync *
84d5c8366b54a7c31e7f80287f2f00f199e567c0vboxsync * We need to move the cursor and unselect any selected text before
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync * inserting anything, otherwise, text will disappear.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QTextCursor Cursor = textCursor();
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync if (!fClearSelection && Cursor.hasSelection())
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync {
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync QTextCursor SavedCursor = Cursor;
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync Cursor.clearSelection();
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync Cursor.movePosition(QTextCursor::End);
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync Cursor.insertText(rStr);
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync setTextCursor(SavedCursor);
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync }
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync else
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync {
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync if (Cursor.hasSelection())
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync Cursor.clearSelection();
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync if (!Cursor.atEnd())
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync Cursor.movePosition(QTextCursor::End);
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync Cursor.insertText(rStr);
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync setTextCursor(Cursor);
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync ensureCursorVisible();
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g C o n s o l e I n p u t
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g C o n s o l e I n p u t
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g C o n s o l e I n p u t
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsoleInput::VBoxDbgConsoleInput(QWidget *pParent/* = NULL*/, const char *pszName/* = NULL*/)
7119da12ccdef5319114169b35259e542806c62cvboxsync : QComboBox(pParent), m_hGUIThread(RTThreadNativeSelf())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
7119da12ccdef5319114169b35259e542806c62cvboxsync addItem(""); /* invariant: empty command line is the last item */
7119da12ccdef5319114169b35259e542806c62cvboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setEditable(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setInsertPolicy(NoInsert);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setAutoCompletion(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setMaxCount(50);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const QLineEdit *pEdit = lineEdit();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pEdit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(pEdit, SIGNAL(returnPressed()), this, SLOT(returnPressed()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync NOREF(pszName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsoleInput::~VBoxDbgConsoleInput()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_hGUIThread == RTThreadNativeSelf());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsoleInput::setLineEdit(QLineEdit *pEdit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_hGUIThread == RTThreadNativeSelf());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QComboBox::setLineEdit(pEdit);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (lineEdit() == pEdit && pEdit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(pEdit, SIGNAL(returnPressed()), this, SLOT(returnPressed()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsoleInput::returnPressed()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_hGUIThread == RTThreadNativeSelf());
7119da12ccdef5319114169b35259e542806c62cvboxsync
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync QString strCommand = currentText();
7119da12ccdef5319114169b35259e542806c62cvboxsync /* TODO: trim whitespace? */
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync if (strCommand.isEmpty())
7119da12ccdef5319114169b35259e542806c62cvboxsync return;
7119da12ccdef5319114169b35259e542806c62cvboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* deal with the current command. */
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync emit commandSubmitted(strCommand);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
7119da12ccdef5319114169b35259e542806c62cvboxsync
7119da12ccdef5319114169b35259e542806c62cvboxsync /*
7119da12ccdef5319114169b35259e542806c62cvboxsync * Add current command to history.
7119da12ccdef5319114169b35259e542806c62cvboxsync */
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync bool fNeedsAppending = true;
7119da12ccdef5319114169b35259e542806c62cvboxsync
7119da12ccdef5319114169b35259e542806c62cvboxsync /* invariant: empty line at the end */
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync int iLastItem = count() - 1;
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync Assert(itemText(iLastItem).isEmpty());
7119da12ccdef5319114169b35259e542806c62cvboxsync
7119da12ccdef5319114169b35259e542806c62cvboxsync /* have previous command? check duplicate. */
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync if (iLastItem > 0)
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync {
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync const QString strPrevCommand(itemText(iLastItem - 1));
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync if (strCommand == strPrevCommand)
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync fNeedsAppending = false;
7119da12ccdef5319114169b35259e542806c62cvboxsync }
7119da12ccdef5319114169b35259e542806c62cvboxsync
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync if (fNeedsAppending)
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync {
7119da12ccdef5319114169b35259e542806c62cvboxsync /* history full? drop the oldest command. */
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync if (count() == maxCount())
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync {
7119da12ccdef5319114169b35259e542806c62cvboxsync removeItem(0);
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync --iLastItem;
7119da12ccdef5319114169b35259e542806c62cvboxsync }
7119da12ccdef5319114169b35259e542806c62cvboxsync
7119da12ccdef5319114169b35259e542806c62cvboxsync /* insert before the empty line. */
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync insertItem(iLastItem, strCommand);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
7119da12ccdef5319114169b35259e542806c62cvboxsync /* invariant: empty line at the end */
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync int iNewLastItem = count() - 1;
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync Assert(itemText(iNewLastItem).isEmpty());
7119da12ccdef5319114169b35259e542806c62cvboxsync
7119da12ccdef5319114169b35259e542806c62cvboxsync /* select empty line to present "new" command line to the user */
aaed284a3d84d1fa100786d9e3d4c73f13b10cfevboxsync setCurrentIndex(iNewLastItem);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g C o n s o l e
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g C o n s o l e
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g C o n s o l e
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::VBoxDbgConsole(VBoxDbgGui *a_pDbgGui, QWidget *a_pParent/* = NULL*/)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync : VBoxDbgBaseWindow(a_pDbgGui, a_pParent), m_pOutput(NULL), m_pInput(NULL), m_fInputRestoreFocus(false),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pszInputBuf(NULL), m_cbInputBuf(0), m_cbInputBufAlloc(0),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pszOutputBuf(NULL), m_cbOutputBuf(0), m_cbOutputBufAlloc(0),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pTimer(NULL), m_fUpdatePending(false), m_Thread(NIL_RTTHREAD), m_EventSem(NIL_RTSEMEVENT),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_fTerminate(false), m_fThreadTerminated(false)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setWindowTitle("VBoxDbg - Console");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create the output text box.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pOutput = new VBoxDbgConsoleOutput(this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* try figure a suitable size */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QLabel *pLabel = new QLabel( "11111111111111111111111111111111111111111111111111111111111111111111111111111112222222222", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel->setFont(m_pOutput->font());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QSize Size = pLabel->sizeHint();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete pLabel;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Size.setWidth((int)(Size.width() * 1.10));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Size.setHeight(Size.width() / 2);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync resize(Size);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create the input combo box (with a label).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QHBoxLayout *pLayout = new QHBoxLayout();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync //pLayout->setSizeConstraint(QLayout::SetMaximumSize);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel = new QLabel(" Command ");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLayout->addWidget(pLabel);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel->setMaximumSize(pLabel->sizeHint());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel->setAlignment(Qt::AlignCenter);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput = new VBoxDbgConsoleInput(NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLayout->addWidget(m_pInput);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput->setDuplicatesEnabled(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pInput, SIGNAL(commandSubmitted(const QString &)), this, SLOT(commandSubmitted(const QString &)));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync# if 0//def Q_WS_MAC
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel = new QLabel(" ");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLayout->addWidget(pLabel);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel->setMaximumSize(20, m_pInput->sizeHint().height() + 6);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel->setMinimumSize(20, m_pInput->sizeHint().height() + 6);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync# endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QWidget *pHBox = new QWidget(this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pHBox->setLayout(pLayout);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput->setEnabled(false); /* (we'll get a ready notification) */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Vertical layout box on the whole widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QVBoxLayout *pVLayout = new QVBoxLayout();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pVLayout->setContentsMargins(0, 0, 0, 0);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pVLayout->setSpacing(5);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pVLayout->addWidget(m_pOutput);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pVLayout->addWidget(pHBox);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setLayout(pVLayout);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * The tab order is from input to output, not the other way around as it is by default.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setTabOrder(m_pInput, m_pOutput);
d227b5f558b8360c7e17b0adf7b1240270696000vboxsync m_fInputRestoreFocus = true; /* hack */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Setup the timer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pTimer = new QTimer(this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pTimer, SIGNAL(timeout()), SLOT(updateOutput()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Init the backend structure.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_Back.Core.pfnInput = backInput;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_Back.Core.pfnRead = backRead;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_Back.Core.pfnWrite = backWrite;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_Back.Core.pfnSetReady = backSetReady;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_Back.pSelf = this;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create the critical section, the event semaphore and the debug console thread.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = RTCritSectInit(&m_Lock);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertRC(rc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = RTSemEventCreate(&m_EventSem);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertRC(rc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = RTThreadCreate(&m_Thread, backThread, this, 0, RTTHREADTYPE_DEBUGGER, RTTHREADFLAGS_WAITABLE, "VBoxDbgC");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertRC(rc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_Thread = NIL_RTTHREAD;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Shortcuts.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pFocusToInput = new QAction("", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pFocusToInput->setShortcut(QKeySequence("Ctrl+L"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync addAction(m_pFocusToInput);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pFocusToInput, SIGNAL(triggered(bool)), this, SLOT(actFocusToInput()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pFocusToOutput = new QAction("", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pFocusToOutput->setShortcut(QKeySequence("Ctrl+O"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync addAction(m_pFocusToOutput);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pFocusToOutput, SIGNAL(triggered(bool)), this, SLOT(actFocusToOutput()));
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync addAction(m_pOutput->m_pBlackOnWhiteAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync addAction(m_pOutput->m_pGreenOnBlackAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync addAction(m_pOutput->m_pCourierFontAction);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync addAction(m_pOutput->m_pMonospaceFontAction);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::~VBoxDbgConsole()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(isGUIThread());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Wait for the thread.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ASMAtomicWriteBool(&m_fTerminate, true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTSemEventSignal(m_EventSem);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_Thread != NIL_RTTHREAD)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = RTThreadWait(m_Thread, 15000, NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertRC(rc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_Thread = NIL_RTTHREAD;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Free resources.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete m_pTimer;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pTimer = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTCritSectDelete(&m_Lock);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTSemEventDestroy(m_EventSem);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_EventSem = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pOutput = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_pszInputBuf)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTMemFree(m_pszInputBuf);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pszInputBuf = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cbInputBuf = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cbInputBufAlloc = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete m_pFocusToInput;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pFocusToInput = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete m_pFocusToOutput;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pFocusToOutput = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::commandSubmitted(const QString &rCommand)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(isGUIThread());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync lock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTSemEventSignal(m_EventSem);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QByteArray Utf8Array = rCommand.toUtf8();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *psz = Utf8Array.constData();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cb = strlen(psz);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Make sure we've got space for the input.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (cb + m_cbInputBuf >= m_cbInputBufAlloc)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cbNew = RT_ALIGN_Z(cb + m_cbInputBufAlloc + 1, 128);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void *pv = RTMemRealloc(m_pszInputBuf, cbNew);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pv)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pszInputBuf = (char *)pv;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cbInputBufAlloc = cbNew;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Add the input and output it.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(m_pszInputBuf + m_cbInputBuf, psz, cb);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cbInputBuf += cb;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pszInputBuf[m_cbInputBuf++] = '\n';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync m_pOutput->appendText(rCommand + "\n", true /*fClearSelection*/);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pOutput->ensureCursorVisible();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_fInputRestoreFocus = m_pInput->hasFocus(); /* dirty focus hack */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput->setEnabled(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("VBoxDbgConsole::commandSubmitted: %s (input-enabled=%RTbool)\n", psz, m_pInput->isEnabled()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::updateOutput()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(isGUIThread());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync lock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_fUpdatePending = false;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_cbOutputBuf)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync m_pOutput->appendText(QString::fromUtf8((const char *)m_pszOutputBuf, (int)m_cbOutputBuf), false /*fClearSelection*/);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cbOutputBuf = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Lock the object.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::lock()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTCritSectEnter(&m_Lock);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Unlocks the object.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::unlock()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTCritSectLeave(&m_Lock);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Checks if there is input.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns true if there is input ready.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns false if there not input ready.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pBack Pointer to VBoxDbgConsole::m_Back.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cMillies Number of milliseconds to wait on input data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ DECLCALLBACK(bool)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::backInput(PDBGCBACK pBack, uint32_t cMillies)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsole *pThis = VBOXDBGCONSOLE_FROM_DBGCBACK(pBack);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->lock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool fRc = true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pThis->m_cbInputBuf)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Wait outside the lock for the requested time, then check again.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTSemEventWait(pThis->m_EventSem, cMillies);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->lock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync fRc = pThis->m_cbInputBuf
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || ASMAtomicUoReadBool(&pThis->m_fTerminate);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return fRc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Read input.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns VBox status code.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pBack Pointer to VBoxDbgConsole::m_Back.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pvBuf Where to put the bytes we read.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cbBuf Maximum nymber of bytes to read.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pcbRead Where to store the number of bytes actually read.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * If NULL the entire buffer must be filled for a
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * successful return.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ DECLCALLBACK(int)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::backRead(PDBGCBACK pBack, void *pvBuf, size_t cbBuf, size_t *pcbRead)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsole *pThis = VBOXDBGCONSOLE_FROM_DBGCBACK(pBack);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pcbRead); /** @todo implement this bit */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbRead)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbRead = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->lock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!ASMAtomicUoReadBool(&pThis->m_fTerminate))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pThis->m_cbInputBuf)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *psz = pThis->m_pszInputBuf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cbRead = RT_MIN(pThis->m_cbInputBuf, cbBuf);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(pvBuf, psz, cbRead);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz += cbRead;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->m_cbInputBuf -= cbRead;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (*psz)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memmove(pThis->m_pszInputBuf, psz, pThis->m_cbInputBuf);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->m_pszInputBuf[pThis->m_cbInputBuf] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbRead = cbRead;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = VERR_GENERAL_FAILURE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Write (output).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns VBox status code.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pBack Pointer to VBoxDbgConsole::m_Back.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pvBuf What to write.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cbBuf Number of bytes to write.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pcbWritten Where to store the number of bytes actually written.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * If NULL the entire buffer must be successfully written.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ DECLCALLBACK(int)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::backWrite(PDBGCBACK pBack, const void *pvBuf, size_t cbBuf, size_t *pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsole *pThis = VBOXDBGCONSOLE_FROM_DBGCBACK(pBack);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->lock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (cbBuf + pThis->m_cbOutputBuf >= pThis->m_cbOutputBufAlloc)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cbNew = RT_ALIGN_Z(cbBuf + pThis->m_cbOutputBufAlloc + 1, 1024);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void *pv = RTMemRealloc(pThis->m_pszOutputBuf, cbNew);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pv)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbWritten = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_NO_MEMORY;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->m_pszOutputBuf = (char *)pv;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->m_cbOutputBufAlloc = cbNew;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Add the output.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(pThis->m_pszOutputBuf + pThis->m_cbOutputBuf, pvBuf, cbBuf);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->m_cbOutputBuf += cbBuf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->m_pszOutputBuf[pThis->m_cbOutputBuf] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbWritten = cbBuf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (ASMAtomicUoReadBool(&pThis->m_fTerminate))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = VERR_GENERAL_FAILURE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Tell the GUI thread to draw this text.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * We cannot do it from here without frequent crashes.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pThis->m_fUpdatePending)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QApplication::postEvent(pThis, new VBoxDbgConsoleEvent(VBoxDbgConsoleEvent::kUpdate));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ DECLCALLBACK(void)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::backSetReady(PDBGCBACK pBack, bool fReady)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsole *pThis = VBOXDBGCONSOLE_FROM_DBGCBACK(pBack);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (fReady)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QApplication::postEvent(pThis, new VBoxDbgConsoleEvent(VBoxDbgConsoleEvent::kInputEnable));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The Debugger Console Thread
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns VBox status code (ignored).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param Thread The thread handle.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pvUser Pointer to the VBoxDbgConsole object.s
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ DECLCALLBACK(int)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::backThread(RTTHREAD Thread, void *pvUser)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsole *pThis = (VBoxDbgConsole *)pvUser;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync LogFlow(("backThread: Thread=%p pvUser=%p\n", (void *)Thread, pvUser));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync NOREF(Thread);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create and execute the console.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = pThis->dbgcCreate(&pThis->m_Back.Core, 0);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ASMAtomicUoWriteBool(&pThis->m_fThreadTerminated, true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!ASMAtomicUoReadBool(&pThis->m_fTerminate))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QApplication::postEvent(pThis, new VBoxDbgConsoleEvent(rc == VINF_SUCCESS
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ? VBoxDbgConsoleEvent::kTerminatedUser
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync : VBoxDbgConsoleEvent::kTerminatedOther));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync LogFlow(("backThread: returns %Rrc (m_fTerminate=%RTbool)\n", rc, ASMAtomicUoReadBool(&pThis->m_fTerminate)));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncbool
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::event(QEvent *pGenEvent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(isGUIThread());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pGenEvent->type() == (QEvent::Type)VBoxDbgConsoleEvent::kEventNumber)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsoleEvent *pEvent = (VBoxDbgConsoleEvent *)pGenEvent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pEvent->command())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* make update pending. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case VBoxDbgConsoleEvent::kUpdate:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync lock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!m_fUpdatePending)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_fUpdatePending = true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pTimer->setSingleShot(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pTimer->start(10);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Re-enable the input field and restore focus. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case VBoxDbgConsoleEvent::kInputEnable:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("VBoxDbgConsole: kInputEnable (input-enabled=%RTbool)\n", m_pInput->isEnabled()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput->setEnabled(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( m_fInputRestoreFocus
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && !m_pInput->hasFocus())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput->setFocus(); /* this is a hack. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_fInputRestoreFocus = false;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* The thread terminated by user command (exit, quit, bye). */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case VBoxDbgConsoleEvent::kTerminatedUser:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("VBoxDbgConsole: kTerminatedUser (input-enabled=%RTbool)\n", m_pInput->isEnabled()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput->setEnabled(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync close();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* The thread terminated for some unknown reason., disable input */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case VBoxDbgConsoleEvent::kTerminatedOther:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("VBoxDbgConsole: kTerminatedOther (input-enabled=%RTbool)\n", m_pInput->isEnabled()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput->setEnabled(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* paranoia */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertMsgFailed(("command=%d\n", pEvent->command()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VBoxDbgBaseWindow::event(pGenEvent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::closeEvent(QCloseEvent *a_pCloseEvt)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_fThreadTerminated)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pCloseEvt->accept();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete this;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::actFocusToInput()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!m_pInput->hasFocus())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pInput->setFocus(Qt::ShortcutFocusReason);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgConsole::actFocusToOutput()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!m_pOutput->hasFocus())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pOutput->setFocus(Qt::ShortcutFocusReason);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync