diff options
Diffstat (limited to 'Ryujinx/Ui/GtkHostUiHandler.cs')
-rw-r--r-- | Ryujinx/Ui/GtkHostUiHandler.cs | 69 |
1 files changed, 69 insertions, 0 deletions
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; + } + } +} |