public double GetMouseToKeyboardTransitionCost(KeyDownEvent keyDownEvent) { PhysicalKey key = FindKey(keyDownEvent.Data); if (key != null) { KeyboardSection parentSection = key.ParentSection; if (parentSection.Handedness == Handedness.Right) { lastMouseHandedAction = ActionType.Keyboard; if (MousePad == null) { throw new Exception("MousePad not specified."); } if (mousePadCenter.X == double.MinValue) { CalculateMousePadCenterPoint(); } double travelDistance = MillerComplexity.GetDistance(parentSection.Center, mousePadCenter); double targetApproachWidth = MillerComplexity.GetTargetApproachWidth(key.Size.Width, key.Size.Height); return(MillerComplexity.GetTargetPressScore(travelDistance, targetApproachWidth)); } } return(0); }
const double DBL_FingerPadRadius = 0.7d; // Average radius of human finger pad, in cm public PhysicalKey(string name, Sides exposedEdges, Size size, KeyboardSection parentSection) { ParentSection = parentSection; Size = size; ExposedEdges = exposedEdges; Name = name; }
KeyboardSection GetEscape() { KeyboardSection escapeSection = new KeyboardSection(new Point(3.1, 4.3), new Size(2.4, 1.9), Handedness.Left); escapeSection.Add(Keys.Escape, Sides.Bottom | Sides.Left | Sides.Right | Sides.Top, KeySize.Escape); return(escapeSection); }
/// <summary> /// Initializes a new instance of the MicrosoftNaturalKeyboard class. /// </summary> public MicrosoftNaturalKeyboard() { KeyboardSection.StandardKeySize = KeySize.StandardKey; homeKeysLeft = GetHomeKeysLeft(); homeKeysRight = GetHomeKeysRight(); punctuationKeysRight = GetPunctuationKeys(); extendedKeys = GetExtendedNavKeys(); functionKeysRight = GetFunctionKeysRight(); numPadKeys = GetNumPadKeys(); numPadTopRowOperators = GetNumPadTopRowOperators(); arrowKeys = GetArrowKeys(); keyboardSections.Add(arrowKeys); keyboardSections.Add(GetFunctionKeysLeft()); keyboardSections.Add(functionKeysRight); keyboardSections.Add(homeKeysLeft); keyboardSections.Add(homeKeysRight); keyboardSections.Add(GetNumKeysLeft()); keyboardSections.Add(GetNumKeysRight()); keyboardSections.Add(extendedKeys); keyboardSections.Add(numPadKeys); keyboardSections.Add(numPadTopRowOperators); keyboardSections.Add(GetSpaceBar()); keyboardSections.Add(GetEscape()); keyboardSections.Add(GetLeftKeyColumn()); keyboardSections.Add(GetLeftModifiers()); keyboardSections.Add(GetRightModifiers()); keyboardSections.Add(GetWebSearchMailKeys()); keyboardSections.Add(punctuationKeysRight); }
KeyboardSection GetSpaceBar() { KeyboardSection spaceBarSection = new KeyboardSection(new Point(16.7, 17.2), new Size(14.7, 4.8), Handedness.Both); spaceBarSection.Add(Keys.Space, Sides.Bottom, KeySize.Space); return(spaceBarSection); }
public double GetReachingForMouseTransitionCost() { if (MousePad == null) { throw new Exception("MousePad not specified."); } if (mousePadCenter.X == double.MinValue) { CalculateMousePadCenterPoint(); } if (MousePad.Mouse == null) { throw new Exception("Mouse not specified."); } KeyboardSection nearestSection = GetLastTouchedSectionClosestToMouse(); if (nearestSection == null) { throw new Exception("A keyboard section near the mouse was not found."); } double travelDistance = MillerComplexity.GetDistance(nearestSection.Center, mousePadCenter); double targetApproachWidth = MousePad.Mouse.Width; // Mouse is nearly always approached from the left or right; lastMouseHandedAction = ActionType.Mouse; return(MillerComplexity.GetTargetPressScore(travelDistance, targetApproachWidth)); }
KeyboardSection GetNumPadTopRowOperators() { KeyboardSection punctuationKeys = new KeyboardSection(new Point(37.4, 5.9), new Size(5.8, 1.9), Handedness.Right); punctuationKeys.Add(Keys.PrintScreen, Sides.Left | Sides.Top | Sides.Bottom); punctuationKeys.Add(Keys.Scroll, Sides.Top | Sides.Bottom); punctuationKeys.Add(Keys.Pause, Sides.Right | Sides.Top | Sides.Bottom); return(punctuationKeys); }
KeyboardSection GetWebSearchMailKeys() { KeyboardSection webSearchMailKeys = new KeyboardSection(new Point(6.1, 2.2), new Size(6.5, 1.0), Handedness.Left); webSearchMailKeys.Add(Keys.BrowserHome, Sides.Left | Sides.Top | Sides.Bottom); webSearchMailKeys.Add(Keys.BrowserSearch, Sides.Top | Sides.Bottom); webSearchMailKeys.Add(Keys.LaunchMail, Sides.Right | Sides.Top | Sides.Bottom); return(webSearchMailKeys); }
KeyboardSection GetRightModifiers() { KeyboardSection rightModifiers = new KeyboardSection(new Point(28.9, 15.5), new Size(10.0, 5.3), Handedness.Right); rightModifiers.Add(Keys.RShiftKey, Sides.Right, KeySize.RightShift); rightModifiers.Add(Keys.RControlKey, Sides.Right | Sides.Bottom, KeySize.Ctrl); rightModifiers.Add(Keys.Apps, Sides.Bottom, KeySize.ContextMenu); rightModifiers.Add(Keys.RMenu, Sides.Bottom, KeySize.RightAlt); return(rightModifiers); }
KeyboardSection GetNumKeysRight() { KeyboardSection numKeysRight = new KeyboardSection(new Point(37.2, 9.2), new Size(5.8, 5.5), Handedness.Right); numKeysRight.Add(Keys.D7, Sides.Top | Sides.Left, KeySize.D7); numKeysRight.Add(Keys.D8, Sides.Top); numKeysRight.Add(Keys.D9, Sides.Top); numKeysRight.Add(Keys.D0, Sides.Top); return(numKeysRight); }
KeyboardSection GetArrowKeys() { KeyboardSection arrowKeys = new KeyboardSection(new Point(37.1, 14.7), new Size(6.2, 5.2), Handedness.Right); arrowKeys.Add(Keys.Left, Sides.Left | Sides.Top | Sides.Bottom); arrowKeys.Add(Keys.Up, Sides.Left | Sides.Top | Sides.Right); arrowKeys.Add(Keys.Right, Sides.Bottom | Sides.Top | Sides.Right); arrowKeys.Add(Keys.Down, Sides.Bottom); return(arrowKeys); }
KeyboardSection GetLeftModifiers() { KeyboardSection leftModifiers = new KeyboardSection(new Point(5.3, 14.8), new Size(8.6, 6.8), Handedness.Left); leftModifiers.Add(Keys.LShiftKey, Sides.Left, KeySize.LeftShift); leftModifiers.Add(Keys.LControlKey, Sides.Left | Sides.Bottom, KeySize.Ctrl); leftModifiers.Add(Keys.LWin, Sides.Bottom, KeySize.Windows); leftModifiers.Add(Keys.LMenu, Sides.Bottom, KeySize.LeftAlt); return(leftModifiers); }
KeyboardSection GetLeftKeyColumn() { KeyboardSection leftKeyColumn = new KeyboardSection(new Point(2.6, 8.2), new Size(3.9, 5.9), Handedness.Left); leftKeyColumn.Add(Keys.Oemtilde, Sides.Left | Sides.Top, KeySize.Tilde); leftKeyColumn.Add(Keys.Tab, Sides.Left, KeySize.Tab); leftKeyColumn.Add(Keys.Capital, Sides.Left, KeySize.CapsLock); leftKeyColumn.Add(Keys.CapsLock, Sides.Left, KeySize.CapsLock); return(leftKeyColumn); }
KeyboardSection GetFunctionKeysLeft() { KeyboardSection functionKeysLeft = new KeyboardSection(new Point(10.25, 5.5), new Size(9.4, 3.7), Handedness.Left); functionKeysLeft.Add(Keys.F1, Sides.Left | Sides.Top | Sides.Bottom); functionKeysLeft.Add(Keys.F2, Sides.Top | Sides.Bottom); functionKeysLeft.Add(Keys.F3, Sides.Top | Sides.Bottom); functionKeysLeft.Add(Keys.F4, Sides.Top | Sides.Bottom); functionKeysLeft.Add(Keys.F5, Sides.Top | Sides.Bottom | Sides.Right); return(functionKeysLeft); }
KeyboardSection GetNumKeysLeft() { KeyboardSection numKeysLeft = new KeyboardSection(new Point(23.3, 12.7), new Size(9.7, 5.5), Handedness.Left); numKeysLeft.Add(Keys.D1, Sides.Top); numKeysLeft.Add(Keys.D2, Sides.Top); numKeysLeft.Add(Keys.D3, Sides.Top); numKeysLeft.Add(Keys.D4, Sides.Top); numKeysLeft.Add(Keys.D5, Sides.Top); numKeysLeft.Add(Keys.D6, Sides.Top | Sides.Right); return(numKeysLeft); }
KeyboardSection GetExtendedNavKeys() { KeyboardSection extendedNavKeys = new KeyboardSection(new Point(23.3, 12.7), new Size(9.7, 4.1), Handedness.Right); extendedNavKeys.Add(Keys.Insert, Sides.Top | Sides.Left); extendedNavKeys.Add(Keys.Home, Sides.Top); extendedNavKeys.Add(Keys.PageUp, Sides.Top | Sides.Right); extendedNavKeys.Add(Keys.Delete, Sides.Left | Sides.Bottom); extendedNavKeys.Add(Keys.End, Sides.Bottom); extendedNavKeys.Add(Keys.PageDown, Sides.Bottom | Sides.Right); return(extendedNavKeys); }
KeyboardSection GetFunctionKeysRight() { KeyboardSection functionKeysRight = new KeyboardSection(new Point(25.4, 6), new Size(13.4, 2.0), Handedness.Right); functionKeysRight.Add(Keys.F6, Sides.Left | Sides.Top | Sides.Bottom); functionKeysRight.Add(Keys.F7, Sides.Top | Sides.Bottom); functionKeysRight.Add(Keys.F8, Sides.Top | Sides.Bottom); functionKeysRight.Add(Keys.F9, Sides.Top | Sides.Bottom); functionKeysRight.Add(Keys.F10, Sides.Top | Sides.Bottom); functionKeysRight.Add(Keys.F11, Sides.Top | Sides.Bottom); functionKeysRight.Add(Keys.F12, Sides.Top | Sides.Bottom); return(functionKeysRight); }
KeyboardSection GetPunctuationKeys() { KeyboardSection punctuationKeys = new KeyboardSection(new Point(29.2, 11.0), new Size(9.2, 7.9), Handedness.Right); punctuationKeys.Add(Keys.OemPeriod); punctuationKeys.Add(Keys.OemQuestion); punctuationKeys.Add(Keys.OemMinus, Sides.Top); punctuationKeys.Add(Keys.Oemplus, Sides.Top); punctuationKeys.Add(Keys.Oemcomma); punctuationKeys.Add(Keys.OemOpenBrackets); punctuationKeys.Add(Keys.Oem7); punctuationKeys.Add(Keys.Oem6); punctuationKeys.Add(Keys.Oem5, Sides.Right); // backslash key punctuationKeys.Add(Keys.Oem1); punctuationKeys.Add(Keys.Back, Sides.Top | Sides.Right, KeySize.Backspace); punctuationKeys.Add(Keys.Enter, Sides.Right, KeySize.Enter); return(punctuationKeys); }
KeyboardSection GetHomeKeysRight() { KeyboardSection homeKeysRight = new KeyboardSection(new Point(23.3, 12.7), new Size(9.7, 5.5), Handedness.Right); homeKeysRight.Add(Keys.Y, Sides.Left); homeKeysRight.Add(Keys.U); homeKeysRight.Add(Keys.I); homeKeysRight.Add(Keys.O); homeKeysRight.Add(Keys.P); homeKeysRight.Add(Keys.H, Sides.Left, KeySize.H); homeKeysRight.Add(Keys.J); homeKeysRight.Add(Keys.K); homeKeysRight.Add(Keys.L); homeKeysRight.Add(Keys.N, Sides.Left, KeySize.N); homeKeysRight.Add(Keys.M); return(homeKeysRight); }
PhysicalKey FindKey(string keyName) { PhysicalKey key; if (keyName.Length == 1 && char.IsDigit(keyName, 0)) { keyName = "D" + keyName; } const string Key_Enter = "Enter"; if (keyName == Key_Enter && lastRightKeyPressed != null) { // The Enter key appears twice on the MS Natural keyboard. Find it in the right section based on the closest section of the last key hit. KeyboardSection parentSection = lastRightKeyPressed.ParentSection; if (parentSection == numPadKeys || parentSection == numPadTopRowOperators) { key = numPadKeys.FindKey(Key_Enter); } else { key = punctuationKeysRight.FindKey(Key_Enter); } if (key != null) { return(key); } } foreach (KeyboardSection keyboardSection in keyboardSections) { key = keyboardSection.FindKey(keyName); if (key != null) { return(key); } } return(null); }
KeyboardSection GetLastTouchedSectionClosestToMouse() { KeyboardSection nearestSection = null; switch (MousePadPosition) { case Handedness.Left: if (lastLeftKeyPressed != null) { nearestSection = lastLeftKeyPressed.ParentSection; } else { nearestSection = homeKeysLeft; } break; case Handedness.Right: if (lastRightKeyPressed != null) { nearestSection = lastRightKeyPressed.ParentSection; } else { nearestSection = homeKeysRight; } break; case Handedness.Both: if (lastAmbidextrousKeyPressed != null) { nearestSection = lastAmbidextrousKeyPressed.ParentSection; } else { nearestSection = homeKeysRight; } break; } return(nearestSection); }
KeyboardSection GetHomeKeysLeft() { KeyboardSection homeKeysLeft = new KeyboardSection(new Point(10, 11.85), new Size(9.6, 5.4), Handedness.Left); homeKeysLeft.Add(Keys.Q); homeKeysLeft.Add(Keys.W); homeKeysLeft.Add(Keys.E); homeKeysLeft.Add(Keys.R); homeKeysLeft.Add(Keys.T, Sides.Right, KeySize.T); homeKeysLeft.Add(Keys.A); homeKeysLeft.Add(Keys.S); homeKeysLeft.Add(Keys.D); homeKeysLeft.Add(Keys.F); homeKeysLeft.Add(Keys.G, Sides.Right, KeySize.G); homeKeysLeft.Add(Keys.Z); homeKeysLeft.Add(Keys.X); homeKeysLeft.Add(Keys.C); homeKeysLeft.Add(Keys.V); homeKeysLeft.Add(Keys.B, Sides.Right); return(homeKeysLeft); }
KeyboardSection GetNumPadKeys() { KeyboardSection numPadKeys = new KeyboardSection(new Point(44.4, 12.2), new Size(7.75, 9.6), Handedness.Right); numPadKeys.Add(Keys.NumLock, Sides.Left | Sides.Top); numPadKeys.Add(Keys.Divide, Sides.Top); numPadKeys.Add(Keys.Multiply, Sides.Top); numPadKeys.Add(Keys.Subtract, Sides.Top | Sides.Right); numPadKeys.Add(Keys.NumPad7, Sides.Left); numPadKeys.Add(Keys.NumPad8); numPadKeys.Add(Keys.NumPad9); numPadKeys.Add(Keys.Add, Sides.Right, KeySize.Add); numPadKeys.Add(Keys.NumPad4, Sides.Left); numPadKeys.Add(Keys.NumPad5); numPadKeys.Add(Keys.NumPad6); numPadKeys.Add(Keys.NumPad1, Sides.Left); numPadKeys.Add(Keys.NumPad2); numPadKeys.Add(Keys.NumPad3); numPadKeys.Add(Keys.Enter, Sides.Right | Sides.Bottom, KeySize.NumPadEnter); numPadKeys.Add(Keys.NumPad0, Sides.Left | Sides.Bottom, KeySize.NumPad0); numPadKeys.Add(Keys.Delete); return(numPadKeys); }
/// <summary> /// Determines the approximate travel distance between keys by measuring the travel distance /// between the parenting sections of the two keys. /// </summary> double GetApproximateDistanceBetweenKeys(PhysicalKey key1, PhysicalKey key2) { KeyboardSection section = key2.ParentSection; return(GetApproximateDistanceToKey(section, key1)); }
/// <summary> /// Returns the distance between the center of the specified section to the center of the section /// holding the specified key. /// </summary> double GetApproximateDistanceToKey(KeyboardSection section, PhysicalKey key1) { double distanceBetweenPoints = GetDistanceBetweenPoints(key1.ParentSection.Center, section.Center); return(Math.Max(distanceBetweenPoints, DBL_MinimumDistanceBetweenKeys)); }