From 081d052f0a8df6a7e803444640e8b32833cfb1e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fele?= Date: Wed, 21 Jan 2026 19:01:55 +0100 Subject: [PATCH] Consolidate key input to use KeyDown only, removing TextInput handler Handle printable characters directly in KeyDown using KeySymbol property instead of deferring to the TextInput event. This simplifies the input handling path while maintaining proper keyboard layout support. Co-Authored-By: Claude Opus 4.5 --- .../Views/Viewer/ViewerView.axaml | 1 - .../Views/Viewer/ViewerView.axaml.cs | 59 +++++++------------ 2 files changed, 21 insertions(+), 39 deletions(-) diff --git a/src/RemoteViewer.Client/Views/Viewer/ViewerView.axaml b/src/RemoteViewer.Client/Views/Viewer/ViewerView.axaml index 135f785..0377a31 100644 --- a/src/RemoteViewer.Client/Views/Viewer/ViewerView.axaml +++ b/src/RemoteViewer.Client/Views/Viewer/ViewerView.axaml @@ -214,7 +214,6 @@ PointerWheelChanged="DisplayPanel_PointerWheelChanged" KeyDown="DisplayPanel_KeyDown" KeyUp="DisplayPanel_KeyUp" - TextInput="DisplayPanel_TextInput" > 100) - return; + // If KeySymbol is a printable character, send as text input + if (string.IsNullOrEmpty(e.KeySymbol) is false && + e.KeySymbol.Length == 1 && + char.IsControl(e.KeySymbol[0]) is false) + { + await this._viewModel.Connection.RequiredViewerService.SendTextInputAsync(e.KeySymbol); + } + // Non-printable keys (arrows, function keys, etc.) go through KeyDown + else + { + var keyCode = (ushort)KeyInterop.VirtualKeyFromKey(e.Key); + var modifiers = this.GetKeyModifiers(e.KeyModifiers); + await this._viewModel.Connection.RequiredViewerService.SendKeyDownAsync(keyCode, modifiers); + } - await this._viewModel.Connection.RequiredViewerService.SendTextInputAsync(e.Text); } private async void DisplayPanel_KeyUp(object? sender, KeyEventArgs e) @@ -284,15 +275,16 @@ private async void DisplayPanel_KeyUp(object? sender, KeyEventArgs e) if (this._viewModel is not { IsInputEnabled: true }) return; - // Printable characters were handled by TextInput event - if (ShouldDeferToTextInput(e.KeySymbol)) + e.Handled = true; + + // Printable characters were sent as text on KeyDown, no KeyUp needed + if (string.IsNullOrEmpty(e.KeySymbol) is false && + e.KeySymbol.Length == 1 && + char.IsControl(e.KeySymbol[0]) is false) { - e.Handled = true; return; } - e.Handled = true; - var keyCode = (ushort)KeyInterop.VirtualKeyFromKey(e.Key); var modifiers = this.GetKeyModifiers(e.KeyModifiers); await this._viewModel.Connection.RequiredViewerService.SendKeyUpAsync(keyCode, modifiers); @@ -421,15 +413,6 @@ private void ResetToolbarHideTimer() #endregion #region Helper Methods - private static bool ShouldDeferToTextInput(string? keySymbol) - { - // If KeySymbol is a printable character, let TextInput handle it. - // Control characters (Ctrl+key) and null (special keys) go through KeyDown. - return !string.IsNullOrEmpty(keySymbol) && - keySymbol.Length == 1 && - !char.IsControl(keySymbol[0]); - } - private bool TryGetNormalizedPosition(PointerEventArgs e, out float x, out float y) { x = -1;