diff --git a/include/buttoncombo/ButtonCombo.h b/include/buttoncombo/ButtonCombo.h new file mode 100644 index 0000000..0bc947c --- /dev/null +++ b/include/buttoncombo/ButtonCombo.h @@ -0,0 +1,58 @@ +#pragma once + +#ifdef __cplusplus + +#include "defines.h" + +#include + +namespace ButtonComboModule { + class ButtonCombo { + public: + static std::optional 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 \ No newline at end of file diff --git a/include/buttoncombo/manager.h b/include/buttoncombo/api.h similarity index 53% rename from include/buttoncombo/manager.h rename to include/buttoncombo/api.h index 29cd321..fee853f 100644 --- a/include/buttoncombo/manager.h +++ b/include/buttoncombo/api.h @@ -124,3 +124,112 @@ ButtonComboModule_Error ButtonComboModule_DetectButtonCombo_Blocking(const Butto #ifdef __cplusplus } #endif + +#ifdef __cplusplus + +#include "ButtonCombo.h" +#include +#include + +namespace ButtonComboModule { + std::string_view GetStatusStr(ButtonComboModule_Error status); + + std::optional 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 CreateComboPressDown(std::string_view label, + ButtonComboModule_Buttons combo, + ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus, + ButtonComboModule_Error &outError) noexcept; + + std::optional CreateComboPressDownObserver(std::string_view label, + ButtonComboModule_Buttons combo, + ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus, + ButtonComboModule_Error &outError) noexcept; + + std::optional 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 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 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 diff --git a/source/ButtonCombo.cpp b/source/ButtonCombo.cpp new file mode 100644 index 0000000..587bc5e --- /dev/null +++ b/source/ButtonCombo.cpp @@ -0,0 +1,105 @@ +#include +#include +#include + +#include +#include + +namespace ButtonComboModule { + std::optional 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 \ No newline at end of file diff --git a/source/cppApi.cpp b/source/cppApi.cpp new file mode 100644 index 0000000..94e10c1 --- /dev/null +++ b/source/cppApi.cpp @@ -0,0 +1,164 @@ +#include "buttoncombo/ButtonCombo.h" +#include "buttoncombo/api.h" +#include "buttoncombo/defines.h" + +#include +#include + +namespace ButtonComboModule { + std::string_view GetStatusStr(const ButtonComboModule_Error status) { + return ButtonComboModule_GetStatusStr(status); + } + + std::optional CreateComboPressDownEx(const std::string_view label, + const ButtonComboModule_ControllerTypes controllerMask, + const ButtonComboModule_Buttons combo, + const ButtonComboModule_ComboCallback callback, + void *context, + const bool observer, + ButtonComboModule_ComboStatus &outStatus, + ButtonComboModule_Error &outError) noexcept { + ButtonComboModule_ComboOptions options = {}; + options.metaOptions.label = label.data(); + options.callbackOptions = {.callback = callback, .context = context}; + options.buttonComboOptions.type = observer ? BUTTON_COMBO_MODULE_TYPE_PRESS_DOWN_OBSERVER : BUTTON_COMBO_MODULE_TYPE_PRESS_DOWN; + options.buttonComboOptions.basicCombo.combo = combo; + options.buttonComboOptions.basicCombo.controllerMask = controllerMask; + + return ButtonCombo::Create(options, outStatus, outError); + } + + std::optional CreateComboPressDown(const std::string_view label, + const ButtonComboModule_Buttons combo, + const ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus, + ButtonComboModule_Error &outError) noexcept { + return CreateComboPressDownEx(label, BUTTON_COMBO_MODULE_CONTROLLER_ALL, combo, callback, context, false, outStatus, outError); + } + + std::optional CreateComboPressDownObserver(const std::string_view label, + const ButtonComboModule_Buttons combo, + const ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus, + ButtonComboModule_Error &outError) noexcept { + return CreateComboPressDownEx(label, BUTTON_COMBO_MODULE_CONTROLLER_ALL, combo, callback, context, true, outStatus, outError); + } + + + std::optional CreateComboHoldEx(const std::string_view label, + const ButtonComboModule_ControllerTypes controllerMask, + const ButtonComboModule_Buttons combo, + const uint32_t holdDurationInMs, + const ButtonComboModule_ComboCallback callback, + void *context, + const bool observer, + ButtonComboModule_ComboStatus &outStatus, + ButtonComboModule_Error &outError) noexcept { + ButtonComboModule_ComboOptions options = {}; + options.metaOptions.label = label.data(); + options.callbackOptions = {.callback = callback, .context = context}; + options.buttonComboOptions.type = observer ? BUTTON_COMBO_MODULE_TYPE_HOLD_OBSERVER : BUTTON_COMBO_MODULE_TYPE_HOLD; + options.buttonComboOptions.basicCombo.combo = combo; + options.buttonComboOptions.basicCombo.controllerMask = controllerMask; + options.buttonComboOptions.optionalHoldForXMs = holdDurationInMs; + + return ButtonCombo::Create(options, outStatus, outError); + } + + std::optional CreateComboHold(const std::string_view label, + const ButtonComboModule_Buttons combo, + const uint32_t holdDurationInMs, + const ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus, + ButtonComboModule_Error &outError) noexcept { + return CreateComboHoldEx(label, BUTTON_COMBO_MODULE_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, false, outStatus, outError); + } + + std::optional CreateComboHoldObserver(const std::string_view label, + const ButtonComboModule_Buttons combo, + const uint32_t holdDurationInMs, + const ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus, + ButtonComboModule_Error &outError) noexcept { + return CreateComboHoldEx(label, BUTTON_COMBO_MODULE_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, true, outStatus, outError); + } + + ButtonCombo CreateComboPressDownEx(const std::string_view label, + const ButtonComboModule_ControllerTypes controllerMask, + const ButtonComboModule_Buttons combo, + const ButtonComboModule_ComboCallback callback, + void *context, + const bool observer, + ButtonComboModule_ComboStatus &outStatus) { + ButtonComboModule_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(ButtonComboModule_GetStatusStr(error))}; + } + return std::move(*res); + } + + ButtonCombo CreatePressDown(const std::string_view label, + const ButtonComboModule_Buttons combo, + const ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus) { + return CreateComboPressDownEx(label, BUTTON_COMBO_MODULE_CONTROLLER_ALL, combo, callback, context, false, outStatus); + } + + ButtonCombo CreatePressDownObserver(const std::string_view label, + const ButtonComboModule_Buttons combo, + const ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus) { + return CreateComboPressDownEx(label, BUTTON_COMBO_MODULE_CONTROLLER_ALL, combo, callback, context, true, outStatus); + } + + ButtonCombo CreateComboHoldEx(const std::string_view label, + const ButtonComboModule_ControllerTypes controllerMask, + const ButtonComboModule_Buttons combo, + const uint32_t holdDurationInMs, + const ButtonComboModule_ComboCallback callback, + void *context, + const bool observer, + ButtonComboModule_ComboStatus &outStatus) { + ButtonComboModule_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(ButtonComboModule_GetStatusStr(error))}; + } + return std::move(*res); + } + + ButtonCombo CreateComboHold(const std::string_view label, + const ButtonComboModule_Buttons combo, + const uint32_t holdDurationInMs, + const ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus) { + return CreateComboHoldEx(label, BUTTON_COMBO_MODULE_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, false, outStatus); + } + + ButtonCombo CreateComboHoldObserver(const std::string_view label, + const ButtonComboModule_Buttons combo, + const uint32_t holdDurationInMs, + const ButtonComboModule_ComboCallback callback, + void *context, + ButtonComboModule_ComboStatus &outStatus) { + return CreateComboHoldEx(label, BUTTON_COMBO_MODULE_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, true, outStatus); + } + + ButtonComboModule_Error CheckComboAvailable(const ButtonComboModule_ButtonComboOptions &options, + ButtonComboModule_ComboStatus &outStatus) { + return ButtonComboModule_CheckComboAvailable(&options, &outStatus); + } + + ButtonComboModule_Error DetectButtonCombo_Blocking(const ButtonComboModule_DetectButtonComboOptions &options, + ButtonComboModule_Buttons &outButtons) { + return ButtonComboModule_DetectButtonCombo_Blocking(&options, &outButtons); + } +} // namespace ButtonComboModule \ No newline at end of file diff --git a/source/utils.cpp b/source/utils.cpp index d46f0b3..6044956 100644 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -1,6 +1,6 @@ #include "logger.h" +#include #include -#include #include #include #include