summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/debugger/debugimgui.cpp
diff options
context:
space:
mode:
author mahlemiut <bsr@xnet.co.nz>2016-06-19 11:35:33 +1200
committer mahlemiut <bsr@xnet.co.nz>2016-06-19 11:36:54 +1200
commit7b2ccbd32e53d0dce7aba9d7884e732c8bea430c (patch)
treeb423bf8f906dc45b84452382bbe3cba1c2a57630 /src/osd/modules/debugger/debugimgui.cpp
parent20906487ce74ba59e7a40c58933d5fc569b04d50 (diff)
debugimgui: added history functionality to debugger console, fixed issue with main views being re-allocated when no extra windows have been created.
Diffstat (limited to 'src/osd/modules/debugger/debugimgui.cpp')
-rw-r--r--src/osd/modules/debugger/debugimgui.cpp43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/osd/modules/debugger/debugimgui.cpp b/src/osd/modules/debugger/debugimgui.cpp
index 81f13926376..5baf125506a 100644
--- a/src/osd/modules/debugger/debugimgui.cpp
+++ b/src/osd/modules/debugger/debugimgui.cpp
@@ -77,6 +77,7 @@ public:
bool exec_cmd; // console only
int src_sel;
char console_input[512];
+ std::vector<std::string> console_history;
};
class debug_imgui : public osd_module, public debug_module
@@ -94,7 +95,8 @@ public:
font_size(0),
m_key_char(0),
m_hide(false),
- m_win_count(0)
+ m_win_count(0),
+ m_initialised(false)
{
}
@@ -127,6 +129,7 @@ private:
void draw_view(debug_area* view_ptr, bool exp_change);
void update_cpu_view(device_t* device);
static bool get_view_source(void* data, int idx, const char** out_text);
+ static int history_set(ImGuiTextEditCallbackData* data);
running_machine* m_machine;
INT32 m_mouse_x;
@@ -141,6 +144,7 @@ private:
UINT8 m_key_char;
bool m_hide;
int m_win_count; // number of active windows, does not decrease, used to ID individual windows
+ bool m_initialised; // true after initial views are created
};
// globals
@@ -148,6 +152,7 @@ static std::vector<debug_area*> view_list;
static debug_area* view_main_console = nullptr;
static debug_area* view_main_disasm = nullptr;
static debug_area* view_main_regs = nullptr;
+static int history_pos;
static void view_list_add(debug_area* item)
{
@@ -427,6 +432,7 @@ void debug_imgui::handle_console(running_machine* machine)
{
m_machine->debugger().cpu().get_visible_cpu()->debug()->single_step();
view_main_console->exec_cmd = false;
+ history_pos = view_main_console->console_history.size();
return;
}
m_machine->debugger().console().execute_command(view_main_console->console_input, true);
@@ -459,11 +465,39 @@ void debug_imgui::handle_console(running_machine* machine)
m_running = true;
if(strcmp(view_main_console->console_input,"next") == 0)
m_running = true;
+ view_main_console->console_history.push_back(std::string(view_main_console->console_input));
+ history_pos = view_main_console->console_history.size();
strcpy(view_main_console->console_input,"");
view_main_console->exec_cmd = false;
}
}
+int debug_imgui::history_set(ImGuiTextEditCallbackData* data)
+{
+ if(view_main_console->console_history.size() == 0)
+ return 0;
+
+ switch(data->EventKey)
+ {
+ case ImGuiKey_UpArrow:
+ if(history_pos > 0)
+ history_pos--;
+ break;
+ case ImGuiKey_DownArrow:
+ if(history_pos < view_main_console->console_history.size())
+ history_pos++;
+ break;
+ }
+
+ if(history_pos == view_main_console->console_history.size())
+ data->BufTextLen = (int)snprintf(data->Buf, (size_t)data->BufSize, "%s", "");
+ else
+ data->BufTextLen = (int)snprintf(data->Buf, (size_t)data->BufSize, "%s", view_main_console->console_history[history_pos].c_str());
+
+ data->BufDirty = true;
+ return 0;
+}
+
void debug_imgui::update_cpu_view(device_t* device)
{
const debug_view_source *source;
@@ -948,11 +982,11 @@ void debug_imgui::draw_console()
ImGui::EndChild();
ImGui::Separator();
- ImGuiInputTextFlags flags = ImGuiInputTextFlags_EnterReturnsTrue;
+ ImGuiInputTextFlags flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackHistory;
if(m_running)
flags |= ImGuiInputTextFlags_ReadOnly;
ImGui::PushItemWidth(-1.0f);
- if(ImGui::InputText("##console_input",view_main_console->console_input,512,flags))
+ if(ImGui::InputText("##console_input",view_main_console->console_input,512,flags,history_set))
view_main_console->exec_cmd = true;
if ((ImGui::IsRootWindowOrAnyChildFocused() && !ImGui::IsAnyItemActive() && !ImGui::IsMouseClicked(0)))
ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget
@@ -1078,7 +1112,7 @@ void debug_imgui::wait_for_debugger(device_t &device, bool firststop)
{
UINT32 width = m_machine->render().ui_target().width();
UINT32 height = m_machine->render().ui_target().height();
- if(firststop && view_list.empty())
+ if(firststop && !m_initialised)
{
view_main_console = dview_alloc(device.machine(), DVT_CONSOLE);
view_main_console->title = "MAME Debugger";
@@ -1095,6 +1129,7 @@ void debug_imgui::wait_for_debugger(device_t &device, bool firststop)
view_main_regs->width = 180;
view_main_regs->height = 440;
strcpy(view_main_console->console_input,""); // clear console input
+ m_initialised = true;
}
if(firststop)
{