diff --git a/ShiftOS.Engine/ShiftOS.Engine.csproj b/ShiftOS.Engine/ShiftOS.Engine.csproj
index 6740db1..8d3d003 100644
--- a/ShiftOS.Engine/ShiftOS.Engine.csproj
+++ b/ShiftOS.Engine/ShiftOS.Engine.csproj
@@ -52,9 +52,6 @@
True
Resources.resx
-
-
-
UserControl
diff --git a/ShiftOS.Engine/Terminal/Commands/Hello.cs b/ShiftOS.Engine/Terminal/Commands/Hello.cs
deleted file mode 100644
index 531bd1f..0000000
--- a/ShiftOS.Engine/Terminal/Commands/Hello.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-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, " + String.Join(" ", parameters);
- }
- }
-}
diff --git a/ShiftOS.Engine/Terminal/TerminalCommand.cs b/ShiftOS.Engine/Terminal/TerminalCommand.cs
deleted file mode 100644
index b5dd8bf..0000000
--- a/ShiftOS.Engine/Terminal/TerminalCommand.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace ShiftOS.Engine.Terminal
-{
- public class TerminalCommand
- {
- public string GetName() { return ""; }
-
- public void Run(params string[] parameters) { return ""; }
-
- public void Run(params string[] parameters) {
-
- }
- }
-}
diff --git a/ShiftOS.Main/ShiftOS.Main.csproj b/ShiftOS.Main/ShiftOS.Main.csproj
index 7c19b38..b2e9739 100644
--- a/ShiftOS.Main/ShiftOS.Main.csproj
+++ b/ShiftOS.Main/ShiftOS.Main.csproj
@@ -88,6 +88,9 @@
Desktop.cs
+
+
+
HijackScreen.cs
diff --git a/ShiftOS.Main/ShiftOS/Apps/Terminal.Designer.cs b/ShiftOS.Main/ShiftOS/Apps/Terminal.Designer.cs
index e92cdb4..b514bbf 100644
--- a/ShiftOS.Main/ShiftOS/Apps/Terminal.Designer.cs
+++ b/ShiftOS.Main/ShiftOS/Apps/Terminal.Designer.cs
@@ -60,6 +60,6 @@
#endregion
- private System.Windows.Forms.RichTextBox termmain;
+ public System.Windows.Forms.RichTextBox termmain;
}
}
diff --git a/ShiftOS.Main/ShiftOS/Apps/Terminal.cs b/ShiftOS.Main/ShiftOS/Apps/Terminal.cs
index a9bd093..1bd5c03 100644
--- a/ShiftOS.Main/ShiftOS/Apps/Terminal.cs
+++ b/ShiftOS.Main/ShiftOS/Apps/Terminal.cs
@@ -8,15 +8,19 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ShiftOS.Engine;
-using ShiftOS.Engine.Terminal;
+using ShiftOS.Main.Terminal;
namespace ShiftOS.Main.ShiftOS.Apps
{
public partial class Terminal : UserControl
{
+ public int TerminalID = TerminalBackend.trmTopID++; // Used so that we can have multiple instances of the terminal whilst the command begin run knowing what terminal to send the text to - very complicated ;)
public string defaulttextBefore = "user> ";
public string defaulttextResult = "user@shiftos> "; // NOT YET IMPLEMENTED!!!
- public bool doClear = false;
+ public bool DoClear = false;
+ public bool RunningCommand = false;
+ public bool WaitingResponse = false;
+ public string InputReturnText = "";
// The below variables makes the terminal... a terminal!
public string OldText = "";
@@ -27,12 +31,8 @@ namespace ShiftOS.Main.ShiftOS.Apps
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;
+ TerminalBackend.trm.Add(this); // Makes the commands run!
}
private void termmain_KeyDown(object sender, KeyEventArgs e)
@@ -45,51 +45,67 @@ namespace ShiftOS.Main.ShiftOS.Apps
// termmain.Paste(DataFormats.GetFormat(DataFormats.Text));
e.Handled = true;
} else if (e.KeyCode == Keys.Enter) {
- Print(TerminalBackend.RunCommand(termmain.Text.Substring(TrackingPosition, termmain.Text.Length - TrackingPosition))); // The most horrific line in the entire application!
+ RunningCommand = true;
+ TerminalBackend.RunCommand(termmain.Text.Substring(TrackingPosition, termmain.Text.Length - TrackingPosition), TerminalID); // The most horrific line in the entire application!
+ RunningCommand = false;
+ termmain.AppendText($"\n {defaulttextResult}");
+ TrackingPosition = termmain.Text.Length;
e.Handled = true;
}
}
private void termmain_TextChanged(object sender, EventArgs e)
{
- if (termmain.SelectionStart < TrackingPosition)
+ if (!RunningCommand)
{
- if (doClear == false) // If it's not clearing the terminal
+ if (termmain.SelectionStart < TrackingPosition)
{
- termmain.Text = OldText;
- termmain.Select(termmain.Text.Length, 0);
+ if (!DoClear) // If it's not clearing the terminal
+ {
+ termmain.Text = OldText;
+ termmain.Select(termmain.Text.Length, 0);
+ }
+ }
+ else
+ {
+ OldText = termmain.Text;
}
- }
- else
- {
- OldText = termmain.Text;
}
}
private void termmain_SelectionChanged(object sender, EventArgs e)
{
- if (termmain.SelectionStart < TrackingPosition)
+ if (!RunningCommand)
{
- termmain.Text = OldText;
- termmain.Select(termmain.Text.Length, 0);
+ if (termmain.SelectionStart < TrackingPosition)
+ {
+ termmain.Text = OldText;
+ termmain.Select(termmain.Text.Length, 0);
+ }
}
}
private void Terminal_Load(object sender, EventArgs e)
{
- Print("\n");
+ termmain.Text = $"\n {defaulttextResult}";
+ TrackingPosition = termmain.Text.Length;
}
- public string RunCommand(string command)
+ public void Input(string request)
{
- string ToReturn = "";
+ InputReturnText = "";
+ RunningCommand = false;
- if (command == "hi")
- {
- ToReturn = $"{ToReturn} \n Hi!";
- MessageBox.Show("HI!");
- }
- return ToReturn;
+ termmain.AppendText($"\n {request} ");
+ TrackingPosition = termmain.Text.Length;
+ }
+
+ public void Clear()
+ {
+ DoClear = true;
+ termmain.Text = $"\n {defaulttextResult}";
+ TrackingPosition = termmain.Text.Length;
+ DoClear = false;
}
}
}
diff --git a/ShiftOS.Main/ShiftOS/Desktop.cs b/ShiftOS.Main/ShiftOS/Desktop.cs
index 06f1fc8..3477788 100644
--- a/ShiftOS.Main/ShiftOS/Desktop.cs
+++ b/ShiftOS.Main/ShiftOS/Desktop.cs
@@ -61,7 +61,7 @@ namespace ShiftOS.Main.ShiftOS
private void terminalToolStripMenuItem_Click(object sender, EventArgs e)
{
Apps.Terminal trm = new Apps.Terminal();
-
+
ShiftWM.Init(trm, "Terminal", null, false, true);
}
}
diff --git a/ShiftOS.Main/Terminal/Commands/Hello.cs b/ShiftOS.Main/Terminal/Commands/Hello.cs
new file mode 100644
index 0000000..efc9a9a
--- /dev/null
+++ b/ShiftOS.Main/Terminal/Commands/Hello.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ShiftOS.Main.Terminal.Commands
+{
+ public class Hello : TerminalCommand
+ {
+ public override string Name { get; } = "Hello";
+ public override string Summary { get; } = "Just an example command.";
+ public override string Usage { get; } = "Hello .";
+ public override bool Unlocked { get; set; } = false;
+
+ public override async void Run(params string[] parameters)
+ {
+ string name = string.Join(" ", parameters);
+ WriteLine($"Oh, hello, {name}.", Color.Red);
+ string age = await Input("Hey, What's your age?");
+ WriteLine($"Ok, so your name is {name} and your age {age}.");
+ }
+ }
+}
diff --git a/ShiftOS.Engine/Terminal/TerminalBackend.cs b/ShiftOS.Main/Terminal/TerminalBackend.cs
similarity index 57%
rename from ShiftOS.Engine/Terminal/TerminalBackend.cs
rename to ShiftOS.Main/Terminal/TerminalBackend.cs
index 7103238..9a5785f 100644
--- a/ShiftOS.Engine/Terminal/TerminalBackend.cs
+++ b/ShiftOS.Main/Terminal/TerminalBackend.cs
@@ -4,8 +4,9 @@ using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
+using System.Windows.Forms;
-namespace ShiftOS.Engine.Terminal
+namespace ShiftOS.Main.Terminal
{
public static class TerminalBackend
{
@@ -15,12 +16,14 @@ namespace ShiftOS.Engine.Terminal
&& t.GetConstructor(Type.EmptyTypes) != null
select Activator.CreateInstance(t) as TerminalCommand;
+ public static List trm = new List();
+ public static int trmTopID = 0;
///
/// Runs a terminal command.
///
///
- /// Returns all the output from that command.
- public static string RunCommand(string command)
+ /// The rich text box that the text will be written to.
+ public static void RunCommand(string command, int TermID)
{
string name;
try { name = command.Split(' ')[0]; } catch { name = command; }
@@ -30,17 +33,17 @@ namespace ShiftOS.Engine.Terminal
foreach (TerminalCommand instance in instances)
{
- if (instance.GetName() == name)
- return instance.Run(theParams);
+ if (instance.Name.ToLower() == name.ToLower())
+ {
+ instance.TermID = TermID;
+ // Add a new line!
+ Array.Find(trm.ToArray(), w => w.TerminalID == TermID).termmain.AppendText("\n");
+ instance.Run(theParams);
+ return;
+ }
}
- 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();
+ Array.Find(trm.ToArray(), w => w.TerminalID == TermID).termmain.Text += " \n The command cannot be found. \n";
}
}
}
diff --git a/ShiftOS.Main/Terminal/TerminalCommand.cs b/ShiftOS.Main/Terminal/TerminalCommand.cs
new file mode 100644
index 0000000..4746e6c
--- /dev/null
+++ b/ShiftOS.Main/Terminal/TerminalCommand.cs
@@ -0,0 +1,92 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ShiftOS.Main.Terminal
+{
+ public class TerminalCommand
+ {
+ public int TermID { get; set; }
+
+ public virtual string Name { get; }
+ public virtual string Summary { get; }
+ public virtual string Usage { get; }
+ public virtual bool Unlocked { get; set; }
+
+ public virtual void Run(params string[] parameters) { }
+
+ ///
+ /// Writes a blank line in the terminal.
+ ///
+ public virtual void WriteLine()
+ {
+ WriteLine("");
+ }
+
+ ///
+ /// Writes specified text in the terminal and starts a new line.
+ ///
+ /// The text to write before the new line is made.
+ public virtual void WriteLine(string value)
+ {
+ Array.Find(TerminalBackend.trm.ToArray(), w => w.TerminalID == TermID).termmain.AppendText($"{value} \n");
+ }
+
+ ///
+ /// Writes specified text in the terminal in the specified color and starts a new line.
+ ///
+ /// The text to write before the new line is made.
+ /// The color the text is written in.
+ public virtual void WriteLine(string value, Color textClr)
+ {
+ ShiftOS.Apps.Terminal trm = Array.Find(TerminalBackend.trm.ToArray(), w => w.TerminalID == TermID);
+
+ int startPoint = trm.termmain.Text.Length;
+ trm.termmain.AppendText($"{value} \n");
+ trm.termmain.Select(startPoint, $"{value} \n".Length);
+ trm.termmain.SelectionColor = textClr;
+ }
+
+ ///
+ /// Writes specified text in the terminal.
+ ///
+ /// The text to write.
+ /// The color the text is written in.
+ public virtual void Write(string value, Color textClr)
+ {
+
+ ShiftOS.Apps.Terminal trm = Array.Find(TerminalBackend.trm.ToArray(), w => w.TerminalID == TermID);
+
+ int startPoint = trm.termmain.Text.Length;
+ trm.termmain.AppendText($"{value}");
+ trm.termmain.Select(startPoint, $"{value}".Length);
+ trm.termmain.SelectionColor = textClr;
+ }
+
+ ///
+ /// Writes specified text in the terminal.
+ ///
+ /// The text to say before requesting text.
+ public virtual Task Input(string value = "")
+ {
+ ShiftOS.Apps.Terminal trm = Array.Find(TerminalBackend.trm.ToArray(), w => w.TerminalID == TermID);
+ trm.Input(value);
+
+ Task Input = new Task(() =>
+ {
+ while (true)
+ if (trm.InputReturnText != "") break;
+
+ // The terminal has finally decided!
+
+ return trm.InputReturnText;
+ });
+ Input.Start();
+ return Input;
+ }
+ }
+}