Fix a crash when emulator, in non-debugger mode, opens the breakpoint UIs at launch
[clinton/Virtual-Jaguar-Rx.git] / src / gui / mainwin.cpp
index 031e6e3..a941d48 100644 (file)
@@ -20,7 +20,8 @@
 // JPM  11/04/2017  Added the local window\r
 // JPM  08/31/2018  Added the call stack window\r
 // JPM  Sept./2018  Added the new Models and BIOS handler, a screenshot feature and source code files browsing\r
-// JPM   Oct./2018  Added search paths in the settings, breakpoints feature\r
+// JPM   Oct./2018  Added search paths in the settings, breakpoints feature, cartdridge view menu\r
+// JPM  11/18/2018  Fix crash with non-debugger mode\r
 //\r
 \r
 // FIXED:\r
 #include "debugger/localbrowser.h"\r
 #include "debugger/heapallocatorbrowser.h"\r
 #include "debugger/callstackbrowser.h"\r
+#include "debugger/CartFilesListWin.h"\r
 \r
 \r
 // According to SebRmv, this header isn't seen on Arch Linux either... :-/\r
@@ -199,6 +201,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                NewFunctionBreakpointWin = new NewFnctBreakpointWindow(this);\r
                exceptionvectortableBrowseWin = new ExceptionVectorTableBrowserWindow(this);\r
                CallStackBrowseWin = new CallStackBrowserWindow(this);\r
+               CartFilesListWin = new CartFilesListWindow(this);\r
 \r
                mem1BrowseWin = (Memory1BrowserWindow **)calloc(vjs.nbrmemory1browserwindow, sizeof(Memory1BrowserWindow));\r
 #ifdef _MSC_VER\r
@@ -447,6 +450,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                CallStackBrowseAct->setStatusTip(tr("Shows Call Stack browser window"));\r
                connect(CallStackBrowseAct, SIGNAL(triggered()), this, SLOT(ShowCallStackBrowserWin()));\r
 \r
+               // Cart files list\r
+               CartFilesListAct = new QAction(QIcon(""), tr("Directory and files"), this);\r
+               CartFilesListAct->setStatusTip(tr("List of the files in the cartdridge's directory"));\r
+               connect(CartFilesListAct, SIGNAL(triggered()), this, SLOT(ShowCartFilesListWin()));\r
+\r
                // Memory windows\r
                mem1BrowseAct = (QAction **)calloc(vjs.nbrmemory1browserwindow, sizeof(QAction));\r
                QSignalMapper *signalMapper = new QSignalMapper(this);\r
@@ -517,11 +525,25 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        fileMenu->addSeparator();\r
        fileMenu->addAction(quitAppAct);\r
 \r
+       // Alpine and debugger menus\r
        if (vjs.hardwareTypeAlpine || vjs.softTypeDebugger)\r
        {\r
+               // Create debug & view menu\r
                debugMenu = menuBar()->addMenu(tr("&Debug"));\r
+               viewMenu = menuBar()->addMenu(tr("&View"));\r
+\r
+               // Create debugger menu\r
                if (vjs.softTypeDebugger)\r
                {\r
+                       // Cart menu\r
+                       viewCartMenu = viewMenu->addMenu(tr("&Cartridge"));\r
+                       viewCartMenu->addAction(CartFilesListAct);\r
+#if 0\r
+                       viewCartMenu->addSeparator();\r
+                       viewCartMenu->addAction(CartStreamsAct);\r
+#endif\r
+\r
+                       // Windows menu\r
                        debugWindowsMenu = debugMenu->addMenu(tr("&Windows"));\r
                        debugWindowsMenu->addAction(BreakpointsAct);\r
                        debugWindowExceptionMenu = debugWindowsMenu->addMenu(tr("&Exception"));\r
@@ -565,11 +587,14 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                        debugNewBreakpointMenu->addAction(newFunctionBreakpointAct);\r
                        debugMenu->addAction(deleteAllBreakpointsAct);\r
                        debugMenu->addAction(disableAllBreakpointsAct);\r
-                       //debugMenu->addSeparator();\r
-                       //debugMenu->addAction(DasmAct);\r
+#if 0\r
+                       debugMenu->addSeparator();\r
+                       debugMenu->addAction(DasmAct);\r
+#endif\r
                }\r
                else\r
                {\r
+                       // Create alpine menu\r
                        debugMenu->addAction(memBrowseAct);\r
                        debugMenu->addAction(stackBrowseAct);\r
                        debugMenu->addAction(cpuBrowseAct);\r
@@ -1210,7 +1235,7 @@ void MainWin::TogglePowerState(void)
 \r
                WriteLog("GUI: Resetting Jaguar...\n");\r
                JaguarReset();\r
-               DeleteAllBreakpoints();\r
+               DebuggerReset();\r
                DebuggerResetWindows();\r
                DACPauseAudioThread(false);\r
        }\r
@@ -1270,10 +1295,10 @@ void MainWin::ToggleRunState(void)
                        traceStepIntoAct->setDisabled(true);\r
                        traceStepOverAct->setDisabled(true);\r
                        restartAct->setDisabled(true);\r
+                       BreakpointsWin->RefreshContents();\r
                }\r
 \r
                cpuBrowseWin->UnholdBPM();\r
-               BreakpointsWin->RefreshContents();\r
        }\r
 \r
        // Pause/unpause any running/non-running threads...\r
@@ -1455,7 +1480,7 @@ void MainWin::ToggleCDUsage(void)
 }\r
 \r
 \r
-//\r
+// Open, or display, the breakpoints list window\r
 void MainWin::ShowBreakpointsWin(void)\r
 {\r
        BreakpointsWin->show();\r
@@ -1463,7 +1488,7 @@ void MainWin::ShowBreakpointsWin(void)
 }\r
 \r
 \r
-//\r
+// Delete all breakpoints\r
 void MainWin::DeleteAllBreakpoints(void)\r
 {\r
        cpuBrowseWin->ResetBPM();\r
@@ -1472,7 +1497,7 @@ void MainWin::DeleteAllBreakpoints(void)
 }\r
 \r
 \r
-//\r
+// Disable all breakpoints\r
 void MainWin::DisableAllBreakpoints(void)\r
 {\r
        cpuBrowseWin->DisableBPM();\r
@@ -1481,7 +1506,7 @@ void MainWin::DisableAllBreakpoints(void)
 }\r
 \r
 \r
-//\r
+// Open, or display, the new breakpoint function window\r
 void MainWin::ShowNewFunctionBreakpointWin(void)\r
 {\r
        NewFunctionBreakpointWin->show();\r
@@ -1489,6 +1514,14 @@ void MainWin::ShowNewFunctionBreakpointWin(void)
 }\r
 \r
 \r
+// \r
+void MainWin::ShowCartFilesListWin(void)\r
+{\r
+       CartFilesListWin->show();\r
+       CartFilesListWin->RefreshContents();\r
+}\r
+\r
+\r
 // Step Into trace\r
 void MainWin::DebuggerTraceStepInto(void)\r
 {\r
@@ -2023,6 +2056,13 @@ void MainWin::ReadUISettings(void)
                size = settings.value("CallStackBrowseWinSize", QSize(400, 400)).toSize();\r
                CallStackBrowseWin->resize(size);\r
 \r
+               // Cartdridge directory and files\r
+               pos = settings.value("CartFilesListWinPos", QPoint(200, 200)).toPoint();\r
+               CartFilesListWin->move(pos);\r
+               settings.value("CartFilesListWinIsVisible", false).toBool() ? ShowCartFilesListWin() : void();\r
+               size = settings.value("CartFilesListWinSize", QSize(400, 400)).toSize();\r
+               CartFilesListWin->resize(size);\r
+\r
                // Breakpoints UI information\r
                pos = settings.value("BreakpointsWinPos", QPoint(200, 200)).toPoint();\r
                BreakpointsWin->move(pos);\r
@@ -2242,6 +2282,10 @@ void MainWin::WriteUISettings(void)
                settings.setValue("NewFunctionBreakpointWinPos", NewFunctionBreakpointWin->pos());\r
                settings.setValue("NewFunctionBreakpointWinIsVisible", NewFunctionBreakpointWin->isVisible());\r
                settings.setValue("NewFunctionBreakpointWinSize", NewFunctionBreakpointWin->size());\r
+               settings.setValue("CartFilesListWinPos", CartFilesListWin->pos());\r
+               settings.setValue("CartFilesListWinIsVisible", CartFilesListWin->isVisible());\r
+               settings.setValue("CartFilesListWinSize", CartFilesListWin->size());\r
+\r
                for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
                {\r
                        sprintf(mem1Name, "mem1BrowseWinPos[%i]", (unsigned int)i);\r
@@ -2270,6 +2314,16 @@ void MainWin::AlpineRefreshWindows(void)
 }\r
 \r
 \r
+// Reset soft debugger\r
+void MainWin::DebuggerReset(void)\r
+{\r
+       if (vjs.softTypeDebugger)\r
+       {\r
+               DeleteAllBreakpoints();\r
+       }\r
+}\r
+\r
+\r
 // Reset soft debugger windows\r
 void MainWin::DebuggerResetWindows(void)\r
 {\r
@@ -2279,17 +2333,22 @@ void MainWin::DebuggerResetWindows(void)
                allWatchBrowseWin->Reset();\r
                heapallocatorBrowseWin->Reset();\r
                BreakpointsWin->Reset();\r
-\r
+               CartFilesListWin->Reset();\r
                //ResetAlpineWindows();\r
        }\r
 }\r
 \r
 \r
+// Refresh view windows\r
+void MainWin::ViewRefreshWindows(void)\r
+{\r
+       CartFilesListWin->RefreshContents();\r
+}\r
+\r
+\r
 // Refresh soft debugger & alpine debug windows\r
 void MainWin::DebuggerRefreshWindows(void)\r
 {\r
-       size_t i;\r
-\r
        if (vjs.softTypeDebugger)\r
        {\r
                FilesrcListWin->RefreshContents();\r
@@ -2301,12 +2360,13 @@ void MainWin::DebuggerRefreshWindows(void)
                CallStackBrowseWin->RefreshContents();\r
                heapallocatorBrowseWin->RefreshContents();\r
                BreakpointsWin->RefreshContents();\r
-               for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
+               for (size_t i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
                {\r
                        mem1BrowseWin[i]->RefreshContents(i);\r
                }\r
 \r
                AlpineRefreshWindows();\r
+               ViewRefreshWindows();\r
        }\r
 }\r
 \r