From 008f549d2252e1d5ef55acd39634ccfe7495353f Mon Sep 17 00:00:00 2001 From: jays2kings Date: Wed, 21 May 2014 01:36:05 -0400 Subject: [PATCH] =?UTF-8?q?This=20build=20adds=20a=20few=20more=20devs=20t?= =?UTF-8?q?o=20the=20about=20page,=20and=20if=20you=20don't=20have=20the?= =?UTF-8?q?=20Virtual=20Bus=20Driver=20installed,=20DS4Windows=20will=20wa?= =?UTF-8?q?lk=20you=20through=20installing=20the=20driver.=20And=20since?= =?UTF-8?q?=20I=20love=20images,=20here's=20the=20installer=20window.=20Th?= =?UTF-8?q?is=20makes=20it=20easier=20to=20distribute=20a=20single=20zip?= =?UTF-8?q?=20and=20not=20have=20multiple=20exe=E2=80=99s=20in=20it.=20I?= =?UTF-8?q?=20know=20there=E2=80=99s=20the=20Updater.exe,=20but=20if=20it?= =?UTF-8?q?=E2=80=99s=20deleted,=20it=20will=20now=20be=20redownloaded.=20?= =?UTF-8?q?This=20way=20I=20can=20just=20put=20one=20executable=20in=20the?= =?UTF-8?q?=20zip,=20so=20casual=20users=20don=E2=80=99t=20get=20confused.?= =?UTF-8?q?=20If=20Virtual=20Bus=20is=20installed=20via=20DS4Windows,=20th?= =?UTF-8?q?ere=20is=20an=20uninstall=20link=20in=20about.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DS4Control/Control.cs | 18 +-- DS4Tool/DS4Tool.csproj | 19 ++- DS4Tool/Hotkeys.Designer.cs | 123 ++++++++++----- DS4Tool/Hotkeys.cs | 19 +++ DS4Tool/Properties/Resources.resx | 3 + DS4Tool/Properties/Resources1.Designer.cs | 12 +- DS4Tool/Properties/Settings.Designer.cs | 4 +- DS4Tool/Resources/Pairmode.png | Bin 0 -> 31266 bytes DS4Tool/ScpForm.cs | 63 ++++++-- DS4Tool/WelcomeDialog.Designer.cs | 181 ++++++++++++++++++++++ DS4Tool/WelcomeDialog.cs | 139 +++++++++++++++++ DS4Tool/WelcomeDialog.resx | 120 ++++++++++++++ DS4Tool/app.config | 2 +- 13 files changed, 632 insertions(+), 71 deletions(-) create mode 100644 DS4Tool/Resources/Pairmode.png create mode 100644 DS4Tool/WelcomeDialog.Designer.cs create mode 100644 DS4Tool/WelcomeDialog.cs create mode 100644 DS4Tool/WelcomeDialog.resx diff --git a/DS4Control/Control.cs b/DS4Control/Control.cs index cfdb35c..e96c464 100644 --- a/DS4Control/Control.cs +++ b/DS4Control/Control.cs @@ -82,8 +82,7 @@ namespace DS4Control device.Report += this.On_Report; //m_switcher.setMode(Global.getInitialMode(ind)); TouchPadOn(ind, device); - string[] profileA = Global.getAProfile(ind).Split('\\'); - string filename = profileA[profileA.Length - 1]; + string filename = Path.GetFileName(Global.getAProfile(ind)); ind++; if (System.IO.File.Exists(Global.appdatapath + "\\Profiles\\" + filename)) { @@ -92,8 +91,8 @@ namespace DS4Control } else { - LogDebug("Controller " + ind + " is using a profile not found"); - Log.LogToTray("Controller " + ind + " is using a profile not found"); + LogDebug("Controller " + ind + " is not using a profile"); + Log.LogToTray("Controller " + ind + " is not using a profile"); } if (ind >= 4) // out of Xinput devices! break; @@ -173,17 +172,16 @@ namespace DS4Control device.Report += this.On_Report; x360Bus.Plugin(Index); TouchPadOn(Index, device); - string[] profileA = Global.getAProfile(Index).Split('\\'); - string filename = profileA[profileA.Length - 1]; + string filename = Path.GetFileName(Global.getAProfile(Index)); if (System.IO.File.Exists(Global.appdatapath + "\\Profiles\\" + filename)) { - LogDebug("Controller " + (Index+1) + " is using Profile \"" + filename.Substring(0, filename.Length - 4) + "\""); + LogDebug("Controller " + (Index + 1) + " is using Profile \"" + filename.Substring(0, filename.Length - 4) + "\""); Log.LogToTray("Controller " + (Index + 1) + " is using Profile \"" + filename.Substring(0, filename.Length - 4) + "\""); } else { - LogDebug("Controller " + (Index + 1) + " is using a profile not found"); - Log.LogToTray("Controller " + (Index + 1) + " is using a profile not found"); + LogDebug("Controller " + (Index + 1) + " is not using a profile"); + Log.LogToTray("Controller " + (Index + 1) + " is not using a profile"); } break; @@ -404,7 +402,7 @@ namespace DS4Control public virtual void LogDebug(String Data) { - Console.WriteLine(System.DateTime.UtcNow.ToString("o") + "> " + Data); + Console.WriteLine(System.DateTime.Now.ToString("G") + "> " + Data); if (Debug != null) { DebugEventArgs args = new DebugEventArgs(Data); diff --git a/DS4Tool/DS4Tool.csproj b/DS4Tool/DS4Tool.csproj index 3ae7715..3702341 100644 --- a/DS4Tool/DS4Tool.csproj +++ b/DS4Tool/DS4Tool.csproj @@ -9,7 +9,7 @@ Properties ScpServer DS4Tool - v4.0 + v4.5 512 true C:\Users\Jonathan\Dropbox\Public\DS4 Tool\ @@ -31,6 +31,7 @@ false true true + AnyCPU @@ -41,6 +42,7 @@ DEBUG;TRACE prompt 3 + false AnyCPU @@ -50,6 +52,7 @@ TRACE prompt 4 + false Resources\DS4.ico @@ -73,6 +76,9 @@ + + + @@ -116,6 +122,12 @@ ScpForm.cs + + Form + + + WelcomeDialog.cs + Hotkeys.cs @@ -133,6 +145,10 @@ ScpForm.cs + + WelcomeDialog.cs + + SettingsSingleFileGenerator @@ -169,6 +185,7 @@ + diff --git a/DS4Tool/Hotkeys.Designer.cs b/DS4Tool/Hotkeys.Designer.cs index 5fb4b03..089cebf 100644 --- a/DS4Tool/Hotkeys.Designer.cs +++ b/DS4Tool/Hotkeys.Designer.cs @@ -41,10 +41,13 @@ this.label14 = new System.Windows.Forms.Label(); this.label15 = new System.Windows.Forms.Label(); this.linkProfiles = new System.Windows.Forms.LinkLabel(); - this.linkLabel1 = new System.Windows.Forms.LinkLabel(); - this.linkLabel2 = new System.Windows.Forms.LinkLabel(); + this.linkElectro = new System.Windows.Forms.LinkLabel(); + this.linkJays2Kings = new System.Windows.Forms.LinkLabel(); this.label2 = new System.Windows.Forms.Label(); this.lbAbout = new System.Windows.Forms.Label(); + this.linkInhexSTER = new System.Windows.Forms.LinkLabel(); + this.linkJhebbel = new System.Windows.Forms.LinkLabel(); + this.linkUninstall = new System.Windows.Forms.LinkLabel(); this.SuspendLayout(); // // label1 @@ -61,18 +64,18 @@ this.label3.AutoSize = true; this.label3.Location = new System.Drawing.Point(26, 111); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(108, 13); + this.label3.Size = new System.Drawing.Size(176, 13); this.label3.TabIndex = 2; - this.label3.Text = "Pad click (if tap is on)"; + this.label3.Text = "Tap then hold touchpad (if enabled)"; // // label4 // this.label4.AutoSize = true; this.label4.Location = new System.Drawing.Point(26, 136); this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(166, 13); + this.label4.Size = new System.Drawing.Size(172, 13); this.label4.TabIndex = 3; - this.label4.Text = "Pad click on lower right if enabled"; + this.label4.Text = "Pad click on lower right (if enabled)"; // // label5 // @@ -88,23 +91,23 @@ this.label7.AutoSize = true; this.label7.Location = new System.Drawing.Point(226, 111); this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(50, 13); + this.label7.Size = new System.Drawing.Size(83, 13); this.label7.TabIndex = 6; - this.label7.Text = "Left click"; + this.label7.Text = "Left mouse drag"; // // label8 // this.label8.AutoSize = true; this.label8.Location = new System.Drawing.Point(226, 136); this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(145, 26); + this.label8.Size = new System.Drawing.Size(165, 26); this.label8.TabIndex = 7; - this.label8.Text = "Right click (Best used when \r\nright side is used as a mouse)"; + this.label8.Text = "Right click (Best used when right \r\nside is used as a mouse button)"; // // button1 // this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.button1.Location = new System.Drawing.Point(163, 217); + this.button1.Location = new System.Drawing.Point(163, 275); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 8; @@ -161,7 +164,7 @@ // this.linkProfiles.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.linkProfiles.AutoSize = true; - this.linkProfiles.Location = new System.Drawing.Point(292, 222); + this.linkProfiles.Location = new System.Drawing.Point(292, 280); this.linkProfiles.Name = "linkProfiles"; this.linkProfiles.Size = new System.Drawing.Size(94, 13); this.linkProfiles.TabIndex = 17; @@ -169,36 +172,36 @@ this.linkProfiles.Text = "Open Profile folder"; this.linkProfiles.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkProfiles_LinkClicked); // - // linkLabel1 + // linkElectro // - this.linkLabel1.AutoSize = true; - this.linkLabel1.Location = new System.Drawing.Point(215, 194); - this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(143, 13); - this.linkLabel1.TabIndex = 18; - this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "elctrobrains (Branched off of)"; - this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + this.linkElectro.AutoSize = true; + this.linkElectro.Location = new System.Drawing.Point(215, 216); + this.linkElectro.Name = "linkElectro"; + this.linkElectro.Size = new System.Drawing.Size(143, 13); + this.linkElectro.TabIndex = 18; + this.linkElectro.TabStop = true; + this.linkElectro.Text = "elctrobrains (Branched off of)"; + this.linkElectro.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); // - // linkLabel2 + // linkJays2Kings // - this.linkLabel2.AutoSize = true; - this.linkLabel2.Location = new System.Drawing.Point(105, 194); - this.linkLabel2.Name = "linkLabel2"; - this.linkLabel2.Size = new System.Drawing.Size(92, 13); - this.linkLabel2.TabIndex = 18; - this.linkLabel2.TabStop = true; - this.linkLabel2.Text = "Jays2Kings (Mine)"; - this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked); + this.linkJays2Kings.AutoSize = true; + this.linkJays2Kings.Location = new System.Drawing.Point(95, 216); + this.linkJays2Kings.Name = "linkJays2Kings"; + this.linkJays2Kings.Size = new System.Drawing.Size(60, 13); + this.linkJays2Kings.TabIndex = 18; + this.linkJays2Kings.TabStop = true; + this.linkJays2Kings.Text = "Jays2Kings"; + this.linkJays2Kings.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked); // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(26, 194); + this.label2.Location = new System.Drawing.Point(146, 194); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(72, 13); + this.label2.Size = new System.Drawing.Size(109, 13); this.label2.TabIndex = 13; - this.label2.Text = "Source Code:"; + this.label2.Text = "Credits/Source Code:"; // // lbAbout // @@ -206,17 +209,54 @@ this.lbAbout.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lbAbout.Location = new System.Drawing.Point(26, 9); this.lbAbout.Name = "lbAbout"; - this.lbAbout.Size = new System.Drawing.Size(201, 13); + this.lbAbout.Size = new System.Drawing.Size(243, 13); this.lbAbout.TabIndex = 0; - this.lbAbout.Text = "DS4Windows - J2K Build (Version "; + this.lbAbout.Text = "DS4Windows - Jays2Kings Build (Version "; + // + // linkInhexSTER + // + this.linkInhexSTER.AutoSize = true; + this.linkInhexSTER.Location = new System.Drawing.Point(38, 243); + this.linkInhexSTER.Name = "linkInhexSTER"; + this.linkInhexSTER.Size = new System.Drawing.Size(159, 13); + this.linkInhexSTER.TabIndex = 18; + this.linkInhexSTER.TabStop = true; + this.linkInhexSTER.Text = "InhexSTER (Starter of DS4Tool)"; + this.linkInhexSTER.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkInhexSTER_LinkClicked); + // + // linkJhebbel + // + this.linkJhebbel.AutoSize = true; + this.linkJhebbel.Location = new System.Drawing.Point(268, 243); + this.linkJhebbel.Name = "linkJhebbel"; + this.linkJhebbel.Size = new System.Drawing.Size(41, 13); + this.linkJhebbel.TabIndex = 18; + this.linkJhebbel.TabStop = true; + this.linkJhebbel.Text = "jhebbel"; + this.linkJhebbel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkJhebbel_LinkClicked); + // + // linkUninstall + // + this.linkUninstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.linkUninstall.AutoSize = true; + this.linkUninstall.Location = new System.Drawing.Point(12, 280); + this.linkUninstall.Name = "linkUninstall"; + this.linkUninstall.Size = new System.Drawing.Size(106, 13); + this.linkUninstall.TabIndex = 17; + this.linkUninstall.TabStop = true; + this.linkUninstall.Text = "Uninstall VBus Driver"; + this.linkUninstall.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkUninstall_LinkClicked); // // Hotkeys // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(399, 244); - this.Controls.Add(this.linkLabel2); - this.Controls.Add(this.linkLabel1); + this.ClientSize = new System.Drawing.Size(399, 302); + this.Controls.Add(this.linkJhebbel); + this.Controls.Add(this.linkInhexSTER); + this.Controls.Add(this.linkJays2Kings); + this.Controls.Add(this.linkElectro); + this.Controls.Add(this.linkUninstall); this.Controls.Add(this.linkProfiles); this.Controls.Add(this.label14); this.Controls.Add(this.label15); @@ -257,9 +297,12 @@ private System.Windows.Forms.Label label14; private System.Windows.Forms.Label label15; private System.Windows.Forms.LinkLabel linkProfiles; - private System.Windows.Forms.LinkLabel linkLabel1; - private System.Windows.Forms.LinkLabel linkLabel2; + private System.Windows.Forms.LinkLabel linkElectro; + private System.Windows.Forms.LinkLabel linkJays2Kings; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label lbAbout; + private System.Windows.Forms.LinkLabel linkInhexSTER; + private System.Windows.Forms.LinkLabel linkJhebbel; + private System.Windows.Forms.LinkLabel linkUninstall; } } \ No newline at end of file diff --git a/DS4Tool/Hotkeys.cs b/DS4Tool/Hotkeys.cs index 60d818e..beec1ba 100644 --- a/DS4Tool/Hotkeys.cs +++ b/DS4Tool/Hotkeys.cs @@ -16,6 +16,10 @@ namespace ScpServer { InitializeComponent(); lbAbout.Text += Global.getVersion().ToString() + ")"; + ToolTip tt = new ToolTip(); + tt.SetToolTip(linkUninstall, "To fully remove DS4Windows, You can delete the profiles by the link to the other side"); + if (!System.IO.Directory.Exists(Global.appdatapath + "\\Virtual Bus Driver")) + linkUninstall.Visible = false; } private void button1_Click(object sender, EventArgs e) @@ -37,5 +41,20 @@ namespace ScpServer { System.Diagnostics.Process.Start("https://code.google.com/r/brianfundakowskifeldman-ds4windows/"); } + + private void linkInhexSTER_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start("https://code.google.com/p/ds4-tool/"); + } + + private void linkJhebbel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start("https://code.google.com/r/jhebbel-ds4tool/source/browse/"); + } + + private void linkUninstall_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start(Global.appdatapath + "\\Virtual Bus Driver\\ScpDriver.exe"); + } } } diff --git a/DS4Tool/Properties/Resources.resx b/DS4Tool/Properties/Resources.resx index 5158736..ffca937 100644 --- a/DS4Tool/Properties/Resources.resx +++ b/DS4Tool/Properties/Resources.resx @@ -159,4 +159,7 @@ ..\Resources\UpperTouch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Pairmode.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/DS4Tool/Properties/Resources1.Designer.cs b/DS4Tool/Properties/Resources1.Designer.cs index 9b3b871..a6eb09f 100644 --- a/DS4Tool/Properties/Resources1.Designer.cs +++ b/DS4Tool/Properties/Resources1.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.34014 +// Runtime Version:4.0.30319.34209 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -120,6 +120,16 @@ namespace ScpServer.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap Pairmode { + get { + object obj = ResourceManager.GetObject("Pairmode", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/DS4Tool/Properties/Settings.Designer.cs b/DS4Tool/Properties/Settings.Designer.cs index 8eec031..6679ee6 100644 --- a/DS4Tool/Properties/Settings.Designer.cs +++ b/DS4Tool/Properties/Settings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.34011 +// Runtime Version:4.0.30319.34209 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -12,7 +12,7 @@ namespace ScpServer.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/DS4Tool/Resources/Pairmode.png b/DS4Tool/Resources/Pairmode.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9775420124c600e2a12ced005013b863a411f9 GIT binary patch literal 31266 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 profilenames = new List(); foreach (String s in profiles) if (s.EndsWith(".xml")) - profilenames.Add(s.Substring(cutoff, s.Length - 4 - cutoff)); + profilenames.Add(Path.GetFileNameWithoutExtension(s)); for (int i = 0; i < 4; i++) { cbs[i].Items.Clear(); shortcuts[i].DropDownItems.Clear(); - string[] profileA = Global.getAProfile(i).Split('\\'); - string filename = profileA[profileA.Length - 1]; cbs[i].Items.AddRange(profilenames.ToArray()); foreach (string s in profilenames) - shortcuts[i].DropDownItems.Add(s); + shortcuts[i].DropDownItems.Add(Path.GetFileNameWithoutExtension(s)); for (int j = 0; j < cbs[i].Items.Count; j++) - if (cbs[i].Items[j] + ".xml" == filename) + if (cbs[i].Items[j].ToString() == Path.GetFileNameWithoutExtension(Global.getAProfile(i))) { cbs[i].SelectedIndex = j; ((ToolStripMenuItem)shortcuts[i].DropDownItems[j]).Checked = true; @@ -182,7 +210,7 @@ namespace ScpServer } else { - String Posted = Time.ToString("O"); + String Posted = Time.ToString("G"); lvDebug.Items.Add(new ListViewItem(new String[] { Posted, Data })).EnsureVisible(); @@ -206,22 +234,25 @@ namespace ScpServer this.Hide(); this.ShowInTaskbar = false; } + else if (FormWindowState.Normal == this.WindowState) { notifyIcon1.Visible = false; this.Show(); this.ShowInTaskbar = true; } + //Added last message alternative + if (this.Height > 220) lbLastMessage.Visible = false; else lbLastMessage.Visible = true; - - for (int i = 0; i < 4; i++) - if (this.Width > 665) - protexts[i].Visible = true; - else - protexts[i].Visible = false; + if (protexts != null) + for (int i = 0; i < 4; i++) + if (this.Width > 665) + protexts[i].Visible = true; + else + protexts[i].Visible = false; } protected void btnStartStop_Click(object sender, EventArgs e) diff --git a/DS4Tool/WelcomeDialog.Designer.cs b/DS4Tool/WelcomeDialog.Designer.cs new file mode 100644 index 0000000..cc3b1a7 --- /dev/null +++ b/DS4Tool/WelcomeDialog.Designer.cs @@ -0,0 +1,181 @@ +namespace ScpServer +{ + partial class WelcomeDialog + { + /// + /// 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.bnFinish = new System.Windows.Forms.Button(); + this.bnStep1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.labelBluetooth = new System.Windows.Forms.Label(); + this.labelUSB = new System.Windows.Forms.Label(); + this.labelBluetooth2 = new System.Windows.Forms.Label(); + this.linkBluetoothSettings = new System.Windows.Forms.LinkLabel(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // bnFinish + // + this.bnFinish.Location = new System.Drawing.Point(123, 388); + this.bnFinish.Name = "bnFinish"; + this.bnFinish.Size = new System.Drawing.Size(75, 23); + this.bnFinish.TabIndex = 0; + this.bnFinish.Text = "Finish"; + this.bnFinish.UseVisualStyleBackColor = true; + this.bnFinish.Click += new System.EventHandler(this.bnFinish_Click); + // + // bnStep1 + // + this.bnStep1.Location = new System.Drawing.Point(82, 8); + this.bnStep1.Name = "bnStep1"; + this.bnStep1.Size = new System.Drawing.Size(155, 23); + this.bnStep1.TabIndex = 1; + this.bnStep1.Text = "Step 1: Install the DS4 Driver"; + this.bnStep1.UseVisualStyleBackColor = true; + this.bnStep1.Click += new System.EventHandler(this.bnStep1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(29, 57); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(259, 23); + this.button2.TabIndex = 1; + this.button2.Text = "Step 2: If on Windows 7 or below, Install 360 Drvier"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // pictureBox1 + // + this.pictureBox1.Image = global::ScpServer.Properties.Resources.Pairmode; + this.pictureBox1.InitialImage = null; + this.pictureBox1.Location = new System.Drawing.Point(36, 197); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(245, 132); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 2; + this.pictureBox1.TabStop = false; + // + // labelBluetooth + // + this.labelBluetooth.Location = new System.Drawing.Point(1, 155); + this.labelBluetooth.Name = "labelBluetooth"; + this.labelBluetooth.Size = new System.Drawing.Size(312, 39); + this.labelBluetooth.TabIndex = 3; + this.labelBluetooth.Text = "To set up bluetooth (optional):\r\nHold the PS Button and Share for 3 seconds\r\nThe " + + "lightbar will begin to double flash"; + this.labelBluetooth.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // labelUSB + // + this.labelUSB.Location = new System.Drawing.Point(0, 106); + this.labelUSB.Name = "labelUSB"; + this.labelUSB.Size = new System.Drawing.Size(313, 39); + this.labelUSB.TabIndex = 3; + this.labelUSB.Text = "Step 3: Connecting the DualShock 4 controller\r\nTo set up wired/usb:\r\nSimply plug " + + "a mirco usb into your PC and DualShock 4"; + this.labelUSB.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // labelBluetooth2 + // + this.labelBluetooth2.Location = new System.Drawing.Point(1, 332); + this.labelBluetooth2.Name = "labelBluetooth2"; + this.labelBluetooth2.Size = new System.Drawing.Size(312, 64); + this.labelBluetooth2.TabIndex = 3; + this.labelBluetooth2.Text = "Once flashing go to your Bluetooth Settings\r\nand Connect to \"Wireless Controller\"" + + "\r\n\r\nOnce paired, you\'re good to go. Have fun!"; + this.labelBluetooth2.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // linkBluetoothSettings + // + this.linkBluetoothSettings.AutoSize = true; + this.linkBluetoothSettings.Location = new System.Drawing.Point(169, 332); + this.linkBluetoothSettings.Name = "linkBluetoothSettings"; + this.linkBluetoothSettings.Size = new System.Drawing.Size(93, 13); + this.linkBluetoothSettings.TabIndex = 4; + this.linkBluetoothSettings.TabStop = true; + this.linkBluetoothSettings.Text = "Bluetooth Settings"; + this.linkBluetoothSettings.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkBluetoothSettings_LinkClicked); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(1, 32); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(314, 22); + this.label1.TabIndex = 3; + this.label1.Text = "Make sure to check Force Install"; + this.label1.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // label2 + // + this.label2.Location = new System.Drawing.Point(0, 82); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(315, 22); + this.label2.TabIndex = 3; + this.label2.Text = "You do not have to do this if you have before"; + this.label2.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // WelcomeDialog + // + this.AcceptButton = this.bnFinish; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(315, 422); + this.Controls.Add(this.linkBluetoothSettings); + this.Controls.Add(this.labelBluetooth); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.button2); + this.Controls.Add(this.bnStep1); + this.Controls.Add(this.bnFinish); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.labelUSB); + this.Controls.Add(this.labelBluetooth2); + this.Name = "WelcomeDialog"; + this.Text = "Welcome to DS4Windows"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button bnFinish; + private System.Windows.Forms.Button bnStep1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label labelBluetooth; + private System.Windows.Forms.Label labelUSB; + private System.Windows.Forms.Label labelBluetooth2; + private System.Windows.Forms.LinkLabel linkBluetoothSettings; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + } +} \ No newline at end of file diff --git a/DS4Tool/WelcomeDialog.cs b/DS4Tool/WelcomeDialog.cs new file mode 100644 index 0000000..a0c0246 --- /dev/null +++ b/DS4Tool/WelcomeDialog.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Net; +using DS4Control; +using System.IO; +using System.IO.Compression; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Security.Principal; +using System.Security.Permissions; +using System.Reflection; + +namespace ScpServer +{ + public partial class WelcomeDialog : Form + { + public WelcomeDialog() + { + InitializeComponent(); + this.Icon = Properties.Resources.DS4; + if (!File.Exists("Updater.exe")) + { + Uri url2 = new Uri("https://dl.dropboxusercontent.com/u/16364552/DS4Tool/Updater.exe"); + WebClient wc2 = new WebClient(); + wc2.DownloadFileAsync(url2, "Updater.exe"); + } + } + + private void bnFinish_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void linkBluetoothSettings_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start("control", "bthprops.cpl"); + } + + private void bnStep1_Click(object sender, EventArgs e) + { + WebClient wb = new WebClient(); + if (bnStep1.Text == "Step 1: Install the DS4 Driver") + { + wb.DownloadFileAsync(new Uri("https://docs.google.com/uc?authuser=0&id=0BwPaAe9M8N9mYVdPakJ6OXpMUlU&export=download"), Global.appdatapath + "\\VBus.zip"); + wb.DownloadProgressChanged += wb_DownloadProgressChanged; + wb.DownloadFileCompleted += wb_DownloadFileCompleted; + } + } + + private void wb_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) + { + bnStep1.Text = "Downloading " + e.ProgressPercentage + "%"; + } + + string exepath = Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName; + private void wb_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) + { + if (!exepath.StartsWith("C:\\Program Files") && !exepath.StartsWith("C:\\Windows")) + { + bnStep1.Text = "Opening Installer"; + try + { + File.Delete(exepath + "\\ScpDriver.exe"); + File.Delete(exepath + "\\ScpDriver.log"); + Directory.Delete(exepath + "\\System", true); + Directory.Delete(exepath + "\\DIFxAPI", true); + } + catch { } + Directory.CreateDirectory(Global.appdatapath + "\\Virtual Bus Driver"); + try { ZipFile.ExtractToDirectory(Global.appdatapath + "\\VBus.zip", Global.appdatapath + "\\Virtual Bus Driver"); } //Saved so the user can uninstall later + catch { } + try { ZipFile.ExtractToDirectory(Global.appdatapath + "\\VBus.zip", exepath); } + //Made here as starting the scpdriver.exe via process.start, the program looks for file from where it was called, not where the exe is + catch { } + Process.Start(exepath + "\\ScpDriver.exe"); + Timer timer = new Timer(); + timer.Start(); + timer.Tick += timer_Tick; + } + else + { + bnStep1.Text = "Please Open ScpDriver.exe"; + Directory.CreateDirectory(Global.appdatapath + "\\Virtual Bus Driver"); + try { ZipFile.ExtractToDirectory(Global.appdatapath + "\\VBus.zip", Global.appdatapath + "\\Virtual Bus Driver"); } + catch { } + Process.Start(Global.appdatapath + "\\Virtual Bus Driver"); + Timer timer = new Timer(); + timer.Start(); + timer.Tick += timer_Tick; + } + } + + bool running = false; + private void timer_Tick(object sender, EventArgs e) + { + Process[] processes = Process.GetProcessesByName("ScpDriver"); + if (!exepath.StartsWith("C:\\Program Files") && !exepath.StartsWith("C:\\Windows")) + { + if (processes.Length < 1) + { + bnStep1.Text = "Install Complete"; + + try + { + File.Delete(exepath + "\\ScpDriver.exe"); + File.Delete(exepath + "\\ScpDriver.log"); + Directory.Delete(exepath + "\\System", true); + Directory.Delete(exepath + "\\DIFxAPI", true); + } + catch { } + File.Delete(Global.appdatapath + "\\VBus.zip"); + } + } + else + { + if (processes.Length > 0) + running = true; + if (running) + if (processes.Length < 1) + { + bnStep1.Text = "Install Complete"; + File.Delete(Global.appdatapath + "\\VBus.zip"); + } + } + } + + + private void button2_Click(object sender, EventArgs e) + { + Process.Start("http://www.microsoft.com/hardware/en-us/d/xbox-360-controller-for-windows"); + } + } +} diff --git a/DS4Tool/WelcomeDialog.resx b/DS4Tool/WelcomeDialog.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/DS4Tool/WelcomeDialog.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/DS4Tool/app.config b/DS4Tool/app.config index e365603..c5e1dae 100644 --- a/DS4Tool/app.config +++ b/DS4Tool/app.config @@ -1,3 +1,3 @@ - +