From a192c60354250bedb39c7842f72bb45c0d9fe605 Mon Sep 17 00:00:00 2001 From: Patryk Mikos Date: Wed, 15 Jan 2014 21:48:07 +0100 Subject: [PATCH] Hide mouse cursor while typing --- .../Editing/TextArea.cs | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs index 83ae933fd6..c7a73b4c57 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs @@ -70,6 +70,7 @@ namespace ICSharpCode.AvalonEdit.Editing caret = new Caret(this); caret.PositionChanged += (sender, e) => RequestSelectionValidation(); caret.PositionChanged += CaretPositionChanged; + AttachTypingEvents(); ime = new ImeSupport(this); leftMargins.CollectionChanged += leftMargins_CollectionChanged; @@ -951,6 +952,7 @@ namespace ICSharpCode.AvalonEdit.Editing protected override void OnPreviewKeyDown(KeyEventArgs e) { base.OnPreviewKeyDown(e); + HideMouseCursor(); foreach (TextAreaStackedInputHandler h in stackedInputHandlers) { if (e.Handled) break; @@ -974,6 +976,16 @@ namespace ICSharpCode.AvalonEdit.Editing protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); + if (e.Key != Key.LeftShift && e.Key != Key.RightShift + && e.Key != Key.LeftCtrl && e.Key != Key.RightCtrl + && e.Key != Key.LeftAlt && e.Key != Key.RightAlt + && e.Key != Key.Up && e.Key != Key.Down && e.Key != Key.Left && e.Key != Key.Right + && e.Key != Key.PageDown && e.Key != Key.PageUp) + { + HideMouseCursor(); + } else { + ShowMouseCursor(); + } TextView.InvalidateCursorIfMouseWithinTextView(); } @@ -985,6 +997,49 @@ namespace ICSharpCode.AvalonEdit.Editing } #endregion + #region Hide Mouse Cursor While Typing + + bool isMouseCursorHidden; + DispatcherTimer typingTimer; + + void AttachTypingEvents() { + this.MouseEnter += delegate { ShowMouseCursor(); }; + this.MouseLeave += delegate { ShowMouseCursor(); }; + this.MouseMove += delegate { ShowMouseCursor(); }; + this.TouchEnter += delegate { ShowMouseCursor(); }; + this.TouchLeave += delegate { ShowMouseCursor(); }; + this.TouchMove += delegate { ShowMouseCursor(); }; + } + + void ShowMouseCursor() { + if (typingTimer != null) { + typingTimer.Stop(); + typingTimer = null; + } + + if (this.isMouseCursorHidden) { + System.Windows.Forms.Cursor.Show(); + this.isMouseCursorHidden = false; + } + } + + void HideMouseCursor() { + if (typingTimer != null) { + typingTimer.Stop(); + } + typingTimer = new DispatcherTimer(); + typingTimer.Interval = new TimeSpan(0, 0, 0, 1, 200); + typingTimer.Tick += delegate { ShowMouseCursor(); };; + typingTimer.Start(); + + if (!this.isMouseCursorHidden && this.IsMouseOver) { + this.isMouseCursorHidden = true; + System.Windows.Forms.Cursor.Hide(); + } + } + + #endregion + /// protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) {