From c11855565e0ce2bac228610cbaa92c8c7f082c70 Mon Sep 17 00:00:00 2001
From: mageven <62494521+mageven@users.noreply.github.com>
Date: Mon, 3 Aug 2020 07:00:58 +0530
Subject: Implement Software Keyboard GTK frontend (#1434)

* Implement SwKbd GUI

* Relocate UI handler to Emu Context from Config

Also create a common interface for UI handlers in the context and specialize for Gtk

Add basic input length validation in InputDialog

* Add Transfer Memory support to AppletCreator

Read Initial Text for SwKbd using Transfer Memory

* Improve InputDialog widget

Improve length validation
Has extra label to show validition info
Handle potential errors and log them

* Misc improvements

* Improve string validation
* Improve error handling
* Remove tuple in struct
* Address formatting nits

* Add proper Cancel functionality

Also handle GUI errors in UI handler

* Address jD's comments

* Fix _uiHandler init

* Address AcK's comments
---
 Ryujinx/Ui/GtkHostUiHandler.cs | 69 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)
 create mode 100644 Ryujinx/Ui/GtkHostUiHandler.cs

(limited to 'Ryujinx/Ui/GtkHostUiHandler.cs')

diff --git a/Ryujinx/Ui/GtkHostUiHandler.cs b/Ryujinx/Ui/GtkHostUiHandler.cs
new file mode 100644
index 00000000..7b7b3647
--- /dev/null
+++ b/Ryujinx/Ui/GtkHostUiHandler.cs
@@ -0,0 +1,69 @@
+using Gtk;
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE;
+using Ryujinx.HLE.HOS.Applets;
+using System;
+using System.Threading;
+
+namespace Ryujinx.Ui
+{
+    internal class GtkHostUiHandler : IHostUiHandler
+    {
+        private readonly Window _parent;
+
+        public GtkHostUiHandler(Window parent)
+        {
+            _parent = parent;
+        }
+
+        public bool DisplayInputDialog(SoftwareKeyboardUiArgs args, out string userText)
+        {
+            ManualResetEvent dialogCloseEvent = new ManualResetEvent(false);
+            bool okPressed = false;
+            bool error = false;
+            string inputText = args.InitialText ?? "";
+
+            Application.Invoke(delegate
+            {
+                try
+                {
+                    var swkbdDialog = new InputDialog(_parent)
+                    {
+                        Title = "Software Keyboard",
+                        Text = args.HeaderText,
+                        SecondaryText = args.SubtitleText
+                    };
+
+                    swkbdDialog.InputEntry.Text = inputText;
+                    swkbdDialog.InputEntry.PlaceholderText = args.GuideText;
+                    swkbdDialog.OkButton.Label = args.SubmitText;
+
+                    swkbdDialog.SetInputLengthValidation(args.StringLengthMin, args.StringLengthMax);
+
+                    if (swkbdDialog.Run() == (int)ResponseType.Ok)
+                    {
+                        inputText = swkbdDialog.InputEntry.Text;
+                        okPressed = true;
+                    }
+
+                    swkbdDialog.Dispose();
+                }
+                catch (Exception e)
+                {
+                    error = true;
+                    Logger.PrintError(LogClass.Application, $"Error displaying Software Keyboard: {e}");
+                }
+                finally
+                {
+                    dialogCloseEvent.Set();
+                }
+            });
+
+            dialogCloseEvent.WaitOne();
+
+            userText = error ? null : inputText;
+
+            return error || okPressed;
+        }
+    }
+}
-- 
cgit v1.2.3-70-g09d2