diff options
author | mageven <62494521+mageven@users.noreply.github.com> | 2020-08-03 07:00:58 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-03 03:30:58 +0200 |
commit | c11855565e0ce2bac228610cbaa92c8c7f082c70 (patch) | |
tree | 76f4ee1c3c4c15997d27c9cf8d963bac4405c915 /Ryujinx/Ui/GtkHostUiHandler.cs | |
parent | f0c91d9efb7eff0b8bbe8fc8d4901af5a9d59005 (diff) |
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
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; + } + } +} |