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 | 878 ++++++++++-------- 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, 1018 insertions(+), 477 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 05807826a3..8b68f2772b 100644 --- a/DS4Windows/DS4Control/Mapping.cs +++ b/DS4Windows/DS4Control/Mapping.cs @@ -1279,7 +1279,7 @@ public static async void MapCustomAction(int device, DS4State cState, DS4State M 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 @@ public static async void MapCustomAction(int device, DS4State cState, DS4State M { 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 @@ public static async void MapCustomAction(int device, DS4State cState, DS4State M } 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 @@ private static async void PlayMacro(int device, bool[] macrocontrol, string macr 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 @@ private static async void PlayMacro(int device, bool[] macrocontrol, string macr 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 @@ private static async void PlayMacro(int device, bool[] macrocontrol, string macr 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 25d1e5d1cf..90fcaf8895 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 763398d236..25fb8156d0 100644 --- a/DS4Windows/DS4Windows/DS4Form.Designer.cs +++ b/DS4Windows/DS4Windows/DS4Form.Designer.cs @@ -54,6 +54,7 @@ private void InitializeComponent() 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 @@ private void InitializeComponent() 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 @@ private void InitializeComponent() 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 @@ private void InitializeComponent() 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 @@ private void InitializeComponent() // // 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 @@ private void InitializeComponent() 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 @@ private void InitializeComponent() 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 @@ private void InitializeComponent() this.cBDownloadLangauge.UseVisualStyleBackColor = true; this.cBDownloadLangauge.CheckedChanged += new System.EventHandler(this.cBDownloadLangauge_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 + // cBUpdate // - 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 @@ private void InitializeComponent() 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 void InitializeComponent() 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 d88bb2f59b..ce956e9449 100644 --- a/DS4Windows/DS4Windows/DS4Form.cs +++ b/DS4Windows/DS4Windows/DS4Form.cs @@ -48,6 +48,7 @@ public partial class DS4Form : Form bool contextclose; string logFile = appdatapath + @"\DS4Service.log"; StreamWriter logWriter; + bool runningBat; //bool outputlog = false; [DllImport("user32.dll")] @@ -186,12 +187,16 @@ public DS4Form(string[] args) //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 @@ public DS4Form(string[] args) 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 @@ void Hotkeys(object sender, EventArgs e) 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 @@ protected void ControllerStatusChanged() 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 @@ private void hideDS4CheckBox_CheckedChanged(object sender, EventArgs e) 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 @@ private void Pads_MouseLeave(object sender, EventArgs e) { 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 2857bf8acf..0998a01810 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 41b1b04dfa..da88768c41 100644 --- a/DS4Windows/DS4Windows/RecordBox.Designer.cs +++ b/DS4Windows/DS4Windows/RecordBox.Designer.cs @@ -41,6 +41,8 @@ private void InitializeComponent() 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 @@ private void InitializeComponent() 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 @@ private void InitializeComponent() // 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 @@ private void InitializeComponent() // // 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 @@ private void InitializeComponent() 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 void InitializeComponent() 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 30516d242f..c634cc2496 100644 --- a/DS4Windows/DS4Windows/RecordBox.cs +++ b/DS4Windows/DS4Windows/RecordBox.cs @@ -27,6 +27,7 @@ public partial class RecordBox : Form DS4State cState; public bool saved = false; List dcs = new List(); + TextBox tb1, tb2; public RecordBox(KBM360 op) { kbm = op; @@ -106,12 +107,32 @@ void AddMacroValue(int value) 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 @@ void ds4_Tick(object sender, EventArgs e) } } } + } } } @@ -251,6 +273,10 @@ private void btnRecord_Click(object sender, EventArgs e) { 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 @@ private void btnRecord_Click(object sender, EventArgs e) 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 @@ private void btn5th_Click(object sender, EventArgs e) } + 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 @@ void LoadMacro() 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 @@ void LoadMacro() 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 @@ protected override void OnKeyDown(KeyEventArgs e) } } 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 @@ private void RecordBox_Resize(object sender, EventArgs e) 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 9502a2f445..46962e3fa4 100644 --- a/DS4Windows/DS4Windows/RecordBox.resx +++ b/DS4Windows/DS4Windows/RecordBox.resx @@ -117,574 +117,682 @@ 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 + + + MiddleLeft - - Top, Right + + NoControl - - lbMacroOrder + + 536, 29 - - Macro Order + + 213, 46 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 322 - - btn4th + + Record - - $this + + btnRecord - - - 3, 8 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 548, 142 + + $this - - - False + + 8 - - btnSave + + Top, Right - - 133, 48 + + True - - Save Preset + + 591, 121 - - 132, 22 + + 96, 17 - - Text Document (*.txt)|*.txt + + 324 - - 2 + + Record Delays - - Edit the Wait to change the cycle rate + + cBRecordDelays - - btnCancel + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 8 + + $this - - 646, 81 + + 4 - - Record a Macro + + Top, Bottom, Left, Right - - Top + + Macro Order - - Top, Right + + 200 - - 66, 13 + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ + CgAAAk1TRnQBSQFMAgEBAwEAAXwBAQF8AQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/yIAAf8B7wH3AfQGAAH/ + Au8B/xgAAf8BBw4AAuwB/wcAAf8BBwHxAQcBvAGRAosBkQG8AQcB8QHvAf8XAAH/AuwBBw0AAuwB/wgA + AfQB8AEHBosCBwH0FwAB/wTsAQcMAALsAf8IAAHxAZEBiwe0AZEB8RYAAf8G7AEHCwAC7AH/BwAB9AG0 + Aa0BtAG1AfEC/wHxAbUBtAGtAbQB9BUAAuwBBwLsAf8C7AH/CgAC7AH/BwABvAGzAbQBtQb/ArQBswG8 + FQAB7AEHAQAC7AL/AewB/woAAuwB/wcAAbUBtAG1ARkC9AEHAfMB/wEZAQkCtAG1FQABBwIAAuwB/wEA + Av8HAAH/AgAC7AH/AgAB/wQAArQBtQP0AuwBvAH/ARkDtBgAAuwB/woAAewB/wEAAuwB/wEAAQcB/wQA + ArQBtQH0Av8B7AHvAewBBwEZA7QYAALsAf8KAALsAf8C7AH/AQcB7AH/BAABuwG0AbsBGQH/AfQBkgH0 + Af8B7wEZAbUBtAG7GAAC7AH/CgABBwTsAQcC7AH/BAAB8AG0AbsBCQH/AfQB8gP/ArsBtAHwGAAC7AH/ + CwABBwXsAf8EAAH0AVgBUgG7AgkB8wL0AfMBCQG7ARwBUgF5Af8XAALsAf8MAAEHA+wB/wUAARoBmgF6 + AVIDCQK1AgkBuwFYARoBegH/FwAC7AH/DQABBwHsAf8GAAEaAXoBwwF6AVgB3AQJAbsBUgKaAXoB/xcA + A/8OAAH/BwAB/wEaAXoBwwF6AZkBCQLcAQkBmQF6AZoBegH2MgAB/wEaAVkBegH/BAAB/wFZAXoB9hIA + 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/AYMBwwIA + Cw== + - - $this + + 3, 29 - - 103, 23 + + 527, 342 - - 131, 23 + + 326 - - btn5th + + lVMacros - - 536, 81 + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - fromFileToolStripMenuItem + + $this - - 6, 13 + + 9 + + + Top, Right Play once - - Top, Right + + Repeat while held - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 578, 171 - - MiddleCenter + + 121, 21 - - 104, 23 + + 327 - - 5 + + cBStyle - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 332 + + $this - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 2 - + Top, Right - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 536, 2 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 104, 23 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 328 - - 536, 29 + + Save - - 539, 225 + + btnSave - - 3 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + $this - - Repeat while held + + 11 - - savePresets - - - RecordBox + + Top, Right - - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 646, 2 - - 326 + + 103, 23 - - 121, 21 + + 328 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Cancel - - 213, 46 + + btnCancel - - 6 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - lbDelayTip + + $this - - True + + 10 - - 0 + + Top, Right - - 260, 205 + + NoControl - - 578, 171 + + 646, 81 - - Macro Order + + 103, 23 - - 527, 342 + + 332 - - 39, 10 + + Save Preset - - 5th Mouse Button Down + + btnSaveP - + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 10 + + $this - - Load Preset + + 3 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 + + True - - 322 + + 309, 7 - - cHMacro + + 221, 13 329 - - 329 - - - cMSLoadPresets + + Use Keyboard/Mouse + Controller 1 to record - - 328 + + MiddleCenter - - Cycle Programs + + lbRecordTip - - NoControl + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - $this + + 7 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Top, Right - - openPresets + + NoControl - - 4th Mouse Button Down + + 152, 106 - - 332 + + 43, 23 - - Top, Bottom, Left, Right + + Zoom - + 4 - - 333 - - - MiddleLeft + + pBRtouch - - System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + pnlMouseButtons - - 328 + + 0 - - Save + + 152, 77 - - Top + + 43, 23 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Zoom - - True + + 3 - - 96, 17 + + pBLtouch - - False + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 104, 23 + + pnlMouseButtons - - 3, 29 + + 1 - - From File... + + Top - - btnRecord + + NoControl - - Cancel + + 17, 106 - + 131, 23 - - Top, Right - - - 132, 22 + + 1 - - 591, 121 + + Change Lightbar Color - - lbRecordTip + + btnLightbar - - System.Windows.Forms.Form, 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 - - 103, 23 + + pnlMouseButtons - - 309, 7 + + 2 - - Top, Right + + Top - - 7 + + NoControl - - cBStyle + + 17, 77 - - pnlMouseButtons + + 131, 23 - - $this + + 2 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add Rumble - - NoControl + + btnRumble - + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 + + pnlMouseButtons - - iLKeys + + 3 + + + Top 39, 39 - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Record + + 131, 23 - - $this + + 0 - - MiddleCenter + + 5th Mouse Button Down - - cBRecordDelays + + btn5th - - $this + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 324 + + pnlMouseButtons - - $this + + 4 - - $this + + Top - - Double click on a wait to edit the time + + 39, 10 - - btnLoadP + + 131, 23 - - altTabToolStripMenuItem + + 0 - - 750, 375 + + 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 - - 327 + + 12 - - Record Delays + + Top, Right - - 0 + + 536, 81 - - 646, 2 + + 104, 23 - - btnSaveP + + 332 - - 9 + + Load Preset - - Use Keyboard/Mouse + Controller 1 to record + + btnLoadP - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ - CgAAAk1TRnQBSQFMAgEBAwEAATwBAQFgAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo - AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA - AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 - AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA - AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm - AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM - AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA - ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz - AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ - AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM - AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA - AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA - AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ - AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ - AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA - AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm - ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ - Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz - AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA - AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM - AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM - ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM - Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA - AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM - AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ - AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz - AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm - AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw - AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/yIAAf8B7wH3AfQGAAH/ - Au8B/xgAAf8BBw4AAuwB/wcAAf8BBwHxAQcBvAGRAosBkQG8AQcB8QHvAf8XAAH/AuwBBw0AAuwB/wgA - AfQB8AEHBosCBwH0FwAB/wTsAQcMAALsAf8IAAHxAZEBiwe0AZEB8RYAAf8G7AEHCwAC7AH/BwAB9AG0 - Aa0BtAG1AfEC/wHxAbUBtAGtAbQB9BUAAuwBBwLsAf8C7AH/CgAC7AH/BwABvAGzAbQBtQb/ArQBswG8 - FQAB7AEHAQAC7AL/AewB/woAAuwB/wcAAbUBtAG1ARkC9AEHAfMB/wEZAQkCtAG1FQABBwIAAuwB/wEA - Av8HAAH/AgAC7AH/AgAB/wQAArQBtQP0AuwBvAH/ARkDtBgAAuwB/woAAewB/wEAAuwB/wEAAQcB/wQA - ArQBtQH0Av8B7AHvAewBBwEZA7QYAALsAf8KAALsAf8C7AH/AQcB7AH/BAABuwG0AbsBGQH/AfQBkgH0 - Af8B7wEZAbUBtAG7GAAC7AH/CgABBwTsAQcC7AH/BAAB8AG0AbsBCQH/AfQB8gP/ArsBtAHwGAAC7AH/ - CwABBwXsAf8EAAH0AVgBUgG7AgkB8wL0AfMBCQG7ARwBUgF5Af8XAALsAf8MAAEHA+wB/wUAARoBmgF6 - AVIDCQK1AgkBuwFYARoBegH/FwAC7AH/DQABBwHsAf8GAAEaAXoBwwF6AVgB3AQJAbsBUgKaAXoB/xcA - A/8OAAH/BwAB/wEaAXoBwwF6AZkBCQLcAQkBmQF6AZoBegH2MgAB/wEaAVkBegH/BAAB/wFZAXoB9hIA - 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 - Cw== - + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 5 - - System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 102, 17 + + + Text Document (*.txt)|*.txt - - 331 + + 238, 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 - - 210, 74 + + 329 - - Top, Right + + Double click on a wait to edit the time - - 12 + + MiddleCenter - - Top, Right + + False - - $this + + lbDelayTip - - True + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 11 + + $this - - 221, 13 + + 6 - - 238, 17 - - - 102, 17 - 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 6d4fb64b95..b6c426c687 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 acf6277032..088a6e5d20 100644 --- a/DS4Windows/Properties/AssemblyInfo.cs +++ b/DS4Windows/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // 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 e477ea477e..160a7f76d3 100644 --- a/DS4Windows/Properties/Resources1.Designer.cs +++ b/DS4Windows/Properties/Resources.Designer.cs @@ -851,6 +851,16 @@ internal static System.Drawing.Bitmap LEFT { } } + /// + /// 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 @@ internal static System.Drawing.Bitmap RIGHT { } } + /// + /// 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 d33c4c022b..96398eb7b2 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