public void ChangeKeyModifiers_WontChangeChar() { var ki = KeyInputUtil.VimKeyToKeyInput(VimKey.OpenBracket); var ki2 = KeyInputUtil.ChangeKeyModifiers(ki, KeyModifiers.Shift); Assert.AreEqual(ki.Char, ki2.Char); }
/// <summary> /// Run the KeyInput directly in the Wpf control /// </summary> private void RunInWpf(KeyInput keyInput) { Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add(typeof(UIPermissionAttribute)); var presentationSource = _factory.Create <PresentationSource>(); // Normalize upper case letters here to lower and add the shift key modifier if // necessary if (Char.IsUpper(keyInput.Char)) { var lowerKeyInput = KeyInputUtil.CharToKeyInput(Char.ToLower(keyInput.Char)); keyInput = KeyInputUtil.ChangeKeyModifiers(lowerKeyInput, keyInput.KeyModifiers | KeyModifiers.Shift); } Key key; if (!KeyUtil.TryConvertToKeyOnly(keyInput.Key, out key)) { throw new Exception("Couldn't get the WPF key for the given KeyInput"); } // Update the KeyModifiers while this is being processed by our key processor try { _defaultKeyboardDevice.DownKeyModifiers = keyInput.KeyModifiers; // First raise the KeyDown event var keyDownEventArgs = new KeyEventArgs( _defaultKeyboardDevice, presentationSource.Object, 0, key); keyDownEventArgs.RoutedEvent = UIElement.KeyDownEvent; _defaultInputController.HandleKeyDown(this, keyDownEventArgs); // If the event is handled then return if (keyDownEventArgs.Handled) { return; } // Now raise the TextInput event var textInputEventArgs = new TextCompositionEventArgs( _defaultKeyboardDevice, new TextComposition(InputManager.Current, _wpfTextView.VisualElement, keyInput.Char.ToString())); textInputEventArgs.RoutedEvent = UIElement.TextInputEvent; _defaultInputController.HandleTextInput(this, textInputEventArgs); var keyUpEventArgs = new KeyEventArgs( _defaultKeyboardDevice, presentationSource.Object, 0, key); keyUpEventArgs.RoutedEvent = UIElement.KeyUpEvent; _defaultInputController.HandleKeyUp(this, keyUpEventArgs); } finally { _defaultKeyboardDevice.DownKeyModifiers = KeyModifiers.None; } }
/// <summary> /// Try and get the KeyInput which corresponds to the given Key and modifiers /// TODO: really think about this method /// </summary> internal bool TryGetKeyInput(Key key, ModifierKeys modifierKeys, out KeyInput keyInput) { // First just check and see if there is a direct mapping var keyType = new KeyType(key, modifierKeys); if (_keyTypeToKeyInputMap.TryGetValue(keyType, out keyInput)) { return(true); } // Next consider only the shift key part of the requested modifier. We can // re-apply the original modifiers later keyType = new KeyType(key, modifierKeys & ModifierKeys.Shift); if (_keyTypeToKeyInputMap.TryGetValue(keyType, out keyInput)) { // Reapply the modifiers keyInput = KeyInputUtil.ChangeKeyModifiers(keyInput, ConvertToKeyModifiers(modifierKeys)); return(true); } // Last consider it without any modifiers and reapply keyType = new KeyType(key, ModifierKeys.None); if (_keyTypeToKeyInputMap.TryGetValue(keyType, out keyInput)) { // Reapply the modifiers keyInput = KeyInputUtil.ChangeKeyModifiers(keyInput, ConvertToKeyModifiers(modifierKeys)); return(true); } return(false); }
public void CompareSemantics() { var allKeyInputs = Enumerable.Concat(KeyInputUtil.VimKeyInputList, KeyInputUtil.AlternateKeyInputList); var all = allKeyInputs.SelectMany(x => new[] { x, KeyInputUtil.ChangeKeyModifiers(x, KeyModifiers.Control), KeyInputUtil.ChangeKeyModifiers(x, KeyModifiers.Shift), KeyInputUtil.ChangeKeyModifiers(x, KeyModifiers.Alt) }); foreach (var left in all) { foreach (var right in all) { var altLeft = left.GetAlternate(); var altRight = right.GetAlternate(); var result1 = left.CompareTo(right); var result2 = right.CompareTo(left); if (result1 == result2) { Assert.AreEqual(0, result1); Assert.AreEqual(left.GetHashCode(), right.GetHashCode()); if (altLeft.IsSome()) { Assert.AreEqual(0, altLeft.Value.CompareTo(right)); } if (altRight.IsSome()) { Assert.AreEqual(0, left.CompareTo(altRight.Value)); } } else if (result1 < 0) { Assert.IsTrue(result2 > 0); if (altLeft.IsSome()) { Assert.IsTrue(altLeft.Value.CompareTo(right) < 0); Assert.IsTrue(right.CompareTo(altLeft.Value) > 0); } } else if (result2 < 0) { Assert.IsTrue(result1 > 0); if (altLeft.IsSome()) { Assert.IsTrue(altLeft.Value.CompareTo(right) > 0); Assert.IsTrue(right.CompareTo(altLeft.Value) < 0); } } else { Assert.Fail(); } } } }
public void ChangeKeyModifiers_RemoveShiftWontLowerAlpha() { foreach (var letter in CharsLettersLower) { var lower = KeyInputUtil.CharToKeyInput(letter); var upper = KeyInputUtil.CharToKeyInput(Char.ToUpper(letter)); var upperNoShift = KeyInputUtil.ChangeKeyModifiers(upper, KeyModifiers.None); Assert.AreNotEqual(lower, upperNoShift); } }
public void ChangeKeyModifiers_ShiftWontChangeAlpha() { foreach (var letter in CharsLettersLower) { var lower = KeyInputUtil.CharToKeyInput(letter); var upper = KeyInputUtil.CharToKeyInput(Char.ToUpper(letter)); var lowerWithShift = KeyInputUtil.ChangeKeyModifiers(lower, KeyModifiers.Shift); Assert.AreNotEqual(lowerWithShift, upper); } }
public void StringToKeyInput8() { var ki = KeyInputUtil.VimKeyToKeyInput(VimKey.Space); ki = KeyInputUtil.ChangeKeyModifiers(ki, KeyModifiers.Shift); var all = new string[] { "<S-space>", "<S-SPACE>" }; foreach (var cur in all) { Assert.AreEqual(ki, KeyNotationUtil.StringToKeyInput(cur)); } }
public void Equality_AlternatesNotEquivalentWhenModifierPresent() { Action <KeyInput, KeyInput> func = (left, right) => { Assert.AreNotEqual(KeyInputUtil.ChangeKeyModifiers(left, KeyModifiers.Control), right); Assert.AreNotEqual(KeyInputUtil.ChangeKeyModifiers(left, KeyModifiers.Alt), right); Assert.AreNotEqual(KeyInputUtil.ChangeKeyModifiers(left, KeyModifiers.Shift), right); }; foreach (var cur in KeyInputUtil.AlternateKeyInputPairList) { func(cur.Item1, cur.Item2); } }
/// <summary> /// Try and get the KeyInput for the specified char and ModifierKeys. This will /// check and see if this is a well known char. Many well known chars are expected /// to come with certain modifiers (for instance on US keyboard # is expected to /// have Shift applied). These will be removed from the ModifierKeys passed in and /// whatever is left will be applied to the resulting KeyInput. /// </summary> internal KeyInput GetKeyInput(char c, ModifierKeys modifierKeys) { var keyInput = KeyInputUtil.CharToKeyInput(c); ModifierKeys expected; if (_charToModifierMap.TryGetValue(c, out expected)) { modifierKeys &= ~expected; } if (modifierKeys != ModifierKeys.None) { var keyModifiers = ConvertToKeyModifiers(modifierKeys); keyInput = KeyInputUtil.ChangeKeyModifiers(keyInput, keyModifiers); } return(keyInput); }