summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/debugger/win/editwininfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/debugger/win/editwininfo.cpp')
-rw-r--r--src/osd/modules/debugger/win/editwininfo.cpp88
1 files changed, 49 insertions, 39 deletions
diff --git a/src/osd/modules/debugger/win/editwininfo.cpp b/src/osd/modules/debugger/win/editwininfo.cpp
index 6dc4954a796..96b424a5afc 100644
--- a/src/osd/modules/debugger/win/editwininfo.cpp
+++ b/src/osd/modules/debugger/win/editwininfo.cpp
@@ -16,9 +16,15 @@
#include "winutil.h"
-// edit box styles
-#define EDIT_BOX_STYLE WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL
-#define EDIT_BOX_STYLE_EX 0
+namespace {
+
+constexpr DWORD EDIT_BOX_STYLE = WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL;
+constexpr DWORD EDIT_BOX_STYLE_EX = 0;
+
+constexpr int MAX_EDIT_STRING = 256;
+constexpr int HISTORY_LENGTH = 20;
+
+} // anonymous namespace
editwin_info::editwin_info(debugger_windows_interface &debugger, bool is_main_console, LPCSTR title, WNDPROC handler) :
@@ -26,7 +32,7 @@ editwin_info::editwin_info(debugger_windows_interface &debugger, bool is_main_co
m_editwnd(nullptr),
m_edit_defstr(),
m_original_editproc(nullptr),
- m_history_count(0),
+ m_history(),
m_last_history(0)
{
if (window() == nullptr)
@@ -35,11 +41,11 @@ editwin_info::editwin_info(debugger_windows_interface &debugger, bool is_main_co
// create an edit box and override its key handling
m_editwnd = CreateWindowEx(EDIT_BOX_STYLE_EX, TEXT("EDIT"), nullptr, EDIT_BOX_STYLE,
0, 0, 100, 100, window(), nullptr, GetModuleHandleUni(), nullptr);
- m_original_editproc = (WNDPROC)(uintptr_t)GetWindowLongPtr(m_editwnd, GWLP_WNDPROC);
- SetWindowLongPtr(m_editwnd, GWLP_USERDATA, (LONG_PTR)this);
- SetWindowLongPtr(m_editwnd, GWLP_WNDPROC, (LONG_PTR)&editwin_info::static_edit_proc);
- SendMessage(m_editwnd, WM_SETFONT, (WPARAM)metrics().debug_font(), (LPARAM)FALSE);
- SendMessage(m_editwnd, EM_LIMITTEXT, (WPARAM)MAX_EDIT_STRING, (LPARAM)0);
+ m_original_editproc = WNDPROC(uintptr_t(GetWindowLongPtr(m_editwnd, GWLP_WNDPROC)));
+ SetWindowLongPtr(m_editwnd, GWLP_USERDATA, LONG_PTR(this));
+ SetWindowLongPtr(m_editwnd, GWLP_WNDPROC, LONG_PTR(&editwin_info::static_edit_proc));
+ SendMessage(m_editwnd, WM_SETFONT, WPARAM(metrics().debug_font()), LPARAM(FALSE));
+ SendMessage(m_editwnd, EM_LIMITTEXT, WPARAM(MAX_EDIT_STRING), LPARAM(0));
set_editwnd_text("");
}
@@ -80,13 +86,13 @@ void editwin_info::set_editwnd_bounds(RECT const &bounds)
void editwin_info::set_editwnd_text(char const *text)
{
auto tc_buffer = osd::text::to_tstring(text);
- SendMessage(m_editwnd, WM_SETTEXT, (WPARAM)0, (LPARAM)tc_buffer.c_str());
+ SendMessage(m_editwnd, WM_SETTEXT, WPARAM(0), LPARAM(tc_buffer.c_str()));
}
void editwin_info::editwnd_select_all()
{
- SendMessage(m_editwnd, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
+ SendMessage(m_editwnd, EM_SETSEL, WPARAM(0), LPARAM(-1));
}
@@ -100,8 +106,6 @@ void editwin_info::draw_contents(HDC dc)
LRESULT editwin_info::edit_proc(UINT message, WPARAM wparam, LPARAM lparam)
{
- TCHAR buffer[MAX_EDIT_STRING];
-
// handle a few messages
switch (message)
{
@@ -114,23 +118,28 @@ LRESULT editwin_info::edit_proc(UINT message, WPARAM wparam, LPARAM lparam)
switch (wparam)
{
case VK_UP:
- if (m_last_history < (m_history_count - 1))
+ if (!m_history.empty())
+ {
m_last_history++;
- else
- m_last_history = 0;
- SendMessage(m_editwnd, WM_SETTEXT, (WPARAM)0, (LPARAM)&m_history[m_last_history][0]);
- SendMessage(m_editwnd, EM_SETSEL, (WPARAM)MAX_EDIT_STRING, (LPARAM)MAX_EDIT_STRING);
+ if (m_last_history >= m_history.size())
+ m_last_history = 0;
+ auto const &entry(m_history[m_last_history]);
+ SendMessage(m_editwnd, WM_SETTEXT, WPARAM(0), LPARAM(entry.c_str()));
+ SendMessage(m_editwnd, EM_SETSEL, WPARAM(entry.length()), LPARAM(entry.length()));
+ }
break;
case VK_DOWN:
- if (m_last_history > 0)
- m_last_history--;
- else if (m_history_count > 0)
- m_last_history = m_history_count - 1;
- else
- m_last_history = 0;
- SendMessage(m_editwnd, WM_SETTEXT, (WPARAM)0, (LPARAM)&m_history[m_last_history][0]);
- SendMessage(m_editwnd, EM_SETSEL, (WPARAM)MAX_EDIT_STRING, (LPARAM)MAX_EDIT_STRING);
+ if (!m_history.empty())
+ {
+ if (m_last_history > 0)
+ m_last_history--;
+ else
+ m_last_history = m_history.size() - 1;
+ auto const &entry(m_history[m_last_history]);
+ SendMessage(m_editwnd, WM_SETTEXT, WPARAM(0), LPARAM(entry.c_str()));
+ SendMessage(m_editwnd, EM_SETSEL, WPARAM(entry.length()), LPARAM(entry.length()));
+ }
break;
case VK_PRIOR:
@@ -168,35 +177,36 @@ LRESULT editwin_info::edit_proc(UINT message, WPARAM wparam, LPARAM lparam)
{
if (waiting_for_debugger() || !seq_pressed())
{
+ TCHAR buffer[MAX_EDIT_STRING];
+
switch (wparam)
{
- case 13:
+ case 13: // carriage return
{
// fetch the text
- SendMessage(m_editwnd, WM_GETTEXT, (WPARAM)ARRAY_LENGTH(buffer), (LPARAM)buffer);
+ SendMessage(m_editwnd, WM_GETTEXT, WPARAM(ARRAY_LENGTH(buffer)), LPARAM(buffer));
// add to the history if it's not a repeat of the last one
- if (buffer[0] != 0 && _tcscmp(buffer, &m_history[0][0]))
+ if (buffer[0] && (m_history.empty() || _tcscmp(buffer, m_history[0].c_str())))
{
- memmove(&m_history[1][0], &m_history[0][0], (HISTORY_LENGTH - 1) * MAX_EDIT_STRING * sizeof(TCHAR));
- _tcscpy(&m_history[0][0], buffer);
- if (m_history_count < HISTORY_LENGTH)
- m_history_count++;
+ while (m_history.size() >= HISTORY_LENGTH)
+ m_history.pop_back();
+ m_history.emplace_front(buffer);
}
- m_last_history = m_history_count - 1;
+ m_last_history = m_history.size() - 1;
// process
{
auto utf8_buffer = osd::text::from_tstring(buffer);
process_string(utf8_buffer.c_str());
}
- break;
}
+ break;
- case 27:
+ case 27: // escape
{
// fetch the text
- SendMessage(m_editwnd, WM_GETTEXT, (WPARAM)sizeof(buffer), (LPARAM)buffer);
+ SendMessage(m_editwnd, WM_GETTEXT, WPARAM(sizeof(buffer)), LPARAM(buffer));
// if it's not empty, clear the text
if (_tcslen(buffer) > 0)
@@ -205,8 +215,8 @@ LRESULT editwin_info::edit_proc(UINT message, WPARAM wparam, LPARAM lparam)
set_editwnd_text(m_edit_defstr.c_str());
editwnd_select_all();
}
- break;
}
+ break;
default:
return CallWindowProc(m_original_editproc, m_editwnd, message, wparam, lparam);
@@ -226,7 +236,7 @@ LRESULT editwin_info::edit_proc(UINT message, WPARAM wparam, LPARAM lparam)
LRESULT CALLBACK editwin_info::static_edit_proc(HWND wnd, UINT message, WPARAM wparam, LPARAM lparam)
{
- editwin_info *const info = (editwin_info *)(uintptr_t)GetWindowLongPtr(wnd, GWLP_USERDATA);
+ editwin_info *const info = (editwin_info *)uintptr_t(GetWindowLongPtr(wnd, GWLP_USERDATA));
assert(info->m_editwnd == wnd);
return info->edit_proc(message, wparam, lparam);
}