From 59a7eabcbe37d44a1cd4a9b742ce99f423a42ff7 Mon Sep 17 00:00:00 2001 From: Alex-TIMEHACK Date: Sat, 14 Oct 2017 16:23:41 +0100 Subject: [PATCH 1/3] Done like a few things but I need to update so.... --- .vs/ShiftOS/v15/sqlite3/storage.ide | Bin 659456 -> 831488 bytes ShiftOS.Main/ShiftOS.Main.csproj | 9 ++ .../ShiftOS/Apps/Terminal.Designer.cs | 65 ++++++++ ShiftOS.Main/ShiftOS/Apps/Terminal.cs | 92 +++++++++++ ShiftOS.Main/ShiftOS/Apps/Terminal.resx | 120 ++++++++++++++ ShiftOS.Main/ShiftOS/Desktop.Designer.cs | 149 ++++++++++-------- ShiftOS.Main/ShiftOS/Desktop.cs | 9 +- 7 files changed, 375 insertions(+), 69 deletions(-) create mode 100644 ShiftOS.Main/ShiftOS/Apps/Terminal.Designer.cs create mode 100644 ShiftOS.Main/ShiftOS/Apps/Terminal.cs create mode 100644 ShiftOS.Main/ShiftOS/Apps/Terminal.resx diff --git a/.vs/ShiftOS/v15/sqlite3/storage.ide b/.vs/ShiftOS/v15/sqlite3/storage.ide index 3be545347161e0f3a0bdb4b06d984fe738e3e343..12e4cfb2001680f3d822e3ed26d6d68427cb08e7 100644 GIT binary patch delta 98202 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 N#@>bMXHfJQ{{~p;AdUb4 diff --git a/ShiftOS.Main/ShiftOS.Main.csproj b/ShiftOS.Main/ShiftOS.Main.csproj index c814c14..7c19b38 100644 --- a/ShiftOS.Main/ShiftOS.Main.csproj +++ b/ShiftOS.Main/ShiftOS.Main.csproj @@ -70,6 +70,12 @@ Shifter.cs + + UserControl + + + Terminal.cs + Form @@ -104,6 +110,9 @@ Shifter.cs + + Terminal.cs + TestForm.cs diff --git a/ShiftOS.Main/ShiftOS/Apps/Terminal.Designer.cs b/ShiftOS.Main/ShiftOS/Apps/Terminal.Designer.cs new file mode 100644 index 0000000..e92cdb4 --- /dev/null +++ b/ShiftOS.Main/ShiftOS/Apps/Terminal.Designer.cs @@ -0,0 +1,65 @@ +namespace ShiftOS.Main.ShiftOS.Apps +{ + partial class Terminal + { + ///

+ /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.termmain = new System.Windows.Forms.RichTextBox(); + this.SuspendLayout(); + // + // termmain + // + this.termmain.BackColor = System.Drawing.Color.Black; + this.termmain.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.termmain.Dock = System.Windows.Forms.DockStyle.Fill; + this.termmain.ForeColor = System.Drawing.Color.White; + this.termmain.Location = new System.Drawing.Point(0, 0); + this.termmain.Name = "termmain"; + this.termmain.Size = new System.Drawing.Size(476, 394); + this.termmain.TabIndex = 0; + this.termmain.Text = ""; + this.termmain.SelectionChanged += new System.EventHandler(this.termmain_SelectionChanged); + this.termmain.TextChanged += new System.EventHandler(this.termmain_TextChanged); + this.termmain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.termmain_KeyDown); + // + // Terminal + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.termmain); + this.Name = "Terminal"; + this.Size = new System.Drawing.Size(476, 394); + this.Load += new System.EventHandler(this.Terminal_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.RichTextBox termmain; + } +} diff --git a/ShiftOS.Main/ShiftOS/Apps/Terminal.cs b/ShiftOS.Main/ShiftOS/Apps/Terminal.cs new file mode 100644 index 0000000..cb5bed3 --- /dev/null +++ b/ShiftOS.Main/ShiftOS/Apps/Terminal.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ShiftOS.Main.ShiftOS.Apps +{ + public partial class Terminal : UserControl + { + public string defaulttextBefore = "user> "; + public string defaulttextResult = "user@shiftos> "; // NOT YET IMPLEMENTED!!! + public bool doClear = false; + + // The below variables makes the terminal... a terminal! + public string OldText = ""; + public int TrackingPosition = 0; + + public Terminal() + { + InitializeComponent(); + + termmain.ContextMenuStrip = new ContextMenuStrip(); // Disables the right click of a richtextbox! + } + + public void Print(string text) + { + termmain.AppendText($"\n {text} \n {defaulttextResult}"); + TrackingPosition = termmain.Text.Length; + } + + private void termmain_KeyDown(object sender, KeyEventArgs e) + { + // The below code disables the ability to paste anything other then text... + + if (e.Control && e.KeyCode == Keys.V) + { + //if (Clipboard.ContainsText()) + // termmain.Paste(DataFormats.GetFormat(DataFormats.Text)); + e.Handled = true; + } else if (e.KeyCode == Keys.Enter) { + Print(RunCommand(termmain.Text.Substring(TrackingPosition, termmain.Text.Length - TrackingPosition))); // The most horrific line in the entire application! + } + } + + private void termmain_TextChanged(object sender, EventArgs e) + { + if (termmain.SelectionStart < TrackingPosition) + { + if (doClear == false) // If it's not clearing the terminal + { + termmain.Text = OldText; + termmain.Select(termmain.Text.Length, 0); + } + } + else + { + OldText = termmain.Text; + } + } + + private void termmain_SelectionChanged(object sender, EventArgs e) + { + if (termmain.SelectionStart < TrackingPosition) + { + termmain.Text = OldText; + termmain.Select(termmain.Text.Length, 0); + } + } + + private void Terminal_Load(object sender, EventArgs e) + { + Print("\n"); + } + + public string RunCommand(string command) + { + string ToReturn = ""; + + if (command == "hi") + { + ToReturn = $"{ToReturn} \n Hi!"; + MessageBox.Show("HI!"); + } + return ToReturn; + } + } +} diff --git a/ShiftOS.Main/ShiftOS/Apps/Terminal.resx b/ShiftOS.Main/ShiftOS/Apps/Terminal.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/ShiftOS.Main/ShiftOS/Apps/Terminal.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ShiftOS.Main/ShiftOS/Desktop.Designer.cs b/ShiftOS.Main/ShiftOS/Desktop.Designer.cs index dac30c6..ae2dc17 100644 --- a/ShiftOS.Main/ShiftOS/Desktop.Designer.cs +++ b/ShiftOS.Main/ShiftOS/Desktop.Designer.cs @@ -28,75 +28,87 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - this.listView1 = new System.Windows.Forms.ListView(); - this.taskbar = new System.Windows.Forms.ToolStrip(); - this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton(); - this.taskbarClock = new System.Windows.Forms.ToolStripLabel(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.taskbar.SuspendLayout(); - this.SuspendLayout(); - // - // listView1 - // - this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; - this.listView1.Location = new System.Drawing.Point(0, 0); - this.listView1.Name = "listView1"; - this.listView1.Size = new System.Drawing.Size(1962, 1236); - this.listView1.TabIndex = 0; - this.listView1.UseCompatibleStateImageBehavior = false; - // - // taskbar - // - this.taskbar.Dock = System.Windows.Forms.DockStyle.Bottom; - this.taskbar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; - this.taskbar.ImageScalingSize = new System.Drawing.Size(24, 24); - this.taskbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.components = new System.ComponentModel.Container(); + this.listView1 = new System.Windows.Forms.ListView(); + this.taskbar = new System.Windows.Forms.ToolStrip(); + this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton(); + this.taskbarClock = new System.Windows.Forms.ToolStripLabel(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.terminalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.taskbar.SuspendLayout(); + this.SuspendLayout(); + // + // listView1 + // + this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView1.Location = new System.Drawing.Point(0, 0); + this.listView1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(1277, 684); + this.listView1.TabIndex = 0; + this.listView1.UseCompatibleStateImageBehavior = false; + // + // taskbar + // + this.taskbar.Dock = System.Windows.Forms.DockStyle.Bottom; + this.taskbar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.taskbar.ImageScalingSize = new System.Drawing.Size(24, 24); + this.taskbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripDropDownButton1, this.taskbarClock}); - this.taskbar.Location = new System.Drawing.Point(0, 1204); - this.taskbar.Name = "taskbar"; - this.taskbar.Size = new System.Drawing.Size(1962, 32); - this.taskbar.TabIndex = 1; - this.taskbar.Text = "toolStrip1"; - // - // toolStripDropDownButton1 - // - this.toolStripDropDownButton1.Image = global::ShiftOS.Main.Properties.Resources.iconWebBrowser; - this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripDropDownButton1.Name = "toolStripDropDownButton1"; - this.toolStripDropDownButton1.Size = new System.Drawing.Size(131, 29); - this.toolStripDropDownButton1.Tag = ((uint)(0u)); - this.toolStripDropDownButton1.Text = "Programs"; - // - // taskbarClock - // - this.taskbarClock.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.taskbarClock.Image = global::ShiftOS.Main.Properties.Resources.iconClock; - this.taskbarClock.Name = "taskbarClock"; - this.taskbarClock.Size = new System.Drawing.Size(70, 29); - this.taskbarClock.Tag = ((uint)(0u)); - this.taskbarClock.Text = "0:00"; - // - // timer1 - // - this.timer1.Interval = 1000; - this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - // - // Desktop - // - this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1962, 1236); - this.Controls.Add(this.taskbar); - this.Controls.Add(this.listView1); - this.Name = "Desktop"; - this.Text = "Desktop"; - this.taskbar.ResumeLayout(false); - this.taskbar.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); + this.taskbar.Location = new System.Drawing.Point(0, 653); + this.taskbar.Name = "taskbar"; + this.taskbar.Size = new System.Drawing.Size(1277, 31); + this.taskbar.TabIndex = 1; + this.taskbar.Text = "toolStrip1"; + // + // toolStripDropDownButton1 + // + this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.terminalToolStripMenuItem}); + this.toolStripDropDownButton1.Image = global::ShiftOS.Main.Properties.Resources.iconWebBrowser; + this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton1.Name = "toolStripDropDownButton1"; + this.toolStripDropDownButton1.Size = new System.Drawing.Size(95, 28); + this.toolStripDropDownButton1.Tag = ((uint)(0u)); + this.toolStripDropDownButton1.Text = "Programs"; + // + // taskbarClock + // + this.taskbarClock.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.taskbarClock.Image = global::ShiftOS.Main.Properties.Resources.iconClock; + this.taskbarClock.Name = "taskbarClock"; + this.taskbarClock.Size = new System.Drawing.Size(52, 28); + this.taskbarClock.Tag = ((uint)(0u)); + this.taskbarClock.Text = "0:00"; + // + // timer1 + // + this.timer1.Interval = 1000; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // terminalToolStripMenuItem + // + this.terminalToolStripMenuItem.Name = "terminalToolStripMenuItem"; + this.terminalToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.terminalToolStripMenuItem.Text = "Terminal"; + this.terminalToolStripMenuItem.Click += new System.EventHandler(this.terminalToolStripMenuItem_Click); + // + // Desktop + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1277, 684); + this.Controls.Add(this.taskbar); + this.Controls.Add(this.listView1); + this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.Name = "Desktop"; + this.Text = "Desktop"; + this.taskbar.ResumeLayout(false); + this.taskbar.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -107,5 +119,6 @@ private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton1; private System.Windows.Forms.ToolStripLabel taskbarClock; private System.Windows.Forms.Timer timer1; - } + private System.Windows.Forms.ToolStripMenuItem terminalToolStripMenuItem; + } } \ No newline at end of file diff --git a/ShiftOS.Main/ShiftOS/Desktop.cs b/ShiftOS.Main/ShiftOS/Desktop.cs index 494222a..06f1fc8 100644 --- a/ShiftOS.Main/ShiftOS/Desktop.cs +++ b/ShiftOS.Main/ShiftOS/Desktop.cs @@ -57,5 +57,12 @@ namespace ShiftOS.Main.ShiftOS private void timer1_Tick(object sender, EventArgs e) => taskbarClock.Text = $"{DateTime.Now:t}"; - } + + private void terminalToolStripMenuItem_Click(object sender, EventArgs e) + { + Apps.Terminal trm = new Apps.Terminal(); + + ShiftWM.Init(trm, "Terminal", null, false, true); + } + } } From 09215a05ddc717b2eaf667737ac6baa724c5f2bc Mon Sep 17 00:00:00 2001 From: Alex-TIMEHACK Date: Sat, 14 Oct 2017 18:42:11 +0100 Subject: [PATCH 2/3] YOY terminal --- ShiftOS.Engine/ShiftOS.Engine.csproj | 4 ++ ShiftOS.Engine/Terminal/Commands/Hello.cs | 21 ++++++++++ ShiftOS.Engine/Terminal/TerminalBackend.cs | 46 ++++++++++++++++++++++ ShiftOS.Engine/Terminal/TerminalCommand.cs | 15 +++++++ ShiftOS.Main/ShiftOS/Apps/Terminal.cs | 5 ++- 5 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 ShiftOS.Engine/Terminal/Commands/Hello.cs create mode 100644 ShiftOS.Engine/Terminal/TerminalBackend.cs create mode 100644 ShiftOS.Engine/Terminal/TerminalCommand.cs diff --git a/ShiftOS.Engine/ShiftOS.Engine.csproj b/ShiftOS.Engine/ShiftOS.Engine.csproj index 71721bc..6740db1 100644 --- a/ShiftOS.Engine/ShiftOS.Engine.csproj +++ b/ShiftOS.Engine/ShiftOS.Engine.csproj @@ -52,6 +52,9 @@ True Resources.resx + + + UserControl @@ -93,5 +96,6 @@ + \ No newline at end of file diff --git a/ShiftOS.Engine/Terminal/Commands/Hello.cs b/ShiftOS.Engine/Terminal/Commands/Hello.cs new file mode 100644 index 0000000..daf8488 --- /dev/null +++ b/ShiftOS.Engine/Terminal/Commands/Hello.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ShiftOS.Engine.Terminal.Commands +{ + public class Hello : TerminalCommand + { + public override string GetName() + { + return "Hello"; + } + + public override string Run(params string[] parameters) + { + return "Oh, HELLO," + parameters[0]; + } + } +} diff --git a/ShiftOS.Engine/Terminal/TerminalBackend.cs b/ShiftOS.Engine/Terminal/TerminalBackend.cs new file mode 100644 index 0000000..7103238 --- /dev/null +++ b/ShiftOS.Engine/Terminal/TerminalBackend.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace ShiftOS.Engine.Terminal +{ + public static class TerminalBackend + { + // The line below gets all the terminal commands in... well... the entire ShiftOS.Engine + public static IEnumerable instances = from t in Assembly.GetExecutingAssembly().GetTypes() + where t.IsSubclassOf(typeof(TerminalCommand)) + && t.GetConstructor(Type.EmptyTypes) != null + select Activator.CreateInstance(t) as TerminalCommand; + + /// + /// Runs a terminal command. + /// + /// + /// Returns all the output from that command. + public static string RunCommand(string command) + { + string name; + try { name = command.Split(' ')[0]; } catch { name = command; } + + var theParams = new string[command.Split(' ').Length - 1]; + Array.Copy(command.Split(' '), 1, theParams, 0, command.Split(' ').Length - 1); + + foreach (TerminalCommand instance in instances) + { + if (instance.GetName() == name) + return instance.Run(theParams); + } + + return "The command cannot be found."; + } + + // An extra function ;) + private static Type[] GetTypesInNamespace(Assembly assembly, string nameSpace) + { + return assembly.GetTypes().Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal)).ToArray(); + } + } +} diff --git a/ShiftOS.Engine/Terminal/TerminalCommand.cs b/ShiftOS.Engine/Terminal/TerminalCommand.cs new file mode 100644 index 0000000..a344122 --- /dev/null +++ b/ShiftOS.Engine/Terminal/TerminalCommand.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ShiftOS.Engine.Terminal +{ + public abstract class TerminalCommand + { + public abstract string GetName(); + + public abstract string Run(params string[] parameters); + } +} diff --git a/ShiftOS.Main/ShiftOS/Apps/Terminal.cs b/ShiftOS.Main/ShiftOS/Apps/Terminal.cs index cb5bed3..a9bd093 100644 --- a/ShiftOS.Main/ShiftOS/Apps/Terminal.cs +++ b/ShiftOS.Main/ShiftOS/Apps/Terminal.cs @@ -7,6 +7,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using ShiftOS.Engine; +using ShiftOS.Engine.Terminal; namespace ShiftOS.Main.ShiftOS.Apps { @@ -43,7 +45,8 @@ namespace ShiftOS.Main.ShiftOS.Apps // termmain.Paste(DataFormats.GetFormat(DataFormats.Text)); e.Handled = true; } else if (e.KeyCode == Keys.Enter) { - Print(RunCommand(termmain.Text.Substring(TrackingPosition, termmain.Text.Length - TrackingPosition))); // The most horrific line in the entire application! + Print(TerminalBackend.RunCommand(termmain.Text.Substring(TrackingPosition, termmain.Text.Length - TrackingPosition))); // The most horrific line in the entire application! + e.Handled = true; } } From 9952cfd7eb666e04de3b51d1e7dbade8d9168b11 Mon Sep 17 00:00:00 2001 From: Alex-TIMEHACK Date: Sat, 14 Oct 2017 18:47:54 +0100 Subject: [PATCH 3/3] Improved example command --- ShiftOS.Engine/Terminal/Commands/Hello.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ShiftOS.Engine/Terminal/Commands/Hello.cs b/ShiftOS.Engine/Terminal/Commands/Hello.cs index daf8488..531bd1f 100644 --- a/ShiftOS.Engine/Terminal/Commands/Hello.cs +++ b/ShiftOS.Engine/Terminal/Commands/Hello.cs @@ -15,7 +15,7 @@ namespace ShiftOS.Engine.Terminal.Commands public override string Run(params string[] parameters) { - return "Oh, HELLO," + parameters[0]; + return "Oh, HELLO, " + String.Join(" ", parameters); } } }