diff --git a/DevTools/HackStudio/Debugger/DebugInfoWidget.cpp b/DevTools/HackStudio/Debugger/DebugInfoWidget.cpp index 5f7af07458..db2f0ebc81 100644 --- a/DevTools/HackStudio/Debugger/DebugInfoWidget.cpp +++ b/DevTools/HackStudio/Debugger/DebugInfoWidget.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -40,10 +41,38 @@ namespace HackStudio { +void DebugInfoWidget::init_toolbar() +{ + m_continue_action = GUI::Action::create("Continue", Gfx::Bitmap::load_from_file("/res/icons/16x16/debug-continue.png"), [&](auto&) { + pthread_mutex_lock(Debugger::the().continue_mutex()); + Debugger::the().set_continue_type(Debugger::ContinueType::Continue); + pthread_cond_signal(Debugger::the().continue_cond()); + pthread_mutex_unlock(Debugger::the().continue_mutex()); + }); + + m_singlestep_action = GUI::Action::create("Single Step", Gfx::Bitmap::load_from_file("/res/icons/16x16/debug-single-step.png"), [&](auto&) { + pthread_mutex_lock(Debugger::the().continue_mutex()); + Debugger::the().set_continue_type(Debugger::ContinueType::SourceSingleStep); + pthread_cond_signal(Debugger::the().continue_cond()); + pthread_mutex_unlock(Debugger::the().continue_mutex()); + }); + m_continue_action->set_enabled(false); + m_singlestep_action->set_enabled(false); + + m_toolbar->add_action(*m_continue_action); + m_toolbar->add_action(*m_singlestep_action); +} + DebugInfoWidget::DebugInfoWidget() { - set_layout(); - auto& splitter = add(); + set_layout(); + auto& toolbar_container = add(); + m_toolbar = toolbar_container.add(); + init_toolbar(); + auto& bottom_box = add(); + bottom_box.set_layout(); + + auto& splitter = bottom_box.add(); m_backtrace_view = splitter.add(); m_variables_view = splitter.add(); @@ -111,4 +140,16 @@ void DebugInfoWidget::program_stopped() m_variables_view->set_model({}); } +GUI::Action& DebugInfoWidget::continue_action() +{ + ASSERT(m_continue_action); + return *m_continue_action; +} + +GUI::Action& DebugInfoWidget::singlestep_action() +{ + ASSERT(m_singlestep_action); + return *m_singlestep_action; +} + } diff --git a/DevTools/HackStudio/Debugger/DebugInfoWidget.h b/DevTools/HackStudio/Debugger/DebugInfoWidget.h index 7cd38d5c94..5e1bcd6918 100644 --- a/DevTools/HackStudio/Debugger/DebugInfoWidget.h +++ b/DevTools/HackStudio/Debugger/DebugInfoWidget.h @@ -28,8 +28,11 @@ #include "Debugger.h" #include +#include #include #include +#include +#include #include #include @@ -38,17 +41,24 @@ namespace HackStudio { class DebugInfoWidget final : public GUI::Widget { C_OBJECT(DebugInfoWidget) public: - virtual ~DebugInfoWidget() override { } + virtual ~DebugInfoWidget() override {} void update_state(const DebugSession&, const PtraceRegisters&); void program_stopped(); + GUI::Action& continue_action(); + GUI::Action& singlestep_action(); + private: explicit DebugInfoWidget(); + void init_toolbar(); RefPtr m_variables_view; RefPtr m_backtrace_view; RefPtr m_variable_context_menu; + RefPtr m_toolbar; + RefPtr m_continue_action; + RefPtr m_singlestep_action; }; } diff --git a/DevTools/HackStudio/main.cpp b/DevTools/HackStudio/main.cpp index e31ba60cd9..2e36e748c9 100644 --- a/DevTools/HackStudio/main.cpp +++ b/DevTools/HackStudio/main.cpp @@ -608,29 +608,8 @@ int main_impl(int argc, char** argv) debugger_thread->start(); }); - auto continue_action = GUI::Action::create("Continue", Gfx::Bitmap::load_from_file("/res/icons/16x16/debug-continue.png"), [&](auto&) { - pthread_mutex_lock(Debugger::the().continue_mutex()); - Debugger::the().set_continue_type(Debugger::ContinueType::Continue); - pthread_cond_signal(Debugger::the().continue_cond()); - pthread_mutex_unlock(Debugger::the().continue_mutex()); - }); - - auto single_step_action = GUI::Action::create("Single Step", Gfx::Bitmap::load_from_file("/res/icons/16x16/debug-single-step.png"), [&](auto&) { - pthread_mutex_lock(Debugger::the().continue_mutex()); - Debugger::the().set_continue_type(Debugger::ContinueType::SourceSingleStep); - pthread_cond_signal(Debugger::the().continue_cond()); - pthread_mutex_unlock(Debugger::the().continue_mutex()); - }); - continue_action->set_enabled(false); - single_step_action->set_enabled(false); - - toolbar.add_action(run_action); - toolbar.add_action(stop_action); - toolbar.add_separator(); toolbar.add_action(debug_action); - toolbar.add_action(continue_action); - toolbar.add_action(single_step_action); RefPtr current_editor_in_execution; Debugger::initialize( @@ -652,8 +631,8 @@ int main_impl(int argc, char** argv) current_editor_in_execution = get_editor_of_file(source_position.value().file_path); current_editor_in_execution->editor().set_execution_position(source_position.value().line_number - 1); debug_info_widget.update_state(*Debugger::the().session(), regs); - continue_action->set_enabled(true); - single_step_action->set_enabled(true); + debug_info_widget.continue_action().set_enabled(true); + debug_info_widget.singlestep_action().set_enabled(true); reveal_action_tab(debug_info_widget); })); Core::EventLoop::wake(); @@ -663,8 +642,8 @@ int main_impl(int argc, char** argv) [&]() { dbg() << "Program continued"; Core::EventLoop::main().post_event(*g_window, make([&](auto&) { - continue_action->set_enabled(false); - single_step_action->set_enabled(false); + debug_info_widget.continue_action().set_enabled(false); + debug_info_widget.singlestep_action().set_enabled(false); if (current_editor_in_execution) { current_editor_in_execution->editor().clear_execution_position(); }