diff --git a/docs/source/user-docs/menus/disassembly-context-menu.rst b/docs/source/user-docs/menus/disassembly-context-menu.rst index 15ced58d03..22346b4df1 100644 --- a/docs/source/user-docs/menus/disassembly-context-menu.rst +++ b/docs/source/user-docs/menus/disassembly-context-menu.rst @@ -13,9 +13,15 @@ Copy ---------------------------------------- **Description:** Copy the selected text. -**Steps:** Right-click on a selected text and choose ``Copy`` +**Steps:** Double click to select word or triple click to select line under cursor. -**Shortcut:** :kbd:`Ctrl` + :kbd:`C` +**Shortcut:** :kbd:`Ctrl` + :kbd:`C` + +Jump to address +---------------------------------------- +**Description** Jump to the address or function + +**Steps** Hold :kbd:`Ctrl` and double click Copy Address ---------------------------------------- diff --git a/rizin b/rizin index 71679b0800..d8332c50d7 160000 --- a/rizin +++ b/rizin @@ -1 +1 @@ -Subproject commit 71679b0800c657ad03fa374e989b2cd87433bd29 +Subproject commit d8332c50d708475f5a05b87fdd5e886b75dc4e7b diff --git a/src/menus/AddressableItemContextMenu.cpp b/src/menus/AddressableItemContextMenu.cpp index 8a1d3c7f7a..8552c9e758 100644 --- a/src/menus/AddressableItemContextMenu.cpp +++ b/src/menus/AddressableItemContextMenu.cpp @@ -14,10 +14,13 @@ AddressableItemContextMenu::AddressableItemContextMenu(QWidget *parent, MainWind : QMenu(parent), mainWindow(mainWindow) { actionShowInMenu = new QAction(tr("Show in"), this); + actionCopyWord = new QAction(tr("Copy word"), this); actionCopyAddress = new QAction(tr("Copy address"), this); actionShowXrefs = new QAction(tr("Show X-Refs"), this); actionAddcomment = new QAction(tr("Add comment"), this); + connect(actionCopyWord, &QAction::triggered, this, &AddressableItemContextMenu::onActionCopyWord); + connect(actionCopyAddress, &QAction::triggered, this, &AddressableItemContextMenu::onActionCopyAddress); actionCopyAddress->setShortcuts({ Qt::CTRL | Qt::SHIFT | Qt::Key_C }); diff --git a/src/menus/AddressableItemContextMenu.h b/src/menus/AddressableItemContextMenu.h index b8f4f965e2..31c2d76399 100644 --- a/src/menus/AddressableItemContextMenu.h +++ b/src/menus/AddressableItemContextMenu.h @@ -28,6 +28,7 @@ public slots: void xrefsTriggered(); private: + void onActionCopyWord(); void onActionCopyAddress(); void onActionShowXrefs(); void onActionAddComment(); @@ -44,6 +45,7 @@ public slots: protected: void setHasTarget(bool hasTarget); QAction *actionShowInMenu; + QAction *actionCopyWord; QAction *actionCopyAddress; QAction *actionShowXrefs; QAction *actionAddcomment; diff --git a/src/menus/DisassemblyContextMenu.cpp b/src/menus/DisassemblyContextMenu.cpp index 9879a16edc..148913fd73 100644 --- a/src/menus/DisassemblyContextMenu.cpp +++ b/src/menus/DisassemblyContextMenu.cpp @@ -11,6 +11,7 @@ #include "dialogs/EditStringDialog.h" #include "dialogs/BreakpointsDialog.h" #include "MainWindow.h" +#include "DisassemblyWidget.h" #include #include @@ -23,13 +24,13 @@ DisassemblyContextMenu::DisassemblyContextMenu(QWidget *parent, MainWindow *mainWindow) : QMenu(parent), offset(0), - canCopy(false), + canCopy(true), mainWindow(mainWindow), actionEditInstruction(this), actionNopInstruction(this), actionJmpReverse(this), actionEditBytes(this), - actionCopy(this), + actionCopyWord(this), actionCopyAddr(this), actionCopyInstrBytes(this), actionAddComment(this), @@ -70,8 +71,11 @@ DisassemblyContextMenu::DisassemblyContextMenu(QWidget *parent, MainWindow *main actionSetToDataQword(this), showInSubmenu(this) { - initAction(&actionCopy, tr("Copy"), SLOT(on_actionCopy_triggered()), getCopySequence()); - addAction(&actionCopy); +// initAction(&actionCopy, tr("Copy"), SLOT(on_actionCopy_triggered()), getCopySequence()); +// addAction(&actionCopy); +// + initAction(&actionCopyWord, tr("Copy word"), SLOT(on_actionCopyWord_triggered()), getCopySequence()); + addAction(&actionCopyWord); initAction(&actionCopyAddr, tr("Copy address"), SLOT(on_actionCopyAddr_triggered()), getCopyAddressSequence()); @@ -578,8 +582,8 @@ void DisassemblyContextMenu::aboutToShowSlot() actionAddComment.setText(tr("Edit Comment")); } - actionCopy.setVisible(canCopy); - copySeparator->setVisible(canCopy); +// actionCopy.setVisible(canCopy); +// copySeparator->setVisible(canCopy); // Handle renaming of variable, function, flag, ... // Note: This might be useless if we consider setCurrentHighlightedWord is always called before @@ -792,9 +796,19 @@ void DisassemblyContextMenu::on_actionEditBytes_triggered() } } -void DisassemblyContextMenu::on_actionCopy_triggered() +//void DisassemblyContextMenu::on_actionCopy_triggered() +//{ +// emit copy(); +//} + +void DisassemblyContextMenu::on_actionCopyWord_triggered() { - emit copy(); + DisassemblyWidget* disassemblyWidget = dynamic_cast(parentWidget()); + if (disassemblyWidget != nullptr) { + const QString& text = disassemblyWidget->getCurrentHighlightedWord(); + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(text); + } } void DisassemblyContextMenu::on_actionCopyAddr_triggered() diff --git a/src/menus/DisassemblyContextMenu.h b/src/menus/DisassemblyContextMenu.h index 0cf9155614..0df0952b44 100644 --- a/src/menus/DisassemblyContextMenu.h +++ b/src/menus/DisassemblyContextMenu.h @@ -40,7 +40,8 @@ private slots: void on_actionEditBytes_triggered(); void showReverseJmpQuery(); - void on_actionCopy_triggered(); +// void on_actionCopy_triggered(); + void on_actionCopyWord_triggered(); void on_actionCopyAddr_triggered(); void on_actionCopyInstrBytes_triggered(); void on_actionAddComment_triggered(); @@ -110,7 +111,8 @@ private slots: QAction actionJmpReverse; QAction actionEditBytes; - QAction actionCopy; +// QAction actionCopy; + QAction actionCopyWord; QAction *copySeparator; QAction actionCopyAddr; QAction actionCopyInstrBytes; diff --git a/src/widgets/DisassemblyWidget.cpp b/src/widgets/DisassemblyWidget.cpp index 946a2d357c..b456ab90c7 100644 --- a/src/widgets/DisassemblyWidget.cpp +++ b/src/widgets/DisassemblyWidget.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -168,6 +169,8 @@ DisassemblyWidget::DisassemblyWidget(MainWindow *main) ADD_ACTION(Qt::Key_Escape, Qt::WidgetWithChildrenShortcut, &DisassemblyWidget::seekPrev) + ADD_ACTION(Qt::CopyAction, Qt::WidgetWithChildrenShortcut, &DisassemblyWidget::copyHighlightedWord) + ADD_ACTION(Qt::Key_J, Qt::WidgetWithChildrenShortcut, [this]() { moveCursorRelative(false, false); }) ADD_ACTION(QKeySequence::MoveToNextLine, Qt::WidgetWithChildrenShortcut, @@ -661,7 +664,14 @@ bool DisassemblyWidget::eventFilter(QObject *obj, QEvent *event) void DisassemblyWidget::keyPressEvent(QKeyEvent *event) { - if (event->key() == Qt::Key_Return) { + qDebug() << event->key(); + qDebug() << event->modifiers(); + if (event->key() == Qt::Key_C && (event->modifiers() & Qt::ControlModifier)) { + // If there is selected text in the text edit, copy it + if (!mDisasTextEdit->textCursor().selectedText().isEmpty()) { + mDisasTextEdit->copy(); + } + } else if (event->key() == Qt::Key_Return) { const QTextCursor cursor = mDisasTextEdit->textCursor(); jumpToOffsetUnderCursor(cursor); } @@ -786,7 +796,6 @@ void DisassemblyTextEdit::scrollContentsBy(int dx, int dy) void DisassemblyTextEdit::keyPressEvent(QKeyEvent *event) { Q_UNUSED(event) - // QPlainTextEdit::keyPressEvent(event); } void DisassemblyTextEdit::mousePressEvent(QMouseEvent *event) @@ -803,6 +812,10 @@ void DisassemblyWidget::seekPrev() Core()->seekPrev(); } +void DisassemblyWidget::copyHighlightedWord() { + qDebug() << "success!"; +} + /********************* * Left panel *********************/ diff --git a/src/widgets/DisassemblyWidget.h b/src/widgets/DisassemblyWidget.h index 8dadd4d4b3..f6a10b6bd9 100644 --- a/src/widgets/DisassemblyWidget.h +++ b/src/widgets/DisassemblyWidget.h @@ -25,6 +25,7 @@ class DisassemblyWidget : public MemoryDockWidget public: explicit DisassemblyWidget(MainWindow *main); QWidget *getTextWidget(); + const QString& getCurrentHighlightedWord() const { return curHighlightedWord; } static QString getWidgetType(); @@ -103,6 +104,7 @@ protected slots: void moveCursorRelative(bool up, bool page); void jumpToOffsetUnderCursor(const QTextCursor &); + void copyHighlightedWord(); }; class DisassemblyScrollArea : public QAbstractScrollArea