1
0
Fork 0

GUI: refactor BridgeResult and fix a bunch of bugs in the process

This commit is contained in:
Duncan Ogilvie 2019-06-22 13:29:27 +02:00
parent c345647e85
commit 3dc120d623
No known key found for this signature in database
GPG Key ID: FC89E0AAA0C1AAD8
20 changed files with 164 additions and 95 deletions

View File

@ -18,14 +18,16 @@ static Bridge* mBridge;
Bridge::Bridge(QObject* parent) : QObject(parent)
{
InitializeCriticalSection(&csBridge);
hResultEvent = CreateEventW(nullptr, true, true, nullptr);;
for(size_t i = 0; i < BridgeResult::Last; i++)
resultEvents[i] = CreateEventW(nullptr, true, true, nullptr);
dwMainThreadId = GetCurrentThreadId();
}
Bridge::~Bridge()
{
CloseHandle(hResultEvent);
EnterCriticalSection(&csBridge);
for(size_t i = 0; i < BridgeResult::Last; i++)
CloseHandle(resultEvents[i]);
DeleteCriticalSection(&csBridge);
}
@ -48,10 +50,13 @@ void Bridge::CopyToClipboard(const QString & text, const QString & htmlText)
GuiAddStatusBarMessage(tr("The data has been copied to clipboard.\n").toUtf8().constData());
}
void Bridge::setResult(dsint result)
void Bridge::setResult(BridgeResult::Type type, dsint result)
{
bridgeResult = result;
SetEvent(hResultEvent);
#ifdef DEBUG
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] Bridge::setResult(%d, %p)\n", GetCurrentThreadId(), type, result).toUtf8().constData());
#endif //DEBUG
bridgeResults[type] = result;
SetEvent(resultEvents[type]);
}
/************************************************************************************
@ -73,7 +78,7 @@ void Bridge::initBridge()
void Bridge::emitMenuAddToList(QWidget* parent, QMenu* menu, int hMenu, int hParentMenu)
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuAddToList);
emit menuAddMenuToList(parent, menu, hMenu, hParentMenu);
result.Wait();
}
@ -140,7 +145,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_SCRIPT_ADD:
{
BridgeResult result;
BridgeResult result(BridgeResult::ScriptAdd);
emit scriptAdd((int)param1, (const char**)param2);
result.Wait();
}
@ -156,7 +161,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_SCRIPT_ERROR:
{
BridgeResult result;
BridgeResult result(BridgeResult::ScriptMessage);
emit scriptError((int)param1, QString((const char*)param2));
result.Wait();
}
@ -172,7 +177,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_SCRIPT_MESSAGE:
{
BridgeResult result;
BridgeResult result(BridgeResult::ScriptMessage);
emit scriptMessage(QString((const char*)param1));
result.Wait();
}
@ -180,7 +185,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_SCRIPT_MSGYN:
{
BridgeResult result;
BridgeResult result(BridgeResult::ScriptMessage);
emit scriptQuestion(QString((const char*)param1));
return (void*)result.Wait();
}
@ -280,7 +285,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_REF_INITIALIZE:
{
BridgeResult result;
BridgeResult result(BridgeResult::RefInitialize);
emit referenceInitialize(QString((const char*)param1));
result.Wait();
}
@ -331,7 +336,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_ADD:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuAdd);
emit menuAddMenu((int)param1, QString((const char*)param2));
return (void*)result.Wait();
}
@ -339,7 +344,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_ADD_ENTRY:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuAddEntry);
emit menuAddMenuEntry((int)param1, QString((const char*)param2));
return (void*)result.Wait();
}
@ -347,7 +352,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_ADD_SEPARATOR:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuAddSeparator);
emit menuAddSeparator((int)param1);
result.Wait();
}
@ -355,7 +360,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_CLEAR:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuClear);
emit menuClearMenu((int)param1, false);
result.Wait();
}
@ -363,7 +368,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_REMOVE:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuRemove);
emit menuRemoveMenuEntry((int)param1);
result.Wait();
}
@ -375,7 +380,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
SELECTIONDATA* selection = (SELECTIONDATA*)param2;
if(!DbgIsDebugging())
return (void*)false;
BridgeResult result;
BridgeResult result(BridgeResult::SelectionGet);
switch(hWindow)
{
case GUI_DISASSEMBLY:
@ -416,7 +421,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
const SELECTIONDATA* selection = (const SELECTIONDATA*)param2;
if(!DbgIsDebugging())
return (void*)false;
BridgeResult result;
BridgeResult result(BridgeResult::SelectionSet);
switch(hWindow)
{
case GUI_DISASSEMBLY:
@ -438,7 +443,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_GETLINE_WINDOW:
{
QString text = "";
BridgeResult result;
BridgeResult result(BridgeResult::GetlineWindow);
emit getStrWindow(QString((const char*)param1), &text);
if(result.Wait())
{
@ -497,7 +502,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
{
int hMenu = (int)param1;
const ICONDATA* icon = (const ICONDATA*)param2;
BridgeResult result;
BridgeResult result(BridgeResult::MenuSetIcon);
if(!icon)
emit setIconMenu(hMenu, QIcon());
else
@ -515,7 +520,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
{
int hEntry = (int)param1;
const ICONDATA* icon = (const ICONDATA*)param2;
BridgeResult result;
BridgeResult result(BridgeResult::MenuSetEntryIcon);
if(!icon)
emit setIconMenuEntry(hEntry, QIcon());
else
@ -531,7 +536,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_SET_ENTRY_CHECKED:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuSetEntryChecked);
emit setCheckedMenuEntry(int(param1), bool(param2));
result.Wait();
}
@ -539,7 +544,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_SET_VISIBLE:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuSetVisible);
emit setVisibleMenu(int(param1), bool(param2));
result.Wait();
}
@ -547,7 +552,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_SET_ENTRY_VISIBLE:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuSetEntryVisible);
emit setVisibleMenuEntry(int(param1), bool(param2));
result.Wait();
}
@ -555,7 +560,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_SET_NAME:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuSetName);
emit setNameMenu(int(param1), QString((const char*)param2));
result.Wait();
}
@ -563,7 +568,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_SET_ENTRY_NAME:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuSetEntryName);
emit setNameMenuEntry(int(param1), QString((const char*)param2));
result.Wait();
}
@ -603,7 +608,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_GET_GLOBAL_NOTES:
{
BridgeResult result;
BridgeResult result(BridgeResult::GetGlobalNotes);
emit getGlobalNotes(param1);
result.Wait();
}
@ -618,7 +623,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_GET_DEBUGGEE_NOTES:
{
BridgeResult result;
BridgeResult result(BridgeResult::GetDebuggeeNotes);
emit getDebuggeeNotes(param1);
result.Wait();
}
@ -638,7 +643,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_REGISTER_SCRIPT_LANG:
{
BridgeResult result;
BridgeResult result(BridgeResult::RegisterScriptLang);
emit registerScriptLang((SCRIPTTYPEINFO*)param1);
result.Wait();
}
@ -684,7 +689,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_LOAD_GRAPH:
{
BridgeResult result;
BridgeResult result(BridgeResult::LoadGraph);
emit loadGraph((BridgeCFGraphList*)param1, duint(param2));
return (void*)result.Wait();
}
@ -692,7 +697,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_GRAPH_AT:
{
BridgeResult result;
BridgeResult result(BridgeResult::GraphAt);
emit graphAt(duint(param1));
return (void*)result.Wait();
}
@ -757,7 +762,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
{
if(param1)
{
BridgeResult result;
BridgeResult result(BridgeResult::GetActiveView);
emit getActiveView((ACTIVEVIEW*)param1);
result.Wait();
}
@ -779,7 +784,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_TYPE_ADDNODE:
{
BridgeResult result;
BridgeResult result(BridgeResult::TypeAddNode);
emit typeAddNode(param1, (const TYPEDESCRIPTOR*)param2);
return (void*)result.Wait();
}
@ -787,7 +792,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_TYPE_CLEAR:
{
BridgeResult result;
BridgeResult result(BridgeResult::TypeClear);
emit typeClear();
result.Wait();
}
@ -807,7 +812,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
case GUI_MENU_SET_ENTRY_HOTKEY:
{
BridgeResult result;
BridgeResult result(BridgeResult::MenuSetEntryHotkey);
auto params = QString((const char*)param2).split('\1');
if(params.length() == 2)
{

View File

@ -33,7 +33,7 @@ public:
static void CopyToClipboard(const QString & text, const QString & htmlText);
//result function
void setResult(dsint result = 0);
void setResult(BridgeResult::Type type, dsint result = 0);
//helper functions
void emitMenuAddToList(QWidget* parent, QMenu* menu, int hMenu, int hParentMenu = -1);
@ -164,9 +164,9 @@ signals:
private:
CRITICAL_SECTION csBridge;
HANDLE hResultEvent;
HANDLE resultEvents[BridgeResult::Last];
duint bridgeResults[BridgeResult::Last];
DWORD dwMainThreadId = 0;
dsint bridgeResult = 0;
volatile bool dbgStopped = false;
};

View File

@ -2,24 +2,40 @@
#include "Bridge.h"
#include <QCoreApplication>
BridgeResult::BridgeResult()
BridgeResult::BridgeResult(Type type)
: mType(type)
{
EnterCriticalSection(&Bridge::getBridge()->csBridge);
ResetEvent(Bridge::getBridge()->hResultEvent);
Bridge* bridge = Bridge::getBridge();
EnterCriticalSection(&bridge->csBridge);
#ifdef DEBUG
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] BridgeResult(%d)\n", GetCurrentThreadId(), type).toUtf8().constData());
#endif //DEBUG
ResetEvent(bridge->resultEvents[type]);
}
BridgeResult::~BridgeResult()
{
#ifdef DEBUG
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] ~BridgeResult(%d)\n", GetCurrentThreadId(), mType).toUtf8().constData());
#endif //DEBUG
LeaveCriticalSection(&Bridge::getBridge()->csBridge);
}
dsint BridgeResult::Wait()
{
#ifdef DEBUG
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] BridgeResult::Wait(%d)\n", GetCurrentThreadId(), mType).toUtf8().constData());
#endif //DEBUG
Bridge* bridge = Bridge::getBridge();
HANDLE hResultEvent = bridge->resultEvents[mType];
//Don't freeze when waiting on the main thread (https://github.com/x64dbg/x64dbg/issues/1716)
if(GetCurrentThreadId() == Bridge::getBridge()->dwMainThreadId)
while(WaitForSingleObject(Bridge::getBridge()->hResultEvent, 10) == WAIT_TIMEOUT)
if(GetCurrentThreadId() == bridge->dwMainThreadId)
while(WaitForSingleObject(hResultEvent, 10) == WAIT_TIMEOUT)
QCoreApplication::processEvents();
else
WaitForSingleObject(Bridge::getBridge()->hResultEvent, INFINITE);
return Bridge::getBridge()->bridgeResult;
WaitForSingleObject(hResultEvent, INFINITE);
#ifdef DEBUG
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] BridgeResult::~Wait(%d)\n", GetCurrentThreadId(), mType).toUtf8().constData());
#endif //DEBUG
return bridge->bridgeResults[mType];
}

View File

@ -6,9 +6,43 @@
class BridgeResult
{
public:
BridgeResult();
enum Type
{
ScriptAdd,
ScriptMessage,
RefInitialize,
MenuAddToList,
MenuAdd,
MenuAddEntry,
MenuAddSeparator,
MenuClear,
MenuRemove,
SelectionGet,
SelectionSet,
GetlineWindow,
MenuSetIcon,
MenuSetEntryIcon,
MenuSetEntryChecked,
MenuSetVisible,
MenuSetEntryVisible,
MenuSetName,
MenuSetEntryName,
GetGlobalNotes,
GetDebuggeeNotes,
RegisterScriptLang,
LoadGraph,
GraphAt,
GetActiveView,
TypeAddNode,
TypeClear,
MenuSetEntryHotkey,
Last,
};
explicit BridgeResult(Type type);
~BridgeResult();
dsint Wait();
private:
Type mType;
};
#endif // BRIDGERESULT_H

View File

@ -1268,7 +1268,7 @@ void CPUDisassembly::selectionGetSlot(SELECTIONDATA* selection)
{
selection->start = rvaToVa(getSelectionStart());
selection->end = rvaToVa(getSelectionEnd());
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
}
void CPUDisassembly::selectionSetSlot(const SELECTIONDATA* selection)
@ -1279,13 +1279,13 @@ void CPUDisassembly::selectionSetSlot(const SELECTIONDATA* selection)
dsint end = selection->end;
if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range
{
Bridge::getBridge()->setResult(0);
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 0);
return;
}
setSingleSelection(start - selMin);
expandSelectionUpTo(end - selMin);
reloadData();
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 1);
}
void CPUDisassembly::selectionUpdatedSlot()

View File

@ -1360,7 +1360,7 @@ void CPUDump::selectionGet(SELECTIONDATA* selection)
{
selection->start = rvaToVa(getSelectionStart());
selection->end = rvaToVa(getSelectionEnd());
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
}
void CPUDump::selectionSet(const SELECTIONDATA* selection)
@ -1371,13 +1371,13 @@ void CPUDump::selectionSet(const SELECTIONDATA* selection)
dsint end = selection->end;
if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range
{
Bridge::getBridge()->setResult(0);
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 0);
return;
}
setSingleSelection(start - selMin);
expandSelectionUpTo(end - selMin);
reloadData();
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 1);
}
void CPUDump::memoryAccessSingleshootSlot()

View File

@ -664,7 +664,7 @@ void CPUStack::selectionGet(SELECTIONDATA* selection)
{
selection->start = rvaToVa(getSelectionStart());
selection->end = rvaToVa(getSelectionEnd());
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
}
void CPUStack::selectionSet(const SELECTIONDATA* selection)
@ -675,13 +675,13 @@ void CPUStack::selectionSet(const SELECTIONDATA* selection)
dsint end = selection->end;
if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range
{
Bridge::getBridge()->setResult(0);
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 0);
return;
}
setSingleSelection(start - selMin);
expandSelectionUpTo(end - selMin);
reloadData();
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 1);
}
void CPUStack::selectionUpdatedSlot()
{

View File

@ -214,7 +214,7 @@ void CommandLineEdit::registerScriptType(SCRIPTTYPEINFO* info)
// Must be valid pointer
if(!info)
{
Bridge::getBridge()->setResult(0);
Bridge::getBridge()->setResult(BridgeResult::RegisterScriptLang, 0);
return;
}
@ -232,7 +232,7 @@ void CommandLineEdit::registerScriptType(SCRIPTTYPEINFO* info)
if(BridgeSettingGet("Gui", "ScriptType", savedType) && strcmp(info->name, savedType) == 0)
mCmdScriptType->setCurrentIndex(info->id);
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::RegisterScriptLang, 1);
}
void CommandLineEdit::unregisterScriptType(int id)

View File

@ -2071,7 +2071,7 @@ void DisassemblerGraphView::loadGraphSlot(BridgeCFGraphList* graphList, duint ad
auto message = tr("The graph you are trying to render has a large number of nodes (%1). This can cause x64dbg to hang or crash. It is recommended to save your data before you continue.\n\nDo you want to continue rendering this graph?").arg(nodeCount);
if(QMessageBox::question(this, title, message, QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::No)
{
Bridge::getBridge()->setResult(0);
Bridge::getBridge()->setResult(BridgeResult::LoadGraph, 0);
return;
}
}
@ -2081,12 +2081,12 @@ void DisassemblerGraphView::loadGraphSlot(BridgeCFGraphList* graphList, duint ad
this->cur_instr = addr ? addr : this->function;
this->forceCenter = true;
loadCurrentGraph();
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::LoadGraph, 1);
}
void DisassemblerGraphView::graphAtSlot(duint addr)
{
Bridge::getBridge()->setResult(this->navigate(addr) ? this->currentGraph.entryPoint : 0);
Bridge::getBridge()->setResult(BridgeResult::GraphAt, this->navigate(addr) ? this->currentGraph.entryPoint : 0);
}
void DisassemblerGraphView::updateGraphSlot()
@ -2367,7 +2367,7 @@ void DisassemblerGraphView::toggleSummarySlot()
void DisassemblerGraphView::selectionGetSlot(SELECTIONDATA* selection)
{
selection->start = selection->end = cur_instr;
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
}
void DisassemblerGraphView::disassembleAtSlot(dsint va, dsint cip)

View File

@ -80,5 +80,5 @@ void LogStatusLabel::getActiveView(ACTIVEVIEW* active)
QWidget* now = QApplication::focusWidget();
strncpy_s(active->title, findTitle(now, active->titleHwnd).toUtf8().constData(), _TRUNCATE);
strncpy_s(active->className, className(now, active->classHwnd).toUtf8().constData(), _TRUNCATE);
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::GetActiveView);
}

View File

@ -81,6 +81,10 @@ MainWindow::MainWindow(QWidget* parent)
connect(Bridge::getBridge(), SIGNAL(setIconMenuEntry(int, QIcon)), this, SLOT(setIconMenuEntry(int, QIcon)));
connect(Bridge::getBridge(), SIGNAL(setCheckedMenuEntry(int, bool)), this, SLOT(setCheckedMenuEntry(int, bool)));
connect(Bridge::getBridge(), SIGNAL(setHotkeyMenuEntry(int, QString, QString)), this, SLOT(setHotkeyMenuEntry(int, QString, QString)));
connect(Bridge::getBridge(), SIGNAL(setVisibleMenuEntry(int, bool)), this, SLOT(setVisibleMenuEntry(int, bool)));
connect(Bridge::getBridge(), SIGNAL(setVisibleMenu(int, bool)), this, SLOT(setVisibleMenu(int, bool)));
connect(Bridge::getBridge(), SIGNAL(setNameMenuEntry(int, QString)), this, SLOT(setNameMenuEntry(int, QString)));
connect(Bridge::getBridge(), SIGNAL(setNameMenu(int, QString)), this, SLOT(setNameMenu(int, QString)));
connect(Bridge::getBridge(), SIGNAL(showCpu()), this, SLOT(displayCpuWidget()));
connect(Bridge::getBridge(), SIGNAL(addQWidgetTab(QWidget*)), this, SLOT(addQWidgetTab(QWidget*)));
connect(Bridge::getBridge(), SIGNAL(showQWidgetTab(QWidget*)), this, SLOT(showQWidgetTab(QWidget*)));
@ -94,7 +98,7 @@ MainWindow::MainWindow(QWidget* parent)
// Setup menu API
initMenuApi();
addMenuToList(this, ui->menuPlugins, GUI_PLUGIN_MENU);
Bridge::getBridge()->emitMenuAddToList(this, ui->menuPlugins, GUI_PLUGIN_MENU);
// Set window title
if(BridgeIsProcessElevated())
@ -1082,7 +1086,7 @@ void MainWindow::addMenuToList(QWidget* parent, QMenu* menu, int hMenu, int hPar
{
if(!findMenu(hMenu))
mMenuList.push_back(MenuInfo(parent, menu, hMenu, hParentMenu, hMenu == GUI_PLUGIN_MENU));
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuAddToList);
}
void MainWindow::addMenu(int hMenu, QString title)
@ -1090,7 +1094,7 @@ void MainWindow::addMenu(int hMenu, QString title)
const MenuInfo* menu = findMenu(hMenu);
if(!menu && hMenu != -1)
{
Bridge::getBridge()->setResult(-1);
Bridge::getBridge()->setResult(BridgeResult::MenuAdd, -1);
return;
}
int hMenuNew = hEntryMenuPool++;
@ -1105,7 +1109,7 @@ void MainWindow::addMenu(int hMenu, QString title)
menu->mMenu->addMenu(wMenu);
menu->mMenu->menuAction()->setVisible(true);
}
Bridge::getBridge()->setResult(hMenuNew);
Bridge::getBridge()->setResult(BridgeResult::MenuAdd, hMenuNew);
}
void MainWindow::addMenuEntry(int hMenu, QString title)
@ -1113,7 +1117,7 @@ void MainWindow::addMenuEntry(int hMenu, QString title)
const MenuInfo* menu = findMenu(hMenu);
if(!menu && hMenu != -1)
{
Bridge::getBridge()->setResult(-1);
Bridge::getBridge()->setResult(BridgeResult::MenuAddEntry, -1);
return;
}
MenuEntryInfo newInfo;
@ -1135,7 +1139,7 @@ void MainWindow::addMenuEntry(int hMenu, QString title)
menu->mMenu->addAction(wAction);
menu->mMenu->menuAction()->setVisible(true);
}
Bridge::getBridge()->setResult(hEntryNew);
Bridge::getBridge()->setResult(BridgeResult::MenuAddEntry, hEntryNew);
}
void MainWindow::addSeparator(int hMenu)
@ -1149,7 +1153,7 @@ void MainWindow::addSeparator(int hMenu)
newInfo.mAction = menu->mMenu->addSeparator();
mEntryList.push_back(newInfo);
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuAddSeparator);
}
void MainWindow::clearMenuHelper(int hMenu)
@ -1173,7 +1177,7 @@ void MainWindow::clearMenuHelper(int hMenu)
clearMenuHelper(hMenu);
}
void MainWindow::clearMenu(int hMenu, bool erase)
void MainWindow::clearMenuImpl(int hMenu, bool erase)
{
//this recursively removes the entries from mEntryList and mMenuList
clearMenuHelper(hMenu);
@ -1201,7 +1205,12 @@ void MainWindow::clearMenu(int hMenu, bool erase)
break;
}
}
Bridge::getBridge()->setResult();
}
void MainWindow::clearMenu(int hMenu, bool erase)
{
clearMenuImpl(hMenu, erase);
Bridge::getBridge()->setResult(BridgeResult::MenuClear);
}
void MainWindow::initMenuApi()
@ -1239,12 +1248,13 @@ void MainWindow::removeMenuEntry(int hEntryMenu)
parentMenu->mMenu->menuAction()->setVisible(false);
mEntryList.erase(mEntryList.begin() + i);
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuRemove);
return;
}
}
//if hEntryMenu is not in mEntryList, clear+erase it from mMenuList
clearMenu(hEntryMenu, true);
clearMenuImpl(hEntryMenu, true);
Bridge::getBridge()->setResult(BridgeResult::MenuRemove);
}
void MainWindow::setIconMenuEntry(int hEntry, QIcon icon)
@ -1258,7 +1268,7 @@ void MainWindow::setIconMenuEntry(int hEntry, QIcon icon)
break;
}
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryIcon);
}
void MainWindow::setIconMenu(int hMenu, QIcon icon)
@ -1271,7 +1281,7 @@ void MainWindow::setIconMenu(int hMenu, QIcon icon)
menu.mMenu->setIcon(icon);
}
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuSetIcon);
}
void MainWindow::setCheckedMenuEntry(int hEntry, bool checked)
@ -1286,7 +1296,7 @@ void MainWindow::setCheckedMenuEntry(int hEntry, bool checked)
break;
}
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryChecked);
}
QString MainWindow::nestedMenuDescription(const MenuInfo* menu)
@ -1335,7 +1345,7 @@ void MainWindow::setHotkeyMenuEntry(int hEntry, QString hotkey, QString id)
break;
}
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryHotkey);
}
void MainWindow::setVisibleMenuEntry(int hEntry, bool visible)
@ -1349,7 +1359,7 @@ void MainWindow::setVisibleMenuEntry(int hEntry, bool visible)
break;
}
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryVisible);
}
void MainWindow::setVisibleMenu(int hMenu, bool visible)
@ -1362,7 +1372,7 @@ void MainWindow::setVisibleMenu(int hMenu, bool visible)
menu.mMenu->setVisible(visible);
}
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuSetVisible);
}
void MainWindow::setNameMenuEntry(int hEntry, QString name)
@ -1377,7 +1387,7 @@ void MainWindow::setNameMenuEntry(int hEntry, QString name)
break;
}
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryName);
}
void MainWindow::setNameMenu(int hMenu, QString name)
@ -1390,7 +1400,7 @@ void MainWindow::setNameMenu(int hMenu, QString name)
menu.mMenu->setTitle(name);
}
}
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::MenuSetName);
}
void MainWindow::runSelection()
@ -1421,7 +1431,7 @@ void MainWindow::getStrWindow(const QString title, QString* text)
if(mLineEdit.exec() != QDialog::Accepted)
bResult = false;
*text = mLineEdit.editText;
Bridge::getBridge()->setResult(bResult);
Bridge::getBridge()->setResult(BridgeResult::GetlineWindow, bResult);
}
void MainWindow::patchWindow()

View File

@ -243,6 +243,7 @@ private:
QString nestedMenuDescription(const MenuInfo* menu);
QString nestedMenuEntryDescription(const MenuEntryInfo & entry);
void clearMenuHelper(int hMenu);
void clearMenuImpl(int hMenu, bool erase);
bool bCanClose;
MainWindowCloseThread* mCloseThread;

View File

@ -615,7 +615,7 @@ void MemoryMapView::addVirtualModSlot()
void MemoryMapView::selectionGetSlot(SELECTIONDATA* selection)
{
selection->start = selection->end = duint(getCellContent(getInitialSelection(), 0).toULongLong(nullptr, 16));
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
}
void MemoryMapView::disassembleAtSlot(dsint va, dsint cip)

View File

@ -3,7 +3,7 @@
#include "Bridge.h"
#include <QMessageBox>
NotepadView::NotepadView(QWidget* parent) : QPlainTextEdit(parent)
NotepadView::NotepadView(QWidget* parent, BridgeResult::Type type) : QPlainTextEdit(parent), mType(type)
{
updateStyle();
connect(Config(), SIGNAL(colorsUpdated()), this, SLOT(updateStyle()));
@ -31,5 +31,5 @@ void NotepadView::getNotes(void* ptr)
strcpy_s(result, text.length() + 1, text.constData());
}
*(char**)ptr = result;
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(mType);
}

View File

@ -2,18 +2,21 @@
#define NOTEPADVIEW_H
#include <QPlainTextEdit>
#include "BridgeResult.h"
class NotepadView : public QPlainTextEdit
{
Q_OBJECT
public:
explicit NotepadView(QWidget* parent = 0);
NotepadView(QWidget* parent, BridgeResult::Type type);
public slots:
void updateStyle();
void setNotes(const QString text);
void getNotes(void* ptr);
private:
BridgeResult::Type mType;
};
#endif // NOTEPADVIEW_H

View File

@ -4,13 +4,13 @@
NotesManager::NotesManager(QWidget* parent) : QTabWidget(parent)
{
connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(dbgStateChangedSlot(DBGSTATE)));
mGlobal = new NotepadView(this);
mGlobal = new NotepadView(this, BridgeResult::GetGlobalNotes);
mGlobal->setWindowTitle("GlobalNotes");
connect(Bridge::getBridge(), SIGNAL(setGlobalNotes(QString)), mGlobal, SLOT(setNotes(QString)));
connect(Bridge::getBridge(), SIGNAL(getGlobalNotes(void*)), mGlobal, SLOT(getNotes(void*)));
addTab(mGlobal, tr("Global"));
mDebuggee = new NotepadView(this);
mDebuggee = new NotepadView(this, BridgeResult::GetDebuggeeNotes);
mDebuggee->setWindowTitle("DebuggeeNotes");
connect(Bridge::getBridge(), SIGNAL(setDebuggeeNotes(QString)), mDebuggee, SLOT(setNotes(QString)));
connect(Bridge::getBridge(), SIGNAL(getDebuggeeNotes(void*)), mDebuggee, SLOT(getNotes(void*)));

View File

@ -33,7 +33,7 @@ void ReferenceManager::newReferenceView(QString name)
connect(mCurrentReferenceView, SIGNAL(showCpu()), this, SIGNAL(showCpu()));
insertTab(0, mCurrentReferenceView, name);
setCurrentIndex(0);
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::RefInitialize, 1);
}
void ReferenceManager::closeTab(int index)

View File

@ -434,7 +434,7 @@ void ScriptView::add(int count, const char** lines)
setCellContent(i, 1, QString(lines[i]));
BridgeFree(lines);
reloadData(); //repaint
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::ScriptAdd, 1);
}
void ScriptView::clear()
@ -608,7 +608,7 @@ void ScriptView::enableHighlighting(bool enable)
void ScriptView::messageResult(int result)
{
Bridge::getBridge()->setResult(result == QMessageBox::Yes);
Bridge::getBridge()->setResult(BridgeResult::ScriptMessage, result == QMessageBox::Yes);
}
void ScriptView::closeSlot()

View File

@ -73,13 +73,13 @@ void StructWidget::typeAddNode(void* parent, const TYPEDESCRIPTOR* type)
QVariant var;
var.setValue(dtype);
item->setData(0, Qt::UserRole, var);
Bridge::getBridge()->setResult(dsint(item));
Bridge::getBridge()->setResult(BridgeResult::TypeAddNode, dsint(item));
}
void StructWidget::typeClear()
{
ui->treeWidget->clear();
Bridge::getBridge()->setResult();
Bridge::getBridge()->setResult(BridgeResult::TypeClear);
}
void StructWidget::typeUpdateWidget()
@ -128,7 +128,7 @@ void StructWidget::typeUpdateWidget()
void StructWidget::dbgStateChangedSlot(DBGSTATE state)
{
if(state == stopped)
typeClear();
ui->treeWidget->clear();
}
void StructWidget::setupColumns()

View File

@ -810,5 +810,5 @@ void SymbolView::emptySearchResultSlot()
void SymbolView::selectionGetSlot(SELECTIONDATA* selection)
{
selection->start = selection->end = duint(mModuleList->mCurList->getCellContent(mModuleList->mCurList->getInitialSelection(), ColBase).toULongLong(nullptr, 16));
Bridge::getBridge()->setResult(1);
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
}