From 380b95bc59e7dc419f89df951cdc086e792cb0ff Mon Sep 17 00:00:00 2001
From: Caian Benedicto <caianbene@gmail.com>
Date: Tue, 12 Oct 2021 16:54:21 -0300
Subject: Inline software keyboard without input pop up dialog (#2180)

* Initial implementation

* Refactor dynamic text input keys out to facilitate configuration via UI

* Fix code styling

* Add per applet indirect layer handles

* Remove static functions from SoftwareKeyboardRenderer

* Remove inline keyboard reset delay

* Remove inline keyboard V2 responses

* Add inline keyboard soft-lock recovering

* Add comments

* Forward accept and cancel key names to the keyboard and add soft-lock prevention line

* Add dummy window to handle paste events

* Rework inline keyboard state machine and graphics

* Implement IHostUiHandler interfaces on headless WindowBase class

* Add inline keyboard assets

* Fix coding style

* Fix coding style

* Change mode cycling shortcut to F6

* Fix invalid calc size error in games using extended calc

* Remove unnecessary namespaces
---
 .../SoftwareKeyboard/SoftwareKeyboardAppear.cs     | 88 ++++++++++++++++------
 1 file changed, 65 insertions(+), 23 deletions(-)

(limited to 'Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardAppear.cs')

diff --git a/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardAppear.cs b/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardAppear.cs
index 262dd4df..e1ee0507 100644
--- a/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardAppear.cs
+++ b/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardAppear.cs
@@ -5,16 +5,12 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
     /// <summary>
     /// A structure with appearance configurations for the software keyboard when running in inline mode.
     /// </summary>
-    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+    [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
     struct SoftwareKeyboardAppear
     {
-        private const int OkTextLength = 8;
+        public const int OkTextLength = SoftwareKeyboardAppearEx.OkTextLength;
 
-        /// <summary>
-        /// Some games send a Calc without intention of showing the keyboard, a
-        /// common trend observed is that this field will be != 0 in such cases.
-        /// </summary>
-        public uint ShouldBeHidden;
+        public KeyboardMode KeyboardMode;
 
         /// <summary>
         /// The string displayed in the Submit button.
@@ -38,15 +34,26 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
         [MarshalAs(UnmanagedType.I1)]
         public bool PredictionEnabled;
 
-        public byte Empty;
+        /// <summary>
+        /// When set, there is only the option to accept the input.
+        /// </summary>
+        [MarshalAs(UnmanagedType.I1)]
+        public bool CancelButtonDisabled;
 
         /// <summary>
         /// Specifies prohibited characters that cannot be input into the text entry area.
         /// </summary>
-        public InvalidCharFlags InvalidCharFlag;
+        public InvalidCharFlags InvalidChars;
+
+        /// <summary>
+        /// Maximum text length allowed.
+        /// </summary>
+        public int TextMaxLength;
 
-        public int Padding1;
-        public int Padding2;
+        /// <summary>
+        /// Minimum text length allowed.
+        /// </summary>
+        public int TextMinLength;
 
         /// <summary>
         /// Indicates the return button is enabled in the keyboard. This allows for input with multiple lines.
@@ -57,21 +64,56 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
         /// <summary>
         /// [10.0.0+] If value is 1 or 2, then keytopAsFloating=0 and footerScalable=1 in Calc.
         /// </summary>
-        public byte Unknown1;
+        public KeyboardMiniaturizationMode MiniaturizationMode;
 
-        public byte Padding4;
-        public byte Padding5;
+        public byte Reserved1;
+        public byte Reserved2;
 
         /// <summary>
-        /// Bitmask 0x1000 of the Calc and DirectionalButtonAssignEnabled in bitmask 0x10000000.
+        /// Bit field with invalid buttons for the keyboard.
         /// </summary>
-        public uint CalcFlags;
-
-        public uint Padding6;
-        public uint Padding7;
-        public uint Padding8;
-        public uint Padding9;
-        public uint Padding10;
-        public uint Padding11;
+        public InvalidButtonFlags InvalidButtons;
+
+        [MarshalAs(UnmanagedType.I1)]
+        public bool UseSaveData;
+
+        public uint   Reserved3;
+        public ushort Reserved4;
+        public byte   Reserved5;
+        public ulong  Reserved6;
+        public ulong  Reserved7;
+
+        public SoftwareKeyboardAppearEx ToExtended()
+        {
+            SoftwareKeyboardAppearEx appear = new SoftwareKeyboardAppearEx();
+
+            appear.KeyboardMode           = KeyboardMode;
+            appear.OkText                 = OkText;
+            appear.LeftOptionalSymbolKey  = LeftOptionalSymbolKey;
+            appear.RightOptionalSymbolKey = RightOptionalSymbolKey;
+            appear.PredictionEnabled      = PredictionEnabled;
+            appear.CancelButtonDisabled   = CancelButtonDisabled;
+            appear.InvalidChars           = InvalidChars;
+            appear.TextMaxLength          = TextMaxLength;
+            appear.TextMinLength          = TextMinLength;
+            appear.UseNewLine             = UseNewLine;
+            appear.MiniaturizationMode    = MiniaturizationMode;
+            appear.Reserved1              = Reserved1;
+            appear.Reserved2              = Reserved2;
+            appear.InvalidButtons         = InvalidButtons;
+            appear.UseSaveData            = UseSaveData;
+            appear.Reserved3              = Reserved3;
+            appear.Reserved4              = Reserved4;
+            appear.Reserved5              = Reserved5;
+            appear.Uid0                   = Reserved6;
+            appear.Uid1                   = Reserved7;
+            appear.SamplingNumber         = 0;
+            appear.Reserved6              = 0;
+            appear.Reserved7              = 0;
+            appear.Reserved8              = 0;
+            appear.Reserved9              = 0;
+
+            return appear;
+        }
     }
 }
-- 
cgit v1.2.3-70-g09d2