Skip to content

Commit 4ce848d

Browse files
committed
GUI: resolved issue x64dbg#125 (tabbed reference view)
1 parent 13eaa8a commit 4ce848d

File tree

9 files changed

+101
-44
lines changed

9 files changed

+101
-44
lines changed

x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ ReferenceView::ReferenceView()
2020
// Setup signals
2121
connect(Bridge::getBridge(), SIGNAL(referenceAddColumnAt(int, QString)), this, SLOT(addColumnAt(int, QString)));
2222
connect(Bridge::getBridge(), SIGNAL(referenceSetRowCount(int_t)), this, SLOT(setRowCount(int_t)));
23-
connect(Bridge::getBridge(), SIGNAL(referenceDeleteAllColumns()), this, SLOT(deleteAllColumns()));
2423
connect(Bridge::getBridge(), SIGNAL(referenceSetCellContent(int, int, QString)), this, SLOT(setCellContent(int, int, QString)));
2524
connect(Bridge::getBridge(), SIGNAL(referenceReloadData()), this, SLOT(reloadData()));
2625
connect(Bridge::getBridge(), SIGNAL(referenceSetSingleSelection(int, bool)), this, SLOT(setSingleSelection(int, bool)));
@@ -58,6 +57,17 @@ void ReferenceView::setupContextMenu()
5857
connect(Config(), SIGNAL(shortcutsUpdated()), this, SLOT(refreshShortcutsSlot()));
5958
}
6059

60+
void ReferenceView::disconnectBridge()
61+
{
62+
disconnect(Bridge::getBridge(), SIGNAL(referenceAddColumnAt(int, QString)), this, SLOT(addColumnAt(int, QString)));
63+
disconnect(Bridge::getBridge(), SIGNAL(referenceSetRowCount(int_t)), this, SLOT(setRowCount(int_t)));
64+
disconnect(Bridge::getBridge(), SIGNAL(referenceSetCellContent(int, int, QString)), this, SLOT(setCellContent(int, int, QString)));
65+
disconnect(Bridge::getBridge(), SIGNAL(referenceReloadData()), this, SLOT(reloadData()));
66+
disconnect(Bridge::getBridge(), SIGNAL(referenceSetSingleSelection(int, bool)), this, SLOT(setSingleSelection(int, bool)));
67+
disconnect(Bridge::getBridge(), SIGNAL(referenceSetProgress(int)), mSearchProgress, SLOT(setValue(int)));
68+
disconnect(Bridge::getBridge(), SIGNAL(referenceSetSearchStartCol(int)), this, SLOT(setSearchStartCol(int)));
69+
}
70+
6171
void ReferenceView::refreshShortcutsSlot()
6272
{
6373
mToggleBreakpoint->setShortcut(ConfigShortcut("ActionToggleBreakpoint"));
@@ -87,21 +97,6 @@ void ReferenceView::setRowCount(int_t count)
8797
mList->setRowCount(count);
8898
}
8999

90-
void ReferenceView::deleteAllColumns()
91-
{
92-
mSearchBox->setText("");
93-
mList->setTableOffset(0);
94-
mList->setSingleSelection(0);
95-
mList->deleteAllColumns();
96-
mList->reloadData();
97-
mSearchList->setTableOffset(0);
98-
mSearchList->setSingleSelection(0);
99-
mSearchList->deleteAllColumns();
100-
mSearchList->reloadData();
101-
mSearchStartCol = 1;
102-
mFollowDumpDefault = false;
103-
}
104-
105100
void ReferenceView::setCellContent(int r, int c, QString s)
106101
{
107102
mSearchBox->setText("");

x64_dbg_gui/Project/Src/BasicView/ReferenceView.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ class ReferenceView : public SearchListView
1111
public:
1212
ReferenceView();
1313
void setupContextMenu();
14+
void disconnectBridge();
1415

1516
private slots:
1617
void addColumnAt(int width, QString title);
1718
void setRowCount(int_t count);
18-
void deleteAllColumns();
1919
void setCellContent(int r, int c, QString s);
2020
void reloadData();
2121
void setSingleSelection(int index, bool scroll);

x64_dbg_gui/Project/Src/Bridge/Bridge.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Bridge::Bridge(QObject* parent) : QObject(parent)
1717
mBridgeMutex = new QMutex();
1818
winId = 0;
1919
scriptView = 0;
20-
referenceView = 0;
20+
referenceManager = 0;
2121
bridgeResult = 0;
2222
hasBridgeResult = false;
2323
}
@@ -173,11 +173,6 @@ void Bridge::emitReferenceSetRowCount(int_t count)
173173
emit referenceSetRowCount(count);
174174
}
175175

176-
void Bridge::emitReferenceDeleteAllColumns()
177-
{
178-
emit referenceDeleteAllColumns();
179-
}
180-
181176
void Bridge::emitReferenceSetCellContent(int r, int c, QString s)
182177
{
183178
emit referenceSetCellContent(r, c, s);
@@ -203,6 +198,16 @@ void Bridge::emitReferenceSetSearchStartCol(int col)
203198
emit referenceSetSearchStartCol(col);
204199
}
205200

201+
void Bridge::emitReferenceInitialize(QString name)
202+
{
203+
mBridgeMutex->lock();
204+
hasBridgeResult = false;
205+
emit referenceInitialize(name);
206+
while(!hasBridgeResult) //wait for thread completion
207+
Sleep(100);
208+
mBridgeMutex->unlock();
209+
}
210+
206211
void Bridge::emitStackDumpAt(uint_t va, uint_t csp)
207212
{
208213
emit stackDumpAt(va, csp);
@@ -558,13 +563,13 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa
558563

559564
case GUI_REF_GETROWCOUNT:
560565
{
561-
return (void*)Bridge::getBridge()->referenceView->mList->getRowCount();
566+
return (void*)(void*)Bridge::getBridge()->referenceManager->currentReferenceView()->mList->getRowCount();
562567
}
563568
break;
564569

565570
case GUI_REF_DELETEALLCOLUMNS:
566571
{
567-
Bridge::getBridge()->emitReferenceDeleteAllColumns();
572+
GuiReferenceInitialize("References");
568573
}
569574
break;
570575

@@ -577,7 +582,7 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa
577582

578583
case GUI_REF_GETCELLCONTENT:
579584
{
580-
return (void*)Bridge::getBridge()->referenceView->mList->getCellContent((int)(int_t)param1, (int)(int_t)param2).toUtf8().constData();
585+
return (void*)Bridge::getBridge()->referenceManager->currentReferenceView()->mList->getCellContent((int)(int_t)param1, (int)(int_t)param2).toUtf8().constData();
581586
}
582587
break;
583588

@@ -605,6 +610,12 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa
605610
}
606611
break;
607612

613+
case GUI_REF_INITIALIZE:
614+
{
615+
Bridge::getBridge()->emitReferenceInitialize(QString(reinterpret_cast<const char*>(param1)));
616+
}
617+
break;
618+
608619
case GUI_STACK_DUMP_AT:
609620
{
610621
Bridge::getBridge()->emitStackDumpAt((uint_t)param1, (uint_t)param2);

x64_dbg_gui/Project/Src/Bridge/Bridge.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <QMutex>
66
#include "Imports.h"
77
#include "NewTypes.h"
8-
#include "SearchListView.h"
8+
#include "ReferenceManager.h"
99

1010
class Bridge : public QObject
1111
{
@@ -48,12 +48,12 @@ class Bridge : public QObject
4848
void emitSetSymbolProgress(int progress);
4949
void emitReferenceAddColumnAt(int width, QString title);
5050
void emitReferenceSetRowCount(int_t count);
51-
void emitReferenceDeleteAllColumns();
5251
void emitReferenceSetCellContent(int r, int c, QString s);
5352
void emitReferenceReloadData();
5453
void emitReferenceSetSingleSelection(int index, bool scroll);
5554
void emitReferenceSetProgress(int progress);
5655
void emitReferenceSetSearchStartCol(int col);
56+
void emitReferenceInitialize(QString name);
5757
void emitStackDumpAt(uint_t va, uint_t csp);
5858
void emitUpdateDump();
5959
void emitUpdateThreads();
@@ -80,7 +80,7 @@ class Bridge : public QObject
8080
//Public variables
8181
void* winId;
8282
QWidget* scriptView;
83-
SearchListView* referenceView;
83+
ReferenceManager* referenceManager;
8484

8585
signals:
8686
void disassembleAt(int_t va, int_t eip);
@@ -107,12 +107,12 @@ class Bridge : public QObject
107107
void setSymbolProgress(int progress);
108108
void referenceAddColumnAt(int width, QString title);
109109
void referenceSetRowCount(int_t count);
110-
void referenceDeleteAllColumns();
111110
void referenceSetCellContent(int r, int c, QString s);
112111
void referenceReloadData();
113112
void referenceSetSingleSelection(int index, bool scroll);
114113
void referenceSetProgress(int progress);
115114
void referenceSetSearchStartCol(int col);
115+
void referenceInitialize(QString name);
116116
void stackDumpAt(uint_t va, uint_t csp);
117117
void updateDump();
118118
void updateThreads();

x64_dbg_gui/Project/Src/Gui/MainWindow.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi
8282
mCpuWidget->setWindowTitle("CPU");
8383
mCpuWidget->setWindowIcon(QIcon(":/icons/images/processor-cpu.png"));
8484

85-
// Reference View
86-
mReferenceView = new ReferenceView();
87-
Bridge::getBridge()->referenceView = mReferenceView;
88-
mReferenceView->setWindowTitle("References");
89-
mReferenceView->setWindowIcon(QIcon(":/icons/images/search.png"));
85+
// Reference Manager
86+
mReferenceManager = new ReferenceManager();
87+
Bridge::getBridge()->referenceManager = mReferenceManager;
88+
mReferenceManager->setWindowTitle("References");
89+
mReferenceManager->setWindowIcon(QIcon(":/icons/images/search.png"));
9090

9191
// Thread View
9292
mThreadView = new ThreadView();
@@ -105,7 +105,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi
105105
mTabWidget->addTab(mCallStackView, mCallStackView->windowIcon(), mCallStackView->windowTitle());
106106
mTabWidget->addTab(mScriptView, mScriptView->windowIcon(), mScriptView->windowTitle());
107107
mTabWidget->addTab(mSymbolView, mSymbolView->windowIcon(), mSymbolView->windowTitle());
108-
mTabWidget->addTab(mReferenceView, mReferenceView->windowIcon(), mReferenceView->windowTitle());
108+
mTabWidget->addTab(mReferenceManager, mReferenceManager->windowIcon(), mReferenceManager->windowTitle());
109109
mTabWidget->addTab(mThreadView, mThreadView->windowIcon(), mThreadView->windowTitle());
110110

111111
setCentralWidget(mTabWidget);
@@ -152,7 +152,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi
152152
connect(ui->actionCpu, SIGNAL(triggered()), this, SLOT(displayCpuWidget()));
153153
connect(ui->actionSymbolInfo, SIGNAL(triggered()), this, SLOT(displaySymbolWidget()));
154154
connect(mSymbolView, SIGNAL(showCpu()), this, SLOT(displayCpuWidget()));
155-
connect(mReferenceView, SIGNAL(showCpu()), this, SLOT(displayCpuWidget()));
155+
connect(mReferenceManager, SIGNAL(showCpu()), this, SLOT(displayCpuWidget()));
156156
connect(ui->actionReferences, SIGNAL(triggered()), this, SLOT(displayReferencesWidget()));
157157
connect(ui->actionThreads, SIGNAL(triggered()), this, SLOT(displayThreadsWidget()));
158158
connect(ui->actionSettings, SIGNAL(triggered()), this, SLOT(openSettings()));
@@ -644,9 +644,9 @@ void MainWindow::displaySymbolWidget()
644644

645645
void MainWindow::displayReferencesWidget()
646646
{
647-
mReferenceView->show();
648-
mReferenceView->setFocus();
649-
setTab(mReferenceView);
647+
mReferenceManager->show();
648+
mReferenceManager->setFocus();
649+
setTab(mReferenceManager);
650650
}
651651

652652
void MainWindow::displayThreadsWidget()

x64_dbg_gui/Project/Src/Gui/MainWindow.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include "SymbolView.h"
1414
#include "BreakpointsView.h"
1515
#include "ScriptView.h"
16-
#include "ReferenceView.h"
16+
#include "ReferenceManager.h"
1717
#include "ThreadView.h"
1818
#include "PatchDialog.h"
1919
#include "CalculatorDialog.h"
@@ -104,7 +104,7 @@ public slots:
104104
SymbolView* mSymbolView;
105105
BreakpointsView* mBreakpointsView;
106106
ScriptView* mScriptView;
107-
ReferenceView* mReferenceView;
107+
ReferenceManager* mReferenceManager;
108108
ThreadView* mThreadView;
109109
PatchDialog* mPatchDialog;
110110
CalculatorDialog* mCalculatorDialog;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "ReferenceManager.h"
2+
#include "Bridge.h"
3+
4+
ReferenceManager::ReferenceManager(QWidget* parent) : MHTabWidget(parent, false, true)
5+
{
6+
this->setMovable(true);
7+
mCurrentReferenceView = 0;
8+
connect(Bridge::getBridge(), SIGNAL(referenceInitialize(QString)), this, SLOT(newReferenceView(QString)));
9+
}
10+
11+
ReferenceView* ReferenceManager::currentReferenceView()
12+
{
13+
return mCurrentReferenceView;
14+
}
15+
16+
void ReferenceManager::newReferenceView(QString name)
17+
{
18+
if(mCurrentReferenceView) //disconnect previous reference view
19+
mCurrentReferenceView->disconnectBridge();
20+
mCurrentReferenceView = new ReferenceView();
21+
connect(mCurrentReferenceView, SIGNAL(showCpu()), this, SIGNAL(showCpu()));
22+
insertTab(0, mCurrentReferenceView, name);
23+
setCurrentIndex(0);
24+
Bridge::getBridge()->BridgeSetResult(1);
25+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#ifndef REFERENCEMANAGER_H
2+
#define REFERENCEMANAGER_H
3+
4+
#include "TabWidget.h"
5+
#include "ReferenceView.h"
6+
7+
class ReferenceManager : public MHTabWidget
8+
{
9+
Q_OBJECT
10+
public:
11+
explicit ReferenceManager(QWidget* parent = 0);
12+
ReferenceView* currentReferenceView();
13+
14+
public slots:
15+
void newReferenceView(QString name);
16+
17+
signals:
18+
void showCpu();
19+
20+
private:
21+
ReferenceView* mCurrentReferenceView;
22+
};
23+
24+
#endif // REFERENCEMANAGER_H

x64_dbg_gui/Project/x64_dbg.pro

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ SOURCES += \
8484
Src/Gui/CalculatorDialog.cpp \
8585
Src/Gui/AttachDialog.cpp \
8686
Src/Gui/PageMemoryRights.cpp \
87-
Src/Gui/SelectFields.cpp
87+
Src/Gui/SelectFields.cpp \
88+
Src/Gui/ReferenceManager.cpp
8889

8990

9091
HEADERS += \
@@ -147,7 +148,8 @@ HEADERS += \
147148
Src/Gui/CalculatorDialog.h \
148149
Src/Gui/AttachDialog.h \
149150
Src/Gui/PageMemoryRights.h \
150-
Src/Gui/SelectFields.h
151+
Src/Gui/SelectFields.h \
152+
Src/Gui/ReferenceManager.h
151153

152154

153155
INCLUDEPATH += \

0 commit comments

Comments
 (0)