2019-03-28 21:20:18 -04:00
|
|
|
|
using Mesen.GUI.Debugger.Workspace;
|
|
|
|
|
using Mesen.GUI.Forms;
|
2019-02-16 08:10:08 -05:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
|
|
|
|
namespace Mesen.GUI.Debugger
|
|
|
|
|
{
|
|
|
|
|
public class DebugWindowManager
|
|
|
|
|
{
|
|
|
|
|
private static HashSet<Form> _openedWindows = new HashSet<Form>();
|
|
|
|
|
|
|
|
|
|
public static List<Form> GetWindows()
|
|
|
|
|
{
|
|
|
|
|
return new List<Form>(_openedWindows);
|
|
|
|
|
}
|
|
|
|
|
public static Form OpenDebugWindow(DebugWindow window)
|
|
|
|
|
{
|
|
|
|
|
Form existingWindow = GetExistingSingleInstanceWindow(window);
|
|
|
|
|
if(existingWindow != null) {
|
2019-04-30 21:05:53 -04:00
|
|
|
|
BringToFront(existingWindow);
|
2019-02-16 08:10:08 -05:00
|
|
|
|
return existingWindow;
|
|
|
|
|
} else {
|
|
|
|
|
BaseForm frm = null;
|
|
|
|
|
switch(window) {
|
2019-04-07 12:25:14 -04:00
|
|
|
|
case DebugWindow.Debugger: frm = new frmDebugger(CpuType.Cpu); frm.Icon = Properties.Resources.Debugger; break;
|
|
|
|
|
case DebugWindow.SpcDebugger: frm = new frmDebugger(CpuType.Spc); frm.Icon = Properties.Resources.SpcDebugger; break;
|
2019-02-16 08:10:08 -05:00
|
|
|
|
case DebugWindow.TraceLogger: frm = new frmTraceLogger(); frm.Icon = Properties.Resources.LogWindow; break;
|
|
|
|
|
case DebugWindow.MemoryTools: frm = new frmMemoryTools(); frm.Icon = Properties.Resources.CheatCode; break;
|
2019-03-23 15:39:21 -04:00
|
|
|
|
case DebugWindow.TileViewer: frm = new frmTileViewer(); frm.Icon = Properties.Resources.VerticalLayout; break;
|
2019-03-03 16:34:23 -05:00
|
|
|
|
case DebugWindow.TilemapViewer: frm = new frmTilemapViewer(); frm.Icon = Properties.Resources.VideoOptions; break;
|
2019-03-16 16:38:28 -04:00
|
|
|
|
case DebugWindow.PaletteViewer: frm = new frmPaletteViewer(); frm.Icon = Properties.Resources.VideoFilter; break;
|
2019-04-25 19:49:15 -04:00
|
|
|
|
case DebugWindow.SpriteViewer: frm = new frmSpriteViewer(); frm.Icon = Properties.Resources.PerfTracker; break;
|
2019-03-07 20:12:32 -05:00
|
|
|
|
case DebugWindow.EventViewer: frm = new frmEventViewer(); frm.Icon = Properties.Resources.NesEventViewer; break;
|
2019-02-16 08:10:08 -05:00
|
|
|
|
}
|
2019-03-28 22:40:52 -04:00
|
|
|
|
|
|
|
|
|
if(_openedWindows.Count == 0) {
|
|
|
|
|
DebugWorkspaceManager.GetWorkspace();
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-16 08:10:08 -05:00
|
|
|
|
_openedWindows.Add(frm);
|
|
|
|
|
frm.FormClosed += Debugger_FormClosed;
|
|
|
|
|
frm.Show();
|
|
|
|
|
return frm;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static frmMemoryTools OpenMemoryViewer()
|
|
|
|
|
{
|
|
|
|
|
frmMemoryTools frm = GetMemoryViewer();
|
|
|
|
|
if(frm == null) {
|
|
|
|
|
frm = new frmMemoryTools();
|
|
|
|
|
frm.Icon = Properties.Resources.CheatCode;
|
|
|
|
|
frm.FormClosed += Debugger_FormClosed;
|
|
|
|
|
_openedWindows.Add(frm);
|
|
|
|
|
} else {
|
|
|
|
|
if(frm.WindowState == FormWindowState.Minimized) {
|
|
|
|
|
//Unminimize window if it was minimized
|
|
|
|
|
frm.WindowState = FormWindowState.Normal;
|
|
|
|
|
}
|
|
|
|
|
frm.BringToFront();
|
|
|
|
|
}
|
|
|
|
|
frm.Show();
|
|
|
|
|
return frm;
|
|
|
|
|
}
|
2019-04-28 22:19:52 -04:00
|
|
|
|
|
|
|
|
|
public static frmMemoryTools OpenMemoryViewer(AddressInfo address)
|
|
|
|
|
{
|
|
|
|
|
frmMemoryTools frm = OpenMemoryViewer();
|
|
|
|
|
frm.ShowAddress(address.Address, address.Type);
|
|
|
|
|
return frm;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static frmDebugger OpenDebugger(CpuType type)
|
|
|
|
|
{
|
|
|
|
|
return (frmDebugger)OpenDebugWindow(type == CpuType.Cpu ? DebugWindow.Debugger : DebugWindow.SpcDebugger);
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-16 08:10:08 -05:00
|
|
|
|
public static frmMemoryTools GetMemoryViewer()
|
|
|
|
|
{
|
|
|
|
|
return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmMemoryTools)) as frmMemoryTools;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static bool HasOpenedWindow
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return _openedWindows.Count > 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void CloseAll()
|
|
|
|
|
{
|
|
|
|
|
List<Form> openedWindows = new List<Form>(_openedWindows);
|
|
|
|
|
foreach(Form frm in openedWindows) {
|
|
|
|
|
frm.Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Form GetExistingSingleInstanceWindow(DebugWindow window)
|
|
|
|
|
{
|
|
|
|
|
//Only one of each of these windows can be opened at once, check if one is already opened
|
|
|
|
|
switch(window) {
|
2019-04-07 12:25:14 -04:00
|
|
|
|
case DebugWindow.Debugger: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmDebugger) && ((frmDebugger)form).CpuType == CpuType.Cpu);
|
|
|
|
|
case DebugWindow.SpcDebugger: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmDebugger) && ((frmDebugger)form).CpuType == CpuType.Spc);
|
2019-02-16 08:10:08 -05:00
|
|
|
|
case DebugWindow.TraceLogger: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmTraceLogger));
|
2019-04-20 17:10:21 -04:00
|
|
|
|
case DebugWindow.EventViewer: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmEventViewer));
|
2019-02-16 08:10:08 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void CleanupDebugger()
|
|
|
|
|
{
|
|
|
|
|
if(_openedWindows.Count == 0) {
|
|
|
|
|
//All windows have been closed, disable debugger
|
2019-03-28 21:20:18 -04:00
|
|
|
|
DebugWorkspaceManager.SaveWorkspace();
|
|
|
|
|
DebugWorkspaceManager.Clear();
|
2019-03-16 12:20:18 -04:00
|
|
|
|
DebugApi.ReleaseDebugger();
|
2019-02-16 08:10:08 -05:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void Debugger_FormClosed(object sender, FormClosedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
_openedWindows.Remove((Form)sender);
|
|
|
|
|
CleanupDebugger();
|
|
|
|
|
}
|
2019-04-30 21:05:53 -04:00
|
|
|
|
|
|
|
|
|
public static void BringToFront(Form form)
|
|
|
|
|
{
|
|
|
|
|
form.BringToFront();
|
|
|
|
|
if(form.WindowState == FormWindowState.Minimized) {
|
|
|
|
|
//Unminimize window if it was minimized
|
|
|
|
|
form.WindowState = FormWindowState.Normal;
|
|
|
|
|
}
|
|
|
|
|
form.Focus();
|
|
|
|
|
}
|
2019-02-16 08:10:08 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public enum DebugWindow
|
|
|
|
|
{
|
2019-02-27 19:49:26 -05:00
|
|
|
|
Debugger,
|
2019-04-07 12:25:14 -04:00
|
|
|
|
SpcDebugger,
|
2019-02-16 08:10:08 -05:00
|
|
|
|
MemoryTools,
|
2019-03-03 16:34:23 -05:00
|
|
|
|
TraceLogger,
|
2019-03-23 15:39:21 -04:00
|
|
|
|
TileViewer,
|
2019-03-07 20:12:32 -05:00
|
|
|
|
TilemapViewer,
|
2019-03-16 16:38:28 -04:00
|
|
|
|
PaletteViewer,
|
2019-04-25 19:49:15 -04:00
|
|
|
|
SpriteViewer,
|
2019-03-07 20:12:32 -05:00
|
|
|
|
EventViewer
|
2019-02-16 08:10:08 -05:00
|
|
|
|
}
|
|
|
|
|
}
|