goldberg_emulator/overlay_experimental/steam_overlay.h

158 lines
4.1 KiB
C
Raw Normal View History

#ifndef __INCLUDED_STEAM_OVERLAY_H__
#define __INCLUDED_STEAM_OVERLAY_H__
2019-07-25 21:33:07 +00:00
#include "../dll/base.h"
2019-07-25 21:33:07 +00:00
#include "Hook_Manager.h"
2019-08-02 09:16:30 +00:00
#include <map>
2019-08-02 11:02:20 +00:00
#include <queue>
2019-07-25 21:33:07 +00:00
2019-08-03 10:58:48 +00:00
static constexpr size_t max_chat_len = 768;
2019-08-02 11:02:20 +00:00
enum window_state
{
2019-08-02 11:02:20 +00: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,
2019-08-03 10:58:48 +00:00
window_state_rich_invite = 1<<4,
window_state_send_message = 1<<5,
};
2019-07-25 21:33:07 +00:00
2019-08-02 11:02:20 +00:00
struct friend_window_state
2019-08-02 09:16:30 +00:00
{
2019-08-02 11:02:20 +00:00
uint8 window_state;
2019-08-03 10:58:48 +00:00
union // The invitation (if any)
2019-08-02 09:16:30 +00:00
{
uint64 lobbyId;
char connect[k_cchMaxRichPresenceValueLength];
};
2019-08-03 10:58:48 +00:00
std::string chat_history;
char chat_input[max_chat_len];
2019-08-02 09:16:30 +00:00
};
struct Friend_Less
{
bool operator()(const Friend& lhs, const Friend& rhs) const
{
return lhs.id() < rhs.id();
}
};
#ifndef NO_OVERLAY
2019-08-14 12:55:31 +00:00
2019-07-25 21:33:07 +00:00
class Steam_Overlay
{
Settings* settings;
SteamCallResults* callback_results;
SteamCallBacks* callbacks;
RunEveryRunCB* run_every_runcb;
Networking* network;
2019-08-02 09:16:30 +00:00
// friend id, show client window (to chat and accept invite maybe)
2019-08-02 11:02:20 +00:00
std::map<Friend, friend_window_state, Friend_Less> friends;
2019-07-25 21:33:07 +00:00
HWND game_hwnd;
WNDPROC game_hwnd_proc;
bool is_ready;
bool show_overlay;
Base_Hook window_hooks;
ENotificationPosition notif_position;
int h_inset, v_inset;
// Callback infos
2019-08-02 11:02:20 +00:00
std::queue<Friend> has_friend_action;
bool overlay_state_changed;
2019-07-25 21:33:07 +00: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;
bool IgnoreMsg(UINT uMsg);
2019-07-25 21:33:07 +00:00
static LRESULT CALLBACK HookWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
2019-07-25 21:33:07 +00:00
static void steam_overlay_run_every_runcb(void* object);
2019-08-03 10:58:48 +00:00
static void steam_overlay_callback(void* object, Common_Message* msg);
void Callback(Common_Message* msg);
void RunCallbacks();
2019-07-25 21:33:07 +00:00
bool FriendHasLobby(uint64 friend_id);
bool IHaveLobby();
2019-08-02 13:26:16 +00: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-07-25 21:33:07 +00:00
public:
Steam_Overlay(Settings* settings, SteamCallResults* callback_results, SteamCallBacks* callbacks, RunEveryRunCB* run_every_runcb, Networking *network);
2019-07-25 21:33:07 +00:00
~Steam_Overlay();
2019-07-25 21:33:07 +00:00
HWND GetGameHwnd() const;
2019-07-25 21:33:07 +00:00
bool Ready() const;
2019-07-25 21:33:07 +00:00
bool NeedPresent() const;
2019-07-25 21:33:07 +00:00
void SetNotificationPosition(ENotificationPosition eNotificationPosition);
2019-07-25 21:33:07 +00:00
void SetNotificationInset(int nHorizontalInset, int nVerticalInset);
void SetupOverlay();
2019-07-25 21:33:07 +00:00
void HookReady(void* hWnd);
2019-07-25 21:33:07 +00:00
void OverlayProc(int width, int height);
2019-07-25 21:33:07 +00:00
void OpenOverlayInvite(CSteamID lobbyId);
void OpenOverlay(const char* pchDialog);
2019-07-25 21:33:07 +00:00
void ShowOverlay(bool state);
2019-08-02 09:16:30 +00:00
void SetLobbyInvite(Friend friendId, uint64 lobbyId);
void SetRichInvite(Friend friendId, const char* connect_str);
2019-08-02 09:16:30 +00:00
void FriendConnect(Friend _friend);
void FriendDisconnect(Friend _friend);
};
2019-07-25 21:33:07 +00:00
2019-08-14 12:55:31 +00:00
#else
class Steam_Overlay
{
public:
Steam_Overlay(Settings* settings, SteamCallResults* callback_results, SteamCallBacks* callbacks, RunEveryRunCB* run_every_runcb, Networking *network);
~Steam_Overlay();
bool Ready() const { return false: }
bool NeedPresent() const { return false; }
void SetNotificationPosition(ENotificationPosition eNotificationPosition) {}
void SetNotificationInset(int nHorizontalInset, int nVerticalInset) {}
void SetupOverlay() {}
void HookReady(void* hWnd) {}
void OverlayProc(int width, int height) {}
void OpenOverlayInvite(CSteamID lobbyId) {}
void OpenOverlay(const char* pchDialog) {}
void ShowOverlay(bool state) {}
void SetLobbyInvite(Friend friendId, uint64 lobbyId) {}
void SetRichInvite(Friend friendId, const char* connect_str) {}
void FriendConnect(Friend _friend) {}
void FriendDisconnect(Friend _friend) {}
};
#endif
#endif//__INCLUDED_STEAM_OVERLAY_H__