Pressing Enter in disassembly will jump to the desired location (#1910)

* Implemented processing of 'Return' key in the disassembly widget
* renamed method in the DisasmWidget
This commit is contained in:
Properrr 2019-12-12 01:52:42 -08:00 committed by Itay Cohen
parent 53452726ac
commit 3700bc63f5
2 changed files with 35 additions and 17 deletions

View File

@ -614,35 +614,50 @@ void DisassemblyWidget::moveCursorRelative(bool up, bool page)
} }
} }
void DisassemblyWidget::jumpToOffsetUnderCursor(const QTextCursor &cursor)
{
RVA offset = readDisassemblyOffset(cursor);
RVA jump = Core()->getOffsetJump(offset);
if (jump == RVA_INVALID) {
bool ok;
RVA xref = Core()->cmdj("axfj@" + QString::number(
offset)).array().first().toObject().value("to").toVariant().toULongLong(&ok);
if (ok) {
jump = xref;
}
}
if (jump != RVA_INVALID) {
seekable->seek(jump);
}
}
bool DisassemblyWidget::eventFilter(QObject *obj, QEvent *event) bool DisassemblyWidget::eventFilter(QObject *obj, QEvent *event)
{ {
if (event->type() == QEvent::MouseButtonDblClick if (event->type() == QEvent::MouseButtonDblClick
&& (obj == mDisasTextEdit || obj == mDisasTextEdit->viewport())) { && (obj == mDisasTextEdit || obj == mDisasTextEdit->viewport())) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
QTextCursor cursor = mDisasTextEdit->cursorForPosition(QPoint(mouseEvent->x(), mouseEvent->y())); const QTextCursor& cursor = mDisasTextEdit->cursorForPosition(QPoint(mouseEvent->x(), mouseEvent->y()));
RVA offset = readDisassemblyOffset(cursor); jumpToOffsetUnderCursor(cursor);
RVA jump = Core()->getOffsetJump(offset);
if (jump == RVA_INVALID) {
bool ok;
RVA xref = Core()->cmdj("axfj@" + QString::number(
offset)).array().first().toObject().value("to").toVariant().toULongLong(&ok);
if (ok) {
jump = xref;
}
}
if (jump != RVA_INVALID) {
seekable->seek(jump);
}
return true; return true;
} }
return MemoryDockWidget::eventFilter(obj, event); return MemoryDockWidget::eventFilter(obj, event);
} }
void DisassemblyWidget::keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Return) {
const QTextCursor cursor = mDisasTextEdit->textCursor();
jumpToOffsetUnderCursor(cursor);
}
MemoryDockWidget::keyPressEvent(event);
}
QString DisassemblyWidget::getWindowTitle() const QString DisassemblyWidget::getWindowTitle() const
{ {
return tr("Disassembly"); return tr("Disassembly");

View File

@ -72,6 +72,7 @@ private:
RVA readCurrentDisassemblyOffset(); RVA readCurrentDisassemblyOffset();
RVA readDisassemblyOffset(QTextCursor tc); RVA readDisassemblyOffset(QTextCursor tc);
bool eventFilter(QObject *obj, QEvent *event) override; bool eventFilter(QObject *obj, QEvent *event) override;
void keyPressEvent(QKeyEvent *event) override;
QString getWindowTitle() const override; QString getWindowTitle() const override;
QList<RVA> breakpoints; QList<RVA> breakpoints;
@ -84,6 +85,8 @@ private:
void connectCursorPositionChanged(bool disconnect); void connectCursorPositionChanged(bool disconnect);
void moveCursorRelative(bool up, bool page); void moveCursorRelative(bool up, bool page);
void jumpToOffsetUnderCursor(const QTextCursor&);
}; };
class DisassemblyScrollArea : public QAbstractScrollArea class DisassemblyScrollArea : public QAbstractScrollArea