Skip to content

Commit ccb0161

Browse files
committed
Allow repeat dynamic keys + disallow certain functions
1 parent 3fe11ed commit ccb0161

File tree

2 files changed

+244
-19
lines changed

2 files changed

+244
-19
lines changed

src/JuliusSweetland.OptiKey.Core/Models/KeyValues.cs

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public static class KeyValues
1212
public static readonly KeyValue AddToDictionaryKey = new KeyValue(FunctionKeys.AddToDictionary);
1313
public static readonly KeyValue Alpha1KeyboardKey = new KeyValue(FunctionKeys.Alpha1Keyboard);
1414
public static readonly KeyValue Alpha2KeyboardKey = new KeyValue(FunctionKeys.Alpha2Keyboard);
15+
public static readonly KeyValue Alpha3KeyboardKey = new KeyValue(FunctionKeys.Alpha3Keyboard);
1516
public static readonly KeyValue ArrowDownKey = new KeyValue(FunctionKeys.ArrowDown);
1617
public static readonly KeyValue ArrowLeftKey = new KeyValue(FunctionKeys.ArrowLeft);
1718
public static readonly KeyValue ArrowRightKey = new KeyValue(FunctionKeys.ArrowRight);
@@ -92,6 +93,7 @@ public static class KeyValues
9293
public static readonly KeyValue CroatianCroatiaKey = new KeyValue(FunctionKeys.CroatianCroatia);
9394
public static readonly KeyValue ConversationAlpha1KeyboardKey = new KeyValue(FunctionKeys.ConversationAlpha1Keyboard);
9495
public static readonly KeyValue ConversationAlpha2KeyboardKey = new KeyValue(FunctionKeys.ConversationAlpha2Keyboard);
96+
public static readonly KeyValue ConversationAlpha3KeyboardKey = new KeyValue(FunctionKeys.ConversationAlpha3Keyboard);
9597
public static readonly KeyValue ConversationCommuniKateKeyboardKey = new KeyValue(FunctionKeys.ConversationCommuniKateKeyboard);
9698
public static readonly KeyValue ConversationConfirmKeyboardKey = new KeyValue(FunctionKeys.ConversationConfirmKeyboard);
9799
public static readonly KeyValue ConversationConfirmYesKey = new KeyValue(FunctionKeys.ConversationConfirmYes);
@@ -227,6 +229,7 @@ public static class KeyValues
227229
public static readonly KeyValue NumericAndSymbols2KeyboardKey = new KeyValue(FunctionKeys.NumericAndSymbols2Keyboard);
228230
public static readonly KeyValue NumericAndSymbols3KeyboardKey = new KeyValue(FunctionKeys.NumericAndSymbols3Keyboard);
229231
public static readonly KeyValue PersianIranKey = new KeyValue(FunctionKeys.PersianIran);
232+
public static readonly KeyValue PluginKey = new KeyValue(FunctionKeys.Plugin);
230233
public static readonly KeyValue PgDnKey = new KeyValue(FunctionKeys.PgDn);
231234
public static readonly KeyValue PgUpKey = new KeyValue(FunctionKeys.PgUp);
232235
public static readonly KeyValue PhysicalKeysKeyboardKey = new KeyValue(FunctionKeys.PhysicalKeysKeyboard);
@@ -456,6 +459,7 @@ public static List<KeyValue> MutuallyExclusiveMouseActionKeys
456459
}
457460
}
458461

462+
459463
public static List<KeyValue> KeysWhichCanBePressedDown
460464
{
461465
get
@@ -670,5 +674,205 @@ public static List<KeyValue> MultiKeySelectionKeys
670674
: new List<KeyValue>();
671675
}
672676
}
677+
678+
public static List<FunctionKeys> FunctionKeysWhichShouldntBeRepeated
679+
{
680+
get
681+
{
682+
var keys = new List<FunctionKeys>
683+
{
684+
FunctionKeys.AddToDictionary,
685+
FunctionKeys.Alpha1Keyboard,
686+
FunctionKeys.Alpha2Keyboard,
687+
FunctionKeys.Alpha3Keyboard,
688+
FunctionKeys.BackFromKeyboard,
689+
FunctionKeys.Calibrate,
690+
FunctionKeys.CatalanSpain,
691+
FunctionKeys.ClearScratchpad,
692+
FunctionKeys.CollapseDock,
693+
FunctionKeys.CommuniKate,
694+
FunctionKeys.CommuniKateKeyboard,
695+
FunctionKeys.ConversationAlpha1Keyboard,
696+
FunctionKeys.ConversationAlpha2Keyboard,
697+
FunctionKeys.ConversationAlpha3Keyboard,
698+
FunctionKeys.ConversationCommuniKateKeyboard,
699+
FunctionKeys.ConversationConfirmKeyboard,
700+
FunctionKeys.ConversationConfirmYes,
701+
FunctionKeys.ConversationConfirmNo,
702+
FunctionKeys.ConversationNumericAndSymbolsKeyboard,
703+
FunctionKeys.CopyAllFromScratchpad,
704+
FunctionKeys.CroatianCroatia,
705+
FunctionKeys.Currencies1Keyboard,
706+
FunctionKeys.Currencies2Keyboard,
707+
FunctionKeys.CzechCzechRepublic,
708+
FunctionKeys.DanishDenmark,
709+
FunctionKeys.DecreaseOpacity,
710+
FunctionKeys.Diacritic1Keyboard,
711+
FunctionKeys.Diacritic2Keyboard,
712+
FunctionKeys.Diacritic3Keyboard,
713+
FunctionKeys.DutchBelgium,
714+
FunctionKeys.DutchNetherlands,
715+
FunctionKeys.DynamicKeyboard,
716+
FunctionKeys.DynamicKeyboardNext,
717+
FunctionKeys.DynamicKeyboardPrev,
718+
FunctionKeys.EnglishCanada,
719+
FunctionKeys.EnglishUK,
720+
FunctionKeys.EnglishUS,
721+
FunctionKeys.ExpandToBottom,
722+
FunctionKeys.ExpandToBottomAndLeft,
723+
FunctionKeys.ExpandToBottomAndRight,
724+
FunctionKeys.ExpandToLeft,
725+
FunctionKeys.ExpandToRight,
726+
FunctionKeys.ExpandToTop,
727+
FunctionKeys.ExpandToTopAndLeft,
728+
FunctionKeys.ExpandToTopAndRight,
729+
FunctionKeys.ExpandDock,
730+
FunctionKeys.FinnishFinland,
731+
FunctionKeys.FrenchFrance,
732+
FunctionKeys.FrenchCanada,
733+
FunctionKeys.GeorgianGeorgia,
734+
FunctionKeys.GermanGermany,
735+
FunctionKeys.GreekGreece,
736+
FunctionKeys.HebrewIsrael,
737+
FunctionKeys.HindiIndia,
738+
FunctionKeys.HungarianHungary,
739+
FunctionKeys.IncreaseOpacity,
740+
FunctionKeys.ItalianItaly,
741+
FunctionKeys.JapaneseJapan,
742+
FunctionKeys.KoreanKorea,
743+
FunctionKeys.LanguageKeyboard,
744+
FunctionKeys.LeftAlt,
745+
FunctionKeys.LeftCtrl,
746+
FunctionKeys.LeftShift,
747+
FunctionKeys.LeftWin,
748+
FunctionKeys.LookToScrollBounds,
749+
FunctionKeys.LookToScrollIncrement,
750+
FunctionKeys.LookToScrollMode,
751+
FunctionKeys.LookToScrollSpeed,
752+
FunctionKeys.Menu,
753+
FunctionKeys.MenuKeyboard,
754+
FunctionKeys.Minimise,
755+
FunctionKeys.More,
756+
FunctionKeys.MouseDrag,
757+
FunctionKeys.MouseKeyboard,
758+
FunctionKeys.MouseLeftClick,
759+
FunctionKeys.MouseLeftDoubleClick,
760+
FunctionKeys.MouseLeftDownUp,
761+
FunctionKeys.MouseMiddleClick,
762+
FunctionKeys.MouseMiddleDownUp,
763+
FunctionKeys.MouseMoveAmountInPixels,
764+
FunctionKeys.MouseMoveAndLeftClick,
765+
FunctionKeys.MouseMoveAndLeftDoubleClick,
766+
FunctionKeys.MouseMoveAndMiddleClick,
767+
FunctionKeys.MouseMoveAndRightClick,
768+
FunctionKeys.MouseMoveTo,
769+
FunctionKeys.MouseMoveToBottom,
770+
FunctionKeys.MouseMoveToLeft,
771+
FunctionKeys.MouseMoveToRight,
772+
FunctionKeys.MouseMoveToTop,
773+
FunctionKeys.MouseRightClick,
774+
FunctionKeys.MouseRightDownUp,
775+
FunctionKeys.MouseScrollAmountInClicks,
776+
FunctionKeys.MouseMoveAndScrollToBottom,
777+
FunctionKeys.MouseMoveAndScrollToLeft,
778+
FunctionKeys.MouseMoveAndScrollToRight,
779+
FunctionKeys.MouseMoveAndScrollToTop,
780+
FunctionKeys.MouseMagnifier,
781+
FunctionKeys.MoveAndResizeAdjustmentAmount,
782+
FunctionKeys.MoveToBottom,
783+
FunctionKeys.MoveToBottomAndLeft,
784+
FunctionKeys.MoveToBottomAndLeftBoundaries,
785+
FunctionKeys.MoveToBottomAndRight,
786+
FunctionKeys.MoveToBottomAndRightBoundaries,
787+
FunctionKeys.MoveToBottomBoundary,
788+
FunctionKeys.MoveToLeft,
789+
FunctionKeys.MoveToLeftBoundary,
790+
FunctionKeys.MoveToRight,
791+
FunctionKeys.MoveToRightBoundary,
792+
FunctionKeys.MoveToTop,
793+
FunctionKeys.MoveToTopAndLeft,
794+
FunctionKeys.MoveToTopAndLeftBoundaries,
795+
FunctionKeys.MoveToTopAndRight,
796+
FunctionKeys.MoveToTopAndRightBoundaries,
797+
FunctionKeys.MoveToTopBoundary,
798+
FunctionKeys.MultiKeySelectionIsOn,
799+
FunctionKeys.NextSuggestions,
800+
FunctionKeys.NoQuestionResult,
801+
FunctionKeys.NumberLock,
802+
FunctionKeys.NumericAndSymbols1Keyboard,
803+
FunctionKeys.NumericAndSymbols2Keyboard,
804+
FunctionKeys.NumericAndSymbols3Keyboard,
805+
FunctionKeys.PhysicalKeysKeyboard,
806+
FunctionKeys.Plugin,
807+
FunctionKeys.PersianIran,
808+
FunctionKeys.PolishPoland,
809+
FunctionKeys.PortuguesePortugal,
810+
FunctionKeys.PreviousSuggestions,
811+
FunctionKeys.Quit,
812+
FunctionKeys.Restart,
813+
FunctionKeys.RussianRussia,
814+
FunctionKeys.ScrollLock,
815+
FunctionKeys.SelectVoice,
816+
FunctionKeys.SerbianSerbia,
817+
FunctionKeys.ShrinkFromBottom,
818+
FunctionKeys.ShrinkFromBottomAndLeft,
819+
FunctionKeys.ShrinkFromBottomAndRight,
820+
FunctionKeys.ShrinkFromLeft,
821+
FunctionKeys.ShrinkFromRight,
822+
FunctionKeys.ShrinkFromTop,
823+
FunctionKeys.ShrinkFromTopAndLeft,
824+
FunctionKeys.ShrinkFromTopAndRight,
825+
FunctionKeys.SimplifiedAlphaClear,
826+
FunctionKeys.SimplifiedKeyboardAlphaGroup1All,
827+
FunctionKeys.SimplifiedKeyboardAlphaGroup2All,
828+
FunctionKeys.SimplifiedKeyboardAlphaGroup3All,
829+
FunctionKeys.SimplifiedKeyboardAlphaGroup4All,
830+
FunctionKeys.SimplifiedKeyboardAlphaGroup5All,
831+
FunctionKeys.SimplifiedKeyboardAlphaGroup6All,
832+
FunctionKeys.SimplifiedKeyboardAlphaGroup7All,
833+
FunctionKeys.SimplifiedKeyboardAlphaGroup8All,
834+
FunctionKeys.SimplifiedKeyboardAlphaGroup9All,
835+
FunctionKeys.SimplifiedKeyboardAlphaGroup10All,
836+
FunctionKeys.SimplifiedKeyboardAlphaGroup1SubGroup1,
837+
FunctionKeys.SimplifiedKeyboardAlphaGroup1SubGroup2,
838+
FunctionKeys.SimplifiedKeyboardAlphaGroup1SubGroup3,
839+
FunctionKeys.SimplifiedKeyboardAlphaGroup2SubGroup1,
840+
FunctionKeys.SimplifiedKeyboardAlphaGroup2SubGroup2,
841+
FunctionKeys.SimplifiedKeyboardAlphaGroup2SubGroup3,
842+
FunctionKeys.SimplifiedKeyboardAlphaGroup3SubGroup1,
843+
FunctionKeys.SimplifiedKeyboardAlphaGroup3SubGroup2,
844+
FunctionKeys.SimplifiedKeyboardAlphaGroup3SubGroup3,
845+
FunctionKeys.SimplifiedKeyboardAlphaGroup4SubGroup1,
846+
FunctionKeys.SimplifiedKeyboardAlphaGroup4SubGroup2,
847+
FunctionKeys.SimplifiedKeyboardAlphaGroup4SubGroup3,
848+
FunctionKeys.SimplifiedKeyboardNumericAll,
849+
FunctionKeys.SimplifiedKeyboardNumericGroup1,
850+
FunctionKeys.SimplifiedKeyboardNumericGroup2,
851+
FunctionKeys.SimplifiedKeyboardNumericGroup3,
852+
FunctionKeys.SimplifiedKeyboardGermanUmlaut,
853+
FunctionKeys.SimplifiedKeyboardHome,
854+
FunctionKeys.SizeAndPositionKeyboard,
855+
FunctionKeys.Sleep,
856+
FunctionKeys.SlovakSlovakia,
857+
FunctionKeys.SlovenianSlovenia,
858+
FunctionKeys.SpanishSpain,
859+
FunctionKeys.Speak,
860+
FunctionKeys.Suggestion1,
861+
FunctionKeys.Suggestion2,
862+
FunctionKeys.Suggestion3,
863+
FunctionKeys.Suggestion4,
864+
FunctionKeys.Suggestion5,
865+
FunctionKeys.Suggestion6,
866+
FunctionKeys.ToggleCaseOfPreviousCharacter,
867+
FunctionKeys.Translation,
868+
FunctionKeys.TurkishTurkey,
869+
FunctionKeys.UkrainianUkraine,
870+
FunctionKeys.UrduPakistan,
871+
FunctionKeys.WebBrowsingKeyboard,
872+
FunctionKeys.YesQuestionResult
873+
};
874+
return keys;
875+
}
876+
}
673877
}
674878
}

src/JuliusSweetland.OptiKey.Core/UI/ViewModels/MainViewModel.ServiceEventHandlers.cs

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,39 @@ private void SetupInputServiceEventHandlers()
205205

206206
if ((singleKeyValue != null || (multiKeySelection != null && multiKeySelection.Any())))
207207
{
208+
// Inject previous keyvalue if asked to repeat
209+
if (singleKeyValue.FunctionKey != null &&
210+
singleKeyValue.FunctionKey == FunctionKeys.RepeatLastKeyAction &&
211+
SelectionMode == SelectionModes.Keys)
212+
{
213+
bool preventRepeat = false;
214+
215+
// Certain keys built in keys are removed from repeats.
216+
if (lastKeyValueExecuted.FunctionKey.HasValue &&
217+
KeyValues.FunctionKeysWhichShouldntBeRepeated.Contains(lastKeyValueExecuted.FunctionKey.Value))
218+
{
219+
preventRepeat = true;
220+
}
221+
222+
// Prevent dynamic key that contains any of these forbidden functions, or a "Change Keyboard" command
223+
if (lastKeyValueExecuted != null && lastKeyValueExecuted.Commands != null && lastKeyValueExecuted.Commands.Any())
224+
{
225+
foreach (var command in lastKeyValueExecuted.Commands)
226+
{
227+
if (command.Name == KeyCommands.ChangeKeyboard)
228+
preventRepeat = true;
229+
else if (command.Name == KeyCommands.Function)
230+
{
231+
if (Enum.TryParse(command.Value, out FunctionKeys fk) && KeyValues.FunctionKeysWhichShouldntBeRepeated.Contains(fk))
232+
preventRepeat = true;
233+
}
234+
}
235+
}
236+
237+
if (!preventRepeat)
238+
singleKeyValue = lastKeyValueExecuted;
239+
}
240+
208241
//DynamicKeys can have a list of Commands and perform multiple actions
209242
if (singleKeyValue != null && singleKeyValue.Commands != null && singleKeyValue.Commands.Any())
210243
{
@@ -224,6 +257,13 @@ private void SetupInputServiceEventHandlers()
224257
{
225258
KeySelectionResult(singleKeyValue, multiKeySelection);
226259
}
260+
261+
// Remember keyvalue to allow repeats (unless keyvalue is "repeat last key action")
262+
if (singleKeyValue.FunctionKey == null ||
263+
singleKeyValue.FunctionKey != FunctionKeys.RepeatLastKeyAction)
264+
{
265+
lastKeyValueExecuted = singleKeyValue;
266+
}
227267
}
228268
if (SelectionMode == SelectionModes.SinglePoint)
229269
{
@@ -353,18 +393,6 @@ private void ProcessBasicKeyValue(KeyValue singleKeyValue)
353393
Log.InfoFormat("KeySelectionResult received with string value '{0}' and function key values '{1}'",
354394
singleKeyValue.String.ToPrintableString(), singleKeyValue.FunctionKey);
355395

356-
// Inject previous keyvalue if asked to repeat
357-
if (singleKeyValue.FunctionKey != null &&
358-
singleKeyValue.FunctionKey == FunctionKeys.RepeatLastKeyAction &&
359-
SelectionMode == SelectionModes.Keys)
360-
{
361-
// We could consider allowing this to repeat the last mouse action, or
362-
// to repeat the original mouse-related key, but we're not sure how useful
363-
// it would be
364-
if (!lastMouseActionStateManager.LastMouseActionExists)
365-
singleKeyValue = lastKeyValueExecuted;
366-
}
367-
368396
keyStateService.ProgressKeyDownState(singleKeyValue);
369397

370398
if (!string.IsNullOrEmpty(singleKeyValue.String)
@@ -386,13 +414,6 @@ private void ProcessBasicKeyValue(KeyValue singleKeyValue)
386414
HandleFunctionKeySelectionResult(singleKeyValue);
387415
}
388416
}
389-
390-
// Remember keyvalue to allow repeats (unless keyvalue is "repeat last key action")
391-
if (singleKeyValue.FunctionKey == null ||
392-
singleKeyValue.FunctionKey != FunctionKeys.RepeatLastKeyAction)
393-
{
394-
lastKeyValueExecuted = singleKeyValue;
395-
}
396417
}
397418

398419
private void KeySelectionResult(KeyValue singleKeyValue, List<string> multiKeySelection)

0 commit comments

Comments
 (0)