mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Merge pull request #1656 from ogniK5377/message-queue
Ability to switch between docked and undocked mode in-game
This commit is contained in:
		
						commit
						93fca5d9cf
					
				@ -338,7 +338,54 @@ void ISelfController::GetIdleTimeDetectionExtension(Kernel::HLERequestContext& c
 | 
			
		||||
    LOG_WARNING(Service_AM, "(STUBBED) called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ICommonStateGetter::ICommonStateGetter() : ServiceFramework("ICommonStateGetter") {
 | 
			
		||||
AppletMessageQueue::AppletMessageQueue() {
 | 
			
		||||
    auto& kernel = Core::System::GetInstance().Kernel();
 | 
			
		||||
    on_new_message = Kernel::Event::Create(kernel, Kernel::ResetType::Sticky,
 | 
			
		||||
                                           "AMMessageQueue:OnMessageRecieved");
 | 
			
		||||
    on_operation_mode_changed = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
 | 
			
		||||
                                                      "AMMessageQueue:OperationModeChanged");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AppletMessageQueue::~AppletMessageQueue() = default;
 | 
			
		||||
 | 
			
		||||
const Kernel::SharedPtr<Kernel::Event>& AppletMessageQueue::GetMesssageRecieveEvent() const {
 | 
			
		||||
    return on_new_message;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const Kernel::SharedPtr<Kernel::Event>& AppletMessageQueue::GetOperationModeChangedEvent() const {
 | 
			
		||||
    return on_operation_mode_changed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AppletMessageQueue::PushMessage(AppletMessage msg) {
 | 
			
		||||
    messages.push(msg);
 | 
			
		||||
    on_new_message->Signal();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() {
 | 
			
		||||
    if (messages.empty()) {
 | 
			
		||||
        on_new_message->Clear();
 | 
			
		||||
        return AppletMessage::NoMessage;
 | 
			
		||||
    }
 | 
			
		||||
    auto msg = messages.front();
 | 
			
		||||
    messages.pop();
 | 
			
		||||
    if (messages.empty()) {
 | 
			
		||||
        on_new_message->Clear();
 | 
			
		||||
    }
 | 
			
		||||
    return msg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::size_t AppletMessageQueue::GetMessageCount() const {
 | 
			
		||||
    return messages.size();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AppletMessageQueue::OperationModeChanged() {
 | 
			
		||||
    PushMessage(AppletMessage::OperationModeChanged);
 | 
			
		||||
    PushMessage(AppletMessage::PerformanceModeChanged);
 | 
			
		||||
    on_operation_mode_changed->Signal();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_queue)
 | 
			
		||||
    : ServiceFramework("ICommonStateGetter"), msg_queue(std::move(msg_queue)) {
 | 
			
		||||
    // clang-format off
 | 
			
		||||
    static const FunctionInfo functions[] = {
 | 
			
		||||
        {0, &ICommonStateGetter::GetEventHandle, "GetEventHandle"},
 | 
			
		||||
@ -388,21 +435,19 @@ void ICommonStateGetter::GetBootMode(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ICommonStateGetter::GetEventHandle(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    event->Signal();
 | 
			
		||||
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushCopyObjects(event);
 | 
			
		||||
    rb.PushCopyObjects(msg_queue->GetMesssageRecieveEvent());
 | 
			
		||||
 | 
			
		||||
    LOG_WARNING(Service_AM, "(STUBBED) called");
 | 
			
		||||
    LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ICommonStateGetter::ReceiveMessage(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 3};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.Push<u32>(15);
 | 
			
		||||
    rb.PushEnum<AppletMessageQueue::AppletMessage>(msg_queue->PopMessage());
 | 
			
		||||
 | 
			
		||||
    LOG_WARNING(Service_AM, "(STUBBED) called");
 | 
			
		||||
    LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ICommonStateGetter::GetCurrentFocusState(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
@ -414,13 +459,11 @@ void ICommonStateGetter::GetCurrentFocusState(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    event->Signal();
 | 
			
		||||
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushCopyObjects(event);
 | 
			
		||||
    rb.PushCopyObjects(msg_queue->GetOperationModeChangedEvent());
 | 
			
		||||
 | 
			
		||||
    LOG_WARNING(Service_AM, "(STUBBED) called");
 | 
			
		||||
    LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ICommonStateGetter::GetDefaultDisplayResolution(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
@ -444,7 +487,7 @@ void ICommonStateGetter::GetOperationMode(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.Push(static_cast<u8>(use_docked_mode ? OperationMode::Docked : OperationMode::Handheld));
 | 
			
		||||
 | 
			
		||||
    LOG_WARNING(Service_AM, "(STUBBED) called");
 | 
			
		||||
    LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ICommonStateGetter::GetPerformanceMode(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
@ -454,7 +497,7 @@ void ICommonStateGetter::GetPerformanceMode(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    rb.Push(static_cast<u32>(use_docked_mode ? APM::PerformanceMode::Docked
 | 
			
		||||
                                             : APM::PerformanceMode::Handheld));
 | 
			
		||||
 | 
			
		||||
    LOG_WARNING(Service_AM, "(STUBBED) called");
 | 
			
		||||
    LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class IStorageAccessor final : public ServiceFramework<IStorageAccessor> {
 | 
			
		||||
@ -840,8 +883,12 @@ void IApplicationFunctions::GetPseudoDeviceId(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
 | 
			
		||||
void InstallInterfaces(SM::ServiceManager& service_manager,
 | 
			
		||||
                       std::shared_ptr<NVFlinger::NVFlinger> nvflinger) {
 | 
			
		||||
    std::make_shared<AppletAE>(nvflinger)->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<AppletOE>(nvflinger)->InstallAsService(service_manager);
 | 
			
		||||
    auto message_queue = std::make_shared<AppletMessageQueue>();
 | 
			
		||||
    message_queue->PushMessage(
 | 
			
		||||
        AppletMessageQueue::AppletMessage::FocusStateChanged); // Needed on game boot
 | 
			
		||||
 | 
			
		||||
    std::make_shared<AppletAE>(nvflinger, message_queue)->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<AppletOE>(nvflinger, message_queue)->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<IdleSys>()->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<OMM>()->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<SPSM>()->InstallAsService(service_manager);
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <queue>
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Kernel {
 | 
			
		||||
@ -39,6 +40,31 @@ enum SystemLanguage {
 | 
			
		||||
    TraditionalChinese = 16,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class AppletMessageQueue {
 | 
			
		||||
public:
 | 
			
		||||
    enum class AppletMessage : u32 {
 | 
			
		||||
        NoMessage = 0,
 | 
			
		||||
        FocusStateChanged = 15,
 | 
			
		||||
        OperationModeChanged = 30,
 | 
			
		||||
        PerformanceModeChanged = 31,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    AppletMessageQueue();
 | 
			
		||||
    ~AppletMessageQueue();
 | 
			
		||||
 | 
			
		||||
    const Kernel::SharedPtr<Kernel::Event>& GetMesssageRecieveEvent() const;
 | 
			
		||||
    const Kernel::SharedPtr<Kernel::Event>& GetOperationModeChangedEvent() const;
 | 
			
		||||
    void PushMessage(AppletMessage msg);
 | 
			
		||||
    AppletMessage PopMessage();
 | 
			
		||||
    std::size_t GetMessageCount() const;
 | 
			
		||||
    void OperationModeChanged();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::queue<AppletMessage> messages;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> on_new_message;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> on_operation_mode_changed;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class IWindowController final : public ServiceFramework<IWindowController> {
 | 
			
		||||
public:
 | 
			
		||||
    IWindowController();
 | 
			
		||||
@ -102,7 +128,7 @@ private:
 | 
			
		||||
 | 
			
		||||
class ICommonStateGetter final : public ServiceFramework<ICommonStateGetter> {
 | 
			
		||||
public:
 | 
			
		||||
    ICommonStateGetter();
 | 
			
		||||
    explicit ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_queue);
 | 
			
		||||
    ~ICommonStateGetter() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
@ -126,6 +152,7 @@ private:
 | 
			
		||||
    void GetDefaultDisplayResolution(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> event;
 | 
			
		||||
    std::shared_ptr<AppletMessageQueue> msg_queue;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> {
 | 
			
		||||
 | 
			
		||||
@ -12,8 +12,10 @@ namespace Service::AM {
 | 
			
		||||
 | 
			
		||||
class ILibraryAppletProxy final : public ServiceFramework<ILibraryAppletProxy> {
 | 
			
		||||
public:
 | 
			
		||||
    explicit ILibraryAppletProxy(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)
 | 
			
		||||
        : ServiceFramework("ILibraryAppletProxy"), nvflinger(std::move(nvflinger)) {
 | 
			
		||||
    explicit ILibraryAppletProxy(std::shared_ptr<NVFlinger::NVFlinger> nvflinger,
 | 
			
		||||
                                 std::shared_ptr<AppletMessageQueue> msg_queue)
 | 
			
		||||
        : ServiceFramework("ILibraryAppletProxy"), nvflinger(std::move(nvflinger)),
 | 
			
		||||
          msg_queue(std::move(msg_queue)) {
 | 
			
		||||
        static const FunctionInfo functions[] = {
 | 
			
		||||
            {0, &ILibraryAppletProxy::GetCommonStateGetter, "GetCommonStateGetter"},
 | 
			
		||||
            {1, &ILibraryAppletProxy::GetSelfController, "GetSelfController"},
 | 
			
		||||
@ -32,7 +34,7 @@ private:
 | 
			
		||||
    void GetCommonStateGetter(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
        rb.Push(RESULT_SUCCESS);
 | 
			
		||||
        rb.PushIpcInterface<ICommonStateGetter>();
 | 
			
		||||
        rb.PushIpcInterface<ICommonStateGetter>(msg_queue);
 | 
			
		||||
        LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -93,12 +95,15 @@ private:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::shared_ptr<NVFlinger::NVFlinger> nvflinger;
 | 
			
		||||
    std::shared_ptr<AppletMessageQueue> msg_queue;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ISystemAppletProxy final : public ServiceFramework<ISystemAppletProxy> {
 | 
			
		||||
public:
 | 
			
		||||
    explicit ISystemAppletProxy(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)
 | 
			
		||||
        : ServiceFramework("ISystemAppletProxy"), nvflinger(std::move(nvflinger)) {
 | 
			
		||||
    explicit ISystemAppletProxy(std::shared_ptr<NVFlinger::NVFlinger> nvflinger,
 | 
			
		||||
                                std::shared_ptr<AppletMessageQueue> msg_queue)
 | 
			
		||||
        : ServiceFramework("ISystemAppletProxy"), nvflinger(std::move(nvflinger)),
 | 
			
		||||
          msg_queue(std::move(msg_queue)) {
 | 
			
		||||
        static const FunctionInfo functions[] = {
 | 
			
		||||
            {0, &ISystemAppletProxy::GetCommonStateGetter, "GetCommonStateGetter"},
 | 
			
		||||
            {1, &ISystemAppletProxy::GetSelfController, "GetSelfController"},
 | 
			
		||||
@ -119,7 +124,7 @@ private:
 | 
			
		||||
    void GetCommonStateGetter(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
        rb.Push(RESULT_SUCCESS);
 | 
			
		||||
        rb.PushIpcInterface<ICommonStateGetter>();
 | 
			
		||||
        rb.PushIpcInterface<ICommonStateGetter>(msg_queue);
 | 
			
		||||
        LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -186,31 +191,34 @@ private:
 | 
			
		||||
        LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
    }
 | 
			
		||||
    std::shared_ptr<NVFlinger::NVFlinger> nvflinger;
 | 
			
		||||
    std::shared_ptr<AppletMessageQueue> msg_queue;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void AppletAE::OpenSystemAppletProxy(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushIpcInterface<ISystemAppletProxy>(nvflinger);
 | 
			
		||||
    rb.PushIpcInterface<ISystemAppletProxy>(nvflinger, msg_queue);
 | 
			
		||||
    LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AppletAE::OpenLibraryAppletProxy(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushIpcInterface<ILibraryAppletProxy>(nvflinger);
 | 
			
		||||
    rb.PushIpcInterface<ILibraryAppletProxy>(nvflinger, msg_queue);
 | 
			
		||||
    LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AppletAE::OpenLibraryAppletProxyOld(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushIpcInterface<ILibraryAppletProxy>(nvflinger);
 | 
			
		||||
    rb.PushIpcInterface<ILibraryAppletProxy>(nvflinger, msg_queue);
 | 
			
		||||
    LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AppletAE::AppletAE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)
 | 
			
		||||
    : ServiceFramework("appletAE"), nvflinger(std::move(nvflinger)) {
 | 
			
		||||
AppletAE::AppletAE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger,
 | 
			
		||||
                   std::shared_ptr<AppletMessageQueue> msg_queue)
 | 
			
		||||
    : ServiceFramework("appletAE"), nvflinger(std::move(nvflinger)),
 | 
			
		||||
      msg_queue(std::move(msg_queue)) {
 | 
			
		||||
    // clang-format off
 | 
			
		||||
    static const FunctionInfo functions[] = {
 | 
			
		||||
        {100, &AppletAE::OpenSystemAppletProxy, "OpenSystemAppletProxy"},
 | 
			
		||||
@ -228,4 +236,8 @@ AppletAE::AppletAE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)
 | 
			
		||||
 | 
			
		||||
AppletAE::~AppletAE() = default;
 | 
			
		||||
 | 
			
		||||
const std::shared_ptr<AppletMessageQueue>& AppletAE::GetMessageQueue() const {
 | 
			
		||||
    return msg_queue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Service::AM
 | 
			
		||||
 | 
			
		||||
@ -17,15 +17,19 @@ namespace AM {
 | 
			
		||||
 | 
			
		||||
class AppletAE final : public ServiceFramework<AppletAE> {
 | 
			
		||||
public:
 | 
			
		||||
    explicit AppletAE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger);
 | 
			
		||||
    explicit AppletAE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger,
 | 
			
		||||
                      std::shared_ptr<AppletMessageQueue> msg_queue);
 | 
			
		||||
    ~AppletAE() override;
 | 
			
		||||
 | 
			
		||||
    const std::shared_ptr<AppletMessageQueue>& GetMessageQueue() const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    void OpenSystemAppletProxy(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void OpenLibraryAppletProxy(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void OpenLibraryAppletProxyOld(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 | 
			
		||||
    std::shared_ptr<NVFlinger::NVFlinger> nvflinger;
 | 
			
		||||
    std::shared_ptr<AppletMessageQueue> msg_queue;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace AM
 | 
			
		||||
 | 
			
		||||
@ -12,8 +12,10 @@ namespace Service::AM {
 | 
			
		||||
 | 
			
		||||
class IApplicationProxy final : public ServiceFramework<IApplicationProxy> {
 | 
			
		||||
public:
 | 
			
		||||
    explicit IApplicationProxy(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)
 | 
			
		||||
        : ServiceFramework("IApplicationProxy"), nvflinger(std::move(nvflinger)) {
 | 
			
		||||
    explicit IApplicationProxy(std::shared_ptr<NVFlinger::NVFlinger> nvflinger,
 | 
			
		||||
                               std::shared_ptr<AppletMessageQueue> msg_queue)
 | 
			
		||||
        : ServiceFramework("IApplicationProxy"), nvflinger(std::move(nvflinger)),
 | 
			
		||||
          msg_queue(std::move(msg_queue)) {
 | 
			
		||||
        // clang-format off
 | 
			
		||||
        static const FunctionInfo functions[] = {
 | 
			
		||||
            {0, &IApplicationProxy::GetCommonStateGetter, "GetCommonStateGetter"},
 | 
			
		||||
@ -70,7 +72,7 @@ private:
 | 
			
		||||
    void GetCommonStateGetter(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
        rb.Push(RESULT_SUCCESS);
 | 
			
		||||
        rb.PushIpcInterface<ICommonStateGetter>();
 | 
			
		||||
        rb.PushIpcInterface<ICommonStateGetter>(msg_queue);
 | 
			
		||||
        LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -89,17 +91,20 @@ private:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::shared_ptr<NVFlinger::NVFlinger> nvflinger;
 | 
			
		||||
    std::shared_ptr<AppletMessageQueue> msg_queue;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void AppletOE::OpenApplicationProxy(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushIpcInterface<IApplicationProxy>(nvflinger);
 | 
			
		||||
    rb.PushIpcInterface<IApplicationProxy>(nvflinger, msg_queue);
 | 
			
		||||
    LOG_DEBUG(Service_AM, "called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AppletOE::AppletOE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)
 | 
			
		||||
    : ServiceFramework("appletOE"), nvflinger(std::move(nvflinger)) {
 | 
			
		||||
AppletOE::AppletOE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger,
 | 
			
		||||
                   std::shared_ptr<AppletMessageQueue> msg_queue)
 | 
			
		||||
    : ServiceFramework("appletOE"), nvflinger(std::move(nvflinger)),
 | 
			
		||||
      msg_queue(std::move(msg_queue)) {
 | 
			
		||||
    static const FunctionInfo functions[] = {
 | 
			
		||||
        {0, &AppletOE::OpenApplicationProxy, "OpenApplicationProxy"},
 | 
			
		||||
    };
 | 
			
		||||
@ -108,4 +113,8 @@ AppletOE::AppletOE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)
 | 
			
		||||
 | 
			
		||||
AppletOE::~AppletOE() = default;
 | 
			
		||||
 | 
			
		||||
const std::shared_ptr<AppletMessageQueue>& AppletOE::GetMessageQueue() const {
 | 
			
		||||
    return msg_queue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Service::AM
 | 
			
		||||
 | 
			
		||||
@ -17,13 +17,17 @@ namespace AM {
 | 
			
		||||
 | 
			
		||||
class AppletOE final : public ServiceFramework<AppletOE> {
 | 
			
		||||
public:
 | 
			
		||||
    explicit AppletOE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger);
 | 
			
		||||
    explicit AppletOE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger,
 | 
			
		||||
                      std::shared_ptr<AppletMessageQueue> msg_queue);
 | 
			
		||||
    ~AppletOE() override;
 | 
			
		||||
 | 
			
		||||
    const std::shared_ptr<AppletMessageQueue>& GetMessageQueue() const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    void OpenApplicationProxy(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 | 
			
		||||
    std::shared_ptr<NVFlinger::NVFlinger> nvflinger;
 | 
			
		||||
    std::shared_ptr<AppletMessageQueue> msg_queue;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace AM
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,10 @@
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#include "core/core.h"
 | 
			
		||||
#include "core/hle/service/am/am.h"
 | 
			
		||||
#include "core/hle/service/am/applet_ae.h"
 | 
			
		||||
#include "core/hle/service/am/applet_oe.h"
 | 
			
		||||
#include "core/hle/service/sm/sm.h"
 | 
			
		||||
#include "core/settings.h"
 | 
			
		||||
#include "ui_configure_general.h"
 | 
			
		||||
#include "yuzu/configuration/configure_general.h"
 | 
			
		||||
@ -20,7 +24,6 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent)
 | 
			
		||||
    this->setConfiguration();
 | 
			
		||||
 | 
			
		||||
    ui->use_cpu_jit->setEnabled(!Core::System::GetInstance().IsPoweredOn());
 | 
			
		||||
    ui->use_docked_mode->setEnabled(!Core::System::GetInstance().IsPoweredOn());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ConfigureGeneral::~ConfigureGeneral() = default;
 | 
			
		||||
@ -38,6 +41,30 @@ void ConfigureGeneral::PopulateHotkeyList(const HotkeyRegistry& registry) {
 | 
			
		||||
    ui->widget->Populate(registry);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigureGeneral::OnDockedModeChanged(bool last_state, bool new_state) {
 | 
			
		||||
    if (last_state == new_state) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Core::System& system{Core::System::GetInstance()};
 | 
			
		||||
    Service::SM::ServiceManager& sm = system.ServiceManager();
 | 
			
		||||
 | 
			
		||||
    // Message queue is shared between these services, we just need to signal an operation
 | 
			
		||||
    // change to one and it will handle both automatically
 | 
			
		||||
    auto applet_oe = sm.GetService<Service::AM::AppletOE>("appletOE");
 | 
			
		||||
    auto applet_ae = sm.GetService<Service::AM::AppletAE>("appletAE");
 | 
			
		||||
    bool has_signalled = false;
 | 
			
		||||
 | 
			
		||||
    if (applet_oe != nullptr) {
 | 
			
		||||
        applet_oe->GetMessageQueue()->OperationModeChanged();
 | 
			
		||||
        has_signalled = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (applet_ae != nullptr && !has_signalled) {
 | 
			
		||||
        applet_ae->GetMessageQueue()->OperationModeChanged();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigureGeneral::applyConfiguration() {
 | 
			
		||||
    UISettings::values.gamedir_deepscan = ui->toggle_deepscan->isChecked();
 | 
			
		||||
    UISettings::values.confirm_before_closing = ui->toggle_check_exit->isChecked();
 | 
			
		||||
@ -45,6 +72,9 @@ void ConfigureGeneral::applyConfiguration() {
 | 
			
		||||
        ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString();
 | 
			
		||||
 | 
			
		||||
    Settings::values.use_cpu_jit = ui->use_cpu_jit->isChecked();
 | 
			
		||||
    const bool pre_docked_mode = Settings::values.use_docked_mode;
 | 
			
		||||
    Settings::values.use_docked_mode = ui->use_docked_mode->isChecked();
 | 
			
		||||
    OnDockedModeChanged(pre_docked_mode, Settings::values.use_docked_mode);
 | 
			
		||||
 | 
			
		||||
    Settings::values.enable_nfc = ui->enable_nfc->isChecked();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@ public:
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    void setConfiguration();
 | 
			
		||||
    void OnDockedModeChanged(bool last_state, bool new_state);
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<Ui::ConfigureGeneral> ui;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user