GUI: fixed some context menu bugs in RegistersView + follow in stack option
This commit is contained in:
parent
174afe635b
commit
7b8c865607
|
|
@ -3,8 +3,6 @@
|
|||
|
||||
RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent), mVScrollOffset(0)
|
||||
{
|
||||
|
||||
|
||||
// precreate ContextMenu Actions
|
||||
wCM_Increment = new QAction(tr("Increment"),this);
|
||||
wCM_Increment->setShortcut(Qt::Key_Plus);
|
||||
|
|
@ -22,9 +20,7 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent), mV
|
|||
wCM_CopyToClipboard->setShortcut(QKeySequence::Copy);
|
||||
wCM_FollowInDisassembly = new QAction(tr("Follow in Disassembler"),this);
|
||||
wCM_FollowInDump = new QAction(tr("Follow in Dump"),this);
|
||||
|
||||
|
||||
|
||||
wCM_FollowInStack = new QAction("Follow in Stack", this);
|
||||
|
||||
// general purposes register (we allow the user to modify the value)
|
||||
mGPR.insert(CAX);
|
||||
|
|
@ -56,6 +52,20 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent), mV
|
|||
mFlags.insert(DF);
|
||||
mFlags.insert(OF);
|
||||
|
||||
//registers that should not be changed
|
||||
mNoChange.insert(GS);
|
||||
mNoChange.insert(FS);
|
||||
mNoChange.insert(ES);
|
||||
mNoChange.insert(DS);
|
||||
mNoChange.insert(CS);
|
||||
mNoChange.insert(SS);
|
||||
mNoChange.insert(DR0);
|
||||
mNoChange.insert(DR1);
|
||||
mNoChange.insert(DR2);
|
||||
mNoChange.insert(DR3);
|
||||
mNoChange.insert(DR6);
|
||||
mNoChange.insert(DR7);
|
||||
mNoChange.insert(CIP);
|
||||
|
||||
// create mapping from internal id to name
|
||||
mRegisterMapping.clear();
|
||||
|
|
@ -220,11 +230,11 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent), mV
|
|||
connect(wCM_CopyToClipboard,SIGNAL(triggered()),this,SLOT(onCopyToClipboardAction()));
|
||||
connect(wCM_FollowInDisassembly,SIGNAL(triggered()),this,SLOT(onFollowInDisassembly()));
|
||||
connect(wCM_FollowInDump,SIGNAL(triggered()),this,SLOT(onFollowInDump()));
|
||||
connect(wCM_FollowInStack,SIGNAL(triggered()),this,SLOT(onFollowInStack()));
|
||||
}
|
||||
|
||||
RegistersView::~RegistersView()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -247,7 +257,7 @@ bool RegistersView::identifyRegister(const int line, const int offset, REGISTER_
|
|||
if( (it.value().line == (line - mVScrollOffset)) /* same line ? */
|
||||
&& ( (1 + it.value().start) <= offset) /* between start ... ? */
|
||||
&& ( offset<= (1+it.value().start+it.value().labelwidth+it.value().valuesize)) /* ... and end ? */
|
||||
)
|
||||
)
|
||||
{
|
||||
// we found a matching register in the viewport
|
||||
if(clickedReg)
|
||||
|
|
@ -276,11 +286,8 @@ void RegistersView::mousePressEvent(QMouseEvent* event)
|
|||
mSelected = r;
|
||||
emit refresh();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void RegistersView::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
{
|
||||
Q_UNUSED(event);
|
||||
|
|
@ -317,7 +324,6 @@ void RegistersView::paintEvent(QPaintEvent *event)
|
|||
drawRegister(&wPainter,it.key(),registerValue(&wRegDumpStruct,it.key()));
|
||||
it++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void RegistersView::keyPressEvent(QKeyEvent *event)
|
||||
|
|
@ -329,31 +335,28 @@ void RegistersView::keyPressEvent(QKeyEvent *event)
|
|||
wCM_CopyToClipboard->trigger();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
switch(event->key())
|
||||
{
|
||||
case Qt::Key_0:
|
||||
wCM_Zero->trigger();
|
||||
break;
|
||||
break;
|
||||
case Qt::Key_1:
|
||||
wCM_SetToOne->trigger();
|
||||
break;
|
||||
break;
|
||||
case Qt::Key_Plus:
|
||||
wCM_Increment->trigger();
|
||||
break;
|
||||
break;
|
||||
case Qt::Key_Minus:
|
||||
wCM_Decrement->trigger();
|
||||
break;
|
||||
break;
|
||||
case Qt::Key_Space:
|
||||
wCM_ToggleValue->trigger();
|
||||
break;
|
||||
break;
|
||||
case Qt::Key_Return:
|
||||
wCM_Modify->trigger();
|
||||
break;
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -508,21 +511,17 @@ void RegistersView::updateRegistersSlot()
|
|||
setRegisters(&z);
|
||||
}
|
||||
|
||||
|
||||
void RegistersView::displayEditDialog()
|
||||
{
|
||||
WordEditDialog wEditDial(this);
|
||||
//QString wReg = registerValue(&wRegDumpStruct,mSelected);
|
||||
|
||||
#ifdef _WIN64
|
||||
wEditDial.setup(QString("Edit"),registerValue(&wRegDumpStruct,mSelected), 8);
|
||||
#else
|
||||
wEditDial.setup(QString("Edit"), registerValue(&wRegDumpStruct,mSelected), 4);
|
||||
#endif
|
||||
|
||||
if(wEditDial.exec() == QDialog::Accepted) //OK button clicked
|
||||
setRegister(mSelected, wEditDial.getVal());
|
||||
|
||||
}
|
||||
|
||||
void RegistersView::onIncrementAction()
|
||||
|
|
@ -539,12 +538,14 @@ void RegistersView::onDecrementAction()
|
|||
|
||||
void RegistersView::onZeroAction()
|
||||
{
|
||||
setRegister(mSelected, 0);
|
||||
if(!mNoChange.contains(mSelected))
|
||||
setRegister(mSelected, 0);
|
||||
}
|
||||
|
||||
void RegistersView::onSetToOneAction()
|
||||
{
|
||||
setRegister(mSelected, 1);
|
||||
if(!mNoChange.contains(mSelected))
|
||||
setRegister(mSelected, 1);
|
||||
}
|
||||
|
||||
void RegistersView::onModifyAction()
|
||||
|
|
@ -564,7 +565,6 @@ void RegistersView::onToggleValueAction()
|
|||
val *= -1;
|
||||
setRegister(mSelected,val);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void RegistersView::onCopyToClipboardAction()
|
||||
|
|
@ -592,7 +592,16 @@ void RegistersView::onFollowInDump()
|
|||
if(DbgMemIsValidReadPtr(registerValue(&wRegDumpStruct,mSelected)))
|
||||
DbgCmdExec(QString().sprintf("dump \"%s\"", addr.toUtf8().constData()).toUtf8().constData());
|
||||
}
|
||||
}
|
||||
|
||||
void RegistersView::onFollowInStack()
|
||||
{
|
||||
if(mGPR.contains(mSelected))
|
||||
{
|
||||
QString addr = QString("%1").arg(registerValue(&wRegDumpStruct,mSelected), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper();
|
||||
if(DbgMemIsValidReadPtr(registerValue(&wRegDumpStruct,mSelected)))
|
||||
DbgCmdExec(QString().sprintf("sdump \"%s\"", addr.toUtf8().constData()).toUtf8().constData());
|
||||
}
|
||||
}
|
||||
|
||||
void RegistersView::displayCustomContextMenuSlot(QPoint pos)
|
||||
|
|
@ -603,11 +612,14 @@ void RegistersView::displayCustomContextMenuSlot(QPoint pos)
|
|||
|
||||
if(mSelected != UNKNOWN)
|
||||
{
|
||||
if(registerValue(&wRegDumpStruct,mSelected) >= 1)
|
||||
wMenu.addAction(wCM_Zero);
|
||||
if(registerValue(&wRegDumpStruct,mSelected) == 0)
|
||||
wMenu.addAction(wCM_SetToOne);
|
||||
wMenu.addAction(wCM_ToggleValue);
|
||||
if(!mNoChange.contains(mSelected))
|
||||
{
|
||||
if(registerValue(&wRegDumpStruct,mSelected) >= 1)
|
||||
wMenu.addAction(wCM_Zero);
|
||||
if(registerValue(&wRegDumpStruct,mSelected) == 0)
|
||||
wMenu.addAction(wCM_SetToOne);
|
||||
wMenu.addAction(wCM_ToggleValue);
|
||||
}
|
||||
|
||||
if(mGPR.contains(mSelected))
|
||||
{
|
||||
|
|
@ -615,11 +627,15 @@ void RegistersView::displayCustomContextMenuSlot(QPoint pos)
|
|||
wMenu.addAction(wCM_Increment);
|
||||
wMenu.addAction(wCM_Decrement);
|
||||
|
||||
int_t addr = registerValue(&wRegDumpStruct,mSelected);
|
||||
uint_t addr = registerValue(&wRegDumpStruct,mSelected);
|
||||
if(DbgMemIsValidReadPtr(addr))
|
||||
{
|
||||
wMenu.addAction(wCM_FollowInDump);
|
||||
wMenu.addAction(wCM_FollowInDisassembly);
|
||||
duint size=0;
|
||||
duint base=DbgMemFindBaseAddr(DbgValFromString("csp"), &size);
|
||||
if(addr>=base && addr<base+size)
|
||||
wMenu.addAction(wCM_FollowInStack);
|
||||
}
|
||||
}
|
||||
wMenu.addAction(wCM_CopyToClipboard);
|
||||
|
|
@ -662,7 +678,6 @@ void RegistersView::setRegister(REGISTER_NAME reg, uint_t value)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void RegistersView::debugStateChangedSlot(DBGSTATE state)
|
||||
{
|
||||
if(state==stopped)
|
||||
|
|
@ -676,7 +691,6 @@ void RegistersView::repaint()
|
|||
this->viewport()->repaint();
|
||||
}
|
||||
|
||||
|
||||
int_t RegistersView::registerValue(const REGDUMP* regd,const REGISTER_NAME reg)
|
||||
{
|
||||
// this is probably the most efficient general method to access the values of the struct
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ protected slots:
|
|||
void onCopyToClipboardAction();
|
||||
void onFollowInDisassembly();
|
||||
void onFollowInDump();
|
||||
|
||||
void onFollowInStack();
|
||||
|
||||
private:
|
||||
int mVScrollOffset;
|
||||
|
|
@ -113,6 +113,8 @@ private:
|
|||
QSet<REGISTER_NAME> mFlags;
|
||||
// contains all id's of registers if there occurs a change
|
||||
QSet<REGISTER_NAME> mRegisterUpdates;
|
||||
// registers that do not allow changes
|
||||
QSet<REGISTER_NAME> mNoChange;
|
||||
// maps from id to name
|
||||
QMap<REGISTER_NAME,QString> mRegisterMapping;
|
||||
// contains viewport positions
|
||||
|
|
@ -132,6 +134,7 @@ private:
|
|||
QAction* wCM_CopyToClipboard;
|
||||
QAction* wCM_FollowInDisassembly;
|
||||
QAction* wCM_FollowInDump;
|
||||
QAction* wCM_FollowInStack;
|
||||
int_t mCip;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue