diff --git a/src/Xenia.Debug.UI/Controls/BaseDocument.Designer.cs b/src/Xenia.Debug.UI/Controls/BaseDocument.Designer.cs new file mode 100644 index 000000000..a3ddc9483 --- /dev/null +++ b/src/Xenia.Debug.UI/Controls/BaseDocument.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Controls { + partial class BaseDocument { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "BaseDocument"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Controls/BaseDocument.cs b/src/Xenia.Debug.UI/Controls/BaseDocument.cs new file mode 100644 index 000000000..79b96f8ac --- /dev/null +++ b/src/Xenia.Debug.UI/Controls/BaseDocument.cs @@ -0,0 +1,18 @@ +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; +using WeifenLuo.WinFormsUI.Docking; + +namespace Xenia.Debug.UI.Controls { + public partial class BaseDocument : DockContent { + public BaseDocument() { + InitializeComponent(); + } + } +} diff --git a/src/Xenia.Debug.UI/Controls/BasePanel.Designer.cs b/src/Xenia.Debug.UI/Controls/BasePanel.Designer.cs new file mode 100644 index 000000000..3cdffce91 --- /dev/null +++ b/src/Xenia.Debug.UI/Controls/BasePanel.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Controls { + partial class BasePanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "BasePanel"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Form1.cs b/src/Xenia.Debug.UI/Controls/BasePanel.cs similarity index 63% rename from src/Xenia.Debug.UI/Form1.cs rename to src/Xenia.Debug.UI/Controls/BasePanel.cs index d1e76d532..90c30589b 100644 --- a/src/Xenia.Debug.UI/Form1.cs +++ b/src/Xenia.Debug.UI/Controls/BasePanel.cs @@ -7,10 +7,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using WeifenLuo.WinFormsUI.Docking; -namespace Xenia.Debug.UI { - public partial class Form1 : Form { - public Form1() { +namespace Xenia.Debug.UI.Controls { + public partial class BasePanel : DockContent { + public BasePanel() { InitializeComponent(); } } diff --git a/src/Xenia.Debug.UI/MainWindow.Designer.cs b/src/Xenia.Debug.UI/MainWindow.Designer.cs new file mode 100644 index 000000000..bc11d14c0 --- /dev/null +++ b/src/Xenia.Debug.UI/MainWindow.Designer.cs @@ -0,0 +1,121 @@ +namespace Xenia.Debug.UI { + partial class MainWindow { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow)); + this.mainMenuStrip = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mainToolStrip = new System.Windows.Forms.ToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.mainMenuStrip.SuspendLayout(); + this.mainToolStrip.SuspendLayout(); + this.statusStrip.SuspendLayout(); + this.SuspendLayout(); + // + // mainMenuStrip + // + this.mainMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem}); + this.mainMenuStrip.Location = new System.Drawing.Point(0, 0); + this.mainMenuStrip.Name = "mainMenuStrip"; + this.mainMenuStrip.Size = new System.Drawing.Size(1571, 24); + this.mainMenuStrip.TabIndex = 0; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // mainToolStrip + // + this.mainToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1}); + this.mainToolStrip.Location = new System.Drawing.Point(0, 24); + this.mainToolStrip.Name = "mainToolStrip"; + this.mainToolStrip.Size = new System.Drawing.Size(1571, 25); + this.mainToolStrip.TabIndex = 3; + this.mainToolStrip.Text = "toolStrip1"; + // + // toolStripButton1 + // + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(23, 22); + this.toolStripButton1.Text = "toolStripButton1"; + // + // statusStrip + // + this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabel1}); + this.statusStrip.Location = new System.Drawing.Point(0, 1081); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Size = new System.Drawing.Size(1571, 22); + this.statusStrip.TabIndex = 4; + this.statusStrip.Text = "statusStrip1"; + // + // toolStripStatusLabel1 + // + this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; + this.toolStripStatusLabel1.Size = new System.Drawing.Size(118, 17); + this.toolStripStatusLabel1.Text = "toolStripStatusLabel1"; + // + // MainWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1571, 1103); + this.Controls.Add(this.statusStrip); + this.Controls.Add(this.mainToolStrip); + this.Controls.Add(this.mainMenuStrip); + this.IsMdiContainer = true; + this.MainMenuStrip = this.mainMenuStrip; + this.Name = "MainWindow"; + this.Text = "Xenia Debugger"; + this.mainMenuStrip.ResumeLayout(false); + this.mainMenuStrip.PerformLayout(); + this.mainToolStrip.ResumeLayout(false); + this.mainToolStrip.PerformLayout(); + this.statusStrip.ResumeLayout(false); + this.statusStrip.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip mainMenuStrip; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStrip mainToolStrip; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; + private WeifenLuo.WinFormsUI.Docking.DockPanel dockPanel; + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/MainWindow.cs b/src/Xenia.Debug.UI/MainWindow.cs new file mode 100644 index 000000000..bcff2b7d8 --- /dev/null +++ b/src/Xenia.Debug.UI/MainWindow.cs @@ -0,0 +1,104 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Views; + +namespace Xenia.Debug.UI { + public partial class MainWindow : Form { + private DeserializeDockContent deserializeDockContent; + + private BreakpointsPanel breakpointsPanel; + private CallstackPanel callstackPanel; + private List codeDocuments = new List(); + private FilesystemPanel filesystemPanel; + private FunctionsPanel functionsPanel; + private HeapDocument heapDocument; + private List memoryDocuments = new List(); + private ModulesPanel modulesPanel; + private ProfilePanel profilePanel; + private List registersPanels = new List(); + private StatisticsDocument statisticsDocument; + private ThreadsPanel threadsPanel; + private TracePanel tracePanel; + + public Debugger Debugger { + get; + } + + public MainWindow() { + InitializeComponent(); + + dockPanel = new DockPanel(); + dockPanel.Dock = System.Windows.Forms.DockStyle.Fill; + dockPanel.DockBackColor = System.Drawing.SystemColors.AppWorkspace; + dockPanel.DockBottomPortion = 200D; + dockPanel.DockLeftPortion = 350D; + dockPanel.Name = "dockPanel"; + Controls.Add(dockPanel); + Controls.SetChildIndex(dockPanel, 0); + + this.Debugger = new Debugger(); + + breakpointsPanel = new BreakpointsPanel(Debugger); + callstackPanel = new CallstackPanel(Debugger); + codeDocuments.Add(new CodeDocument(Debugger)); + filesystemPanel = new FilesystemPanel(Debugger); + functionsPanel = new FunctionsPanel(Debugger); + heapDocument = new HeapDocument(Debugger); + memoryDocuments.Add(new MemoryDocument(Debugger)); + modulesPanel = new ModulesPanel(Debugger); + profilePanel = new ProfilePanel(Debugger); + registersPanels.Add(new RegistersPanel(Debugger, RegisterClass.GuestGeneralPurpose)); + registersPanels.Add(new RegistersPanel(Debugger, RegisterClass.GuestFloatingPoint)); + registersPanels.Add(new RegistersPanel(Debugger, RegisterClass.GuestVector)); + statisticsDocument = new StatisticsDocument(Debugger); + threadsPanel = new ThreadsPanel(Debugger); + tracePanel = new TracePanel(Debugger); + + // deserializeDockContent = + // new DeserializeDockContent(GetContentFromPersistString); + + SetupDefaultLayout(); + } + + private void SetupDefaultLayout() { + dockPanel.SuspendLayout(true); + + filesystemPanel.Show(dockPanel, DockState.DockLeft); + functionsPanel.Show(filesystemPanel.Pane, filesystemPanel); + + breakpointsPanel.Show(dockPanel, DockState.DockBottom); + callstackPanel.Show(breakpointsPanel.Pane, breakpointsPanel); + + modulesPanel.Show(breakpointsPanel.Pane, DockAlignment.Right, 0.5); + threadsPanel.Show(modulesPanel.Pane, modulesPanel); + + registersPanels[registersPanels.Count - 1].Show(filesystemPanel.Pane, + DockAlignment.Right, 0.5); + for (int i = registersPanels.Count - 2; i >= 0; --i) { + registersPanels[i].Show(registersPanels[i + 1].Pane, registersPanels[i + 1]); + } + + foreach (var codeDocument in codeDocuments) { + codeDocument.Show(dockPanel, DockState.Document); + } + + heapDocument.Show(codeDocuments[0].Pane, DockAlignment.Right, 0.5); + for (int i = 0; i < memoryDocuments.Count; ++i) { + memoryDocuments[i].Show(heapDocument.Pane, heapDocument); + } + + tracePanel.Show(heapDocument.Pane, DockAlignment.Bottom, 0.5); + statisticsDocument.Show(tracePanel.Pane, tracePanel); + + dockPanel.ResumeLayout(true, true); + } + } +} diff --git a/src/Xenia.Debug.UI/MainWindow.resx b/src/Xenia.Debug.UI/MainWindow.resx new file mode 100644 index 000000000..9cc3a5399 --- /dev/null +++ b/src/Xenia.Debug.UI/MainWindow.resx @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + True + + + 132, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + 237, 17 + + \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Program.cs b/src/Xenia.Debug.UI/Program.cs index 30dc61c97..fd628be77 100644 --- a/src/Xenia.Debug.UI/Program.cs +++ b/src/Xenia.Debug.UI/Program.cs @@ -9,7 +9,7 @@ namespace Xenia.Debug.UI { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); + Application.Run(new MainWindow()); } } } diff --git a/src/Xenia.Debug.UI/Views/BreakpointsPanel.Designer.cs b/src/Xenia.Debug.UI/Views/BreakpointsPanel.Designer.cs new file mode 100644 index 000000000..5da37e72b --- /dev/null +++ b/src/Xenia.Debug.UI/Views/BreakpointsPanel.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class BreakpointsPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Breakpoints"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/BreakpointsPanel.cs b/src/Xenia.Debug.UI/Views/BreakpointsPanel.cs new file mode 100644 index 000000000..966ce89df --- /dev/null +++ b/src/Xenia.Debug.UI/Views/BreakpointsPanel.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class BreakpointsPanel : BasePanel { + private readonly Debugger debugger; + + public BreakpointsPanel(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/CallstackPanel.Designer.cs b/src/Xenia.Debug.UI/Views/CallstackPanel.Designer.cs new file mode 100644 index 000000000..c69d8a7ff --- /dev/null +++ b/src/Xenia.Debug.UI/Views/CallstackPanel.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class CallstackPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Callstack"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/CallstackPanel.cs b/src/Xenia.Debug.UI/Views/CallstackPanel.cs new file mode 100644 index 000000000..ef1e5fe07 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/CallstackPanel.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class CallstackPanel : BasePanel { + private readonly Debugger debugger; + + public CallstackPanel(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/CodeDocument.Designer.cs b/src/Xenia.Debug.UI/Views/CodeDocument.Designer.cs new file mode 100644 index 000000000..a41e99195 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/CodeDocument.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class CodeDocument { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Code"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/CodeDocument.cs b/src/Xenia.Debug.UI/Views/CodeDocument.cs new file mode 100644 index 000000000..138b70301 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/CodeDocument.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class CodeDocument : BaseDocument { + private readonly Debugger debugger; + + public CodeDocument(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/FilesystemPanel.Designer.cs b/src/Xenia.Debug.UI/Views/FilesystemPanel.Designer.cs new file mode 100644 index 000000000..8fa9b1f39 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/FilesystemPanel.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class FilesystemPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Filesystem"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/FilesystemPanel.cs b/src/Xenia.Debug.UI/Views/FilesystemPanel.cs new file mode 100644 index 000000000..4ae872f76 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/FilesystemPanel.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class FilesystemPanel : BasePanel { + private readonly Debugger debugger; + + public FilesystemPanel(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/FunctionsPanel.Designer.cs b/src/Xenia.Debug.UI/Views/FunctionsPanel.Designer.cs new file mode 100644 index 000000000..92627a880 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/FunctionsPanel.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class FunctionsPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Functions"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/FunctionsPanel.cs b/src/Xenia.Debug.UI/Views/FunctionsPanel.cs new file mode 100644 index 000000000..588b04c67 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/FunctionsPanel.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class FunctionsPanel : BasePanel { + private readonly Debugger debugger; + + public FunctionsPanel(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/HeapDocument.Designer.cs b/src/Xenia.Debug.UI/Views/HeapDocument.Designer.cs new file mode 100644 index 000000000..477b7d23b --- /dev/null +++ b/src/Xenia.Debug.UI/Views/HeapDocument.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class HeapDocument { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Heap"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/HeapDocument.cs b/src/Xenia.Debug.UI/Views/HeapDocument.cs new file mode 100644 index 000000000..57abb7ca6 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/HeapDocument.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class HeapDocument : BaseDocument { + private readonly Debugger debugger; + + public HeapDocument(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/MemoryDocument.Designer.cs b/src/Xenia.Debug.UI/Views/MemoryDocument.Designer.cs new file mode 100644 index 000000000..061e1963d --- /dev/null +++ b/src/Xenia.Debug.UI/Views/MemoryDocument.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class MemoryDocument { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Memory"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/MemoryDocument.cs b/src/Xenia.Debug.UI/Views/MemoryDocument.cs new file mode 100644 index 000000000..ca937ebf9 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/MemoryDocument.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class MemoryDocument : BaseDocument { + private readonly Debugger debugger; + + public MemoryDocument(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/ModulesPanel.Designer.cs b/src/Xenia.Debug.UI/Views/ModulesPanel.Designer.cs new file mode 100644 index 000000000..1591f6e09 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/ModulesPanel.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class ModulesPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Modules"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/ModulesPanel.cs b/src/Xenia.Debug.UI/Views/ModulesPanel.cs new file mode 100644 index 000000000..0ff5cf41d --- /dev/null +++ b/src/Xenia.Debug.UI/Views/ModulesPanel.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class ModulesPanel : BasePanel { + private readonly Debugger debugger; + + public ModulesPanel(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/ProfilePanel.Designer.cs b/src/Xenia.Debug.UI/Views/ProfilePanel.Designer.cs new file mode 100644 index 000000000..31b9b9af7 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/ProfilePanel.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class ProfilePanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Profile"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/ProfilePanel.cs b/src/Xenia.Debug.UI/Views/ProfilePanel.cs new file mode 100644 index 000000000..5a1677538 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/ProfilePanel.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class ProfilePanel : BasePanel { + private readonly Debugger debugger; + + public ProfilePanel(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/RegistersPanel.Designer.cs b/src/Xenia.Debug.UI/Views/RegistersPanel.Designer.cs new file mode 100644 index 000000000..65851374c --- /dev/null +++ b/src/Xenia.Debug.UI/Views/RegistersPanel.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class RegistersPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Registers"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/RegistersPanel.cs b/src/Xenia.Debug.UI/Views/RegistersPanel.cs new file mode 100644 index 000000000..0d8d8569f --- /dev/null +++ b/src/Xenia.Debug.UI/Views/RegistersPanel.cs @@ -0,0 +1,53 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public enum RegisterClass { + GuestGeneralPurpose, + GuestFloatingPoint, + GuestVector, + HostGeneralPurpose, + HostAvx, + } + + public partial class RegistersPanel : BasePanel { + private readonly Debugger debugger; + private readonly RegisterClass registerClass; + + public RegistersPanel(Debugger debugger, RegisterClass registerClass) { + InitializeComponent(); + + this.debugger = debugger; + this.registerClass = registerClass; + switch (registerClass) { + case RegisterClass.GuestGeneralPurpose: + this.Text = "GPR"; + break; + case RegisterClass.GuestFloatingPoint: + this.Text = "FPR"; + break; + case RegisterClass.GuestVector: + this.Text = "VR"; + break; + case RegisterClass.HostGeneralPurpose: + this.Text = "x64"; + break; + case RegisterClass.HostAvx: + this.Text = "AVX"; + break; + default: + System.Diagnostics.Debug.Fail("Unhandled case: " + registerClass); + break; + } + } + } +} diff --git a/src/Xenia.Debug.UI/Views/StatisticsDocument.Designer.cs b/src/Xenia.Debug.UI/Views/StatisticsDocument.Designer.cs new file mode 100644 index 000000000..ac427cd60 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/StatisticsDocument.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class StatisticsDocument { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Statistics"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/StatisticsDocument.cs b/src/Xenia.Debug.UI/Views/StatisticsDocument.cs new file mode 100644 index 000000000..47a2dc58c --- /dev/null +++ b/src/Xenia.Debug.UI/Views/StatisticsDocument.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class StatisticsDocument : BaseDocument { + private readonly Debugger debugger; + + public StatisticsDocument(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Views/ThreadsPanel.Designer.cs b/src/Xenia.Debug.UI/Views/ThreadsPanel.Designer.cs new file mode 100644 index 000000000..0666df37e --- /dev/null +++ b/src/Xenia.Debug.UI/Views/ThreadsPanel.Designer.cs @@ -0,0 +1,33 @@ +namespace Xenia.Debug.UI.Views { + partial class ThreadsPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Threads"; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/ThreadsPanel.cs b/src/Xenia.Debug.UI/Views/ThreadsPanel.cs new file mode 100644 index 000000000..93d3c5874 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/ThreadsPanel.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class ThreadsPanel : BasePanel { + private readonly Debugger debugger; + + public ThreadsPanel(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Form1.Designer.cs b/src/Xenia.Debug.UI/Views/TracePanel.Designer.cs similarity index 90% rename from src/Xenia.Debug.UI/Form1.Designer.cs rename to src/Xenia.Debug.UI/Views/TracePanel.Designer.cs index f4307e9c6..e1a0aa7cf 100644 --- a/src/Xenia.Debug.UI/Form1.Designer.cs +++ b/src/Xenia.Debug.UI/Views/TracePanel.Designer.cs @@ -1,5 +1,5 @@ -namespace Xenia.Debug.UI { - partial class Form1 { +namespace Xenia.Debug.UI.Views { + partial class TracePanel { /// /// Required designer variable. /// @@ -25,10 +25,9 @@ private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Text = "Form1"; + this.Text = "Trace"; } #endregion } -} - +} \ No newline at end of file diff --git a/src/Xenia.Debug.UI/Views/TracePanel.cs b/src/Xenia.Debug.UI/Views/TracePanel.cs new file mode 100644 index 000000000..841101a14 --- /dev/null +++ b/src/Xenia.Debug.UI/Views/TracePanel.cs @@ -0,0 +1,22 @@ +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; +using WeifenLuo.WinFormsUI.Docking; +using Xenia.Debug.UI.Controls; + +namespace Xenia.Debug.UI.Views { + public partial class TracePanel : BasePanel { + private readonly Debugger debugger; + + public TracePanel(Debugger debugger) { + InitializeComponent(); + this.debugger = debugger; + } + } +} diff --git a/src/Xenia.Debug.UI/Xenia.Debug.UI.csproj b/src/Xenia.Debug.UI/Xenia.Debug.UI.csproj index f8a2623b1..694409919 100644 --- a/src/Xenia.Debug.UI/Xenia.Debug.UI.csproj +++ b/src/Xenia.Debug.UI/Xenia.Debug.UI.csproj @@ -51,14 +51,107 @@ - + Form - - Form1.cs + + BaseDocument.cs + + + Form + + + BasePanel.cs + + + Form + + + MainWindow.cs + + Form + + + BreakpointsPanel.cs + + + Form + + + CallstackPanel.cs + + + Form + + + CodeDocument.cs + + + Form + + + FilesystemPanel.cs + + + Form + + + FunctionsPanel.cs + + + Form + + + HeapDocument.cs + + + Form + + + MemoryDocument.cs + + + Form + + + ModulesPanel.cs + + + Form + + + ProfilePanel.cs + + + Form + + + RegistersPanel.cs + + + Form + + + StatisticsDocument.cs + + + Form + + + ThreadsPanel.cs + + + Form + + + TracePanel.cs + + + MainWindow.cs + ResXFileCodeGenerator Resources.Designer.cs diff --git a/src/Xenia.Debug/Breakpoint.cs b/src/Xenia.Debug/Breakpoint.cs new file mode 100644 index 000000000..4412f5bff --- /dev/null +++ b/src/Xenia.Debug/Breakpoint.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class Breakpoint : Changeable { + // type code/data/kernel + // address+[end address] + // conditions? script? + // action (suspend, trace, etc) + } +} diff --git a/src/Xenia.Debug/BreakpointList.cs b/src/Xenia.Debug/BreakpointList.cs new file mode 100644 index 000000000..a5564e773 --- /dev/null +++ b/src/Xenia.Debug/BreakpointList.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class BreakpointList : Changeable { + private readonly List breakpoints = new List(); + + public void Add(Breakpoint breakpoint) { + } + + public void Remove(Breakpoint breakpoint) { + } + + public void Clear() { + } + } +} diff --git a/src/Xenia.Debug/Callstack.cs b/src/Xenia.Debug/Callstack.cs new file mode 100644 index 000000000..c9a67ec67 --- /dev/null +++ b/src/Xenia.Debug/Callstack.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Xenia.Debug { + public class Callstack { + } +} diff --git a/src/Xenia.Debug/DebugClient.cs b/src/Xenia.Debug/DebugClient.cs new file mode 100644 index 000000000..7ce678035 --- /dev/null +++ b/src/Xenia.Debug/DebugClient.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Xenia.Debug { + public class DebugClient { + } +} diff --git a/src/Xenia.Debug/Debugger.cs b/src/Xenia.Debug/Debugger.cs new file mode 100644 index 000000000..0ab55e72a --- /dev/null +++ b/src/Xenia.Debug/Debugger.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Xenia.Debug { + public class Debugger { + public DebugClient DebugClient { + get; + } + + public BreakpointList BreakpointList { + get; + } + public FunctionList FunctionList { + get; + } + public Memory Memory { + get; + } + public ModuleList ModuleList { + get; + } + public ThreadList ThreadList { + get; + } + + public Debugger() { + this.DebugClient = new DebugClient(); + + this.BreakpointList = new BreakpointList(); + this.FunctionList = new FunctionList(); + this.Memory = new Memory(); + this.ModuleList = new ModuleList(); + this.ThreadList = new ThreadList(); + } + + public bool Open() { + return true; + } + + public delegate void ChangedEventHandler(EventArgs e); + + public event ChangedEventHandler Changed; + + private void OnChanged(EventArgs e) { + if (Changed != null) { + Changed(e); + } + } + } +} diff --git a/src/Xenia.Debug/Function.cs b/src/Xenia.Debug/Function.cs new file mode 100644 index 000000000..cea2b9ef3 --- /dev/null +++ b/src/Xenia.Debug/Function.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class Function : Changeable { + } +} diff --git a/src/Xenia.Debug/FunctionList.cs b/src/Xenia.Debug/FunctionList.cs new file mode 100644 index 000000000..840fd252b --- /dev/null +++ b/src/Xenia.Debug/FunctionList.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class FunctionList : Changeable { + } +} diff --git a/src/Xenia.Debug/Memory.cs b/src/Xenia.Debug/Memory.cs new file mode 100644 index 000000000..99fb89fa7 --- /dev/null +++ b/src/Xenia.Debug/Memory.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class Memory : Changeable { + public MemoryView CreateView() { + return new MemoryView(this); + } + } +} diff --git a/src/Xenia.Debug/MemoryView.cs b/src/Xenia.Debug/MemoryView.cs new file mode 100644 index 000000000..c13901964 --- /dev/null +++ b/src/Xenia.Debug/MemoryView.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class MemoryView : Changeable { + private readonly Memory memory; + + public MemoryView(Memory memory) { + this.memory = memory; + } + } +} diff --git a/src/Xenia.Debug/Module.cs b/src/Xenia.Debug/Module.cs new file mode 100644 index 000000000..5a2734820 --- /dev/null +++ b/src/Xenia.Debug/Module.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class Module : Changeable { + } +} diff --git a/src/Xenia.Debug/ModuleList.cs b/src/Xenia.Debug/ModuleList.cs new file mode 100644 index 000000000..d292f99fc --- /dev/null +++ b/src/Xenia.Debug/ModuleList.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class ModuleList : Changeable { + } +} diff --git a/src/Xenia.Debug/Thread.cs b/src/Xenia.Debug/Thread.cs new file mode 100644 index 000000000..bf54810df --- /dev/null +++ b/src/Xenia.Debug/Thread.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class ThreadContext { + } + + public class Thread : Changeable { + } +} diff --git a/src/Xenia.Debug/ThreadList.cs b/src/Xenia.Debug/ThreadList.cs new file mode 100644 index 000000000..3f7cabdff --- /dev/null +++ b/src/Xenia.Debug/ThreadList.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xenia.Debug.Utilities; + +namespace Xenia.Debug { + public class ThreadList : Changeable { + } +} diff --git a/src/Xenia.Debug/Utilities/Changeable.cs b/src/Xenia.Debug/Utilities/Changeable.cs new file mode 100644 index 000000000..fe527782c --- /dev/null +++ b/src/Xenia.Debug/Utilities/Changeable.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Xenia.Debug.Utilities { + public delegate void ChangedEventHandler(); + + public class Changeable { + private int changeDepth; + public event ChangedEventHandler Changed; + + protected void BeginChanging() { + ++changeDepth; + } + + protected void EndChanging() { + if (--changeDepth == 0) { + OnChanged(); + } + } + + protected void OnChanged() { + System.Diagnostics.Debug.Assert(changeDepth == 0); + if (Changed != null) { + Changed(); + } + } + } +} diff --git a/src/Xenia.Debug/Xenia.Debug.csproj b/src/Xenia.Debug/Xenia.Debug.csproj index cc9d1b93e..b556d6a31 100644 --- a/src/Xenia.Debug/Xenia.Debug.csproj +++ b/src/Xenia.Debug/Xenia.Debug.csproj @@ -43,7 +43,21 @@ + + + + + + + + + + + + + +