Ver código fonte

Fixed keyboard focus for gtk

Nikita Tsukanov 9 anos atrás
pai
commit
fa2c3ab4a8

+ 31 - 0
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;