diff options
| author | 2022-09-16 22:09:58 +1000 | |
|---|---|---|
| committer | 2022-09-16 22:23:34 +1000 | |
| commit | c76cf754b3cb1a07f8d3ca585bb3a055d78f25be (patch) | |
| tree | 833fa7b23f8a84a79fd052008a6ad7c3847b46da /src/osd/modules/debugger/win/debugwininfo.cpp | |
| parent | 1aae44005b59aa712fb60f639ddbb9e8e5e7a357 (diff) | |
debugger/win: Added capability to save/restore window arrangement.
* Format is mostly compatible with the Cocoa debugger, besides reversed
vertical positioning.
* Made Qt debugger more compatible with configuration format used by
Win32 and Cocoa debuggers.
* emu/config.cpp: Preserve elements with no registered handlers in
default and system configuation files.
Diffstat (limited to 'src/osd/modules/debugger/win/debugwininfo.cpp')
| -rw-r--r-- | src/osd/modules/debugger/win/debugwininfo.cpp | 106 |
1 files changed, 105 insertions, 1 deletions
diff --git a/src/osd/modules/debugger/win/debugwininfo.cpp b/src/osd/modules/debugger/win/debugwininfo.cpp index fdd486f3e80..f449d39dbf8 100644 --- a/src/osd/modules/debugger/win/debugwininfo.cpp +++ b/src/osd/modules/debugger/win/debugwininfo.cpp @@ -14,12 +14,17 @@ #include "debugger.h" #include "debug/debugcon.h" #include "debug/debugcpu.h" + +#include "util/xmlfile.h" + #include "window.h" #include "winutf8.h" - #include "winutil.h" + #include "modules/lib/osdobj_common.h" +#include <cstring> + bool debugwin_info::s_window_class_registered = false; @@ -251,6 +256,89 @@ bool debugwin_info::handle_key(WPARAM wparam, LPARAM lparam) } +void debugwin_info::save_configuration(util::xml::data_node &parentnode) +{ + util::xml::data_node *const node = parentnode.add_child(osd::debugger::NODE_WINDOW, nullptr); + if (node) + save_configuration_to_node(*node); +} + + +void debugwin_info::restore_configuration_from_node(util::xml::data_node const &node) +{ + // get current size to use for defaults + RECT bounds; + POINT origin; + origin.x = 0; + origin.y = 0; + if (!GetClientRect(window(), &bounds) && ClientToScreen(window(), &origin)) + return; + + // get saved size and adjust for window chrome + RECT desired; + desired.left = node.get_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_X, origin.x); + desired.top = node.get_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_Y, origin.y); + desired.right = desired.left + node.get_attribute_int(osd::debugger::ATTR_WINDOW_WIDTH, bounds.right); + desired.bottom = desired.top + node.get_attribute_int(osd::debugger::ATTR_WINDOW_HEIGHT, bounds.bottom); + // TODO: sanity checks... + if (!AdjustWindowRectEx(&desired, DEBUG_WINDOW_STYLE, GetMenu(window()) ? TRUE : FALSE, DEBUG_WINDOW_STYLE_EX)) + return; + + // actually move the window + MoveWindow( + window(), + desired.left, + desired.top, + desired.right - desired.left, + desired.bottom - desired.top, + TRUE); + + // restrict to one monitor and avoid toolbars + HMONITOR const nearest_monitor = MonitorFromWindow(window(), MONITOR_DEFAULTTONEAREST); + if (nearest_monitor) + { + MONITORINFO info; + std::memset(&info, 0, sizeof(info)); + info.cbSize = sizeof(info); + if (GetMonitorInfo(nearest_monitor, &info)) + { + if (desired.right > info.rcWork.right) + { + desired.left -= desired.right - info.rcWork.right; + desired.right = info.rcWork.right; + } + if (desired.bottom > info.rcWork.bottom) + { + desired.top -= desired.bottom - info.rcWork.bottom; + desired.bottom = info.rcWork.bottom; + } + if (desired.left < info.rcWork.left) + { + desired.right += info.rcWork.left - desired.left; + desired.left = info.rcWork.left; + } + if (desired.top < info.rcWork.top) + { + desired.bottom += info.rcWork.top - desired.top; + desired.top = info.rcWork.top; + } + desired.bottom = std::min(info.rcWork.bottom, desired.bottom); + desired.right = std::min(info.rcWork.right, desired.right); + MoveWindow( + window(), + desired.left, + desired.top, + desired.right - desired.left, + desired.bottom - desired.top, + TRUE); + } + } + + // sort out contents + recompute_children(); +} + + void debugwin_info::recompute_children() { if (m_views[0] != nullptr) @@ -392,6 +480,22 @@ void debugwin_info::draw_border(HDC dc, RECT &bounds) } +void debugwin_info::save_configuration_to_node(util::xml::data_node &node) +{ + RECT bounds; + POINT origin; + origin.x = 0; + origin.y = 0; + if (GetClientRect(window(), &bounds) && ClientToScreen(window(), &origin)) + { + node.set_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_X, origin.x); + node.set_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_Y, origin.y); + node.set_attribute_int(osd::debugger::ATTR_WINDOW_WIDTH, bounds.right); + node.set_attribute_int(osd::debugger::ATTR_WINDOW_HEIGHT, bounds.bottom); + } +} + + void debugwin_info::draw_border(HDC dc, HWND child) { RECT bounds; |
