AppletStateMgr.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using Ryujinx.HLE.OsHle.Handles;
  2. using Ryujinx.HLE.OsHle.Services.Am;
  3. using System;
  4. using System.Collections.Concurrent;
  5. namespace Ryujinx.HLE.OsHle
  6. {
  7. class AppletStateMgr : IDisposable
  8. {
  9. private ConcurrentQueue<MessageInfo> Messages;
  10. public FocusState FocusState { get; private set; }
  11. public KEvent MessageEvent { get; private set; }
  12. public AppletStateMgr()
  13. {
  14. Messages = new ConcurrentQueue<MessageInfo>();
  15. MessageEvent = new KEvent();
  16. }
  17. public void SetFocus(bool IsFocused)
  18. {
  19. FocusState = IsFocused
  20. ? FocusState.InFocus
  21. : FocusState.OutOfFocus;
  22. EnqueueMessage(MessageInfo.FocusStateChanged);
  23. }
  24. public void EnqueueMessage(MessageInfo Message)
  25. {
  26. Messages.Enqueue(Message);
  27. MessageEvent.WaitEvent.Set();
  28. }
  29. public bool TryDequeueMessage(out MessageInfo Message)
  30. {
  31. if (Messages.Count < 2)
  32. {
  33. MessageEvent.WaitEvent.Reset();
  34. }
  35. return Messages.TryDequeue(out Message);
  36. }
  37. public void Dispose()
  38. {
  39. Dispose(true);
  40. }
  41. protected virtual void Dispose(bool Disposing)
  42. {
  43. if (Disposing)
  44. {
  45. MessageEvent.Dispose();
  46. }
  47. }
  48. }
  49. }