Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions include/buttoncombo/ButtonCombo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#pragma once

#ifdef __cplusplus

#include "defines.h"

#include <optional>

namespace ButtonComboModule {
class ButtonCombo {
public:
static std::optional<ButtonCombo> Create(const ButtonComboModule_ComboOptions &options,
ButtonComboModule_ComboStatus &outStatus,
ButtonComboModule_Error &outError) noexcept;

static ButtonCombo Create(const ButtonComboModule_ComboOptions &options,
ButtonComboModule_ComboStatus &outStatus);

~ButtonCombo();
ButtonCombo(const ButtonCombo &) = delete;

ButtonCombo(ButtonCombo &&src) noexcept;

ButtonCombo &operator=(const ButtonCombo &) = delete;

ButtonCombo &operator=(ButtonCombo &&src) noexcept;

[[nodiscard]] ButtonComboModule_ComboHandle getHandle() const;

ButtonComboModule_Error GetButtonComboStatus(ButtonComboModule_ComboStatus &outStatus) const;

[[nodiscard]] ButtonComboModule_Error UpdateButtonComboMeta(const ButtonComboModule_MetaOptions &metaOptions) const;

[[nodiscard]] ButtonComboModule_Error UpdateButtonComboCallback(const ButtonComboModule_CallbackOptions &callbackOptions) const;

[[nodiscard]] ButtonComboModule_Error UpdateControllerMask(ButtonComboModule_ControllerTypes controllerMask,
ButtonComboModule_ComboStatus &outStatus) const;

[[nodiscard]] ButtonComboModule_Error UpdateButtonCombo(ButtonComboModule_Buttons combo,
ButtonComboModule_ComboStatus &outStatus) const;

[[nodiscard]] ButtonComboModule_Error UpdateHoldDuration(uint32_t holdDurationInFrames) const;

[[nodiscard]] ButtonComboModule_Error GetButtonComboMeta(ButtonComboModule_MetaOptionsOut &outOptions) const;

ButtonComboModule_Error GetButtonComboCallback(ButtonComboModule_CallbackOptions &outOptions) const;

ButtonComboModule_Error GetButtonComboInfoEx(ButtonComboModule_ButtonComboInfoEx &outOptions) const;

private:
void ReleaseButtonComboHandle();

explicit ButtonCombo(ButtonComboModule_ComboHandle handle);

ButtonComboModule_ComboHandle mHandle = ButtonComboModule_ComboHandle(nullptr);
};
} // namespace ButtonComboModule
#endif
109 changes: 109 additions & 0 deletions include/buttoncombo/manager.h → include/buttoncombo/api.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,112 @@ ButtonComboModule_Error ButtonComboModule_DetectButtonCombo_Blocking(const Butto
#ifdef __cplusplus
}
#endif

#ifdef __cplusplus

#include "ButtonCombo.h"
#include <optional>
#include <string_view>

namespace ButtonComboModule {
std::string_view GetStatusStr(ButtonComboModule_Error status);

std::optional<ButtonCombo> CreateComboPressDownEx(std::string_view label,
ButtonComboModule_ControllerTypes controllerMask,
ButtonComboModule_Buttons combo,
ButtonComboModule_ComboCallback callback,
void *context,
bool observer,
ButtonComboModule_ComboStatus &outStatus,
ButtonComboModule_Error &outError) noexcept;

std::optional<ButtonCombo> CreateComboPressDown(std::string_view label,
ButtonComboModule_Buttons combo,
ButtonComboModule_ComboCallback callback,
void *context,
ButtonComboModule_ComboStatus &outStatus,
ButtonComboModule_Error &outError) noexcept;

std::optional<ButtonCombo> CreateComboPressDownObserver(std::string_view label,
ButtonComboModule_Buttons combo,
ButtonComboModule_ComboCallback callback,
void *context,
ButtonComboModule_ComboStatus &outStatus,
ButtonComboModule_Error &outError) noexcept;

std::optional<ButtonCombo> CreateComboHoldEx(std::string_view label,
ButtonComboModule_ControllerTypes controllerMask,
ButtonComboModule_Buttons combo,
uint32_t holdDurationInMs,
ButtonComboModule_ComboCallback callback,
void *context,
bool observer,
ButtonComboModule_ComboStatus &outStatus,
ButtonComboModule_Error &outError) noexcept;

std::optional<ButtonCombo> CreateComboHold(std::string_view label,
ButtonComboModule_Buttons combo,
uint32_t holdDurationInMs,
ButtonComboModule_ComboCallback callback,
void *context,
ButtonComboModule_ComboStatus &outStatus,
ButtonComboModule_Error &outError) noexcept;

std::optional<ButtonCombo> CreateComboHoldObserver(std::string_view label,
ButtonComboModule_Buttons combo,
uint32_t holdDurationInMs,
ButtonComboModule_ComboCallback callback,
void *context,
ButtonComboModule_ComboStatus &outStatus,
ButtonComboModule_Error &outError) noexcept;


ButtonCombo CreateComboPressDownEx(std::string_view label,
ButtonComboModule_ControllerTypes controllerMask,
ButtonComboModule_Buttons combo,
ButtonComboModule_ComboCallback callback,
void *context,
bool observer,
ButtonComboModule_ComboStatus &outStatus);

ButtonCombo CreateComboPressDown(std::string_view label,
ButtonComboModule_Buttons combo,
ButtonComboModule_ComboCallback callback,
void *context,
ButtonComboModule_ComboStatus &outStatus);

ButtonCombo CreateComboPressDownObserver(std::string_view label,
ButtonComboModule_Buttons combo,
ButtonComboModule_ComboCallback callback,
void *context,
ButtonComboModule_ComboStatus &outStatus);

ButtonCombo CreateComboHoldEx(std::string_view label,
ButtonComboModule_ControllerTypes controllerMask,
ButtonComboModule_Buttons combo,
uint32_t holdDurationInMs,
ButtonComboModule_ComboCallback callback,
void *context,
bool observer,
ButtonComboModule_ComboStatus &outStatus);

ButtonCombo CreateComboHold(std::string_view label,
ButtonComboModule_Buttons combo,
uint32_t holdDurationInMs,
ButtonComboModule_ComboCallback callback,
void *context,
ButtonComboModule_ComboStatus &outStatus);

ButtonCombo CreateComboHoldObserver(std::string_view label,
ButtonComboModule_Buttons combo,
uint32_t holdDurationInMs,
ButtonComboModule_ComboCallback callback,
void *context,
ButtonComboModule_ComboStatus &outStatus);
ButtonComboModule_Error CheckComboAvailable(const ButtonComboModule_ButtonComboOptions &options,
ButtonComboModule_ComboStatus &outStatus);

ButtonComboModule_Error DetectButtonCombo_Blocking(const ButtonComboModule_DetectButtonComboOptions &options,
ButtonComboModule_Buttons &outButtons);
} // namespace ButtonComboModule
#endif
105 changes: 105 additions & 0 deletions source/ButtonCombo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
#include <buttoncombo/ButtonCombo.h>
#include <buttoncombo/api.h>
#include <buttoncombo/defines.h>

#include <coreinit/debug.h>
#include <stdexcept>

namespace ButtonComboModule {
std::optional<ButtonCombo> ButtonCombo::Create(const ButtonComboModule_ComboOptions &options,
ButtonComboModule_ComboStatus &outStatus,
ButtonComboModule_Error &outError) noexcept {
ButtonComboModule_ComboHandle handle;
if (outError = ButtonComboModule_AddButtonCombo(&options, &handle, &outStatus); outError == BUTTON_COMBO_MODULE_ERROR_SUCCESS) {
return ButtonCombo(handle);
}
return {};
}

ButtonCombo ButtonCombo::Create(const ButtonComboModule_ComboOptions &options,
ButtonComboModule_ComboStatus &outStatus) {
ButtonComboModule_Error error;
auto res = Create(options, outStatus, error);
if (!res) {
throw std::runtime_error{std::string("Failed to create button combo: ").append(ButtonComboModule_GetStatusStr(error))};
}
return std::move(*res);
}

ButtonCombo::~ButtonCombo() {
ReleaseButtonComboHandle();
}

void ButtonCombo::ReleaseButtonComboHandle() {
if (mHandle != nullptr) {
if (const auto res = ButtonComboModule_RemoveButtonCombo(mHandle); res != BUTTON_COMBO_MODULE_ERROR_SUCCESS) {
OSReport("ButtonCombo::ReleaseButtonComboHandle(): ButtonComboModule_RemoveButtonCombo for %08X returned: %s\n", mHandle, ButtonComboModule_GetStatusStr(res));
}
mHandle = ButtonComboModule_ComboHandle(nullptr);
}
}

ButtonCombo::ButtonCombo(ButtonCombo &&src) noexcept {
ReleaseButtonComboHandle();

mHandle = src.mHandle;

src.mHandle = ButtonComboModule_ComboHandle(nullptr);
}

ButtonCombo &ButtonCombo::operator=(ButtonCombo &&src) noexcept {
if (this != &src) {
ReleaseButtonComboHandle();

mHandle = src.mHandle;

src.mHandle = ButtonComboModule_ComboHandle(nullptr);
}
return *this;
}

[[nodiscard]] ButtonComboModule_ComboHandle ButtonCombo::getHandle() const {
return mHandle;
}

ButtonComboModule_Error ButtonCombo::GetButtonComboStatus(ButtonComboModule_ComboStatus &outStatus) const {
return ButtonComboModule_GetButtonComboStatus(mHandle, &outStatus);
}

[[nodiscard]] ButtonComboModule_Error ButtonCombo::UpdateButtonComboMeta(const ButtonComboModule_MetaOptions &metaOptions) const {
return ButtonComboModule_UpdateButtonComboMeta(mHandle, &metaOptions);
}

[[nodiscard]] ButtonComboModule_Error ButtonCombo::UpdateButtonComboCallback(const ButtonComboModule_CallbackOptions &callbackOptions) const {
return ButtonComboModule_UpdateButtonComboCallback(mHandle, &callbackOptions);
}

[[nodiscard]] ButtonComboModule_Error ButtonCombo::UpdateControllerMask(const ButtonComboModule_ControllerTypes controllerMask,
ButtonComboModule_ComboStatus &outStatus) const {
return ButtonComboModule_UpdateControllerMask(mHandle, controllerMask, &outStatus);
}

[[nodiscard]] ButtonComboModule_Error ButtonCombo::UpdateButtonCombo(const ButtonComboModule_Buttons combo,
ButtonComboModule_ComboStatus &outStatus) const {
return ButtonComboModule_UpdateButtonCombo(mHandle, combo, &outStatus);
}

[[nodiscard]] ButtonComboModule_Error ButtonCombo::UpdateHoldDuration(const uint32_t holdDurationInFrames) const {
return ButtonComboModule_UpdateHoldDuration(mHandle, holdDurationInFrames);
}

[[nodiscard]] ButtonComboModule_Error ButtonCombo::GetButtonComboMeta(ButtonComboModule_MetaOptionsOut &outOptions) const {
return ButtonComboModule_GetButtonComboMeta(mHandle, &outOptions);
}

ButtonComboModule_Error ButtonCombo::GetButtonComboCallback(ButtonComboModule_CallbackOptions &outOptions) const {
return ButtonComboModule_GetButtonComboCallback(mHandle, &outOptions);
}

ButtonComboModule_Error ButtonCombo::GetButtonComboInfoEx(ButtonComboModule_ButtonComboInfoEx &outOptions) const {
return ButtonComboModule_GetButtonComboInfoEx(mHandle, &outOptions);
}

ButtonCombo::ButtonCombo(const ButtonComboModule_ComboHandle handle) : mHandle(handle) {
}
} // namespace ButtonComboModule
Loading