public Tuple <bool, bool> IsAllPressed(BindingsFile.Assignment a) // return if all okay pressed, second if all are pressable { bool allpressable = true; foreach (BindingsFile.DeviceKeyPair ma in a.keys) { InputDeviceInterface idi = GetInputDeviceFromBindingDevice(ma.Device); if (idi == null) // no device, false { return(new Tuple <bool, bool>(false, false)); } bool?v = idi.IsPressed(ma.Key); // is it pressed, or not pressable? if (v.HasValue) // is pressable { if (v.Value == false) // if it { return(new Tuple <bool, bool>(false, false)); } } else { allpressable = false; // not pressable } } return(new Tuple <bool, bool>(true, allpressable)); }
private void Devices_OnNewEvent(List <InputDeviceEvent> list) { IntPtr handle = GetForegroundWindow(); Process[] processes = Process.GetProcessesByName("elitedangerous64");//Process.GetProcessesByName("EliteDangerous64"); bool ed = false; foreach (Process p in processes) { if (p.MainWindowHandle == handle) //ED seems to have multiple processes running.. find one { ed = true; break; } } if (!ed) { //System.Diagnostics.Debug.WriteLine("Rejected keypress " + processes.Length); return; } foreach (InputDeviceEvent je in list) { string match = je.EventName(); // same as bindings name.. System.Diagnostics.Debug.WriteLine(je.ToString(10) + " " + match); ac.ActionRun("onEliteInputRaw", "EliteUIEvent", additionalvars: new Conditions.ConditionVariables(new string[] { "Device", je.Device.ID().Name, "EventName", match, "Pressed", je.Pressed?"1":"0", "Value", je.Value.ToStringInvariant() })); BindingsFile.Device dv = GetBindingDeviceFromInputDeviceIdentifier(je.Device.ID()); if (dv != null) { List <BindingsFile.Assignment> assignlist = dv.Find(match, false); // get everything associated with this key.. if (assignlist != null) { List <BindingsFile.Assignment> inonstate = new List <BindingsFile.Assignment>(); List <bool> ispressable = new List <bool>(); foreach (BindingsFile.Assignment a in assignlist) { Tuple <bool, bool> pressstate = IsAllPressed(a); if (pressstate.Item1) // if pressed { //System.Diagnostics.Debug.WriteLine(" Rule Matches " + a.assignedfunc); inonstate.Add(a); // but it might not be the best rule.. ispressable.Add(pressstate.Item2); } else { int isonindex = assignmentsinonstate.IndexOf(a); if (isonindex != -1) { System.Diagnostics.Debug.WriteLine("Action " + a.assignedfunc + "-"); assignmentsinonstate.Remove(a); ac.ActionRun("onEliteInputOff", "EliteUIEvent", additionalvars: new Conditions.ConditionVariables(new string[] { "Binding", a.assignedfunc })); } } } List <string> bindingstoexecute = new List <string>(); for (int i = 0; i < inonstate.Count; i++) { BindingsFile.Assignment a = inonstate[i]; if (a.KeyAssignementLongerThan(inonstate)) // we have the best key list { if (ispressable[i]) { assignmentsinonstate.Add(a); } bindingstoexecute.Add(a.assignedfunc); System.Diagnostics.Debug.WriteLine("Action " + a.assignedfunc); } else { //System.Diagnostics.Debug.WriteLine(" Reject Rule due to others are longer " + inonstate[i].assignedfunc); } } //System.Diagnostics.Debug.WriteLine("On state " + assignmentsinonstate.Count); foreach (string s in bindingstoexecute) { ac.ActionRun("onEliteInput", "EliteUIEvent", additionalvars: new Conditions.ConditionVariables(new string[] { "Device", je.Device.ID().Name, "Binding", s, "BindingList", String.Join(",", bindingstoexecute), "EventName", match, "Pressed", je.Pressed?"1":"0", "Value", je.Value.ToStringInvariant() })); } } } } }