Debugger: Added standalone "Watch Window"

This commit is contained in:
Sour 2019-01-29 17:21:23 -05:00
parent d58d1f39d1
commit 9a256fa8b7
16 changed files with 344 additions and 34 deletions

View file

@ -289,6 +289,9 @@ namespace Mesen.GUI.Config
public Size ProfilerSize = new Size(0, 0);
public Point ProfilerLocation;
public Size WatchWindowSize = new Size(0, 0);
public Point WatchWindowLocation;
public Point WindowLocation;
public int WindowWidth = -1;
public int WindowHeight = -1;

View file

@ -84,6 +84,8 @@ namespace Mesen.GUI.Config
public XmlKeys OpenTraceLogger = Keys.Control | Keys.J;
[ShortcutName("Open Text Hooker")]
public XmlKeys OpenTextHooker = Keys.Control | Keys.H;
[ShortcutName("Open Watch Window")]
public XmlKeys OpenWatchWindow = Keys.Control | Keys.W;
[ShortcutName("Open Nametabler Viewer (Compact)")]
public XmlKeys OpenNametableViewer = Keys.Control | Keys.D1;

View file

@ -43,7 +43,6 @@
this.mnuMoveDown = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
this.mnuHexDisplay = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
this.txtEdit = new System.Windows.Forms.TextBox();
this.contextMenuWatch.SuspendLayout();
this.SuspendLayout();
@ -93,10 +92,9 @@
this.mnuMoveUp,
this.mnuMoveDown,
this.toolStripMenuItem2,
this.mnuHexDisplay,
this.toolStripMenuItem3});
this.mnuHexDisplay});
this.contextMenuWatch.Name = "contextMenuWatch";
this.contextMenuWatch.Size = new System.Drawing.Size(194, 160);
this.contextMenuWatch.Size = new System.Drawing.Size(194, 154);
this.contextMenuWatch.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuWatch_Opening);
//
// mnuRemoveWatch
@ -164,11 +162,6 @@
this.mnuHexDisplay.Text = "Hexadecimal Display";
this.mnuHexDisplay.Click += new System.EventHandler(this.mnuHexDisplay_Click);
//
// toolStripMenuItem3
//
this.toolStripMenuItem3.Name = "toolStripMenuItem3";
this.toolStripMenuItem3.Size = new System.Drawing.Size(190, 6);
//
// txtEdit
//
this.txtEdit.AcceptsReturn = true;
@ -209,6 +202,5 @@
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4;
private System.Windows.Forms.ToolStripMenuItem mnuMoveUp;
private System.Windows.Forms.ToolStripMenuItem mnuMoveDown;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3;
}
}

View file

@ -21,6 +21,7 @@ namespace Mesen.GUI.Debugger
private int _previousMaxLength = -1;
private int _selectedAddress = -1;
private CodeLabel _selectedLabel = null;
private List<WatchValueInfo> _previousValues = new List<WatchValueInfo>();
private bool _isEditing = false;
ListViewItem _keyDownItem = null;
@ -90,7 +91,8 @@ namespace Mesen.GUI.Debugger
public void UpdateWatch(bool autoResizeColumns = true)
{
List<WatchValueInfo> watchContent = WatchManager.GetWatchContent(mnuHexDisplay.Checked);
List<WatchValueInfo> watchContent = WatchManager.GetWatchContent(mnuHexDisplay.Checked, _previousValues);
_previousValues = watchContent;
int currentSelection = lstWatch.FocusedItem?.Index ?? -1;

View file

@ -43,6 +43,7 @@ namespace Mesen.GUI.Debugger
case DebugWindow.EventViewer: frm = new frmEventViewer(); frm.Icon = Properties.Resources.NesEventViewer; break;
case DebugWindow.TextHooker: frm = new frmTextHooker(); frm.Icon = Properties.Resources.Font; break;
case DebugWindow.Profiler: frm = new frmProfiler(); frm.Icon = Properties.Resources.Speed; break;
case DebugWindow.WatchWindow: frm = new frmWatchWindow(); frm.Icon = Properties.Resources.Find; break;
}
_openedWindows.Add(frm);
frm.FormClosed += Debugger_FormClosed;
@ -147,6 +148,7 @@ namespace Mesen.GUI.Debugger
case DebugWindow.ApuViewer: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmApuViewer));
case DebugWindow.TextHooker: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmTextHooker));
case DebugWindow.Profiler: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmProfiler));
case DebugWindow.WatchWindow: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmWatchWindow));
}
return null;
@ -156,6 +158,7 @@ namespace Mesen.GUI.Debugger
{
if(_openedWindows.Count == 0) {
//All windows have been closed, disable debugger
DebugWorkspaceManager.SaveWorkspace();
DebugWorkspaceManager.Clear();
InteropEmu.DebugRelease();
}
@ -180,5 +183,6 @@ namespace Mesen.GUI.Debugger
EventViewer,
TextHooker,
Profiler,
WatchWindow,
}
}

View file

@ -11,7 +11,6 @@ namespace Mesen.GUI.Debugger
{
public static event EventHandler WatchChanged;
private static List<string> _watchEntries = new List<string>();
private static List<WatchValueInfo> _previousValues = new List<WatchValueInfo>();
private static Regex _arrayWatchRegex = new Regex(@"\[((\$[0-9A-Fa-f]+)|(\d+)|([@_a-zA-Z0-9]+))\s*,\s*(\d+)\]", RegexOptions.Compiled);
public static List<string> WatchEntries
@ -24,7 +23,7 @@ namespace Mesen.GUI.Debugger
}
}
public static List<WatchValueInfo> GetWatchContent(bool useHex)
public static List<WatchValueInfo> GetWatchContent(bool useHex, List<WatchValueInfo> previousValues)
{
var list = new List<WatchValueInfo>();
for(int i = 0; i < _watchEntries.Count; i++) {
@ -53,10 +52,9 @@ namespace Mesen.GUI.Debugger
}
}
list.Add(new WatchValueInfo() { Expression = expression, Value = newValue, HasChanged = forceHasChanged || (i < _previousValues.Count ? (_previousValues[i].Value != newValue) : false) });
list.Add(new WatchValueInfo() { Expression = expression, Value = newValue, HasChanged = forceHasChanged || (i < previousValues.Count ? (previousValues[i].Value != newValue) : false) });
}
_previousValues = list;
return list;
}
@ -119,7 +117,7 @@ namespace Mesen.GUI.Debugger
{
HashSet<int> set = new HashSet<int>(indexes);
_watchEntries = _watchEntries.Where((el, index) => !set.Contains(index)).ToList();
_previousValues = _previousValues.Where((el, index) => !set.Contains(index)).ToList();
//_previousValues = _previousValues.Where((el, index) => !set.Contains(index)).ToList();
WatchChanged?.Invoke(null, EventArgs.Empty);
}
}

View file

@ -52,6 +52,7 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.OpenScriptWindow)),
GetMember(nameof(DebuggerShortcutsConfig.OpenTextHooker)),
GetMember(nameof(DebuggerShortcutsConfig.OpenTraceLogger)),
GetMember(nameof(DebuggerShortcutsConfig.OpenWatchWindow)),
GetMember(nameof(DebuggerShortcutsConfig.OpenNametableViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenChrViewer)),

View file

@ -180,6 +180,7 @@ namespace Mesen.GUI.Debugger
this.toolStripMenuItem19 = new System.Windows.Forms.ToolStripSeparator();
this.mnuShowBreakNotifications = new System.Windows.Forms.ToolStripMenuItem();
this.mnuShowInstructionProgression = new System.Windows.Forms.ToolStripMenuItem();
this.mnuShowSelectionLength = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem27 = new System.Windows.Forms.ToolStripSeparator();
this.mnuAlwaysScrollToCenter = new System.Windows.Forms.ToolStripMenuItem();
this.mnuRefreshWhileRunning = new System.Windows.Forms.ToolStripMenuItem();
@ -196,6 +197,7 @@ namespace Mesen.GUI.Debugger
this.mnuScriptWindow = new System.Windows.Forms.ToolStripMenuItem();
this.mnuTextHooker = new System.Windows.Forms.ToolStripMenuItem();
this.mnuTraceLogger = new System.Windows.Forms.ToolStripMenuItem();
this.mnuWatchWindow = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripSeparator();
this.pPUViewerCompactToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuOpenNametableViewer = new System.Windows.Forms.ToolStripMenuItem();
@ -226,7 +228,6 @@ namespace Mesen.GUI.Debugger
this.ctrlPpuMemoryMapping = new Mesen.GUI.Debugger.Controls.ctrlMemoryMapping();
this.ctrlCpuMemoryMapping = new Mesen.GUI.Debugger.Controls.ctrlMemoryMapping();
this.tsToolbar = new Mesen.GUI.Controls.ctrlMesenToolStrip();
this.mnuShowSelectionLength = new System.Windows.Forms.ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
this.splitContainer.Panel1.SuspendLayout();
this.splitContainer.Panel2.SuspendLayout();
@ -1634,6 +1635,14 @@ namespace Mesen.GUI.Debugger
this.mnuShowInstructionProgression.Text = "Show instruction progression";
this.mnuShowInstructionProgression.Click += new System.EventHandler(this.mnuShowInstructionProgression_Click);
//
// mnuShowSelectionLength
//
this.mnuShowSelectionLength.CheckOnClick = true;
this.mnuShowSelectionLength.Name = "mnuShowSelectionLength";
this.mnuShowSelectionLength.Size = new System.Drawing.Size(266, 22);
this.mnuShowSelectionLength.Text = "Show selection length";
this.mnuShowSelectionLength.Click += new System.EventHandler(this.mnuShowSelectionLength_Click);
//
// toolStripMenuItem27
//
this.toolStripMenuItem27.Name = "toolStripMenuItem27";
@ -1688,6 +1697,7 @@ namespace Mesen.GUI.Debugger
this.mnuScriptWindow,
this.mnuTextHooker,
this.mnuTraceLogger,
this.mnuWatchWindow,
this.toolStripMenuItem13,
this.pPUViewerCompactToolStripMenuItem,
this.toolStripMenuItem17,
@ -1770,6 +1780,14 @@ namespace Mesen.GUI.Debugger
this.mnuTraceLogger.Text = "Trace Logger";
this.mnuTraceLogger.Click += new System.EventHandler(this.mnuTraceLogger_Click);
//
// mnuWatchWindow
//
this.mnuWatchWindow.Image = global::Mesen.GUI.Properties.Resources.Find;
this.mnuWatchWindow.Name = "mnuWatchWindow";
this.mnuWatchWindow.Size = new System.Drawing.Size(194, 22);
this.mnuWatchWindow.Text = "Watch Window";
this.mnuWatchWindow.Click += new System.EventHandler(this.mnuWatchWindow_Click);
//
// toolStripMenuItem13
//
this.toolStripMenuItem13.Name = "toolStripMenuItem13";
@ -2005,14 +2023,6 @@ namespace Mesen.GUI.Debugger
this.tsToolbar.Text = "toolStrip1";
this.tsToolbar.Visible = false;
//
// mnuShowSelectionLength
//
this.mnuShowSelectionLength.CheckOnClick = true;
this.mnuShowSelectionLength.Name = "mnuShowSelectionLength";
this.mnuShowSelectionLength.Size = new System.Drawing.Size(266, 22);
this.mnuShowSelectionLength.Text = "Show selection length";
this.mnuShowSelectionLength.Click += new System.EventHandler(this.mnuShowSelectionLength_Click);
//
// frmDebugger
//
this.AllowDrop = true;
@ -2260,5 +2270,6 @@ namespace Mesen.GUI.Debugger
private System.Windows.Forms.ToolStripMenuItem mnuProfiler;
private System.Windows.Forms.ToolStripMenuItem mnuRunCpuCycle;
private System.Windows.Forms.ToolStripMenuItem mnuShowSelectionLength;
private System.Windows.Forms.ToolStripMenuItem mnuWatchWindow;
}
}

View file

@ -287,6 +287,7 @@ namespace Mesen.GUI.Debugger
mnuTraceLogger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenTraceLogger));
mnuTextHooker.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenTextHooker));
mnuProfiler.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenProfiler));
mnuWatchWindow.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenWatchWindow));
mnuOpenNametableViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenNametableViewer));
mnuOpenChrViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenChrViewer));
@ -1890,5 +1891,10 @@ namespace Mesen.GUI.Debugger
{
DebugWindowManager.OpenPpuViewer(PpuViewerMode.PaletteViewer);
}
private void mnuWatchWindow_Click(object sender, EventArgs e)
{
DebugWindowManager.OpenDebugWindow(DebugWindow.WatchWindow);
}
}
}

View file

@ -0,0 +1,58 @@
namespace Mesen.GUI.Debugger
{
partial class frmWatchWindow
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.ctrlWatch = new Mesen.GUI.Debugger.ctrlWatch();
this.SuspendLayout();
//
// ctrlWatch
//
this.ctrlWatch.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlWatch.Location = new System.Drawing.Point(0, 0);
this.ctrlWatch.Name = "ctrlWatch";
this.ctrlWatch.Size = new System.Drawing.Size(317, 322);
this.ctrlWatch.TabIndex = 0;
//
// frmWatchWindow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(317, 322);
this.Controls.Add(this.ctrlWatch);
this.MinimumSize = new System.Drawing.Size(248, 137);
this.Name = "frmWatchWindow";
this.Text = "Watch Window";
this.ResumeLayout(false);
}
#endregion
private ctrlWatch ctrlWatch;
}
}

View file

@ -0,0 +1,83 @@
using Mesen.GUI.Config;
using Mesen.GUI.Forms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Debugger
{
public partial class frmWatchWindow : BaseForm
{
private InteropEmu.NotificationListener _notifListener;
public frmWatchWindow()
{
InitializeComponent();
if(!DesignMode) {
if(!ConfigManager.Config.DebugInfo.WatchWindowSize.IsEmpty) {
this.StartPosition = FormStartPosition.Manual;
this.Size = ConfigManager.Config.DebugInfo.WatchWindowSize;
this.Location = ConfigManager.Config.DebugInfo.WatchWindowLocation;
}
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if(!DesignMode) {
DebugWorkspaceManager.GetWorkspace();
DebugWorkspaceManager.AutoLoadDbgFiles(true);
_notifListener = new InteropEmu.NotificationListener(ConfigManager.Config.DebugInfo.DebugConsoleId);
_notifListener.OnNotification += _notifListener_OnNotification;
ctrlWatch.UpdateWatch(true);
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
ConfigManager.Config.DebugInfo.WatchWindowSize = this.WindowState != FormWindowState.Normal ? this.RestoreBounds.Size : this.Size;
ConfigManager.Config.DebugInfo.WatchWindowLocation = this.WindowState != FormWindowState.Normal ? this.RestoreBounds.Location : this.Location;
ConfigManager.ApplyChanges();
}
protected override void OnFormClosed(FormClosedEventArgs e)
{
base.OnFormClosed(e);
if(_notifListener != null) {
_notifListener.Dispose();
_notifListener = null;
}
}
private void _notifListener_OnNotification(InteropEmu.NotificationEventArgs e)
{
switch(e.NotificationType) {
case InteropEmu.ConsoleNotificationType.PpuFrameDone:
if(ConfigManager.Config.DebugInfo.RefreshWhileRunning) {
this.BeginInvoke((MethodInvoker)(() => {
ctrlWatch.UpdateWatch(false);
}));
}
break;
case InteropEmu.ConsoleNotificationType.CodeBreak:
this.BeginInvoke((MethodInvoker)(() => {
ctrlWatch.UpdateWatch(false);
}));
break;
}
}
}
}

View file

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View file

@ -198,6 +198,7 @@ namespace Mesen.GUI.Forms
this.mnuDebugDebugger = new System.Windows.Forms.ToolStripMenuItem();
this.mnuEventViewer = new System.Windows.Forms.ToolStripMenuItem();
this.mnuMemoryViewer = new System.Windows.Forms.ToolStripMenuItem();
this.mnuProfiler = new System.Windows.Forms.ToolStripMenuItem();
this.mnuPpuViewer = new System.Windows.Forms.ToolStripMenuItem();
this.mnuScriptWindow = new System.Windows.Forms.ToolStripMenuItem();
this.mnuTextHooker = new System.Windows.Forms.ToolStripMenuItem();
@ -221,7 +222,7 @@ namespace Mesen.GUI.Forms
this.mnuReportBug = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator();
this.mnuAbout = new System.Windows.Forms.ToolStripMenuItem();
this.mnuProfiler = new System.Windows.Forms.ToolStripMenuItem();
this.mnuWatchWindow = new System.Windows.Forms.ToolStripMenuItem();
this.panelRenderer.SuspendLayout();
this.panelInfo.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
@ -315,10 +316,10 @@ namespace Mesen.GUI.Forms
this.lblVersion.AutoSize = true;
this.lblVersion.BackColor = System.Drawing.Color.Transparent;
this.lblVersion.ForeColor = System.Drawing.Color.White;
this.lblVersion.Location = new System.Drawing.Point(55, 5);
this.lblVersion.Location = new System.Drawing.Point(55, 7);
this.lblVersion.Margin = new System.Windows.Forms.Padding(0, 1, 0, 0);
this.lblVersion.Name = "lblVersion";
this.lblVersion.Size = new System.Drawing.Size(0, 16);
this.lblVersion.Size = new System.Drawing.Size(0, 13);
this.lblVersion.TabIndex = 6;
this.lblVersion.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
@ -1567,6 +1568,7 @@ namespace Mesen.GUI.Forms
this.mnuScriptWindow,
this.mnuTextHooker,
this.mnuTraceLogger,
this.mnuWatchWindow,
this.sepDebugDualSystemSecondaryCpu,
this.mnuDebugDualSystemSecondaryCpu,
this.toolStripMenuItem25,
@ -1620,6 +1622,14 @@ namespace Mesen.GUI.Forms
this.mnuMemoryViewer.Text = "Memory Tools";
this.mnuMemoryViewer.Click += new System.EventHandler(this.mnuMemoryViewer_Click);
//
// mnuProfiler
//
this.mnuProfiler.Image = global::Mesen.GUI.Properties.Resources.Speed;
this.mnuProfiler.Name = "mnuProfiler";
this.mnuProfiler.Size = new System.Drawing.Size(258, 22);
this.mnuProfiler.Text = "Performance Profiler";
this.mnuProfiler.Click += new System.EventHandler(this.mnuProfiler_Click);
//
// mnuPpuViewer
//
this.mnuPpuViewer.Image = global::Mesen.GUI.Properties.Resources.Video;
@ -1794,13 +1804,13 @@ namespace Mesen.GUI.Forms
this.mnuAbout.Text = "About";
this.mnuAbout.Click += new System.EventHandler(this.mnuAbout_Click);
//
// mnuProfiler
// mnuWatchWindow
//
this.mnuProfiler.Image = global::Mesen.GUI.Properties.Resources.Speed;
this.mnuProfiler.Name = "mnuProfiler";
this.mnuProfiler.Size = new System.Drawing.Size(258, 22);
this.mnuProfiler.Text = "Performance Profiler";
this.mnuProfiler.Click += new System.EventHandler(this.mnuProfiler_Click);
this.mnuWatchWindow.Image = global::Mesen.GUI.Properties.Resources.Find;
this.mnuWatchWindow.Name = "mnuWatchWindow";
this.mnuWatchWindow.Size = new System.Drawing.Size(258, 22);
this.mnuWatchWindow.Text = "Watch Window";
this.mnuWatchWindow.Click += new System.EventHandler(this.mnuWatchWindow_Click);
//
// frmMain
//
@ -2023,6 +2033,7 @@ namespace Mesen.GUI.Forms
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem28;
private System.Windows.Forms.ToolStripMenuItem mnuProfiler;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.ToolStripMenuItem mnuWatchWindow;
}
}

View file

@ -398,6 +398,11 @@ namespace Mesen.GUI.Forms
DebugWindowManager.OpenDebugWindow(DebugWindow.TraceLogger);
}
private void mnuWatchWindow_Click(object sender, EventArgs e)
{
DebugWindowManager.OpenDebugWindow(DebugWindow.WatchWindow);
}
private void mnuTextHooker_Click(object sender, EventArgs e)
{
DebugWindowManager.OpenDebugWindow(DebugWindow.TextHooker);

View file

@ -841,6 +841,7 @@ namespace Mesen.GUI.Forms
mnuTraceLogger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenTraceLogger));
mnuTextHooker.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenTextHooker));
mnuProfiler.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenProfiler));
mnuWatchWindow.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenWatchWindow));
mnuOpenNametableViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenNametableViewer));
mnuOpenChrViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenChrViewer));
@ -1183,6 +1184,7 @@ namespace Mesen.GUI.Forms
mnuTextHooker.Enabled = running;
mnuTraceLogger.Enabled = running;
mnuProfiler.Enabled = running;
mnuWatchWindow.Enabled = running;
mnuPpuViewerCompact.Enabled = running;
mnuOpenNametableViewer.Enabled = running;

View file

@ -844,6 +844,12 @@
<Compile Include="Debugger\frmTraceLogger.Designer.cs">
<DependentUpon>frmTraceLogger.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\frmWatchWindow.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Debugger\frmWatchWindow.Designer.cs">
<DependentUpon>frmWatchWindow.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\HdPackCopyHelper.cs" />
<Compile Include="Debugger\HexBox\BuiltInContextMenu.cs">
<SubType>Component</SubType>
@ -1401,6 +1407,9 @@
<EmbeddedResource Include="Debugger\frmTextHooker.resx">
<DependentUpon>frmTextHooker.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\frmWatchWindow.resx">
<DependentUpon>frmWatchWindow.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Dependencies\LuaScripts\Example.lua">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>