From 3680b6b425c03d4221982222d012ce0f032a1b7d Mon Sep 17 00:00:00 2001 From: jays2kings Date: Wed, 12 Aug 2015 23:53:43 -0400 Subject: [PATCH] Version 1.4.27 (Windows 10) Thanks to another workaround found, it has been added to DS4Windows, there is a button on the main tab, to connect your controller exclusively, this will temporarily kill explorer (The taskbar) and bring it back once a controller is connected Macros: When recording with a delay, you can now add rumble and changing the lightbar color during the macro, you can use the touchpad zones to add rumble or lightbar options. To change how much rumble happens or the lightbar color, just double click the item in the list --- DS4Windows/DS4Control/Mapping.cs | 41 +- DS4Windows/DS4Windows.csproj | 9 +- DS4Windows/DS4Windows/DS4Form.Designer.cs | 82 +- DS4Windows/DS4Windows/DS4Form.cs | 62 +- DS4Windows/DS4Windows/DS4Form.resx | 31 +- DS4Windows/DS4Windows/RecordBox.Designer.cs | 54 +- DS4Windows/DS4Windows/RecordBox.cs | 300 ++++- DS4Windows/DS4Windows/RecordBox.resx | 1042 +++++++++-------- DS4Windows/DS4Windows/RecordBox.tr.resx | 8 +- DS4Windows/Properties/AssemblyInfo.cs | 4 +- ...ces1.Designer.cs => Resources.Designer.cs} | 20 + DS4Windows/Properties/Resources.resx | 6 + DS4Windows/Resources/left touch.png | Bin 0 -> 23180 bytes DS4Windows/Resources/right touch.png | Bin 0 -> 23103 bytes 14 files changed, 1100 insertions(+), 559 deletions(-) rename DS4Windows/Properties/{Resources1.Designer.cs => Resources.Designer.cs} (98%) create mode 100644 DS4Windows/Resources/left touch.png create mode 100644 DS4Windows/Resources/right touch.png diff --git a/DS4Windows/DS4Control/Mapping.cs b/DS4Windows/DS4Control/Mapping.cs index 0580782..8b68f27 100644 --- a/DS4Windows/DS4Control/Mapping.cs +++ b/DS4Windows/DS4Control/Mapping.cs @@ -1279,7 +1279,7 @@ namespace DS4Windows DateTime now = DateTime.UtcNow; if (!subtriggeractivated && now <= oldnowKeyAct[device] + TimeSpan.FromMilliseconds(250)) { - await Task.Delay(3); //if the button is assigned to the same key use a delay so the keydown is the last action, not key up + await Task.Delay(3); //if the button is assigned to the same key use a delay so the key down is the last action, not key up triggeractivated = true; oldnowKeyAct[device] = DateTime.MinValue; } @@ -1459,6 +1459,10 @@ namespace DS4Windows { if (Global.getCustomButton(device, action.trigger[0]) != X360Controls.Unbound) Global.getCustomButtons(device)[action.trigger[0]] = X360Controls.Unbound; + if (Global.getCustomMacro(device, action.trigger[0]) != "0") + Global.getCustomMacros(device).Remove(action.trigger[0]); + if (Global.getCustomKey(device, action.trigger[0]) != 0) + Global.getCustomMacros(device).Remove(action.trigger[0]); string[] dets = action.details.Split(','); DS4Device d = ctrl.DS4Controllers[device]; //Global.cus @@ -1493,7 +1497,7 @@ namespace DS4Windows } int type = 0; - string macro = "91/71/71/91"; + string macro = ""; if (tappedOnce) //single tap { if (int.TryParse(dets[0], out type)) @@ -1625,7 +1629,7 @@ namespace DS4Windows keys = new int[0]; } for (int i = 0; i < keys.Length; i++) - keys[i] = ushort.Parse(skeys[i]); + keys[i] = int.Parse(skeys[i]); bool[] keydown = new bool[286]; if (control == DS4Controls.None || !macrodone[DS4ControltoInt(control)]) { @@ -1633,7 +1637,33 @@ namespace DS4Windows macrodone[DS4ControltoInt(control)] = true; foreach (int i in keys) { - if (i >= 300) //ints over 300 used to delay + if (i >= 1000000000) + { + string lb = i.ToString().Substring(1); + if (i > 1000000000) + { + byte r = (byte)(int.Parse(lb[0].ToString()) * 100 + int.Parse(lb[1].ToString()) * 10 + int.Parse(lb[2].ToString())); + byte g = (byte)(int.Parse(lb[3].ToString()) * 100 + int.Parse(lb[4].ToString()) * 10 + int.Parse(lb[5].ToString())); + byte b = (byte)(int.Parse(lb[6].ToString()) * 100 + int.Parse(lb[7].ToString()) * 10 + int.Parse(lb[8].ToString())); + DS4LightBar.forcelight[device] = true; + DS4LightBar.forcedFlash[device] = 0; + DS4LightBar.forcedColor[device] = new DS4Color(r, g, b); + } + else + { + DS4LightBar.forcedFlash[device] = 0; + DS4LightBar.forcelight[device] = false; + } + } + else if (i >= 1000000) + { + DS4Device d = Program.rootHub.DS4Controllers[device]; + string r = i.ToString().Substring(1); + byte heavy = (byte)(int.Parse(r[0].ToString()) * 100 + int.Parse(r[1].ToString()) * 10 + int.Parse(r[2].ToString())); + byte light = (byte)(int.Parse(r[3].ToString()) * 100 + int.Parse(r[4].ToString()) * 10 + int.Parse(r[5].ToString())); + d.setRumble(light, heavy); + } + else if (i >= 300) //ints over 300 used to delay await Task.Delay(i - 300); else if (!keydown[i]) { @@ -1750,6 +1780,9 @@ namespace DS4Windows else InputMethods.performKeyRelease(i); } + DS4LightBar.forcedFlash[device] = 0; + DS4LightBar.forcelight[device] = false; + Program.rootHub.DS4Controllers[device].setRumble(0, 0); if (keyType.HasFlag(DS4KeyType.HoldMacro)) { await Task.Delay(50); diff --git a/DS4Windows/DS4Windows.csproj b/DS4Windows/DS4Windows.csproj index 25d1e5d..90fcaf8 100644 --- a/DS4Windows/DS4Windows.csproj +++ b/DS4Windows/DS4Windows.csproj @@ -461,6 +461,7 @@ ResXFileCodeGenerator Designer + Resources.Designer.cs @@ -470,7 +471,11 @@ SettingsSingleFileGenerator Settings.Designer.cs - + + True + True + Resources.resx + True Settings.settings @@ -513,6 +518,7 @@ + @@ -529,6 +535,7 @@ + diff --git a/DS4Windows/DS4Windows/DS4Form.Designer.cs b/DS4Windows/DS4Windows/DS4Form.Designer.cs index 763398d..25fb815 100644 --- a/DS4Windows/DS4Windows/DS4Form.Designer.cs +++ b/DS4Windows/DS4Windows/DS4Form.Designer.cs @@ -54,6 +54,7 @@ this.openProfiles = new System.Windows.Forms.OpenFileDialog(); this.tabMain = new System.Windows.Forms.TabControl(); this.tabControllers = new System.Windows.Forms.TabPage(); + this.btnConnectDS4Win10 = new System.Windows.Forms.Button(); this.tLPControllers = new System.Windows.Forms.TableLayoutPanel(); this.pBStatus1 = new System.Windows.Forms.PictureBox(); this.lbPad1 = new System.Windows.Forms.Label(); @@ -114,6 +115,9 @@ this.cBSwipeProfiles = new System.Windows.Forms.CheckBox(); this.StartWindowsCheckBox = new System.Windows.Forms.CheckBox(); this.startMinimizedCheckBox = new System.Windows.Forms.CheckBox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.lbNotifications = new System.Windows.Forms.Label(); + this.cBoxNotifications = new System.Windows.Forms.ComboBox(); this.cBDisconnectBT = new System.Windows.Forms.CheckBox(); this.panel2 = new System.Windows.Forms.Panel(); this.nUDLatency = new System.Windows.Forms.NumericUpDown(); @@ -121,11 +125,8 @@ this.cBFlashWhenLate = new System.Windows.Forms.CheckBox(); this.cBCloseMini = new System.Windows.Forms.CheckBox(); this.cBQuickCharge = new System.Windows.Forms.CheckBox(); - this.cBUpdate = new System.Windows.Forms.CheckBox(); this.cBDownloadLangauge = new System.Windows.Forms.CheckBox(); - this.panel1 = new System.Windows.Forms.Panel(); - this.lbNotifications = new System.Windows.Forms.Label(); - this.cBoxNotifications = new System.Windows.Forms.ComboBox(); + this.cBUpdate = new System.Windows.Forms.CheckBox(); this.pNUpdate = new System.Windows.Forms.Panel(); this.cBUpdateTime = new System.Windows.Forms.ComboBox(); this.lbCheckEvery = new System.Windows.Forms.Label(); @@ -159,9 +160,9 @@ this.toolStrip1.SuspendLayout(); this.tabSettings.SuspendLayout(); this.fLPSettings.SuspendLayout(); + this.panel1.SuspendLayout(); this.panel2.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.nUDLatency)).BeginInit(); - this.panel1.SuspendLayout(); this.pNUpdate.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.nUDUpdateTime)).BeginInit(); this.pnlXIPorts.SuspendLayout(); @@ -339,12 +340,20 @@ // // tabControllers // + this.tabControllers.Controls.Add(this.btnConnectDS4Win10); this.tabControllers.Controls.Add(this.tLPControllers); this.tabControllers.Controls.Add(this.lbNoControllers); resources.ApplyResources(this.tabControllers, "tabControllers"); this.tabControllers.Name = "tabControllers"; this.tabControllers.UseVisualStyleBackColor = true; // + // btnConnectDS4Win10 + // + resources.ApplyResources(this.btnConnectDS4Win10, "btnConnectDS4Win10"); + this.btnConnectDS4Win10.Name = "btnConnectDS4Win10"; + this.btnConnectDS4Win10.UseVisualStyleBackColor = true; + this.btnConnectDS4Win10.Click += new System.EventHandler(this.btnConnectDS4Win10_Click); + // // tLPControllers // resources.ApplyResources(this.tLPControllers, "tLPControllers"); @@ -824,6 +833,30 @@ this.startMinimizedCheckBox.UseVisualStyleBackColor = true; this.startMinimizedCheckBox.CheckedChanged += new System.EventHandler(this.startMinimizedCheckBox_CheckedChanged); // + // panel1 + // + this.panel1.Controls.Add(this.lbNotifications); + this.panel1.Controls.Add(this.cBoxNotifications); + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // lbNotifications + // + resources.ApplyResources(this.lbNotifications, "lbNotifications"); + this.lbNotifications.Name = "lbNotifications"; + // + // cBoxNotifications + // + resources.ApplyResources(this.cBoxNotifications, "cBoxNotifications"); + this.cBoxNotifications.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cBoxNotifications.FormattingEnabled = true; + this.cBoxNotifications.Items.AddRange(new object[] { + resources.GetString("cBoxNotifications.Items"), + resources.GetString("cBoxNotifications.Items1"), + resources.GetString("cBoxNotifications.Items2")}); + this.cBoxNotifications.Name = "cBoxNotifications"; + this.cBoxNotifications.SelectedIndexChanged += new System.EventHandler(this.cBoxNotifications_SelectedIndexChanged); + // // cBDisconnectBT // resources.ApplyResources(this.cBDisconnectBT, "cBDisconnectBT"); @@ -883,13 +916,6 @@ this.cBQuickCharge.UseVisualStyleBackColor = true; this.cBQuickCharge.CheckedChanged += new System.EventHandler(this.cBQuickCharge_CheckedChanged); // - // cBUpdate - // - resources.ApplyResources(this.cBUpdate, "cBUpdate"); - this.cBUpdate.Name = "cBUpdate"; - this.cBUpdate.UseVisualStyleBackColor = true; - this.cBUpdate.CheckedChanged += new System.EventHandler(this.cBUpdate_CheckedChanged); - // // cBDownloadLangauge // resources.ApplyResources(this.cBDownloadLangauge, "cBDownloadLangauge"); @@ -899,29 +925,12 @@ this.cBDownloadLangauge.UseVisualStyleBackColor = true; this.cBDownloadLangauge.CheckedChanged += new System.EventHandler(this.cBDownloadLangauge_CheckedChanged); // - // panel1 + // cBUpdate // - this.panel1.Controls.Add(this.lbNotifications); - this.panel1.Controls.Add(this.cBoxNotifications); - resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Name = "panel1"; - // - // lbNotifications - // - resources.ApplyResources(this.lbNotifications, "lbNotifications"); - this.lbNotifications.Name = "lbNotifications"; - // - // cBoxNotifications - // - resources.ApplyResources(this.cBoxNotifications, "cBoxNotifications"); - this.cBoxNotifications.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cBoxNotifications.FormattingEnabled = true; - this.cBoxNotifications.Items.AddRange(new object[] { - resources.GetString("cBoxNotifications.Items"), - resources.GetString("cBoxNotifications.Items1"), - resources.GetString("cBoxNotifications.Items2")}); - this.cBoxNotifications.Name = "cBoxNotifications"; - this.cBoxNotifications.SelectedIndexChanged += new System.EventHandler(this.cBoxNotifications_SelectedIndexChanged); + resources.ApplyResources(this.cBUpdate, "cBUpdate"); + this.cBUpdate.Name = "cBUpdate"; + this.cBUpdate.UseVisualStyleBackColor = true; + this.cBUpdate.CheckedChanged += new System.EventHandler(this.cBUpdate_CheckedChanged); // // pNUpdate // @@ -1099,11 +1108,11 @@ this.tabSettings.ResumeLayout(false); this.fLPSettings.ResumeLayout(false); this.fLPSettings.PerformLayout(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); this.panel2.ResumeLayout(false); this.panel2.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.nUDLatency)).EndInit(); - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); this.pNUpdate.ResumeLayout(false); this.pNUpdate.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.nUDUpdateTime)).EndInit(); @@ -1233,6 +1242,7 @@ private System.Windows.Forms.Panel panel2; private System.Windows.Forms.NumericUpDown nUDLatency; private System.Windows.Forms.Label lbMsLatency; + private System.Windows.Forms.Button btnConnectDS4Win10; //private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; } } diff --git a/DS4Windows/DS4Windows/DS4Form.cs b/DS4Windows/DS4Windows/DS4Form.cs index d88bb2f..ce956e9 100644 --- a/DS4Windows/DS4Windows/DS4Form.cs +++ b/DS4Windows/DS4Windows/DS4Form.cs @@ -48,6 +48,7 @@ namespace DS4Windows bool contextclose; string logFile = appdatapath + @"\DS4Service.log"; StreamWriter logWriter; + bool runningBat; //bool outputlog = false; [DllImport("user32.dll")] @@ -186,12 +187,16 @@ namespace DS4Windows //MessageBox.Show(Environment.OSVersion.VersionString); foreach (ToolStripMenuItem t in shortcuts) t.DropDownItemClicked += Profile_Changed_Menu; - hideDS4CheckBox.CheckedChanged -= hideDS4CheckBox_CheckedChanged; - hideDS4CheckBox.Checked = UseExclusiveMode; - hideDS4CheckBox.CheckedChanged += hideDS4CheckBox_CheckedChanged; + hideDS4CheckBox.CheckedChanged -= hideDS4CheckBox_CheckedChanged; + hideDS4CheckBox.Checked = UseExclusiveMode; + hideDS4CheckBox.CheckedChanged += hideDS4CheckBox_CheckedChanged; if (Environment.OSVersion.Version.Major >= 10) - toolTip1.SetToolTip(hideDS4CheckBox, "Currently does not work on Windows 10"); - cBDisconnectBT.Checked = DCBTatStop; + { + toolTip1.SetToolTip(hideDS4CheckBox, "For Windows 10, use button on the main tab to connect exclusivly"); + btnConnectDS4Win10.Visible = hideDS4CheckBox.Checked; + toolTip1.SetToolTip(btnConnectDS4Win10, "This will temporarily kill the taskbar until you connect a controller"); + } + cBDisconnectBT.Checked = DCBTatStop; cBQuickCharge.Checked = QuickCharge; nUDXIPorts.Value = FirstXinputPort; Program.rootHub.x360Bus.FirstController = FirstXinputPort; @@ -320,6 +325,23 @@ namespace DS4Windows appShortcutToStartup(); } } + UpdateTheUpdater(); + } + + private async void UpdateTheUpdater() + { + if (File.Exists(exepath + "\\Update Files\\DS4Updater.exe")) + { + Process[] processes = Process.GetProcessesByName("DS4Updater"); + while (processes.Length > 0) + { + await Task.Delay(500); + } + File.Delete(exepath + "\\DS4Updater.exe"); + File.Move(exepath + "\\Update Files\\DS4Updater.exe", exepath + "\\DS4Updater.exe"); + Directory.Delete(exepath + "\\Update Files"); + } + } void NewVersion() @@ -475,6 +497,13 @@ namespace DS4Windows LoadProfile(j, false, Program.rootHub); } } + if (bat != null && bat.HasExited && runningBat) + { + Process.Start("explorer.exe"); + bat = null; + runningBat = false; + } + GC.Collect(); } @@ -791,6 +820,11 @@ namespace DS4Windows Batteries[Index].Text = Program.rootHub.getDS4Battery(Index); if (Pads[Index].Text != String.Empty) { + if (runningBat) + { + SendKeys.Send("A"); + runningBat = false; + } Pads[Index].Enabled = true; nocontrollers = false; if (Pads[Index].Text != Properties.Resources.Connecting) @@ -1062,6 +1096,8 @@ namespace DS4Windows module.Dispose(); UseExclusiveMode = hideDS4CheckBox.Checked; + if (Environment.OSVersion.Version.Major >= 10) + btnConnectDS4Win10.Visible = hideDS4CheckBox.Checked; btnStartStop_Clicked(false); btnStartStop_Clicked(false); Save(); @@ -1615,6 +1651,22 @@ namespace DS4Windows { toolTip1.Hide((Label)sender); } + Process bat; + private void btnConnectDS4Win10_Click(object sender, EventArgs e) + { + if (!runningBat) + { + StreamWriter w = new StreamWriter(exepath + "\\ConnectDS4.bat"); + w.WriteLine("@echo off"); // Turn off echo + w.WriteLine("taskkill /IM explorer.exe /f"); + w.WriteLine("echo Connect your DS4 controller"); // + w.WriteLine("pause"); + w.WriteLine("start explorer.exe"); + w.Close(); + runningBat = true; + bat = Process.Start(exepath + "\\ConnectDS4.bat"); + } + } private void cBDownloadLangauge_CheckedChanged(object sender, EventArgs e) { diff --git a/DS4Windows/DS4Windows/DS4Form.resx b/DS4Windows/DS4Windows/DS4Form.resx index 2857bf8..0998a01 100644 --- a/DS4Windows/DS4Windows/DS4Form.resx +++ b/DS4Windows/DS4Windows/DS4Form.resx @@ -6583,6 +6583,33 @@ XML Files (*.xml)|*.xml + + Top + + + 0, 130 + + + 896, 23 + + + 48 + + + Connect DS4 exclusivly (experimental) + + + btnConnectDS4Win10 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControllers + + + 0 + 5 @@ -7573,7 +7600,7 @@ tabControllers - 0 + 1 <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="pBStatus1" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lbPad1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lbPad2" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="bnEditC3" Row="3" RowSpan="1" Column="4" ColumnSpan="1" /><Control Name="bnEditC4" Row="4" RowSpan="1" Column="4" ColumnSpan="1" /><Control Name="lbPad3" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lbPad4" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="cBController1" Row="1" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="bnEditC2" Row="2" RowSpan="1" Column="4" ColumnSpan="1" /><Control Name="cBController2" Row="2" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="cBController3" Row="3" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="bnEditC1" Row="1" RowSpan="1" Column="4" ColumnSpan="1" /><Control Name="cBController4" Row="4" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="lbSelectedProfile" Row="0" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="lbID" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lbStatus" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lbBattery" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="lbBatt1" Row="1" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="lbBatt2" Row="2" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="lbBatt3" Row="3" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="lbBatt4" Row="4" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="pBStatus2" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="pBStatus3" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="pBStatus4" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="Percent,46.27451,Percent,28.23529,Percent,25.4902,AutoSize,0,AutoSize,0" /><Rows Styles="AutoSize,0,Percent,25,Percent,25,Percent,25,Percent,25,Absolute,20" /></TableLayoutSettings> @@ -7609,7 +7636,7 @@ tabControllers - 1 + 2 4, 22 diff --git a/DS4Windows/DS4Windows/RecordBox.Designer.cs b/DS4Windows/DS4Windows/RecordBox.Designer.cs index 41b1b04..da88768 100644 --- a/DS4Windows/DS4Windows/RecordBox.Designer.cs +++ b/DS4Windows/DS4Windows/RecordBox.Designer.cs @@ -41,6 +41,8 @@ this.btnSaveP = new System.Windows.Forms.Button(); this.lbRecordTip = new System.Windows.Forms.Label(); this.pnlMouseButtons = new System.Windows.Forms.Panel(); + this.btnLightbar = new System.Windows.Forms.Button(); + this.btnRumble = new System.Windows.Forms.Button(); this.btn5th = new System.Windows.Forms.Button(); this.btn4th = new System.Windows.Forms.Button(); this.btnLoadP = new System.Windows.Forms.Button(); @@ -51,8 +53,12 @@ this.cMSLoadPresets = new System.Windows.Forms.ContextMenuStrip(this.components); this.altTabToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fromFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pBLtouch = new System.Windows.Forms.PictureBox(); + this.pBRtouch = new System.Windows.Forms.PictureBox(); this.pnlMouseButtons.SuspendLayout(); this.cMSLoadPresets.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pBLtouch)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pBRtouch)).BeginInit(); this.SuspendLayout(); // // btnRecord @@ -148,12 +154,34 @@ // pnlMouseButtons // resources.ApplyResources(this.pnlMouseButtons, "pnlMouseButtons"); + this.pnlMouseButtons.Controls.Add(this.pBRtouch); + this.pnlMouseButtons.Controls.Add(this.pBLtouch); + this.pnlMouseButtons.Controls.Add(this.btnLightbar); + this.pnlMouseButtons.Controls.Add(this.btnRumble); this.pnlMouseButtons.Controls.Add(this.btn5th); this.pnlMouseButtons.Controls.Add(this.btn4th); this.pnlMouseButtons.Name = "pnlMouseButtons"; this.pnlMouseButtons.MouseDown += new System.Windows.Forms.MouseEventHandler(this.anyMouseDown); this.pnlMouseButtons.MouseUp += new System.Windows.Forms.MouseEventHandler(this.anyMouseUp); // + // btnLightbar + // + resources.ApplyResources(this.btnLightbar, "btnLightbar"); + this.btnLightbar.Name = "btnLightbar"; + this.btnLightbar.UseVisualStyleBackColor = true; + this.btnLightbar.Click += new System.EventHandler(this.btnLightbar_Click); + this.btnLightbar.KeyDown += new System.Windows.Forms.KeyEventHandler(this.anyKeyDown); + this.btnLightbar.KeyUp += new System.Windows.Forms.KeyEventHandler(this.anyKeyUp); + // + // btnRumble + // + resources.ApplyResources(this.btnRumble, "btnRumble"); + this.btnRumble.Name = "btnRumble"; + this.btnRumble.UseVisualStyleBackColor = true; + this.btnRumble.Click += new System.EventHandler(this.btnRumble_Click); + this.btnRumble.KeyDown += new System.Windows.Forms.KeyEventHandler(this.anyKeyDown); + this.btnRumble.KeyUp += new System.Windows.Forms.KeyEventHandler(this.anyKeyUp); + // // btn5th // resources.ApplyResources(this.btn5th, "btn5th"); @@ -200,25 +228,39 @@ // // cMSLoadPresets // - resources.ApplyResources(this.cMSLoadPresets, "cMSLoadPresets"); this.cMSLoadPresets.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.altTabToolStripMenuItem, this.fromFileToolStripMenuItem}); this.cMSLoadPresets.Name = "cMSLoadPresets"; this.cMSLoadPresets.ShowImageMargin = false; + resources.ApplyResources(this.cMSLoadPresets, "cMSLoadPresets"); // // altTabToolStripMenuItem // - resources.ApplyResources(this.altTabToolStripMenuItem, "altTabToolStripMenuItem"); this.altTabToolStripMenuItem.Name = "altTabToolStripMenuItem"; + resources.ApplyResources(this.altTabToolStripMenuItem, "altTabToolStripMenuItem"); this.altTabToolStripMenuItem.Click += new System.EventHandler(this.altTabToolStripMenuItem_Click); // // fromFileToolStripMenuItem // - resources.ApplyResources(this.fromFileToolStripMenuItem, "fromFileToolStripMenuItem"); this.fromFileToolStripMenuItem.Name = "fromFileToolStripMenuItem"; + resources.ApplyResources(this.fromFileToolStripMenuItem, "fromFileToolStripMenuItem"); this.fromFileToolStripMenuItem.Click += new System.EventHandler(this.fromFileToolStripMenuItem_Click); // + // pBLtouch + // + this.pBLtouch.Image = global::DS4Windows.Properties.Resources.left_touch; + resources.ApplyResources(this.pBLtouch, "pBLtouch"); + this.pBLtouch.Name = "pBLtouch"; + this.pBLtouch.TabStop = false; + // + // pBRtouch + // + this.pBRtouch.Image = global::DS4Windows.Properties.Resources.right_touch; + resources.ApplyResources(this.pBRtouch, "pBRtouch"); + this.pBRtouch.Name = "pBRtouch"; + this.pBRtouch.TabStop = false; + // // RecordBox // resources.ApplyResources(this, "$this"); @@ -249,6 +291,8 @@ this.Resize += new System.EventHandler(this.RecordBox_Resize); this.pnlMouseButtons.ResumeLayout(false); this.cMSLoadPresets.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pBLtouch)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pBRtouch)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -277,5 +321,9 @@ private System.Windows.Forms.ContextMenuStrip cMSLoadPresets; private System.Windows.Forms.ToolStripMenuItem altTabToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem fromFileToolStripMenuItem; + private System.Windows.Forms.Button btnLightbar; + private System.Windows.Forms.Button btnRumble; + private System.Windows.Forms.PictureBox pBRtouch; + private System.Windows.Forms.PictureBox pBLtouch; } } \ No newline at end of file diff --git a/DS4Windows/DS4Windows/RecordBox.cs b/DS4Windows/DS4Windows/RecordBox.cs index 30516d2..c634cc2 100644 --- a/DS4Windows/DS4Windows/RecordBox.cs +++ b/DS4Windows/DS4Windows/RecordBox.cs @@ -27,6 +27,7 @@ namespace DS4Windows DS4State cState; public bool saved = false; List dcs = new List(); + TextBox tb1, tb2; public RecordBox(KBM360 op) { kbm = op; @@ -106,12 +107,32 @@ namespace DS4Windows else macros.Add(value); } + bool[] pTP = new bool[4]; void ds4_Tick(object sender, EventArgs e) { if (Program.rootHub.DS4Controllers[0] != null) { cState = Program.rootHub.getDS4State(0); if (btnRecord.Text == Properties.Resources.StopText) + { + if (cBRecordDelays.Checked) + { + Mouse tP = Program.rootHub.touchPad[0]; + if (tP.leftDown && !pTP[0]) + if (!btnRumble.Text.Contains("Stop")) + btnRumble_Click(sender, e); + else if (!tP.leftDown && pTP[0]) + if (btnRumble.Text.Contains("Stop")) + btnRumble_Click(sender, e); + if (tP.rightDown && !pTP[1]) + if (!btnLightbar.Text.Contains("Reset")) + btnLightbar_Click(sender, e); + else if (!tP.rightDown && pTP[1]) + if (btnLightbar.Text.Contains("Reset")) + btnLightbar_Click(sender, e); + pTP[0] = tP.leftDown; + pTP[1] = tP.rightDown; + } foreach (DS4Controls dc in dcs) if (Mapping.getBoolMapping(dc, cState, null, null)) { @@ -175,6 +196,7 @@ namespace DS4Windows } } } + } } } @@ -251,6 +273,10 @@ namespace DS4Windows { if (cBRecordDelays.Checked) sw.Start(); + btnRumble.Visible = cBRecordDelays.Checked; + btnLightbar.Visible = cBRecordDelays.Checked; + pBLtouch.Visible = cBRecordDelays.Checked; + pBRtouch.Visible = cBRecordDelays.Checked; Program.rootHub.recordingMacro = true; saved = false; ds4.Start(); @@ -278,6 +304,13 @@ namespace DS4Windows btn4th_Click(sender, e); if (btn5th.Text.Contains(Properties.Resources.UpText)) btn5th_Click(sender, e); + if (cBRecordDelays.Checked) + { + if (btnRumble.Text.Contains("Stop")) + btnRumble_Click(sender, e); + if (btnLightbar.Text.Contains("Reset")) + btnLightbar_Click(sender, e); + } if (cBRecordDelays.Checked) sw.Reset(); if (cBRecordDelays.Checked) @@ -618,6 +651,98 @@ namespace DS4Windows } + private void btnRumble_Click(object sender, EventArgs e) + { + int value = 1255255; + if (btnRumble.Text.Contains("Add")) + { + if (macros.Count == 0 || (recordAfter && macrosAfter.Count == 0)) + { + AddMacroValue(value); + lVMacros.Items.Add("Rumble 255,255 (100%)", 0); + if (cBRecordDelays.Checked) + { + sw.Reset(); + sw.Start(); + } + } + else if (macros.Count > 0 || (recordAfter && macrosAfter.Count > 0)) + { + if (cBRecordDelays.Checked) + { + AddMacroValue((int)sw.ElapsedMilliseconds + 300); + lVMacros.Items.Add(Properties.Resources.WaitMS.Replace("*number*", sw.ElapsedMilliseconds.ToString()).Replace("*ms*", "ms"), 2); + sw.Reset(); + sw.Start(); + } + AddMacroValue(value); + lVMacros.Items.Add("Rumble 255,255 (100%)", 0); + } + btnRumble.Text = "Stop Rumble"; + } + else + { + value = 1000000; + if (cBRecordDelays.Checked) + { + AddMacroValue((int)sw.ElapsedMilliseconds + 300); + lVMacros.Items.Add(Properties.Resources.WaitMS.Replace("*number*", sw.ElapsedMilliseconds.ToString()).Replace("*ms*", "ms"), 2); + sw.Reset(); + sw.Start(); + } + AddMacroValue(value); + lVMacros.Items.Add("Stop Rumble", 1); + btnRumble.Text = "Add Rumble"; + } + lVMacros.Items[lVMacros.Items.Count - 1].EnsureVisible(); + } + + private void btnLightbar_Click(object sender, EventArgs e) + { + int value = 1255255255; + if (btnLightbar.Text.Contains("Change")) + { + if (macros.Count == 0 || (recordAfter && macrosAfter.Count == 0)) + { + AddMacroValue(value); + lVMacros.Items.Add("Lightbar Color: 255,255,255", 0); + if (cBRecordDelays.Checked) + { + sw.Reset(); + sw.Start(); + } + } + else if (macros.Count > 0 || (recordAfter && macrosAfter.Count > 0)) + { + if (cBRecordDelays.Checked) + { + AddMacroValue((int)sw.ElapsedMilliseconds + 300); + lVMacros.Items.Add(Properties.Resources.WaitMS.Replace("*number*", sw.ElapsedMilliseconds.ToString()).Replace("*ms*", "ms"), 2); + sw.Reset(); + sw.Start(); + } + AddMacroValue(value); + lVMacros.Items.Add("Lightbar Color: 255,255,255", 0); + } + btnLightbar.Text = "Reset Lightbar Color"; + } + else + { + value = 1000000000; + if (cBRecordDelays.Checked) + { + AddMacroValue((int)sw.ElapsedMilliseconds + 300); + lVMacros.Items.Add(Properties.Resources.WaitMS.Replace("*number*", sw.ElapsedMilliseconds.ToString()).Replace("*ms*", "ms"), 2); + sw.Reset(); + sw.Start(); + } + AddMacroValue(value); + lVMacros.Items.Add("Reset Lightbar", 1); + btnLightbar.Text = "Change Lightbar Color"; + } + lVMacros.Items[lVMacros.Items.Count - 1].EnsureVisible(); + } + public void btnSave_Click(object sender, EventArgs e) { if (macros.Count > 0) @@ -749,7 +874,34 @@ namespace DS4Windows bool[] keydown = new bool[286]; foreach (int i in macros) { - if (i >= 300) //ints over 300 used to delay + if (i >= 1000000000) + { + if (i > 1000000000) + { + string lb = i.ToString().Substring(1); + byte r = (byte)(int.Parse(lb[0].ToString()) * 100 + int.Parse(lb[1].ToString()) * 10 + int.Parse(lb[2].ToString())); + byte g = (byte)(int.Parse(lb[3].ToString()) * 100 + int.Parse(lb[4].ToString()) * 10 + int.Parse(lb[5].ToString())); + byte b = (byte)(int.Parse(lb[6].ToString()) * 100 + int.Parse(lb[7].ToString()) * 10 + int.Parse(lb[8].ToString())); + lVMacros.Items.Add($"Lightbar Color: {r},{g},{b}", 0); + } + else + { + lVMacros.Items.Add("Reset Lightbar", 1); + } + } + else if (i >= 1000000) + { + if (i > 1000000) + { + string r = i.ToString().Substring(1); + byte heavy = (byte)(int.Parse(r[0].ToString()) * 100 + int.Parse(r[1].ToString()) * 10 + int.Parse(r[2].ToString())); + byte light = (byte)(int.Parse(r[3].ToString()) * 100 + int.Parse(r[4].ToString()) * 10 + int.Parse(r[5].ToString())); + lVMacros.Items.Add($"Rumble {heavy}, {light} ({Math.Round((heavy * .75f + light * .25f) / 2.55f, 1)}%)", 0); + } + else + lVMacros.Items.Add("Stop Rumble", 1); + } + else if (i >= 300) //ints over 300 used to delay lVMacros.Items.Add(Properties.Resources.WaitMS.Replace("*number*", (i - 300).ToString()).Replace("*ms*", "ms"), 2); else if (!keydown[i]) { @@ -823,7 +975,7 @@ namespace DS4Windows keydown[i] = false; } } - for (ushort i = 0; i < keydown.Length; i++) + for (int i = 0; i < keydown.Length; i++) { if (keydown[i]) { @@ -922,61 +1074,127 @@ namespace DS4Windows } } private int selection; + private bool changingDelay = false; private void lVMacros_MouseDoubleClick(object sender, MouseEventArgs e) { - if (lVMacros.SelectedIndices[0] >= 0 && lVMacros.SelectedItems[0].ImageIndex == 2) - { - TextBox tb = new TextBox(); - tb.MaxLength = 5; - tb.KeyDown += nud_KeyDown; - tb.LostFocus += nud_LostFocus; - selection = lVMacros.SelectedIndices[0]; - Controls.Add(tb); - tb.Location = new Point(lVMacros.Location.X + lVMacros.SelectedItems[0].Position.X, lVMacros.Location.Y + lVMacros.SelectedItems[0].Position.Y); - tb.BringToFront(); - lVMacros.MouseHover -= lVMacros_MouseHover; - tb.TextChanged += tb_TextChanged; - tb.Focus(); - } + if (lVMacros.SelectedIndices[0] >= 0) + if (lVMacros.SelectedItems[0].ImageIndex == 2) + { + TextBox tb = new TextBox(); + tb.MaxLength = 5; + tb.KeyDown += nud_KeyDown; + tb.LostFocus += nud_LostFocus; + selection = lVMacros.SelectedIndices[0]; + Controls.Add(tb); + changingDelay = true; + tb.Location = new Point(lVMacros.Location.X + lVMacros.SelectedItems[0].Position.X, lVMacros.Location.Y + lVMacros.SelectedItems[0].Position.Y); + tb.BringToFront(); + lVMacros.MouseHover -= lVMacros_MouseHover; + tb.TextChanged += tb_TextChanged; + tb.Focus(); + } + else if (macros[lVMacros.SelectedIndices[0]] > 1000000000) + { + selection = lVMacros.SelectedIndices[0]; + string lb = macros[lVMacros.SelectedIndices[0]].ToString().Substring(1); + byte r = (byte)(int.Parse(lb[0].ToString()) * 100 + int.Parse(lb[1].ToString()) * 10 + int.Parse(lb[2].ToString())); + byte g = (byte)(int.Parse(lb[3].ToString()) * 100 + int.Parse(lb[4].ToString()) * 10 + int.Parse(lb[5].ToString())); + byte b = (byte)(int.Parse(lb[6].ToString()) * 100 + int.Parse(lb[7].ToString()) * 10 + int.Parse(lb[8].ToString())); + AdvancedColorDialog advColorDialog = new AdvancedColorDialog(); + advColorDialog.Color = Color.FromArgb(r, g, b); + advColorDialog.OnUpdateColor += advColorDialog_OnUpdateColor; + if (advColorDialog.ShowDialog() == DialogResult.OK) + { + macros[selection] = 1000000000 + advColorDialog.Color.R * 1000000 + advColorDialog.Color.G * 1000 + advColorDialog.Color.B; + } + lVMacros.Items[selection].Text = ($"Lightbar Color: {advColorDialog.Color.R},{advColorDialog.Color.G},{advColorDialog.Color.B}"); + } + else if (macros[lVMacros.SelectedIndices[0]] > 1000000 && macros[lVMacros.SelectedIndices[0]] != 1000000000) + { + + lVMacros.MouseHover -= lVMacros_MouseHover; + string r = macros[lVMacros.SelectedIndices[0]].ToString().Substring(1); + byte heavy = (byte)(int.Parse(r[0].ToString()) * 100 + int.Parse(r[1].ToString()) * 10 + int.Parse(r[2].ToString())); + byte light = (byte)(int.Parse(r[3].ToString()) * 100 + int.Parse(r[4].ToString()) * 10 + int.Parse(r[5].ToString())); + selection = lVMacros.SelectedIndices[0]; + tb1 = new TextBox(); + tb2 = new TextBox(); + tb1.Name = "tBHeavy"; + tb1.Name = "tBLight"; + tb1.MaxLength = 3; + tb2.MaxLength = 3; + tb1.KeyDown += nud_KeyDown; + tb2.KeyDown += nud_KeyDown; + Controls.Add(tb1); + Controls.Add(tb2); + changingDelay = false; + tb1.Location = new Point(lVMacros.Location.X + lVMacros.SelectedItems[0].Position.X, lVMacros.Location.Y + lVMacros.SelectedItems[0].Position.Y); + tb1.Size = new Size(tb1.Size.Width / 2, tb1.Size.Height); + tb2.Location = new Point(lVMacros.Location.X + lVMacros.SelectedItems[0].Position.X + tb1.Size.Width, lVMacros.Location.Y + lVMacros.SelectedItems[0].Position.Y); + tb2.Size = tb1.Size; + tb1.BringToFront(); + tb2.BringToFront(); + tb1.Text = heavy.ToString(); + tb2.Text = light.ToString(); + tb1.TextChanged += tb_TextChanged; + tb2.TextChanged += tb_TextChanged; + tb1.Focus(); + } } void tb_TextChanged(object sender, EventArgs e) { TextBox tb = (TextBox)sender; - for (int i = tb.Text.Length - 1; i >= 0; i--) - if (!Char.IsDigit(tb.Text[i])) - tb.Text = tb.Text.Remove(i, 1); + //if (changingDelay) + { + for (int i = tb.Text.Length - 1; i >= 0; i--) + if (!char.IsDigit(tb.Text[i])) + tb.Text = tb.Text.Remove(i, 1); + } } void nud_LostFocus(object sender, EventArgs e) { - TextBox tb = (TextBox)sender; - int i; - if (!string.IsNullOrEmpty(tb.Text) && int.TryParse(tb.Text, out i)) - { - lVMacros.Items[selection] = new ListViewItem(Properties.Resources.WaitMS.Replace("*number*", (tb.Text)).Replace("*ms*", "ms"), 2); - macros[selection] = i + 300; - saved = false; - } - Controls.Remove(tb); - lVMacros.MouseHover += lVMacros_MouseHover; + SaveMacroChange((TextBox)sender); } void nud_KeyDown(object sender, KeyEventArgs e) { - TextBox tb = (TextBox)sender; - if (e.KeyCode == Keys.Enter && !string.IsNullOrEmpty(tb.Text)) + if (e.KeyCode == Keys.Enter) + SaveMacroChange((TextBox)sender); + } + private void SaveMacroChange(TextBox tb) + { + int i, j; + if (!string.IsNullOrEmpty(tb.Text)) { - int i; - if (int.TryParse(tb.Text, out i)) + if (changingDelay && int.TryParse(tb.Text, out i)) { lVMacros.Items[selection] = new ListViewItem(Properties.Resources.WaitMS.Replace("*number*", (tb.Text)).Replace("*ms*", "ms"), 2); macros[selection] = i + 300; - saved = false; Controls.Remove(tb); - lVMacros.MouseHover += lVMacros_MouseHover; + saved = false; + } + else if (!changingDelay) + { + if (int.TryParse(tb1.Text, out i) && int.TryParse(tb2.Text, out j)) + { + if (i + j > 0) + { + byte heavy = (byte)i; + byte light = (byte)j; + lVMacros.Items[selection].Text = ($"Rumble {heavy}, {light} ({Math.Round((heavy * .75f + light * .25f) / 2.55f, 1)}%)"); + macros[selection] = 1000000 + heavy * 1000 + light; + saved = false; + Controls.Remove(tb1); + Controls.Remove(tb2); + tb1 = null; + tb2 = null; + } + } } } + lVMacros.MouseHover += lVMacros_MouseHover; } private void RecordBox_Resize(object sender, EventArgs e) @@ -984,6 +1202,18 @@ namespace DS4Windows cHMacro.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize); } + private void advColorDialog_OnUpdateColor(object sender, EventArgs e) + { + if (sender is Color && Program.rootHub.DS4Controllers[0] != null) + { + Color color = (Color)sender; + DS4Color dcolor = new DS4Color { red = color.R, green = color.G, blue = color.B }; + DS4LightBar.forcedColor[0] = dcolor; + DS4LightBar.forcedFlash[0] = 0; + DS4LightBar.forcelight[0] = true; + } + } + private void lVMacros_SelectedIndexChanged(object sender, EventArgs e) { if (btnRecord.Text != Properties.Resources.StopText) diff --git a/DS4Windows/DS4Windows/RecordBox.resx b/DS4Windows/DS4Windows/RecordBox.resx index 9502a2f..46962e3 100644 --- a/DS4Windows/DS4Windows/RecordBox.resx +++ b/DS4Windows/DS4Windows/RecordBox.resx @@ -117,471 +117,90 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.OpenFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - + Top, Right - - lVMacros - - - Top, Right - - - lbMacroOrder - - - Macro Order - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btn4th - - - $this - - - 3, 8 - - - 548, 142 - - - - False - - - btnSave - - - 133, 48 - - - Save Preset - - - 132, 22 - - - Text Document (*.txt)|*.txt - - - 2 - - - Edit the Wait to change the cycle rate - - - btnCancel - - - 8 - - - 646, 81 - - - Record a Macro - - - Top - - - Top, Right - - - 66, 13 - - - $this - - - 103, 23 - - - 131, 23 - - - btn5th - - - 536, 81 - - - fromFileToolStripMenuItem - - - 6, 13 - - - Play once - - - Top, Right - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MiddleCenter - - - 104, 23 - - - 5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 332 - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top, Right - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 536, 29 - - - 539, 225 - - - 3 - - - True - - - Repeat while held - - - savePresets - - - RecordBox - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 326 - - - 121, 21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 213, 46 - - - 6 - - - lbDelayTip - - - True - - - 0 - - - 260, 205 - - - 578, 171 - - - Macro Order - - - 527, 342 - - - 39, 10 - - - 5th Mouse Button Down - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 10 - - - Load Preset - - - Top, Right - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 200 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 536, 2 - - - Text Document (*.txt)|*.txt - - - pnlMouseButtons - - - 322 - - - cHMacro - - - 329 - - - 329 - - - cMSLoadPresets - - - 328 - - - Cycle Programs - - - NoControl - - - $this - - - $this - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - openPresets - - - 4th Mouse Button Down - - - 332 - - - Top, Bottom, Left, Right - - - 4 - - - 333 - MiddleLeft - - System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - 328 - - - Save - - - Top - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 96, 17 - - - False - - - 104, 23 - - - 3, 29 - - - From File... - - - btnRecord - - - Cancel - - - 131, 23 - - - Top, Right - - - 132, 22 - - - 591, 121 - - - lbRecordTip - - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 103, 23 - - - 309, 7 - - - Top, Right - - - 7 - - - cBStyle - - - pnlMouseButtons - - - $this - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - NoControl - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 536, 29 - - 0 + + 213, 46 - - iLKeys - - - 39, 39 - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 322 Record + + btnRecord + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + $this - - MiddleCenter + + 8 - - cBRecordDelays + + Top, Right - - $this + + True + + + 591, 121 + + + 96, 17 324 - - $this - - - $this - - - Double click on a wait to edit the time - - - btnLoadP - - - altTabToolStripMenuItem - - - 750, 375 - - - pnlMouseButtons - - - $this - - - 327 - Record Delays - - 0 + + cBRecordDelays - - 646, 2 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - btnSaveP + + $this - - 9 + + 4 - - Use Keyboard/Mouse + Controller 1 to record + + Top, Bottom, Left, Right + + Macro Order + + + 200 + + + 17, 17 + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ - CgAAAk1TRnQBSQFMAgEBAwEAATwBAQFgAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo + CgAAAk1TRnQBSQFMAgEBAwEAAXwBAQF8AQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -623,68 +242,557 @@ AUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAT/AYcB4QIAAf4BfwH+AT8BgAEB AgAB/AE/Af4BPwHAAQMCAAH4AR8B/gE/AcABAwIAAfABDwH+AT8BgAEBAgAB8AEHAf4BPwGAAQECAAHy AQcB/gE/AYABAQIAAfYBJwH2ATcBgAEBAgAB/gE/AfIBJwGAAQECAAH+AT8B8AEHAYABAQIAAf4BPwHw - AQcBgAEBAgAB/gE/AfgBDwQAAf4BPwH8AR8EAAH+AT8B/gE/BAAB/gE/Af8BfwEAAQECAAT/AYMBwxgA + AQcBgAEBAgAB/gE/AfgBDwQAAf4BPwH8AR8EAAH+AT8B/gE/BAAB/gE/Af8BfwEAAQECAAT/AYMBwwIA Cw== - + + 3, 29 + + + 527, 342 + + + 326 + + + lVMacros + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - + + 9 + + + Top, Right + + + Play once + + + Repeat while held + + + 578, 171 + + + 121, 21 + + + 327 + + + cBStyle + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Top, Right + + + 536, 2 + + + 104, 23 + + + 328 + + + Save + + + btnSave + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 331 - - - NoControl - - - 184, 13 - - - 210, 74 - - - Top, Right - - - 12 - - - Top, Right - - + $this - - True - 11 + + Top, Right + + + 646, 2 + + + 103, 23 + + + 328 + + + Cancel + + + btnCancel + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + Top, Right + + + NoControl + + + 646, 81 + + + 103, 23 + + + 332 + + + Save Preset + + + btnSaveP + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Top, Right + + + True + + + 309, 7 + 221, 13 + + 329 + + + Use Keyboard/Mouse + Controller 1 to record + + + MiddleCenter + + + lbRecordTip + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + Top, Right + + + NoControl + + + 152, 106 + + + 43, 23 + + + Zoom + + + 4 + + + pBRtouch + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pnlMouseButtons + + + 0 + + + 152, 77 + + + 43, 23 + + + Zoom + + + 3 + + + pBLtouch + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pnlMouseButtons + + + 1 + + + Top + + + NoControl + + + 17, 106 + + + 131, 23 + + + 1 + + + Change Lightbar Color + + + btnLightbar + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pnlMouseButtons + + + 2 + + + Top + + + NoControl + + + 17, 77 + + + 131, 23 + + + 2 + + + Add Rumble + + + btnRumble + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pnlMouseButtons + + + 3 + + + Top + + + 39, 39 + + + 131, 23 + + + 0 + + + 5th Mouse Button Down + + + btn5th + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pnlMouseButtons + + + 4 + + + Top + + + 39, 10 + + + 131, 23 + + + 0 + + + 4th Mouse Button Down + + + btn4th + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pnlMouseButtons + + + 5 + + + 539, 225 + + + 210, 138 + + + 331 + + + False + + + pnlMouseButtons + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + Top, Right + + + 536, 81 + + + 104, 23 + + + 332 + + + Load Preset + + + btnLoadP + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + 102, 17 + + + Text Document (*.txt)|*.txt + 238, 17 - - 102, 17 - + + Text Document (*.txt)|*.txt + + + True + + + 3, 8 + + + 66, 13 + + + 333 + + + Macro Order + + + lbMacroOrder + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top, Right + + + True + + + NoControl + + + 548, 142 + + + 184, 13 + + + 329 + + + Double click on a wait to edit the time + + + MiddleCenter + + + False + + + lbDelayTip + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + 356, 17 - - 17, 17 - + + 133, 48 + + + cMSLoadPresets + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 132, 22 + + + Cycle Programs + + + Edit the Wait to change the cycle rate + + + 132, 22 + + + From File... + True - - tr - + + 6, 13 + + + 750, 375 + + + 260, 205 + + + Record a Macro + + + cHMacro + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + iLKeys + + + System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + savePresets + + + System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + openPresets + + + System.Windows.Forms.OpenFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + altTabToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + fromFileToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + RecordBox + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/DS4Windows/DS4Windows/RecordBox.tr.resx b/DS4Windows/DS4Windows/RecordBox.tr.resx index 6d4fb64..b6c426c 100644 --- a/DS4Windows/DS4Windows/RecordBox.tr.resx +++ b/DS4Windows/DS4Windows/RecordBox.tr.resx @@ -135,7 +135,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ - CgAAAk1TRnQBSQFMAgEBAwEAAWABAQFgAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CgAAAk1TRnQBSQFMAgEBAwEAAWgBAQFoAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -229,9 +229,6 @@ Süreyi ayarlamak için çift tıklayın - - 151, 48 - 150, 22 @@ -247,4 +244,7 @@ Dosyadan... + + 151, 48 + \ No newline at end of file diff --git a/DS4Windows/Properties/AssemblyInfo.cs b/DS4Windows/Properties/AssemblyInfo.cs index acf6277..088a6e5 100644 --- a/DS4Windows/Properties/AssemblyInfo.cs +++ b/DS4Windows/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.4.269")] -[assembly: AssemblyFileVersion("1.4.269")] +[assembly: AssemblyVersion("1.4.27")] +[assembly: AssemblyFileVersion("1.4.27")] diff --git a/DS4Windows/Properties/Resources1.Designer.cs b/DS4Windows/Properties/Resources.Designer.cs similarity index 98% rename from DS4Windows/Properties/Resources1.Designer.cs rename to DS4Windows/Properties/Resources.Designer.cs index e477ea4..160a7f7 100644 --- a/DS4Windows/Properties/Resources1.Designer.cs +++ b/DS4Windows/Properties/Resources.Designer.cs @@ -851,6 +851,16 @@ namespace DS4Windows.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap left_touch { + get { + object obj = ResourceManager.GetObject("left_touch", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1236,6 +1246,16 @@ namespace DS4Windows.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap right_touch { + get { + object obj = ResourceManager.GetObject("right_touch", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized string similar to Right Click to set presets for a set of controls. /// diff --git a/DS4Windows/Properties/Resources.resx b/DS4Windows/Properties/Resources.resx index d33c4c0..96398eb 100644 --- a/DS4Windows/Properties/Resources.resx +++ b/DS4Windows/Properties/Resources.resx @@ -694,4 +694,10 @@ Charge the battery + + ..\Resources\left touch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\right touch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/DS4Windows/Resources/left touch.png b/DS4Windows/Resources/left touch.png new file mode 100644 index 0000000000000000000000000000000000000000..4c94c3667b5a7757e5de20d3cefc72ee2b903dc3 GIT binary patch literal 23180 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 UgA>swKk6qZtt?d_@yP3c0Eb~W4*&oF literal 0 HcmV?d00001 diff --git a/DS4Windows/Resources/right touch.png b/DS4Windows/Resources/right touch.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2ac3d54ec82ba2a5d7cdeca2e386fe2af4d261 GIT binary patch literal 23103 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 ACIA2c literal 0 HcmV?d00001