#if !defined(_CRT_SECURE_NO_WARNINGS) #define _CRT_SECURE_NO_WARNINGS #endif #include "overlay_manager.h" #include "core.h" #include #include namespace discord { class OverlayEvents final { public: static void DISCORD_CALLBACK OnToggle(void* callbackData, bool locked) { auto* core = reinterpret_cast(callbackData); if (!core) { return; } auto& module = core->OverlayManager(); module.OnToggle((locked != 0)); } }; IDiscordOverlayEvents OverlayManager::events_{ &OverlayEvents::OnToggle, }; void OverlayManager::IsEnabled(bool* enabled) { if (!enabled) { return; } internal_->is_enabled(internal_, reinterpret_cast(enabled)); } void OverlayManager::IsLocked(bool* locked) { if (!locked) { return; } internal_->is_locked(internal_, reinterpret_cast(locked)); } void OverlayManager::SetLocked(bool locked, std::function callback) { static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { std::unique_ptr> cb( reinterpret_cast*>(callbackData)); if (!cb || !(*cb)) { return; } (*cb)(static_cast(result)); }; std::unique_ptr> cb{}; cb.reset(new std::function(std::move(callback))); internal_->set_locked(internal_, (locked ? 1 : 0), cb.release(), wrapper); } void OverlayManager::OpenActivityInvite(ActivityActionType type, std::function callback) { static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { std::unique_ptr> cb( reinterpret_cast*>(callbackData)); if (!cb || !(*cb)) { return; } (*cb)(static_cast(result)); }; std::unique_ptr> cb{}; cb.reset(new std::function(std::move(callback))); internal_->open_activity_invite( internal_, static_cast(type), cb.release(), wrapper); } void OverlayManager::OpenGuildInvite(char const* code, std::function callback) { static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { std::unique_ptr> cb( reinterpret_cast*>(callbackData)); if (!cb || !(*cb)) { return; } (*cb)(static_cast(result)); }; std::unique_ptr> cb{}; cb.reset(new std::function(std::move(callback))); internal_->open_guild_invite(internal_, const_cast(code), cb.release(), wrapper); } void OverlayManager::OpenVoiceSettings(std::function callback) { static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { std::unique_ptr> cb( reinterpret_cast*>(callbackData)); if (!cb || !(*cb)) { return; } (*cb)(static_cast(result)); }; std::unique_ptr> cb{}; cb.reset(new std::function(std::move(callback))); internal_->open_voice_settings(internal_, cb.release(), wrapper); } Result OverlayManager::InitDrawingDxgi(IDXGISwapChain* swapchain, bool useMessageForwarding) { auto result = internal_->init_drawing_dxgi(internal_, swapchain, (useMessageForwarding ? 1 : 0)); return static_cast(result); } void OverlayManager::OnPresent() { internal_->on_present(internal_); } void OverlayManager::ForwardMessage(MSG* message) { internal_->forward_message(internal_, message); } void OverlayManager::KeyEvent(bool down, char const* keyCode, KeyVariant variant) { internal_->key_event(internal_, (down ? 1 : 0), const_cast(keyCode), static_cast(variant)); } void OverlayManager::CharEvent(char const* character) { internal_->char_event(internal_, const_cast(character)); } void OverlayManager::MouseButtonEvent(std::uint8_t down, std::int32_t clickCount, MouseButton which, std::int32_t x, std::int32_t y) { internal_->mouse_button_event( internal_, down, clickCount, static_cast(which), x, y); } void OverlayManager::MouseMotionEvent(std::int32_t x, std::int32_t y) { internal_->mouse_motion_event(internal_, x, y); } void OverlayManager::ImeCommitText(char const* text) { internal_->ime_commit_text(internal_, const_cast(text)); } void OverlayManager::ImeSetComposition(char const* text, ImeUnderline* underlines, std::uint32_t underlinesLength, std::int32_t from, std::int32_t to) { internal_->ime_set_composition(internal_, const_cast(text), reinterpret_cast(underlines), underlinesLength, from, to); } void OverlayManager::ImeCancelComposition() { internal_->ime_cancel_composition(internal_); } void OverlayManager::SetImeCompositionRangeCallback( std::function onImeCompositionRangeChanged) { static auto wrapper = [](void* callbackData, int32_t from, int32_t to, DiscordRect* bounds, uint32_t boundsLength) -> void { std::unique_ptr> cb( reinterpret_cast*>( callbackData)); if (!cb || !(*cb)) { return; } (*cb)(from, to, reinterpret_cast(bounds), boundsLength); }; std::unique_ptr> cb{}; cb.reset(new std::function( std::move(onImeCompositionRangeChanged))); internal_->set_ime_composition_range_callback(internal_, cb.release(), wrapper); } void OverlayManager::SetImeSelectionBoundsCallback( std::function onImeSelectionBoundsChanged) { static auto wrapper = [](void* callbackData, DiscordRect anchor, DiscordRect focus, bool isAnchorFirst) -> void { std::unique_ptr> cb( reinterpret_cast*>(callbackData)); if (!cb || !(*cb)) { return; } (*cb)(*reinterpret_cast(&anchor), *reinterpret_cast(&focus), (isAnchorFirst != 0)); }; std::unique_ptr> cb{}; cb.reset(new std::function(std::move(onImeSelectionBoundsChanged))); internal_->set_ime_selection_bounds_callback(internal_, cb.release(), wrapper); } bool OverlayManager::IsPointInsideClickZone(std::int32_t x, std::int32_t y) { auto result = internal_->is_point_inside_click_zone(internal_, x, y); return (result != 0); } } // namespace discord