8 changed files with 121 additions and 118 deletions
-
4src/core/CMakeLists.txt
-
2src/core/hle/service/am/service/application_proxy.cpp
-
2src/core/hle/service/am/service/library_applet_proxy.cpp
-
2src/core/hle/service/am/service/system_applet_proxy.cpp
-
86src/core/hle/service/am/service/window_controller.cpp
-
30src/core/hle/service/am/service/window_controller.h
-
86src/core/hle/service/am/window_controller.cpp
-
27src/core/hle/service/am/window_controller.h
@ -0,0 +1,86 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
|
||||
|
#include "core/hle/service/am/applet.h"
|
||||
|
#include "core/hle/service/am/applet_manager.h"
|
||||
|
#include "core/hle/service/am/service/window_controller.h"
|
||||
|
#include "core/hle/service/cmif_serialization.h"
|
||||
|
|
||||
|
namespace Service::AM { |
||||
|
|
||||
|
IWindowController::IWindowController(Core::System& system_, std::shared_ptr<Applet> applet) |
||||
|
: ServiceFramework{system_, "IWindowController"}, m_applet{std::move(applet)} { |
||||
|
// clang-format off
|
||||
|
static const FunctionInfo functions[] = { |
||||
|
{0, nullptr, "CreateWindow"}, |
||||
|
{1, D<&IWindowController::GetAppletResourceUserId>, "GetAppletResourceUserId"}, |
||||
|
{2, D<&IWindowController::GetAppletResourceUserIdOfCallerApplet>, "GetAppletResourceUserIdOfCallerApplet"}, |
||||
|
{10, D<&IWindowController::AcquireForegroundRights>, "AcquireForegroundRights"}, |
||||
|
{11, D<&IWindowController::ReleaseForegroundRights>, "ReleaseForegroundRights"}, |
||||
|
{12, D<&IWindowController::RejectToChangeIntoBackground>, "RejectToChangeIntoBackground"}, |
||||
|
{20, D<&IWindowController::SetAppletWindowVisibility>, "SetAppletWindowVisibility"}, |
||||
|
{21, D<&IWindowController::SetAppletGpuTimeSlice>, "SetAppletGpuTimeSlice"}, |
||||
|
}; |
||||
|
// clang-format on
|
||||
|
|
||||
|
RegisterHandlers(functions); |
||||
|
} |
||||
|
|
||||
|
IWindowController::~IWindowController() = default; |
||||
|
|
||||
|
Result IWindowController::GetAppletResourceUserId(Out<AppletResourceUserId> out_aruid) { |
||||
|
LOG_INFO(Service_AM, "called"); |
||||
|
*out_aruid = m_applet->aruid; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result IWindowController::GetAppletResourceUserIdOfCallerApplet( |
||||
|
Out<AppletResourceUserId> out_aruid) { |
||||
|
LOG_INFO(Service_AM, "called"); |
||||
|
|
||||
|
if (auto caller_applet = m_applet->caller_applet.lock(); caller_applet != nullptr) { |
||||
|
*out_aruid = caller_applet->aruid; |
||||
|
} else { |
||||
|
*out_aruid = AppletResourceUserId{}; |
||||
|
} |
||||
|
|
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result IWindowController::AcquireForegroundRights() { |
||||
|
LOG_INFO(Service_AM, "called"); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result IWindowController::ReleaseForegroundRights() { |
||||
|
LOG_INFO(Service_AM, "called"); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result IWindowController::RejectToChangeIntoBackground() { |
||||
|
LOG_INFO(Service_AM, "called"); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result IWindowController::SetAppletWindowVisibility(bool visible) { |
||||
|
m_applet->system_buffer_manager.SetWindowVisibility(visible); |
||||
|
m_applet->hid_registration.EnableAppletToGetInput(visible); |
||||
|
|
||||
|
if (visible) { |
||||
|
m_applet->message_queue.PushMessage(AppletMessage::ChangeIntoForeground); |
||||
|
m_applet->focus_state = FocusState::InFocus; |
||||
|
} else { |
||||
|
m_applet->focus_state = FocusState::NotInFocus; |
||||
|
} |
||||
|
|
||||
|
m_applet->message_queue.PushMessage(AppletMessage::FocusStateChanged); |
||||
|
|
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result IWindowController::SetAppletGpuTimeSlice(s64 time_slice) { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called, time_slice={}", time_slice); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
} // namespace Service::AM
|
||||
@ -0,0 +1,30 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include "core/hle/service/cmif_types.h" |
||||
|
#include "core/hle/service/service.h" |
||||
|
|
||||
|
namespace Service::AM { |
||||
|
|
||||
|
struct Applet; |
||||
|
|
||||
|
class IWindowController final : public ServiceFramework<IWindowController> { |
||||
|
public: |
||||
|
explicit IWindowController(Core::System& system_, std::shared_ptr<Applet> applet); |
||||
|
~IWindowController() override; |
||||
|
|
||||
|
private: |
||||
|
Result GetAppletResourceUserId(Out<AppletResourceUserId> out_aruid); |
||||
|
Result GetAppletResourceUserIdOfCallerApplet(Out<AppletResourceUserId> out_aruid); |
||||
|
Result AcquireForegroundRights(); |
||||
|
Result ReleaseForegroundRights(); |
||||
|
Result RejectToChangeIntoBackground(); |
||||
|
Result SetAppletWindowVisibility(bool visible); |
||||
|
Result SetAppletGpuTimeSlice(s64 time_slice); |
||||
|
|
||||
|
const std::shared_ptr<Applet> m_applet; |
||||
|
}; |
||||
|
|
||||
|
} // namespace Service::AM |
||||
@ -1,86 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||
|
|
||||
#include "core/hle/service/am/applet.h"
|
|
||||
#include "core/hle/service/am/window_controller.h"
|
|
||||
#include "core/hle/service/ipc_helpers.h"
|
|
||||
|
|
||||
namespace Service::AM { |
|
||||
|
|
||||
IWindowController::IWindowController(Core::System& system_, std::shared_ptr<Applet> applet_) |
|
||||
: ServiceFramework{system_, "IWindowController"}, applet{std::move(applet_)} { |
|
||||
// clang-format off
|
|
||||
static const FunctionInfo functions[] = { |
|
||||
{0, nullptr, "CreateWindow"}, |
|
||||
{1, &IWindowController::GetAppletResourceUserId, "GetAppletResourceUserId"}, |
|
||||
{2, &IWindowController::GetAppletResourceUserIdOfCallerApplet, "GetAppletResourceUserIdOfCallerApplet"}, |
|
||||
{10, &IWindowController::AcquireForegroundRights, "AcquireForegroundRights"}, |
|
||||
{11, nullptr, "ReleaseForegroundRights"}, |
|
||||
{12, nullptr, "RejectToChangeIntoBackground"}, |
|
||||
{20, &IWindowController::SetAppletWindowVisibility, "SetAppletWindowVisibility"}, |
|
||||
{21, &IWindowController::SetAppletGpuTimeSlice, "SetAppletGpuTimeSlice"}, |
|
||||
}; |
|
||||
// clang-format on
|
|
||||
|
|
||||
RegisterHandlers(functions); |
|
||||
} |
|
||||
|
|
||||
IWindowController::~IWindowController() = default; |
|
||||
|
|
||||
void IWindowController::GetAppletResourceUserId(HLERequestContext& ctx) { |
|
||||
IPC::ResponseBuilder rb{ctx, 4}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.Push<u64>(applet->aruid); |
|
||||
} |
|
||||
|
|
||||
void IWindowController::GetAppletResourceUserIdOfCallerApplet(HLERequestContext& ctx) { |
|
||||
u64 aruid = 0; |
|
||||
if (auto caller = applet->caller_applet.lock(); caller) { |
|
||||
aruid = caller->aruid; |
|
||||
} |
|
||||
|
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 4}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.Push<u64>(aruid); |
|
||||
} |
|
||||
|
|
||||
void IWindowController::AcquireForegroundRights(HLERequestContext& ctx) { |
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
void IWindowController::SetAppletWindowVisibility(HLERequestContext& ctx) { |
|
||||
LOG_INFO(Service_AM, "called"); |
|
||||
|
|
||||
IPC::RequestParser rp{ctx}; |
|
||||
const bool visible = rp.Pop<bool>(); |
|
||||
|
|
||||
applet->system_buffer_manager.SetWindowVisibility(visible); |
|
||||
applet->hid_registration.EnableAppletToGetInput(visible); |
|
||||
|
|
||||
if (visible) { |
|
||||
applet->focus_state = FocusState::InFocus; |
|
||||
applet->message_queue.PushMessage(AppletMessage::ChangeIntoForeground); |
|
||||
} else { |
|
||||
applet->focus_state = FocusState::NotInFocus; |
|
||||
applet->message_queue.PushMessage(AppletMessage::ChangeIntoBackground); |
|
||||
} |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
void IWindowController::SetAppletGpuTimeSlice(HLERequestContext& ctx) { |
|
||||
IPC::RequestParser rp{ctx}; |
|
||||
const auto time_slice = rp.Pop<s64>(); |
|
||||
|
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called, time_slice={}", time_slice); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
} // namespace Service::AM
|
|
||||
@ -1,27 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project |
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
|
|
||||
#pragma once |
|
||||
|
|
||||
#include "core/hle/service/service.h" |
|
||||
|
|
||||
namespace Service::AM { |
|
||||
|
|
||||
struct Applet; |
|
||||
|
|
||||
class IWindowController final : public ServiceFramework<IWindowController> { |
|
||||
public: |
|
||||
explicit IWindowController(Core::System& system_, std::shared_ptr<Applet> applet_); |
|
||||
~IWindowController() override; |
|
||||
|
|
||||
private: |
|
||||
void GetAppletResourceUserId(HLERequestContext& ctx); |
|
||||
void GetAppletResourceUserIdOfCallerApplet(HLERequestContext& ctx); |
|
||||
void AcquireForegroundRights(HLERequestContext& ctx); |
|
||||
void SetAppletWindowVisibility(HLERequestContext& ctx); |
|
||||
void SetAppletGpuTimeSlice(HLERequestContext& ctx); |
|
||||
|
|
||||
const std::shared_ptr<Applet> applet; |
|
||||
}; |
|
||||
|
|
||||
} // namespace Service::AM |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue