ButtonComboAPI: Add C++ wrapper for button combo api

This commit is contained in:
Maschell 2024-12-31 12:52:55 +01:00
parent 8e1c883826
commit 67b84311b3
4 changed files with 428 additions and 0 deletions

View File

@ -0,0 +1,57 @@
#pragma once
#ifdef __cplusplus
#include "defines.h"
#include <coreinit/debug.h>
#include <optional>
class WUPSButtonCombo {
public:
static std::optional<WUPSButtonCombo> Create(const WUPSButtonCombo_ComboOptions &options,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept;
static WUPSButtonCombo Create(const WUPSButtonCombo_ComboOptions &options,
WUPSButtonCombo_ComboStatus &outStatus);
~WUPSButtonCombo();
WUPSButtonCombo(const WUPSButtonCombo &) = delete;
WUPSButtonCombo(WUPSButtonCombo &&other) noexcept;
WUPSButtonCombo &operator=(const WUPSButtonCombo &) = delete;
WUPSButtonCombo &operator=(WUPSButtonCombo &&other) noexcept;
[[nodiscard]] WUPSButtonCombo_ComboHandle getHandle() const;
WUPSButtonCombo_Error GetButtonComboStatus(WUPSButtonCombo_ComboStatus &outStatus) const;
[[nodiscard]] WUPSButtonCombo_Error UpdateButtonComboMeta(const WUPSButtonCombo_MetaOptions &metaOptions) const;
[[nodiscard]] WUPSButtonCombo_Error UpdateButtonComboCallback(const WUPSButtonCombo_CallbackOptions &callbackOptions) const;
[[nodiscard]] WUPSButtonCombo_Error UpdateControllerMask(WUPSButtonCombo_ControllerTypes controllerMask,
WUPSButtonCombo_ComboStatus &outStatus) const;
[[nodiscard]] WUPSButtonCombo_Error UpdateButtonCombo(WUPSButtonCombo_Buttons combo,
WUPSButtonCombo_ComboStatus &outStatus) const;
[[nodiscard]] WUPSButtonCombo_Error UpdateHoldDuration(uint32_t holdDurationInFrames) const;
[[nodiscard]] WUPSButtonCombo_Error GetButtonComboMeta(WUPSButtonCombo_MetaOptionsOut &outOptions) const;
WUPSButtonCombo_Error GetButtonComboCallback(WUPSButtonCombo_CallbackOptions &outOptions) const;
WUPSButtonCombo_Error GetButtonComboInfoEx(WUPSButtonCombo_ButtonComboInfoEx &outOptions) const;
private:
void ReleaseButtonComboHandle();
explicit WUPSButtonCombo(WUPSButtonCombo_ComboHandle handle);
WUPSButtonCombo_ComboHandle mHandle = WUPSButtonCombo_ComboHandle(nullptr);
};
#endif

View File

@ -154,3 +154,110 @@ WUPSButtonCombo_Error WUPSButtonComboAPI_DetectButtonCombo_Blocking(const WUPSBu
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
namespace WUPSButtonComboAPI {
std::string_view GetStatusStr(WUPSButtonCombo_Error status);
std::optional<WUPSButtonCombo> CreateComboPressDownEx(std::string_view label,
WUPSButtonCombo_ControllerTypes controllerMask,
WUPSButtonCombo_Buttons combo,
WUPSButtonCombo_ComboCallback callback,
void *context,
bool observer,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept;
std::optional<WUPSButtonCombo> CreateComboPressDown(std::string_view label,
WUPSButtonCombo_Buttons combo,
WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept;
std::optional<WUPSButtonCombo> CreateComboPressDownObserver(std::string_view label,
WUPSButtonCombo_Buttons combo,
WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept;
std::optional<WUPSButtonCombo> CreateComboHoldEx(std::string_view label,
WUPSButtonCombo_ControllerTypes controllerMask,
WUPSButtonCombo_Buttons combo,
uint32_t holdDurationInMs,
WUPSButtonCombo_ComboCallback callback,
void *context,
bool observer,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept;
std::optional<WUPSButtonCombo> CreateComboHold(std::string_view label,
WUPSButtonCombo_Buttons combo,
uint32_t holdDurationInMs,
WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept;
std::optional<WUPSButtonCombo> CreateComboHoldObserver(std::string_view label,
WUPSButtonCombo_Buttons combo,
uint32_t holdDurationInMs,
WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept;
WUPSButtonCombo CreateComboPressDownEx(std::string_view label,
WUPSButtonCombo_ControllerTypes controllerMask,
WUPSButtonCombo_Buttons combo,
WUPSButtonCombo_ComboCallback callback,
void *context,
bool observer,
WUPSButtonCombo_ComboStatus &outStatus);
WUPSButtonCombo CreateComboPressDown(std::string_view label,
WUPSButtonCombo_Buttons combo,
WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus);
WUPSButtonCombo CreateComboPressDownObserver(std::string_view label,
WUPSButtonCombo_Buttons combo,
WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus);
WUPSButtonCombo CreateComboHoldEx(std::string_view label,
WUPSButtonCombo_ControllerTypes controllerMask,
WUPSButtonCombo_Buttons combo,
uint32_t holdDurationInMs,
WUPSButtonCombo_ComboCallback callback,
void *context,
bool observer,
WUPSButtonCombo_ComboStatus &outStatus);
WUPSButtonCombo CreateComboHold(std::string_view label,
WUPSButtonCombo_Buttons combo,
uint32_t holdDurationInMs,
WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus);
WUPSButtonCombo CreateComboHoldObserver(std::string_view label,
WUPSButtonCombo_Buttons combo,
uint32_t holdDurationInMs,
WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus);
WUPSButtonCombo_Error CheckComboAvailable(const WUPSButtonCombo_ButtonComboOptions &options,
WUPSButtonCombo_ComboStatus &outStatus);
WUPSButtonCombo_Error DetectButtonCombo_Blocking(const WUPSButtonCombo_DetectButtonComboOptions &options,
WUPSButtonCombo_Buttons &outButtons);
} // namespace WUPSButtonComboAPI
#endif

View File

@ -0,0 +1,103 @@
#include "wups/button_combo/WUPSButtonCombo.h"
#include <coreinit/debug.h>
#include <stdexcept>
#include <wups/button_combo/api.h>
std::optional<WUPSButtonCombo> WUPSButtonCombo::Create(const WUPSButtonCombo_ComboOptions &options,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept {
WUPSButtonCombo_ComboHandle handle;
if (outError = WUPSButtonComboAPI_AddButtonCombo(&options, &handle, &outStatus); outError == WUPS_BUTTON_COMBO_ERROR_SUCCESS) {
return WUPSButtonCombo(handle);
}
return {};
}
WUPSButtonCombo WUPSButtonCombo::Create(const WUPSButtonCombo_ComboOptions &options,
WUPSButtonCombo_ComboStatus &outStatus) {
WUPSButtonCombo_Error error;
auto res = Create(options, outStatus, error);
if (!res) {
throw std::runtime_error{std::string("Failed to create button combo: ").append(WUPSButtonComboAPI_GetStatusStr(error))};
}
return std::move(*res);
}
WUPSButtonCombo::~WUPSButtonCombo() {
ReleaseButtonComboHandle();
}
void WUPSButtonCombo::ReleaseButtonComboHandle() {
if (mHandle != nullptr) {
if (const auto res = WUPSButtonComboAPI_RemoveButtonCombo(mHandle); res != WUPS_BUTTON_COMBO_ERROR_SUCCESS) {
OSReport("WUPSButtonCombo::ReleaseButtonComboHandle(): WUPSButtonComboAPI_RemoveButtonCombo for %08X returned: %s\n", mHandle, WUPSButtonComboAPI_GetStatusStr(res));
}
mHandle = WUPSButtonCombo_ComboHandle(nullptr);
}
}
WUPSButtonCombo::WUPSButtonCombo(WUPSButtonCombo &&src) noexcept {
ReleaseButtonComboHandle();
mHandle = src.mHandle;
src.mHandle = WUPSButtonCombo_ComboHandle(nullptr);
}
WUPSButtonCombo &WUPSButtonCombo::operator=(WUPSButtonCombo &&src) noexcept {
if (this != &src) {
ReleaseButtonComboHandle();
mHandle = src.mHandle;
src.mHandle = WUPSButtonCombo_ComboHandle(nullptr);
}
return *this;
}
[[nodiscard]] WUPSButtonCombo_ComboHandle WUPSButtonCombo::getHandle() const {
return mHandle;
}
WUPSButtonCombo_Error WUPSButtonCombo::GetButtonComboStatus(WUPSButtonCombo_ComboStatus &outStatus) const {
return WUPSButtonComboAPI_GetButtonComboStatus(mHandle, &outStatus);
}
[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateButtonComboMeta(const WUPSButtonCombo_MetaOptions &metaOptions) const {
return WUPSButtonComboAPI_UpdateButtonComboMeta(mHandle, &metaOptions);
}
[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateButtonComboCallback(const WUPSButtonCombo_CallbackOptions &callbackOptions) const {
return WUPSButtonComboAPI_UpdateButtonComboCallback(mHandle, &callbackOptions);
}
[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateControllerMask(const WUPSButtonCombo_ControllerTypes controllerMask,
WUPSButtonCombo_ComboStatus &outStatus) const {
return WUPSButtonComboAPI_UpdateControllerMask(mHandle, controllerMask, &outStatus);
}
[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateButtonCombo(const WUPSButtonCombo_Buttons combo,
WUPSButtonCombo_ComboStatus &outStatus) const {
return WUPSButtonComboAPI_UpdateButtonCombo(mHandle, combo, &outStatus);
}
[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateHoldDuration(const uint32_t holdDurationInFrames) const {
return WUPSButtonComboAPI_UpdateHoldDuration(mHandle, holdDurationInFrames);
}
[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::GetButtonComboMeta(WUPSButtonCombo_MetaOptionsOut &outOptions) const {
return WUPSButtonComboAPI_GetButtonComboMeta(mHandle, &outOptions);
}
WUPSButtonCombo_Error WUPSButtonCombo::GetButtonComboCallback(WUPSButtonCombo_CallbackOptions &outOptions) const {
return WUPSButtonComboAPI_GetButtonComboCallback(mHandle, &outOptions);
}
WUPSButtonCombo_Error WUPSButtonCombo::GetButtonComboInfoEx(WUPSButtonCombo_ButtonComboInfoEx &outOptions) const {
return WUPSButtonComboAPI_GetButtonComboInfoEx(mHandle, &outOptions);
}
WUPSButtonCombo::WUPSButtonCombo(const WUPSButtonCombo_ComboHandle handle) : mHandle(handle) {
}

View File

@ -0,0 +1,161 @@
#include <stdexcept>
#include <wups/button_combo/api.h>
#include <wups/button_combo/defines.h>
namespace WUPSButtonComboAPI {
std::string_view GetStatusStr(const WUPSButtonCombo_Error status) {
return WUPSButtonComboAPI_GetStatusStr(status);
}
std::optional<WUPSButtonCombo> CreateComboPressDownEx(const std::string_view label,
const WUPSButtonCombo_ControllerTypes controllerMask,
const WUPSButtonCombo_Buttons combo,
const WUPSButtonCombo_ComboCallback callback,
void *context,
const bool observer,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept {
WUPSButtonCombo_ComboOptions options = {};
options.metaOptions.label = label.data();
options.callbackOptions = {.callback = callback, .context = context};
options.buttonComboOptions.type = observer ? WUPS_BUTTON_COMBO_COMBO_TYPE_PRESS_DOWN_OBSERVER : WUPS_BUTTON_COMBO_COMBO_TYPE_PRESS_DOWN;
options.buttonComboOptions.basicCombo.combo = combo;
options.buttonComboOptions.basicCombo.controllerMask = controllerMask;
return WUPSButtonCombo::Create(options, outStatus, outError);
}
std::optional<WUPSButtonCombo> CreateComboPressDown(const std::string_view label,
const WUPSButtonCombo_Buttons combo,
const WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept {
return CreateComboPressDownEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, callback, context, false, outStatus, outError);
}
std::optional<WUPSButtonCombo> CreateComboPressDownObserver(const std::string_view label,
const WUPSButtonCombo_Buttons combo,
const WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept {
return CreateComboPressDownEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, callback, context, true, outStatus, outError);
}
std::optional<WUPSButtonCombo> CreateComboHoldEx(const std::string_view label,
const WUPSButtonCombo_ControllerTypes controllerMask,
const WUPSButtonCombo_Buttons combo,
const uint32_t holdDurationInMs,
const WUPSButtonCombo_ComboCallback callback,
void *context,
const bool observer,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept {
WUPSButtonCombo_ComboOptions options = {};
options.metaOptions.label = label.data();
options.callbackOptions = {.callback = callback, .context = context};
options.buttonComboOptions.type = observer ? WUPS_BUTTON_COMBO_COMBO_TYPE_HOLD_OBSERVER : WUPS_BUTTON_COMBO_COMBO_TYPE_HOLD;
options.buttonComboOptions.basicCombo.combo = combo;
options.buttonComboOptions.basicCombo.controllerMask = controllerMask;
options.buttonComboOptions.optionalHoldForXMs = holdDurationInMs;
return WUPSButtonCombo::Create(options, outStatus, outError);
}
std::optional<WUPSButtonCombo> CreateComboHold(const std::string_view label,
const WUPSButtonCombo_Buttons combo,
const uint32_t holdDurationInMs,
const WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept {
return CreateComboHoldEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, false, outStatus, outError);
}
std::optional<WUPSButtonCombo> CreateComboHoldObserver(const std::string_view label,
const WUPSButtonCombo_Buttons combo,
const uint32_t holdDurationInMs,
const WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus,
WUPSButtonCombo_Error &outError) noexcept {
return CreateComboHoldEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, true, outStatus, outError);
}
WUPSButtonCombo CreateComboPressDownEx(const std::string_view label,
const WUPSButtonCombo_ControllerTypes controllerMask,
const WUPSButtonCombo_Buttons combo,
const WUPSButtonCombo_ComboCallback callback,
void *context,
const bool observer,
WUPSButtonCombo_ComboStatus &outStatus) {
WUPSButtonCombo_Error error;
auto res = CreateComboPressDownEx(label, controllerMask, combo, callback, context, observer, outStatus, error);
if (!res) {
throw std::runtime_error{std::string("Failed to create press down ex button combo: ").append(WUPSButtonComboAPI_GetStatusStr(error))};
}
return std::move(*res);
}
WUPSButtonCombo CreatePressDown(const std::string_view label,
const WUPSButtonCombo_Buttons combo,
const WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus) {
return CreateComboPressDownEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, callback, context, false, outStatus);
}
WUPSButtonCombo CreatePressDownObserver(const std::string_view label,
const WUPSButtonCombo_Buttons combo,
const WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus) {
return CreateComboPressDownEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, callback, context, true, outStatus);
}
WUPSButtonCombo CreateComboHoldEx(const std::string_view label,
const WUPSButtonCombo_ControllerTypes controllerMask,
const WUPSButtonCombo_Buttons combo,
const uint32_t holdDurationInMs,
const WUPSButtonCombo_ComboCallback callback,
void *context,
const bool observer,
WUPSButtonCombo_ComboStatus &outStatus) {
WUPSButtonCombo_Error error;
auto res = CreateComboHoldEx(label, controllerMask, combo, holdDurationInMs, callback, context, observer, outStatus, error);
if (!res) {
throw std::runtime_error{std::string("Failed to create press down ex button combo: ").append(WUPSButtonComboAPI_GetStatusStr(error))};
}
return std::move(*res);
}
WUPSButtonCombo CreateComboHold(const std::string_view label,
const WUPSButtonCombo_Buttons combo,
const uint32_t holdDurationInMs,
const WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus) {
return CreateComboHoldEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, false, outStatus);
}
WUPSButtonCombo CreateComboHoldObserver(const std::string_view label,
const WUPSButtonCombo_Buttons combo,
const uint32_t holdDurationInMs,
const WUPSButtonCombo_ComboCallback callback,
void *context,
WUPSButtonCombo_ComboStatus &outStatus) {
return CreateComboHoldEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, true, outStatus);
}
WUPSButtonCombo_Error CheckComboAvailable(const WUPSButtonCombo_ButtonComboOptions &options,
WUPSButtonCombo_ComboStatus &outStatus) {
return WUPSButtonComboAPI_CheckComboAvailable(&options, &outStatus);
}
WUPSButtonCombo_Error DetectButtonCombo_Blocking(const WUPSButtonCombo_DetectButtonComboOptions &options,
WUPSButtonCombo_Buttons &outButtons) {
return WUPSButtonComboAPI_DetectButtonCombo_Blocking(&options, &outButtons);
}
} // namespace WUPSButtonComboAPI