diff --git a/src/Cutter.cpp b/src/Cutter.cpp index 9b4a2b16..356d1db4 100644 --- a/src/Cutter.cpp +++ b/src/Cutter.cpp @@ -786,6 +786,22 @@ void CutterCore::continueUntilDebug(QString offset) emit registersChanged(); } +void CutterCore::continueUntilCall() +{ + cmd("dcc"); + QString programCounterValue = cmd("dr?`drn pc`").trimmed(); + seek(programCounterValue); + emit registersChanged(); +} + +void CutterCore::continueUntilSyscall() +{ + cmd("dcs"); + QString programCounterValue = cmd("dr?`drn pc`").trimmed(); + seek(programCounterValue); + emit registersChanged(); +} + void CutterCore::stepDebug() { cmd("ds"); diff --git a/src/Cutter.h b/src/Cutter.h index 91ae422a..e5bc3c14 100644 --- a/src/Cutter.h +++ b/src/Cutter.h @@ -471,6 +471,8 @@ public: void startDebug(); void stopDebug(); void continueDebug(); + void continueUntilCall(); + void continueUntilSyscall(); void continueUntilDebug(QString offset); void stepDebug(); void stepOverDebug(); diff --git a/src/img/icons/continue_until_call.svg b/src/img/icons/continue_until_call.svg new file mode 100644 index 00000000..bf3a8a38 --- /dev/null +++ b/src/img/icons/continue_until_call.svg @@ -0,0 +1,4 @@ + + + C + \ No newline at end of file diff --git a/src/img/icons/continue_until_syscall.svg b/src/img/icons/continue_until_syscall.svg new file mode 100644 index 00000000..fee5a3a5 --- /dev/null +++ b/src/img/icons/continue_until_syscall.svg @@ -0,0 +1,4 @@ + + + S + \ No newline at end of file diff --git a/src/resources.qrc b/src/resources.qrc index 71bfebea..fd1fe886 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -23,6 +23,8 @@ img/icons/media-stop_light.svg img/icons/media-skip-forward_light.svg img/icons/continue_until_main.svg + img/icons/continue_until_call.svg + img/icons/continue_until_syscall.svg img/icons/step_light.svg img/icons/step_over_light.svg img/icons/cloud.svg diff --git a/src/themes/qdarkstyle/style.qss b/src/themes/qdarkstyle/style.qss index 8718ec64..31f64b37 100644 --- a/src/themes/qdarkstyle/style.qss +++ b/src/themes/qdarkstyle/style.qss @@ -985,11 +985,17 @@ QToolButton[popupMode="2"] { border: 1px #76797C; } -QToolButton:hover, -QToolButton::menu-button:hover { +QToolButton:hover { + background-color: transparent; + border: 1px solid #3daee9; +} + +QToolButton::menu-button:hover { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + width: 16px; background-color: transparent; border: 1px solid #3daee9; - padding: 5px; } QToolButton:checked, @@ -997,7 +1003,6 @@ QToolButton:pressed, QToolButton::menu-button:pressed { background-color: #3daee9; border: 1px solid #3daee9; - padding: 5px; } diff --git a/src/widgets/DebugToolbar.cpp b/src/widgets/DebugToolbar.cpp index 91c78e26..34ee01e0 100644 --- a/src/widgets/DebugToolbar.cpp +++ b/src/widgets/DebugToolbar.cpp @@ -3,6 +3,8 @@ #include #include +#include +#include DebugToolbar::DebugToolbar(MainWindow *main, QWidget *parent) : QToolBar(parent), @@ -12,20 +14,36 @@ DebugToolbar::DebugToolbar(MainWindow *main, QWidget *parent) : QIcon startIcon = QIcon(":/img/icons/play_light.svg"); QIcon stopIcon = QIcon(":/img/icons/media-stop_light.svg"); QIcon continueIcon = QIcon(":/img/icons/media-skip-forward_light.svg"); - QIcon continueUntilIcon = QIcon(":/img/icons/continue_until_main.svg"); + QIcon continueUntilMainIcon = QIcon(":/img/icons/continue_until_main.svg"); + QIcon continueUntilCallIcon = QIcon(":/img/icons/continue_until_call.svg"); + QIcon continueUntilSyscallIcon = QIcon(":/img/icons/continue_until_syscall.svg"); QIcon stepIcon = QIcon(":/img/icons/step_light.svg"); QIcon stepOverIcon = QIcon(":/img/icons/step_over_light.svg"); QAction *actionStart = new QAction(startIcon, tr("Start debug"), parent); QAction *actionStop = new QAction(stopIcon, tr("Stop debug"), parent); QAction *actionContinue = new QAction(continueIcon, tr("Continue"), parent); - QAction *actionContinueUntilMain = new QAction(continueUntilIcon, tr("Continue until main"), parent); + QAction *actionContinueUntilMain = new QAction(continueUntilMainIcon, tr("Continue until main"), parent); + QAction *actionContinueUntilCall = new QAction(continueUntilCallIcon, tr("Continue until call"), parent); + QAction *actionContinueUntilSyscall = new QAction(continueUntilSyscallIcon, tr("Continue until syscall"), parent); QAction *actionStep = new QAction(stepIcon, tr("Step"), parent); QAction *actionStepOver = new QAction(stepOverIcon, tr("Step over"), parent); + + QToolButton *continueUntilButton = new QToolButton; + continueUntilButton->setPopupMode(QToolButton::MenuButtonPopup); + connect(continueUntilButton, &QToolButton::triggered, continueUntilButton, &QToolButton::setDefaultAction); + + QMenu *continueUntilMenu = new QMenu; + continueUntilMenu->addAction(actionContinueUntilMain); + continueUntilMenu->addAction(actionContinueUntilCall); + continueUntilMenu->addAction(actionContinueUntilSyscall); + continueUntilButton->setMenu(continueUntilMenu); + continueUntilButton->setDefaultAction(actionContinueUntilMain); + addAction(actionStart); addAction(actionStop); addAction(actionContinue); - addAction(actionContinueUntilMain); + addWidget(continueUntilButton); addAction(actionStep); addAction(actionStepOver); @@ -35,6 +53,8 @@ DebugToolbar::DebugToolbar(MainWindow *main, QWidget *parent) : connect(actionStepOver, &QAction::triggered, Core(), &CutterCore::stepOverDebug); connect(actionContinue, &QAction::triggered, Core(), &CutterCore::continueDebug); connect(actionContinueUntilMain, &QAction::triggered, this, &DebugToolbar::continueUntilMain); + connect(actionContinueUntilCall, &QAction::triggered, Core(), &CutterCore::continueUntilCall); + connect(actionContinueUntilSyscall, &QAction::triggered, Core(),&CutterCore::continueUntilSyscall); } void DebugToolbar::continueUntilMain()