diff --git a/src/Ryujinx.HLE/HOS/Applets/WindowSystem.cs b/src/Ryujinx.HLE/HOS/Applets/WindowSystem.cs
index 88fade3b3..10d3cc8e4 100644
--- a/src/Ryujinx.HLE/HOS/Applets/WindowSystem.cs
+++ b/src/Ryujinx.HLE/HOS/Applets/WindowSystem.cs
@@ -19,8 +19,9 @@ namespace Ryujinx.HLE.HOS.Applets
private EventObserver _eventObserver = null;
// Foreground roots.
- private RealApplet _homeMenu = null;
- private RealApplet _overlayDisp = null;
+ RealApplet _homeMenu = null;
+ RealApplet _overlayDisp = null;
+ RealApplet _application = null;
// Removed single application field to allow multiple applications.
// Home menu state.
@@ -130,23 +131,22 @@ namespace Ryujinx.HLE.HOS.Applets
{
_overlayDisp = applet;
}
- // For application applets, we no longer assign a unique field.
- // They are simply tracked as root applets (if callerPid == 0) and in the _applets dictionary.
+ else if (isApplication)
+ {
+ _application = applet;
+ }
_applets[applet.AppletResourceUserId] = applet;
_eventObserver.TrackAppletProcess(applet);
- // If this is the first applet being tracked, or if it is one of the special system applets,
- // perform initial setup.
- if (_applets.Count == 1 ||
- applet.AppletId == RealAppletId.SystemAppletMenu ||
- applet.AppletId == RealAppletId.OverlayApplet)
+ if (_applets.Count == 1 || applet.AppletId == RealAppletId.SystemAppletMenu || applet.AppletId == RealAppletId.OverlayApplet)
{
SetupFirstApplet(applet);
- _foregroundRequestedApplet = applet;
- applet.AppletState.SetFocus(false);
}
+ // _foregroundRequestedApplet = applet;
+ // applet.AppletState.SetFocusState(FocusState.InFocus);
+
_eventObserver.RequestUpdate();
}
@@ -169,7 +169,7 @@ namespace Ryujinx.HLE.HOS.Applets
{
applet.AppletState.SetFocusState(FocusState.InFocus);
_foregroundRequestedApplet = applet;
- RequestApplicationToGetForeground(applet.ProcessHandle.Pid);
+ RequestApplicationToGetForeground();
}
applet.UpdateSuspensionStateLocked(true);
@@ -208,63 +208,33 @@ namespace Ryujinx.HLE.HOS.Applets
_eventObserver.RequestUpdate();
}
- ///
- /// Requests that the home menu be focused.
- /// The PID provided must match the home menu’s PID.
- ///
- internal void RequestHomeMenuToGetForeground(ulong pid)
+ internal void RequestApplicationToGetForeground()
{
- lock (_lock)
+ // lock (_lock)
{
- if (_homeMenu != null && _homeMenu.ProcessHandle.Pid == pid)
- {
- _foregroundRequestedApplet = _homeMenu;
- }
- else
- {
- Logger.Warning?.Print(LogClass.ServiceAm, $"RequestHomeMenuToGetForeground: Provided pid {pid} does not match the home menu.");
- }
+ _foregroundRequestedApplet = _application;
}
- _eventObserver.RequestUpdate();
- }
- ///
- /// Requests that an application be focused.
- /// The PID provided must belong to an application applet.
- ///
- internal void RequestApplicationToGetForeground(ulong pid)
- {
- lock (_lock)
- {
- if (_applets.TryGetValue(pid, out var applet))
- {
- _foregroundRequestedApplet = applet;
- }
- else
- {
- if (pid == _homeMenu?.ProcessHandle.Pid)
- {
- _foregroundRequestedApplet.AppletState.SetFocusForce(false,true);
- _foregroundRequestedApplet = _homeMenu;
- }
- else
- {
- Logger.Warning?.Print(LogClass.ServiceAm, $"RequestApplicationToGetForeground: Provided pid {pid} is not an application applet.");
- }
- }
- }
_eventObserver.RequestUpdate();
}
internal void RequestLockHomeMenuIntoForeground()
{
- _homeMenuForegroundLocked = true;
+ // lock (_lock)
+ {
+ _homeMenuForegroundLocked = true;
+ }
+
_eventObserver.RequestUpdate();
}
internal void RequestUnlockHomeMenuFromForeground()
{
- _homeMenuForegroundLocked = false;
+ // lock (_lock)
+ {
+ _homeMenuForegroundLocked = false;
+ }
+
_eventObserver.RequestUpdate();
}
@@ -277,7 +247,7 @@ namespace Ryujinx.HLE.HOS.Applets
_eventObserver.RequestUpdate();
}
-
+
internal void OnOperationModeChanged()
{
foreach (var (_, applet) in _applets)
@@ -627,6 +597,21 @@ namespace Ryujinx.HLE.HOS.Applets
applet.CallerApplet.ProcessHandle.SetActivity(true);
}
}
+
+ public void TrackNewProcess(ulong processProcessId, ulong i, bool b)
+ {
+ TrackProcess(processProcessId, i, b);
+ }
+
+ internal RealApplet GetOverlayMenu()
+ {
+ return _overlayDisp;
+ }
+
+ internal RealApplet GetHomeMenu()
+ {
+ return _homeMenu;
+ }
}
internal class ButtonPressTracker
diff --git a/src/Ryujinx.HLE/HOS/ArmProcessContext.cs b/src/Ryujinx.HLE/HOS/ArmProcessContext.cs
index e474a7a24..27c4c679d 100644
--- a/src/Ryujinx.HLE/HOS/ArmProcessContext.cs
+++ b/src/Ryujinx.HLE/HOS/ArmProcessContext.cs
@@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS
public void Execute(IExecutionContext context, ulong codeAddress)
{
// We must wait until shader cache is loaded, among other things, before executing CPU code.
- _gpuContext.WaitUntilGpuReady();
+ //_gpuContext.WaitUntilGpuReady();
_cpuContext.Execute(context, codeAddress);
}
diff --git a/src/Ryujinx.HLE/HOS/Horizon.cs b/src/Ryujinx.HLE/HOS/Horizon.cs
index 747214729..95f021e52 100644
--- a/src/Ryujinx.HLE/HOS/Horizon.cs
+++ b/src/Ryujinx.HLE/HOS/Horizon.cs
@@ -75,7 +75,7 @@ namespace Ryujinx.HLE.HOS
return IntialAppletState;
}
- internal WindowSystem WindowSystem { get; private set; }
+ public WindowSystem WindowSystem { get; private set; }
internal EventObserver EventObserver { get; private set; }
@@ -346,7 +346,7 @@ namespace Ryujinx.HLE.HOS
public void ReturnFocus()
{
- GetAppletState(WindowSystem.GetFocusedApp()).SetFocus(true);
+ GetAppletState(WindowSystem.GetFocusedApp()).SetFocusState(FocusState.InFocus);
}
public void SimulateWakeUpMessage()
@@ -526,11 +526,20 @@ namespace Ryujinx.HLE.HOS
IsPaused = pause;
}
- public void SetupFirst(ulong ProgramId)
+ public void SetupFirst(ulong ProgramId, ulong Pid)
{
bool isApp = ProgramId > 0x01000000000007FF;
- RealApplet app = WindowSystem.TrackProcess(ProgramId, 0, isApp);
- app.AppletState.SetFocusForce(true);
+ ulong pid = 0;
+
+ if (WindowSystem.GetOverlayMenu() != null)
+ {
+ pid = WindowSystem.GetOverlayMenu().ProcessHandle.Pid;
+ }
+ RealApplet app = WindowSystem.TrackProcess(Pid, pid, isApp);
+ if (isApp)
+ {
+ app.AppletState.SetFocusForce(true);
+ }
}
}
}
diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/ILibraryAppletProxy.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/ILibraryAppletProxy.cs
index 8a5940c28..e6bc641c1 100644
--- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/ILibraryAppletProxy.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/ILibraryAppletProxy.cs
@@ -113,7 +113,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService
// GetHomeMenuFunctions() -> object
public ResultCode GetHomeMenuFunctions(ServiceCtx context)
{
- MakeObject(context, new IHomeMenuFunctions(context.Device.System, _pid));
+ MakeObject(context, new IHomeMenuFunctions(context.Device.System));
return ResultCode.Success;
}
diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/ISystemAppletProxy.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/ISystemAppletProxy.cs
index d06b1112e..464a73cc7 100644
--- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/ISystemAppletProxy.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/ISystemAppletProxy.cs
@@ -69,7 +69,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService
// GetHomeMenuFunctions() -> object
public ResultCode GetHomeMenuFunctions(ServiceCtx context)
{
- MakeObject(context, new IHomeMenuFunctions(context.Device.System, _pid));
+ MakeObject(context, new IHomeMenuFunctions(context.Device.System));
return ResultCode.Success;
}
diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IApplicationAccessor.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IApplicationAccessor.cs
index 93bc8097a..97220b75f 100644
--- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IApplicationAccessor.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IApplicationAccessor.cs
@@ -110,7 +110,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
{
applet.ProcessHandle.SetActivity(false);
}
- context.Device.System.WindowSystem.RequestApplicationToGetForeground(applet.ProcessHandle.Pid);
+ context.Device.System.WindowSystem.RequestApplicationToGetForeground();
return ResultCode.Success;
}
diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs
index 737a522d6..94c942882 100644
--- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs
@@ -117,11 +117,6 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
focusState = _applet.AppletState.GetAndClearFocusState();
}
- if (context.Device.System.WindowSystem.IsFocusedApplet(_applet))
- {
- focusState = FocusState.InFocus;
- }
-
Logger.Info?.Print(LogClass.ServiceAm, $"pid: {_applet.ProcessHandle.Pid}, GetCurrentFocusState():{focusState}");
context.ResponseData.Write((byte)focusState);
@@ -135,9 +130,6 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
Logger.Stub?.PrintStub(LogClass.ServiceAm);
_acquiredSleepLockEvent.ReadableEvent.Signal();
-
- _applet.AppletState.SetFocusForce(true);
- context.Device.System.WindowSystem.RequestApplicationToGetForeground(_applet.ProcessHandle.Pid);
return ResultCode.Success;
}
@@ -321,7 +313,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
return ResultCode.Success;
}
-
+
[CommandCmif(68)]
// GetBuiltInDisplayType() -> u32 type
public ResultCode GetBuiltInDisplayType(ServiceCtx context)
@@ -329,7 +321,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
context.ResponseData.Write(0);
return ResultCode.Success;
}
-
+
[CommandCmif(91)] // 7.0.0+
// GetCurrentPerformanceConfiguration() -> nn::apm::PerformanceConfiguration
public ResultCode GetCurrentPerformanceConfiguration(ServiceCtx context)
@@ -363,7 +355,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
Logger.Stub?.PrintStub(LogClass.ServiceAm);
return ResultCode.Success;
}
-
+
[CommandCmif(300)] // 9.0.0+
// GetSettingsPlatformRegion() -> u8
public ResultCode GetSettingsPlatformRegion(ServiceCtx context)
diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IHomeMenuFunctions.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IHomeMenuFunctions.cs
index 0db3684d6..e2990aa18 100644
--- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IHomeMenuFunctions.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IHomeMenuFunctions.cs
@@ -1,3 +1,4 @@
+using LibHac.Util;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Threading;
@@ -8,22 +9,19 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
{
class IHomeMenuFunctions : IpcService
{
- private ulong _pid;
private int _channelEventHandle;
- public IHomeMenuFunctions(Horizon system, ulong pid)
+ public IHomeMenuFunctions(Horizon system)
{
- _pid = pid;
}
[CommandCmif(10)]
// RequestToGetForeground()
public ResultCode RequestToGetForeground(ServiceCtx context)
{
- Logger.Stub?.PrintStub(LogClass.ServiceAm);
- context.Device.System.WindowSystem.RequestApplicationToGetForeground(_pid);
- context.Device.System.GetAppletState(_pid).SetFocusForce(true);
-
+ // Logger.Stub?.PrintStub(LogClass.ServiceAm);
+ context.Device.System.WindowSystem.RequestHomeMenuToGetForeground();
+
return ResultCode.Success;
}
@@ -31,22 +29,40 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
// LockForeground()
public ResultCode LockForeground(ServiceCtx context)
{
- Logger.Stub?.PrintStub(LogClass.ServiceAm);
+ // Logger.Stub?.PrintStub(LogClass.ServiceAm);
context.Device.System.WindowSystem.RequestLockHomeMenuIntoForeground();
-
+
return ResultCode.Success;
- }
-
+ }
+
[CommandCmif(12)]
// UnlockForeground()
public ResultCode UnlockForeground(ServiceCtx context)
{
- Logger.Stub?.PrintStub(LogClass.ServiceAm);
+ // Logger.Stub?.PrintStub(LogClass.ServiceAm);
context.Device.System.WindowSystem.RequestUnlockHomeMenuFromForeground();
return ResultCode.Success;
}
-
+
+ [CommandCmif(20)]
+ // PopFromGeneralChannel() -> object
+ public ResultCode PopFromGeneralChannel(ServiceCtx context)
+ {
+ bool pop = context.Device.System.GeneralChannelData.TryDequeue(out byte[] data);
+ if (!pop)
+ {
+ return ResultCode.NotAvailable;
+ }
+
+ // Logger.Debug?.Print(LogClass.ServiceAm, $"Data size: {data.Length}");
+ Logger.Info?.Print(LogClass.ServiceAm, $"GeneralChannel data: {data.ToHexString()}");
+
+ MakeObject(context, new IStorage(data));
+
+ return ResultCode.Success;
+ }
+
[CommandCmif(21)]
// GetPopFromGeneralChannelEvent() -> handle
public ResultCode GetPopFromGeneralChannelEvent(ServiceCtx context)
@@ -54,8 +70,8 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
if (_channelEventHandle == 0)
{
if (context.Process.HandleTable.GenerateHandle(
- context.Device.System.GeneralChannelEvent.ReadableEvent,
- out _channelEventHandle) != Result.Success)
+ context.Device.System.GeneralChannelEvent.ReadableEvent,
+ out _channelEventHandle) != Result.Success)
{
throw new InvalidOperationException("Out of handles!");
}
@@ -67,8 +83,9 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
return ResultCode.Success;
}
-
+
[CommandCmif(31)]
+ [CommandCmif(32)]
// GetWriterLockAccessorEx(i32) -> object
public ResultCode GetWriterLockAccessorEx(ServiceCtx context)
{
@@ -77,7 +94,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
MakeObject(context, new ILockAccessor(lockId, context.Device.System));
Logger.Stub?.PrintStub(LogClass.ServiceAm);
-
+
return ResultCode.Success;
}
}
diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs
index 52772ce91..a55d364ac 100644
--- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs
@@ -1,4 +1,5 @@
using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Applets;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy.Types;
@@ -11,8 +12,8 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
class ISelfController : IpcService
{
private readonly ulong _pid;
+ private readonly RealApplet _applet;
- private readonly KEvent _libraryAppletLaunchableEvent;
private int _libraryAppletLaunchableEventHandle;
private KEvent _accumulatedSuspendedTickChangedEvent;
@@ -29,8 +30,6 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
private bool _screenShotPermission = false;
private bool _operationModeChangedNotification = false;
private bool _performanceModeChangedNotification = false;
- private bool _restartMessageEnabled = false;
- private bool _outOfFocusSuspendingEnabled = false;
private bool _handlesRequestToDisplay = false;
#pragma warning restore IDE0052
private bool _autoSleepDisabled = false;
@@ -44,8 +43,8 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
public ISelfController(ServiceCtx context, ulong pid)
{
- _libraryAppletLaunchableEvent = new KEvent(context.Device.System.KernelContext);
_pid = pid;
+ _applet = context.Device.System.WindowSystem.GetByAruId(_pid);
}
[CommandCmif(0)]
@@ -54,6 +53,8 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
{
Logger.Stub?.PrintStub(LogClass.ServiceAm);
+ _applet.ProcessHandle.Terminate();
+
return ResultCode.Success;
}
@@ -61,7 +62,17 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
// LockExit()
public ResultCode LockExit(ServiceCtx context)
{
- Logger.Stub?.PrintStub(LogClass.ServiceAm);
+ lock (_applet.Lock)
+ {
+ if (_applet.AppletState.HasRequestedExit)
+ {
+ _applet.ProcessHandle.Terminate();
+ }
+ else
+ {
+ _applet.ExitLocked = true;
+ }
+ }
return ResultCode.Success;
}
@@ -70,7 +81,15 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
// UnlockExit()
public ResultCode UnlockExit(ServiceCtx context)
{
- Logger.Stub?.PrintStub(LogClass.ServiceAm);
+ lock (_applet.Lock)
+ {
+ _applet.ExitLocked = false;
+
+ if (_applet.AppletState.HasRequestedExit)
+ {
+ _applet.ProcessHandle.Terminate();
+ }
+ }
return ResultCode.Success;
}
@@ -112,11 +131,12 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
// GetLibraryAppletLaunchableEvent() -> handle
public ResultCode GetLibraryAppletLaunchableEvent(ServiceCtx context)
{
- _libraryAppletLaunchableEvent.ReadableEvent.Signal();
+ var evnt = _applet.AppletState.LaunchableEvent;
+ evnt.ReadableEvent.Signal();
if (_libraryAppletLaunchableEventHandle == 0)
{
- if (context.Process.HandleTable.GenerateHandle(_libraryAppletLaunchableEvent.ReadableEvent, out _libraryAppletLaunchableEventHandle) != Result.Success)
+ if (context.Process.HandleTable.GenerateHandle(evnt.ReadableEvent, out _libraryAppletLaunchableEventHandle) != Result.Success)
{
throw new InvalidOperationException("Out of handles!");
}
@@ -172,11 +192,18 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
// SetFocusHandlingMode(b8, b8, b8)
public ResultCode SetFocusHandlingMode(ServiceCtx context)
{
- bool unknownFlag1 = context.RequestData.ReadBoolean();
- bool unknownFlag2 = context.RequestData.ReadBoolean();
- bool unknownFlag3 = context.RequestData.ReadBoolean();
+ bool notify = context.RequestData.ReadBoolean();
+ bool background = context.RequestData.ReadBoolean();
+ bool suspend = context.RequestData.ReadBoolean();
- Logger.Stub?.PrintStub(LogClass.ServiceAm, new { unknownFlag1, unknownFlag2, unknownFlag3 });
+ Logger.Stub?.PrintStub(LogClass.ServiceAm, new { notify, background, suspend });
+
+ lock (_applet.Lock)
+ {
+ _applet.AppletState.SetFocusHandlingMode(suspend);
+ _applet.AppletState.FocusStateChangedNotificationEnabled = notify;
+ _applet.UpdateSuspensionStateLocked(true);
+ }
return ResultCode.Success;
}
@@ -189,7 +216,10 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
Logger.Stub?.PrintStub(LogClass.ServiceAm, new { restartMessageEnabled });
- _restartMessageEnabled = restartMessageEnabled;
+ lock (_applet.Lock)
+ {
+ _applet.AppletState.ResumeNotificationEnabled = restartMessageEnabled;
+ }
return ResultCode.Success;
}
@@ -210,7 +240,11 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
Logger.Stub?.PrintStub(LogClass.ServiceAm, new { outOfFocusSuspendingEnabled });
- _outOfFocusSuspendingEnabled = outOfFocusSuspendingEnabled;
+ lock (_applet.Lock)
+ {
+ _applet.AppletState.SetOutOfFocusSuspendingEnabled(outOfFocusSuspendingEnabled);
+ _applet.UpdateSuspensionStateLocked(false);
+ }
return ResultCode.Success;
}
@@ -256,14 +290,13 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
return ResultCode.Success;
}
-
+
[CommandCmif(44)] // 10.0.0+
// CreateManagedDisplaySeparableLayer() -> (u64, u64)
public ResultCode CreateManagedDisplaySeparableLayer(ServiceCtx context)
{
context.Device.System.SurfaceFlinger.CreateLayer(out long displayLayerId, _pid);
context.Device.System.SurfaceFlinger.CreateLayer(out long recordingLayerId, _pid);
- //context.Device.System.SurfaceFlinger.SetRenderLayer(displayLayerId);
context.ResponseData.Write(displayLayerId);
context.ResponseData.Write(recordingLayerId);
@@ -285,13 +318,19 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
}
[CommandCmif(60)]
- // OverrideAutoSleepTimeAndDimmingTime()
+ // OverrideAutoSleepTimeAndDimmingTime(i32, i32, i32, i32)
public ResultCode OverrideAutoSleepTimeAndDimmingTime(ServiceCtx context)
{
- Logger.Stub?.PrintStub(LogClass.ServiceAm);
+ int unk1 = context.RequestData.ReadInt32();
+ int unk2 = context.RequestData.ReadInt32();
+ int unk3 = context.RequestData.ReadInt32();
+ int unk4 = context.RequestData.ReadInt32();
+
+ Logger.Stub?.PrintStub(LogClass.ServiceAm, new { unk1, unk2, unk3, unk4 });
+
return ResultCode.Success;
}
-
+
[CommandCmif(62)]
// SetIdleTimeDetectionExtension(u32)
public ResultCode SetIdleTimeDetectionExtension(ServiceCtx context)
@@ -316,6 +355,17 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
return ResultCode.Success;
}
+ [CommandCmif(64)]
+ // SetInputDetectionSourceSet(u32)
+ public ResultCode SetInputDetectionSourceSet(ServiceCtx context)
+ {
+ uint inputDetectionSourceSet = context.RequestData.ReadUInt32();
+
+ Logger.Stub?.PrintStub(LogClass.ServiceAm, new { inputDetectionSourceSet });
+
+ return ResultCode.Success;
+ }
+
[CommandCmif(65)]
// ReportUserIsActive()
public ResultCode ReportUserIsActive(ServiceCtx context)
diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IWindowController.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IWindowController.cs
index 0e84e1fc6..59332ae96 100644
--- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IWindowController.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IWindowController.cs
@@ -19,8 +19,6 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
context.ResponseData.Write(appletResourceUserId);
- Logger.Stub?.PrintStub(LogClass.ServiceAm, new { appletResourceUserId });
-
return ResultCode.Success;
}
@@ -34,8 +32,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
Logger.Stub?.PrintStub(LogClass.ServiceAm, new { appletResourceUserId });
return ResultCode.Success;
}
-
-
+
[CommandCmif(10)]
// AcquireForegroundRights()
public ResultCode AcquireForegroundRights(ServiceCtx context)
diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/IAllSystemAppletProxiesService.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/IAllSystemAppletProxiesService.cs
index edf15b135..90fad61c7 100644
--- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/IAllSystemAppletProxiesService.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/IAllSystemAppletProxiesService.cs
@@ -12,7 +12,6 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
// OpenSystemAppletProxy(u64, pid, handle) -> object
public ResultCode OpenSystemAppletProxy(ServiceCtx context)
{
- context.Device.System.WindowSystem.TrackProcess(context.Request.HandleDesc.PId, 0, false);
MakeObject(context, new ISystemAppletProxy(context.Request.HandleDesc.PId));
return ResultCode.Success;
@@ -23,7 +22,6 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
// OpenLibraryAppletProxy(u64, pid, handle) -> object
public ResultCode OpenLibraryAppletProxy(ServiceCtx context)
{
- context.Device.System.WindowSystem.TrackProcess(context.Request.HandleDesc.PId, 0, false);
MakeObject(context, new ILibraryAppletProxy(context,context.Request.HandleDesc.PId));
return ResultCode.Success;
@@ -33,7 +31,6 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
// OpenOverlayAppletProxy(pid, handle) -> object
public ResultCode OpenOverlayAppletProxy(ServiceCtx context)
{
- context.Device.System.WindowSystem.TrackProcess(context.Request.HandleDesc.PId, 0, false);
MakeObject(context, new IOverlayAppletProxy(context.Request.HandleDesc.PId));
return ResultCode.Success;
@@ -43,7 +40,6 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
// OpenSystemApplicationProxy(u64, pid, handle) -> object
public ResultCode OpenSystemApplicationProxy(ServiceCtx context)
{
- context.Device.System.WindowSystem.TrackProcess(context.Request.HandleDesc.PId, 0, false);
MakeObject(context, new IApplicationProxy(context.Request.HandleDesc.PId));
return ResultCode.Success;
diff --git a/src/Ryujinx.HLE/HOS/Services/Npns/INpnsUser.cs b/src/Ryujinx.HLE/HOS/Services/Npns/INpnsUser.cs
index 08cbb0366..5edfa94ca 100644
--- a/src/Ryujinx.HLE/HOS/Services/Npns/INpnsUser.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Npns/INpnsUser.cs
@@ -1,3 +1,4 @@
+using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.Horizon.Common;
@@ -31,5 +32,13 @@ namespace Ryujinx.HLE.HOS.Services.Npns
context.Response.HandleDesc = IpcHandleDesc.MakeCopy(receiveEventHandle);
return ResultCode.Success;
}
+
+ [CommandCmif(8)] // 18.0.0+
+ // ListenToByName()
+ public ResultCode ListenToByName(ServiceCtx context)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceNpns);
+ return ResultCode.Success;
+ }
}
}
diff --git a/src/Ryujinx.HLE/HOS/SystemState/AppletStateMgr.cs b/src/Ryujinx.HLE/HOS/SystemState/AppletStateMgr.cs
index 4105962b1..bc149069c 100644
--- a/src/Ryujinx.HLE/HOS/SystemState/AppletStateMgr.cs
+++ b/src/Ryujinx.HLE/HOS/SystemState/AppletStateMgr.cs
@@ -320,13 +320,6 @@ namespace Ryujinx.HLE.HOS.SystemState
return false;
}
-
- public void SetFocus(bool isFocused)
- {
- SetFocusHandlingMode(false);
- FocusState focusState = isFocused ? FocusState.InFocus : FocusState.OutOfFocus;
- SetFocusState(focusState);
- }
public void SetFocusForce(bool isFocused, bool shouldSuspend = false)
{
diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs
index 06aee354b..65bcb275b 100644
--- a/src/Ryujinx.HLE/Switch.cs
+++ b/src/Ryujinx.HLE/Switch.cs
@@ -168,7 +168,7 @@ namespace Ryujinx.HLE
System.WindowSystem.ButtonPressTracker.Update();
}
- public bool LoadSystemProgramId(ulong programId)
+ public bool LoadSystemProgramId(ulong programId, out ProcessResult result)
{
string contentPath = System.ContentManager.GetInstalledContentPath(programId, StorageId.BuiltInSystem, NcaContentType.Program);
string filePath = VirtualFileSystem.SwitchPathToSystemPath(contentPath);
@@ -178,7 +178,7 @@ namespace Ryujinx.HLE
throw new InvalidSystemResourceException("Specified title ID is not installed on the system.");
}
- return Processes.LoadNca(filePath);
+ return Processes.LoadNca(filePath, out result);
}
}
}
diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs
index 2ddb49eb0..16d8abe40 100644
--- a/src/Ryujinx/AppHost.cs
+++ b/src/Ryujinx/AppHost.cs
@@ -42,6 +42,7 @@ using Ryujinx.HLE.HOS;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.HLE.HOS.Services.Ns.Types;
using Ryujinx.HLE.HOS.SystemState;
+using Ryujinx.HLE.Loaders.Processes;
using Ryujinx.Input;
using Ryujinx.Input.HLE;
using SkiaSharp;
@@ -679,6 +680,8 @@ namespace Ryujinx.Ava
InitEmulatedSwitch();
MainWindow.UpdateGraphicsConfig();
+ Device.LoadSystemProgramId(0x010000000000100C, out ProcessResult process);
+ Device.System.WindowSystem.TrackNewProcess(process.ProcessId,0,false);
SystemVersion firmwareVersion = ContentManager.GetCurrentFirmwareVersion();
@@ -967,7 +970,6 @@ namespace Ryujinx.Ava
ConfigurationState.Instance.Multiplayer.LdnServer,
ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value,
ConfigurationState.Instance.Hacks.ShowDirtyHacks ? ConfigurationState.Instance.Hacks.EnabledHacks : null));
- Device.LoadSystemProgramId(0x010000000000100C);
}
private static IHardwareDeviceDriver InitializeAudio()
diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
index 1029cad0e..0395d5581 100644
--- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
@@ -1569,7 +1569,7 @@ namespace Ryujinx.Ava.UI.ViewModels
return;
}
- AppHost.Device.System.SetupFirst(AppHost.Device.Processes.ActiveApplication.ProcessId);
+ AppHost.Device.System.SetupFirst(AppHost.Device.Processes.ActiveApplication.ProgramId,AppHost.Device.Processes.ActiveApplication.ProcessId);
CanUpdate = false;