From fa2c3ab4a8a5b1a9b3faf133548f60e8eff15a46 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 31 Aug 2016 01:43:37 +0300 Subject: [PATCH] Fixed keyboard focus for gtk --- .../Embedding/GtkAvaloniaControlHost.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/Gtk/Avalonia.Gtk/Embedding/GtkAvaloniaControlHost.cs b/src/Gtk/Avalonia.Gtk/Embedding/GtkAvaloniaControlHost.cs index b29a5a1be6..5594a3c13f 100644 --- a/src/Gtk/Avalonia.Gtk/Embedding/GtkAvaloniaControlHost.cs +++ b/src/Gtk/Avalonia.Gtk/Embedding/GtkAvaloniaControlHost.cs @@ -6,8 +6,11 @@ using System.Threading.Tasks; using Avalonia.Controls; using Avalonia.Controls.Embedding; using Avalonia.Diagnostics; +using Avalonia.Input; +using Avalonia.Interactivity; using Avalonia.Layout; using Avalonia.Platform; +using Avalonia.VisualTree; using Gdk; using Gtk; @@ -21,6 +24,34 @@ namespace Avalonia.Gtk.Embedding { _root = new EmbeddableControlRoot(new EmbeddableImpl(this)); _root.Prepare(); + if (_root.IsFocused) + Unfocus(); + _root.GotFocus += RootGotFocus; + CanFocus = true; + } + + void Unfocus() + { + var focused = (IVisual)FocusManager.Instance.Current; + if (focused == null) + return; + while (focused.VisualParent != null) + focused = focused.VisualParent; + + if (focused == _root) + KeyboardDevice.Instance.SetFocusedElement(null, NavigationMethod.Unspecified, InputModifiers.None); + } + + protected override bool OnFocusOutEvent(EventFocus evnt) + { + Unfocus(); + return false; + } + + private void RootGotFocus(object sender, RoutedEventArgs e) + { + this.HasFocus = true; + GdkWindow.Focus(0); } private Control _content;