2019-07-31 22:21:02 +02:00
|
|
|
#ifndef __INCLUDED_STEAM_OVERLAY_H__
|
|
|
|
#define __INCLUDED_STEAM_OVERLAY_H__
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2023-12-27 09:15:10 +02:00
|
|
|
#include "dll/base.h"
|
2019-08-02 11:16:30 +02:00
|
|
|
#include <map>
|
2019-08-02 13:02:20 +02:00
|
|
|
#include <queue>
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-08-03 12:58:48 +02:00
|
|
|
static constexpr size_t max_chat_len = 768;
|
|
|
|
|
2019-08-02 13:02:20 +02:00
|
|
|
enum window_state
|
2019-07-31 22:21:02 +02:00
|
|
|
{
|
2019-08-16 18:31:56 +02:00
|
|
|
window_state_none = 0,
|
|
|
|
window_state_show = 1<<0,
|
|
|
|
window_state_invite = 1<<1,
|
|
|
|
window_state_join = 1<<2,
|
|
|
|
window_state_lobby_invite = 1<<3,
|
|
|
|
window_state_rich_invite = 1<<4,
|
|
|
|
window_state_send_message = 1<<5,
|
|
|
|
window_state_need_attention = 1<<6,
|
2019-07-31 22:21:02 +02:00
|
|
|
};
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-08-02 13:02:20 +02:00
|
|
|
struct friend_window_state
|
2019-08-02 11:16:30 +02:00
|
|
|
{
|
2019-10-11 13:10:48 +02:00
|
|
|
int id;
|
2019-08-02 13:02:20 +02:00
|
|
|
uint8 window_state;
|
2019-10-14 16:35:36 +02:00
|
|
|
std::string window_title;
|
2019-08-03 12:58:48 +02:00
|
|
|
union // The invitation (if any)
|
2019-08-02 11:16:30 +02:00
|
|
|
{
|
|
|
|
uint64 lobbyId;
|
|
|
|
char connect[k_cchMaxRichPresenceValueLength];
|
|
|
|
};
|
2019-08-03 12:58:48 +02:00
|
|
|
std::string chat_history;
|
|
|
|
char chat_input[max_chat_len];
|
2020-01-26 09:46:57 -05:00
|
|
|
|
2020-02-02 19:07:30 -05:00
|
|
|
bool joinable;
|
2019-08-02 11:16:30 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
struct Friend_Less
|
|
|
|
{
|
|
|
|
bool operator()(const Friend& lhs, const Friend& rhs) const
|
|
|
|
{
|
|
|
|
return lhs.id() < rhs.id();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-11-08 15:52:38 +01:00
|
|
|
enum notification_type
|
|
|
|
{
|
|
|
|
notification_type_message = 0,
|
|
|
|
notification_type_invite,
|
|
|
|
notification_type_achievement,
|
2024-01-06 07:41:32 +02:00
|
|
|
notification_type_auto_accept_invite,
|
2019-11-08 15:52:38 +01:00
|
|
|
};
|
|
|
|
|
2019-09-04 19:31:31 +02:00
|
|
|
struct Notification
|
|
|
|
{
|
2019-09-05 09:00:02 +02:00
|
|
|
static constexpr float width = 0.25;
|
2019-11-08 15:52:38 +01:00
|
|
|
static constexpr float height = 5.0;
|
2019-09-04 19:31:31 +02:00
|
|
|
static constexpr std::chrono::milliseconds fade_in = std::chrono::milliseconds(2000);
|
|
|
|
static constexpr std::chrono::milliseconds fade_out = std::chrono::milliseconds(2000);
|
|
|
|
static constexpr std::chrono::milliseconds show_time = std::chrono::milliseconds(6000) + fade_in + fade_out;
|
|
|
|
static constexpr std::chrono::milliseconds fade_out_start = show_time - fade_out;
|
2019-10-11 13:10:48 +02:00
|
|
|
|
|
|
|
int id;
|
2019-11-08 15:52:38 +01:00
|
|
|
uint8 type;
|
2019-09-04 19:31:31 +02:00
|
|
|
std::chrono::seconds start_time;
|
|
|
|
std::string message;
|
2019-11-08 15:52:38 +01:00
|
|
|
std::pair<const Friend, friend_window_state>* frd;
|
2023-11-10 17:25:36 +02:00
|
|
|
std::weak_ptr<uint64_t> icon;
|
2019-09-04 19:31:31 +02:00
|
|
|
};
|
|
|
|
|
2022-08-05 02:09:43 -04:00
|
|
|
struct Overlay_Achievement
|
|
|
|
{
|
|
|
|
std::string name;
|
|
|
|
std::string title;
|
|
|
|
std::string description;
|
2023-11-10 17:25:36 +02:00
|
|
|
std::string icon_name;
|
2023-11-12 23:09:17 +02:00
|
|
|
std::string icon_gray_name;
|
2022-08-05 02:09:43 -04:00
|
|
|
bool hidden;
|
|
|
|
bool achieved;
|
|
|
|
uint32 unlock_time;
|
2023-11-10 17:25:36 +02:00
|
|
|
std::weak_ptr<uint64_t> icon;
|
2023-11-12 23:09:17 +02:00
|
|
|
std::weak_ptr<uint64_t> icon_gray;
|
2022-08-05 02:09:43 -04:00
|
|
|
};
|
2019-08-14 14:55:31 +02:00
|
|
|
|
2022-08-05 02:09:43 -04:00
|
|
|
#ifdef EMU_OVERLAY
|
|
|
|
#include <future>
|
|
|
|
#include "Renderer_Hook.h"
|
2019-07-25 23:33:07 +02:00
|
|
|
class Steam_Overlay
|
|
|
|
{
|
|
|
|
Settings* settings;
|
|
|
|
SteamCallResults* callback_results;
|
|
|
|
SteamCallBacks* callbacks;
|
|
|
|
RunEveryRunCB* run_every_runcb;
|
2019-07-31 22:21:02 +02:00
|
|
|
Networking* network;
|
|
|
|
|
2019-08-02 11:16:30 +02:00
|
|
|
// friend id, show client window (to chat and accept invite maybe)
|
2019-08-02 13:02:20 +02:00
|
|
|
std::map<Friend, friend_window_state, Friend_Less> friends;
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-08-26 16:38:01 +02:00
|
|
|
bool setup_overlay_called;
|
2019-07-25 23:33:07 +02:00
|
|
|
bool is_ready;
|
|
|
|
bool show_overlay;
|
|
|
|
ENotificationPosition notif_position;
|
|
|
|
int h_inset, v_inset;
|
2022-08-05 02:09:43 -04:00
|
|
|
std::string show_url;
|
|
|
|
std::vector<Overlay_Achievement> achievements;
|
|
|
|
bool show_achievements, show_settings;
|
2022-08-21 03:45:11 -04:00
|
|
|
void *fonts_atlas;
|
2022-08-05 02:09:43 -04:00
|
|
|
|
2023-12-29 03:55:11 +02:00
|
|
|
// disable input when force_*.txt file is used
|
|
|
|
bool disable_user_input;
|
|
|
|
// warn when force_*.txt file is used
|
|
|
|
bool warn_forced_setting;
|
|
|
|
// warn when using local save
|
|
|
|
bool warn_local_save;
|
|
|
|
// warn when app ID = 0
|
|
|
|
bool warn_bad_appid;
|
2022-08-05 02:09:43 -04:00
|
|
|
|
|
|
|
char username_text[256];
|
|
|
|
std::atomic_bool save_settings;
|
|
|
|
|
|
|
|
int current_language;
|
|
|
|
|
|
|
|
std::string warning_message;
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
// Callback infos
|
2019-08-02 13:02:20 +02:00
|
|
|
std::queue<Friend> has_friend_action;
|
2019-09-04 19:31:31 +02:00
|
|
|
std::vector<Notification> notifications;
|
2020-01-26 17:24:16 -05:00
|
|
|
std::recursive_mutex notifications_mutex;
|
2022-08-05 02:09:43 -04:00
|
|
|
std::atomic<bool> have_notifications;
|
2020-01-26 17:24:16 -05:00
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
bool overlay_state_changed;
|
|
|
|
|
2020-01-20 11:47:12 -05:00
|
|
|
std::recursive_mutex overlay_mutex;
|
2020-01-26 09:46:57 -05:00
|
|
|
std::atomic<bool> i_have_lobby;
|
2022-08-13 14:32:43 -04:00
|
|
|
std::future<ingame_overlay::Renderer_Hook*> future_renderer;
|
|
|
|
ingame_overlay::Renderer_Hook* _renderer;
|
2020-01-20 11:47:12 -05:00
|
|
|
|
2019-07-25 23:33:07 +02:00
|
|
|
Steam_Overlay(Steam_Overlay const&) = delete;
|
|
|
|
Steam_Overlay(Steam_Overlay&&) = delete;
|
|
|
|
Steam_Overlay& operator=(Steam_Overlay const&) = delete;
|
|
|
|
Steam_Overlay& operator=(Steam_Overlay&&) = delete;
|
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
static void steam_overlay_run_every_runcb(void* object);
|
2019-08-03 12:58:48 +02:00
|
|
|
static void steam_overlay_callback(void* object, Common_Message* msg);
|
|
|
|
|
|
|
|
void Callback(Common_Message* msg);
|
2019-07-31 22:21:02 +02:00
|
|
|
void RunCallbacks();
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2020-02-02 19:07:30 -05:00
|
|
|
bool FriendJoinable(std::pair<const Friend, friend_window_state> &f);
|
2019-08-06 13:46:43 +02:00
|
|
|
bool IHaveLobby();
|
|
|
|
|
2019-11-08 15:52:38 +01:00
|
|
|
void NotifyUser(friend_window_state& friend_state);
|
2023-11-10 17:25:36 +02:00
|
|
|
void NotifyUserAchievement();
|
2024-01-06 07:41:32 +02:00
|
|
|
void NotifySoundAutoAcceptFriendInvite();
|
2019-09-04 19:31:31 +02:00
|
|
|
|
2019-08-02 15:26:16 +02:00
|
|
|
// Right click on friend
|
|
|
|
void BuildContextMenu(Friend const& frd, friend_window_state &state);
|
|
|
|
// Double click on friend
|
|
|
|
void BuildFriendWindow(Friend const& frd, friend_window_state &state);
|
2019-08-26 19:36:07 +02:00
|
|
|
// Notifications like achievements, chat and invitations
|
2019-09-04 19:31:31 +02:00
|
|
|
void BuildNotifications(int width, int height);
|
2019-07-25 23:33:07 +02:00
|
|
|
public:
|
2019-07-31 22:21:02 +02:00
|
|
|
Steam_Overlay(Settings* settings, SteamCallResults* callback_results, SteamCallBacks* callbacks, RunEveryRunCB* run_every_runcb, Networking *network);
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
~Steam_Overlay();
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
bool Ready() const;
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
bool NeedPresent() const;
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
void SetNotificationPosition(ENotificationPosition eNotificationPosition);
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
void SetNotificationInset(int nHorizontalInset, int nVerticalInset);
|
|
|
|
void SetupOverlay();
|
2022-08-07 23:11:21 -04:00
|
|
|
void UnSetupOverlay();
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2022-08-05 02:09:43 -04:00
|
|
|
void HookReady(bool ready);
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-09-05 09:00:02 +02:00
|
|
|
void CreateFonts();
|
2023-11-10 17:25:36 +02:00
|
|
|
void LoadAudio();
|
2019-09-05 09:00:02 +02:00
|
|
|
void OverlayProc();
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
void OpenOverlayInvite(CSteamID lobbyId);
|
|
|
|
void OpenOverlay(const char* pchDialog);
|
2022-08-05 02:09:43 -04:00
|
|
|
void OpenOverlayWebpage(const char* pchURL);
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-08-18 16:22:07 +02:00
|
|
|
bool ShowOverlay() const;
|
2019-07-31 22:21:02 +02:00
|
|
|
void ShowOverlay(bool state);
|
2022-08-05 02:09:43 -04:00
|
|
|
bool OpenOverlayHook(bool toggle);
|
2019-08-02 11:16:30 +02:00
|
|
|
|
2019-08-02 23:01:24 +02:00
|
|
|
void SetLobbyInvite(Friend friendId, uint64 lobbyId);
|
|
|
|
void SetRichInvite(Friend friendId, const char* connect_str);
|
2019-08-02 11:16:30 +02:00
|
|
|
|
|
|
|
void FriendConnect(Friend _friend);
|
|
|
|
void FriendDisconnect(Friend _friend);
|
2019-09-04 19:31:31 +02:00
|
|
|
|
2019-11-08 15:52:38 +01:00
|
|
|
void AddMessageNotification(std::string const& message);
|
|
|
|
void AddAchievementNotification(nlohmann::json const& ach);
|
|
|
|
void AddInviteNotification(std::pair<const Friend, friend_window_state> &wnd_state);
|
2024-01-06 07:41:32 +02:00
|
|
|
void AddAutoAcceptInviteNotification();
|
2019-07-31 22:21:02 +02:00
|
|
|
};
|
2019-07-25 23:33:07 +02:00
|
|
|
|
2019-08-14 14:55:31 +02:00
|
|
|
#else
|
|
|
|
|
|
|
|
class Steam_Overlay
|
|
|
|
{
|
|
|
|
public:
|
2019-09-05 09:00:02 +02:00
|
|
|
Steam_Overlay(Settings* settings, SteamCallResults* callback_results, SteamCallBacks* callbacks, RunEveryRunCB* run_every_runcb, Networking* network) {}
|
2019-08-14 18:11:00 +02:00
|
|
|
~Steam_Overlay() {}
|
2019-08-14 14:55:31 +02:00
|
|
|
|
2019-08-14 18:11:00 +02:00
|
|
|
bool Ready() const { return false; }
|
2019-08-14 14:55:31 +02:00
|
|
|
|
|
|
|
bool NeedPresent() const { return false; }
|
|
|
|
|
|
|
|
void SetNotificationPosition(ENotificationPosition eNotificationPosition) {}
|
|
|
|
|
|
|
|
void SetNotificationInset(int nHorizontalInset, int nVerticalInset) {}
|
|
|
|
void SetupOverlay() {}
|
2022-08-07 23:11:21 -04:00
|
|
|
void UnSetupOverlay() {}
|
2019-08-14 14:55:31 +02:00
|
|
|
|
2022-08-05 02:09:43 -04:00
|
|
|
void HookReady(bool ready) {}
|
2019-08-14 14:55:31 +02:00
|
|
|
|
2019-09-05 09:00:02 +02:00
|
|
|
void CreateFonts() {}
|
|
|
|
void OverlayProc() {}
|
2019-08-14 14:55:31 +02:00
|
|
|
|
|
|
|
void OpenOverlayInvite(CSteamID lobbyId) {}
|
|
|
|
void OpenOverlay(const char* pchDialog) {}
|
2022-08-05 02:09:43 -04:00
|
|
|
void OpenOverlayWebpage(const char* pchURL) {}
|
2019-08-14 14:55:31 +02:00
|
|
|
|
2023-12-21 03:28:21 +02:00
|
|
|
bool ShowOverlay() const { return false; }
|
2019-08-14 14:55:31 +02:00
|
|
|
void ShowOverlay(bool state) {}
|
2023-12-21 03:28:21 +02:00
|
|
|
bool OpenOverlayHook(bool toggle) { return false; }
|
2019-08-14 14:55:31 +02:00
|
|
|
|
|
|
|
void SetLobbyInvite(Friend friendId, uint64 lobbyId) {}
|
|
|
|
void SetRichInvite(Friend friendId, const char* connect_str) {}
|
|
|
|
|
|
|
|
void FriendConnect(Friend _friend) {}
|
|
|
|
void FriendDisconnect(Friend _friend) {}
|
2019-10-15 19:08:14 +02:00
|
|
|
|
|
|
|
void AddMessageNotification(std::string const& message) {}
|
|
|
|
void AddAchievementNotification(nlohmann::json const& ach) {}
|
|
|
|
void AddInviteNotification(std::pair<const Friend, friend_window_state> &wnd_state) {}
|
2024-01-06 07:41:32 +02:00
|
|
|
void AddAutoAcceptInviteNotification() {}
|
2019-08-14 14:55:31 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2019-07-31 22:21:02 +02:00
|
|
|
#endif//__INCLUDED_STEAM_OVERLAY_H__
|