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