diff options
author | 2021-01-28 02:59:43 +1100 | |
---|---|---|
committer | 2021-01-28 02:59:43 +1100 | |
commit | 83c9637635c575972c039d7d63a48d788e41ba34 (patch) | |
tree | 59bad3ada8a0f0f61bf503da21acef0f237d4d6b /src/osd/modules/debugger/debugqt.cpp | |
parent | 832acf5731d68ca411b5fb358ddb4e79ef0faffa (diff) |
-Qt debugger updates:
* Added context menu with Copy Visible and Paste commands to debug views (partially addresses #6066).
* Made memory view last PC display a context menu item.
* Fixed crash on right-clicking a memory view showing something other than an address space.
-debugger: Fixed commas in dumpkbd output.
Diffstat (limited to 'src/osd/modules/debugger/debugqt.cpp')
-rw-r--r-- | src/osd/modules/debugger/debugqt.cpp | 151 |
1 files changed, 73 insertions, 78 deletions
diff --git a/src/osd/modules/debugger/debugqt.cpp b/src/osd/modules/debugger/debugqt.cpp index 9156fd31c16..c8845d42448 100644 --- a/src/osd/modules/debugger/debugqt.cpp +++ b/src/osd/modules/debugger/debugqt.cpp @@ -38,9 +38,7 @@ class debug_qt : public osd_module, public debug_module #endif { public: - debug_qt() - : osd_module(OSD_DEBUG_PROVIDER, "qt"), debug_module(), - m_machine(nullptr) + debug_qt() : osd_module(OSD_DEBUG_PROVIDER, "qt"), debug_module(), m_machine(nullptr) { } @@ -78,37 +76,35 @@ MainWindow *mainQtWindow = nullptr; //============================================================ // Global variable used to feed the xml configuration callbacks -std::vector<WindowQtConfig*> xmlConfigurations; +std::vector<std::unique_ptr<WindowQtConfig> > xmlConfigurations; - void xml_configuration_load(running_machine &machine, config_type cfg_type, util::xml::data_node const *parentnode) +void xml_configuration_load(running_machine &machine, config_type cfg_type, util::xml::data_node const *parentnode) { // We only care about game files if (cfg_type != config_type::GAME) return; // Might not have any data - if (parentnode == nullptr) + if (!parentnode) return; - for (int i = 0; i < xmlConfigurations.size(); i++) - delete xmlConfigurations[i]; xmlConfigurations.clear(); // Configuration load - util::xml::data_node const * wnode = nullptr; + util::xml::data_node const *wnode = nullptr; for (wnode = parentnode->get_child("window"); wnode != nullptr; wnode = wnode->get_next_sibling("window")) { WindowQtConfig::WindowType type = (WindowQtConfig::WindowType)wnode->get_attribute_int("type", WindowQtConfig::WIN_TYPE_UNKNOWN); switch (type) { - case WindowQtConfig::WIN_TYPE_MAIN: xmlConfigurations.push_back(new MainWindowQtConfig()); break; - case WindowQtConfig::WIN_TYPE_MEMORY: xmlConfigurations.push_back(new MemoryWindowQtConfig()); break; - case WindowQtConfig::WIN_TYPE_DASM: xmlConfigurations.push_back(new DasmWindowQtConfig()); break; - case WindowQtConfig::WIN_TYPE_LOG: xmlConfigurations.push_back(new LogWindowQtConfig()); break; - case WindowQtConfig::WIN_TYPE_BREAK_POINTS: xmlConfigurations.push_back(new BreakpointsWindowQtConfig()); break; - case WindowQtConfig::WIN_TYPE_DEVICES: xmlConfigurations.push_back(new DevicesWindowQtConfig()); break; - case WindowQtConfig::WIN_TYPE_DEVICE_INFORMATION: xmlConfigurations.push_back(new DeviceInformationWindowQtConfig()); break; + case WindowQtConfig::WIN_TYPE_MAIN: xmlConfigurations.push_back(std::make_unique<MainWindowQtConfig>()); break; + case WindowQtConfig::WIN_TYPE_MEMORY: xmlConfigurations.push_back(std::make_unique<MemoryWindowQtConfig>()); break; + case WindowQtConfig::WIN_TYPE_DASM: xmlConfigurations.push_back(std::make_unique<DasmWindowQtConfig>()); break; + case WindowQtConfig::WIN_TYPE_LOG: xmlConfigurations.push_back(std::make_unique<LogWindowQtConfig>()); break; + case WindowQtConfig::WIN_TYPE_BREAK_POINTS: xmlConfigurations.push_back(std::make_unique<BreakpointsWindowQtConfig>()); break; + case WindowQtConfig::WIN_TYPE_DEVICES: xmlConfigurations.push_back(std::make_unique<DevicesWindowQtConfig>()); break; + case WindowQtConfig::WIN_TYPE_DEVICE_INFORMATION: xmlConfigurations.push_back(std::make_unique<DeviceInformationWindowQtConfig>()); break; default: continue; } xmlConfigurations.back()->recoverFromXmlNode(*wnode); @@ -124,27 +120,24 @@ void xml_configuration_save(running_machine &machine, config_type cfg_type, util for (int i = 0; i < xmlConfigurations.size(); i++) { - WindowQtConfig* config = xmlConfigurations[i]; + WindowQtConfig &config = *xmlConfigurations[i]; // Create an xml node util::xml::data_node *const debugger_node = parentnode->add_child("window", nullptr); - if (debugger_node == nullptr) - continue; // Insert the appropriate information - config->addToXmlDataNode(*debugger_node); + if (debugger_node) + config.addToXmlDataNode(*debugger_node); } } void gather_save_configurations() { - for (int i = 0; i < xmlConfigurations.size(); i++) - delete xmlConfigurations[i]; xmlConfigurations.clear(); // Loop over all the open windows - foreach (QWidget* widget, QApplication::topLevelWidgets()) + foreach (QWidget *widget, QApplication::topLevelWidgets()) { if (!widget->isVisible()) continue; @@ -153,20 +146,20 @@ void gather_save_configurations() continue; // Figure out its type - if (dynamic_cast<MainWindow*>(widget)) - xmlConfigurations.push_back(new MainWindowQtConfig()); - else if (dynamic_cast<MemoryWindow*>(widget)) - xmlConfigurations.push_back(new MemoryWindowQtConfig()); - else if (dynamic_cast<DasmWindow*>(widget)) - xmlConfigurations.push_back(new DasmWindowQtConfig()); - else if (dynamic_cast<LogWindow*>(widget)) - xmlConfigurations.push_back(new LogWindowQtConfig()); - else if (dynamic_cast<BreakpointsWindow*>(widget)) - xmlConfigurations.push_back(new BreakpointsWindowQtConfig()); - else if (dynamic_cast<DevicesWindow*>(widget)) - xmlConfigurations.push_back(new DevicesWindowQtConfig()); - else if (dynamic_cast<DeviceInformationWindow*>(widget)) - xmlConfigurations.push_back(new DeviceInformationWindowQtConfig()); + if (dynamic_cast<MainWindow *>(widget)) + xmlConfigurations.push_back(std::make_unique<MainWindowQtConfig>()); + else if (dynamic_cast<MemoryWindow *>(widget)) + xmlConfigurations.push_back(std::make_unique<MemoryWindowQtConfig>()); + else if (dynamic_cast<DasmWindow *>(widget)) + xmlConfigurations.push_back(std::make_unique<DasmWindowQtConfig>()); + else if (dynamic_cast<LogWindow *>(widget)) + xmlConfigurations.push_back(std::make_unique<LogWindowQtConfig>()); + else if (dynamic_cast<BreakpointsWindow *>(widget)) + xmlConfigurations.push_back(std::make_unique<BreakpointsWindowQtConfig>()); + else if (dynamic_cast<DevicesWindow *>(widget)) + xmlConfigurations.push_back(std::make_unique<DevicesWindowQtConfig>()); + else if (dynamic_cast<DeviceInformationWindow *>(widget)) + xmlConfigurations.push_back(std::make_unique<DeviceInformationWindowQtConfig>()); xmlConfigurations.back()->buildFromQWidget(widget); } @@ -177,45 +170,46 @@ void gather_save_configurations() // Utilities //============================================================ -void load_and_clear_main_window_config(std::vector<WindowQtConfig*>& configList) +void load_and_clear_main_window_config(std::vector<std::unique_ptr<WindowQtConfig> > &configList) { for (int i = 0; i < configList.size(); i++) { - WindowQtConfig* config = configList[i]; - if (config->m_type == WindowQtConfig::WIN_TYPE_MAIN) + WindowQtConfig &config = *configList[i]; + if (config.m_type == WindowQtConfig::WIN_TYPE_MAIN) { - config->applyToQWidget(mainQtWindow); - configList.erase(configList.begin()+i); + config.applyToQWidget(mainQtWindow); + configList.erase(configList.begin() + i); break; } } } -void setup_additional_startup_windows(running_machine& machine, std::vector<WindowQtConfig*>& configList) +void setup_additional_startup_windows(running_machine &machine, std::vector<std::unique_ptr<WindowQtConfig> > &configList) { for (int i = 0; i < configList.size(); i++) { - WindowQtConfig* config = configList[i]; + WindowQtConfig &config = *configList[i]; - WindowQt* foo = nullptr; - switch (config->m_type) + WindowQt *foo = nullptr; + switch (config.m_type) { - case WindowQtConfig::WIN_TYPE_MEMORY: - foo = new MemoryWindow(&machine); break; - case WindowQtConfig::WIN_TYPE_DASM: - foo = new DasmWindow(&machine); break; - case WindowQtConfig::WIN_TYPE_LOG: - foo = new LogWindow(&machine); break; - case WindowQtConfig::WIN_TYPE_BREAK_POINTS: - foo = new BreakpointsWindow(&machine); break; - case WindowQtConfig::WIN_TYPE_DEVICES: - foo = new DevicesWindow(&machine); break; - case WindowQtConfig::WIN_TYPE_DEVICE_INFORMATION: - foo = new DeviceInformationWindow(&machine); break; - default: break; + case WindowQtConfig::WIN_TYPE_MEMORY: + foo = new MemoryWindow(machine); break; + case WindowQtConfig::WIN_TYPE_DASM: + foo = new DasmWindow(machine); break; + case WindowQtConfig::WIN_TYPE_LOG: + foo = new LogWindow(machine); break; + case WindowQtConfig::WIN_TYPE_BREAK_POINTS: + foo = new BreakpointsWindow(machine); break; + case WindowQtConfig::WIN_TYPE_DEVICES: + foo = new DevicesWindow(machine); break; + case WindowQtConfig::WIN_TYPE_DEVICE_INFORMATION: + foo = new DeviceInformationWindow(machine); break; + default: + break; } - config->applyToQWidget(foo); + config.applyToQWidget(foo); foo->show(); } } @@ -223,12 +217,13 @@ void setup_additional_startup_windows(running_machine& machine, std::vector<Wind void bring_main_window_to_front() { - foreach (QWidget* widget, QApplication::topLevelWidgets()) + foreach (QWidget *widget, QApplication::topLevelWidgets()) { - if (!dynamic_cast<MainWindow*>(widget)) - continue; - widget->activateWindow(); - widget->raise(); + if (dynamic_cast<MainWindow *>(widget)) + { + widget->activateWindow(); + widget->raise(); + } } } @@ -251,7 +246,7 @@ bool debug_qt::nativeEventFilter(const QByteArray &eventType, void *message, lon void debug_qt::init_debugger(running_machine &machine) { - if (qApp == nullptr) + if (!qApp) { // If you're starting from scratch, create a new qApp new QApplication(qtArgc, qtArgv); @@ -262,7 +257,7 @@ void debug_qt::init_debugger(running_machine &machine) else { // If you've done a hard reset, clear out existing widgets & get ready for re-init - foreach (QWidget* widget, QApplication::topLevelWidgets()) + foreach (QWidget *widget, QApplication::topLevelWidgets()) { if (!widget->isWindow() || widget->windowType() != Qt::Window) continue; @@ -274,8 +269,8 @@ void debug_qt::init_debugger(running_machine &machine) m_machine = &machine; // Setup the configuration XML saving and loading machine.configuration().config_register("debugger", - config_load_delegate(&xml_configuration_load, &machine), - config_save_delegate(&xml_configuration_save, &machine)); + config_load_delegate(&xml_configuration_load, &machine), + config_save_delegate(&xml_configuration_save, &machine)); } @@ -298,15 +293,15 @@ void debug_qt::wait_for_debugger(device_t &device, bool firststop) // Dialog initialization if (oneShot) { - mainQtWindow = new MainWindow(m_machine); + mainQtWindow = new MainWindow(*m_machine); load_and_clear_main_window_config(xmlConfigurations); setup_additional_startup_windows(*m_machine, xmlConfigurations); mainQtWindow->show(); oneShot = false; } - // Insure all top level widgets are visible & bring main window to front - foreach (QWidget* widget, QApplication::topLevelWidgets()) + // Ensure all top level widgets are visible & bring main window to front + foreach (QWidget *widget, QApplication::topLevelWidgets()) { if (!widget->isWindow() || widget->windowType() != Qt::Window) continue; @@ -314,9 +309,7 @@ void debug_qt::wait_for_debugger(device_t &device, bool firststop) } if (firststop) - { bring_main_window_to_front(); - } // Set the main window to display the proper cpu mainQtWindow->setProcessor(&device); @@ -337,7 +330,7 @@ void debug_qt::wait_for_debugger(device_t &device, bool firststop) // Hide all top level widgets if requested if (mainQtWindow->wantsHide()) { - foreach (QWidget* widget, QApplication::topLevelWidgets()) + foreach (QWidget *widget, QApplication::topLevelWidgets()) { if (!widget->isWindow() || widget->windowType() != Qt::Window) continue; @@ -355,7 +348,7 @@ void debug_qt::wait_for_debugger(device_t &device, bool firststop) gather_save_configurations(); } #if defined(WIN32) && !defined(SDLMAME_WIN32) - winwindow_update_cursor_state(*m_machine); // make sure the cursor isn't hidden while in debugger + winwindow_update_cursor_state(*m_machine); // make sure the cursor isn't hidden while in debugger #endif } @@ -369,8 +362,10 @@ void debug_qt::debugger_update() qApp->processEvents(QEventLoop::AllEvents, 1); } -#else /* SDLMAME_UNIX */ - MODULE_NOT_SUPPORTED(debug_qt, OSD_DEBUG_PROVIDER, "qt") +#else // USE_QTDEBUG + +MODULE_NOT_SUPPORTED(debug_qt, OSD_DEBUG_PROVIDER, "qt") + #endif MODULE_DEFINITION(DEBUG_QT, debug_qt) |