mirror of
https://gitlab.com/Mr_Goldberg/goldberg_emulator.git
synced 2024-11-27 14:08:39 +01:00
Added invite/join checks
Don't show "Invite" button if current user doesn't have a lobby. Don't show "Join" button if friend doesn't have a lobby. Added a button to open chat with a right click. Close the popup when you click a button.
This commit is contained in:
parent
03d02b497b
commit
d3ded5842d
2 changed files with 93 additions and 46 deletions
|
@ -14,9 +14,27 @@ extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam
|
||||||
static decltype(DispatchMessageA)* _DispatchMessageA = DispatchMessageA;
|
static decltype(DispatchMessageA)* _DispatchMessageA = DispatchMessageA;
|
||||||
static decltype(DispatchMessageW)* _DispatchMessageW = DispatchMessageW;
|
static decltype(DispatchMessageW)* _DispatchMessageW = DispatchMessageW;
|
||||||
|
|
||||||
LRESULT CALLBACK Steam_Overlay::sHookWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
bool Steam_Overlay::IgnoreMsg(const MSG* lpMsg)
|
||||||
{
|
{
|
||||||
return Hook_Manager::Inst().GetOverlay()->HookWndProc(hWnd, uMsg, wParam, lParam);
|
if (lpMsg->hwnd == game_hwnd && show_overlay)
|
||||||
|
{
|
||||||
|
switch (lpMsg->message)
|
||||||
|
{
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL:
|
||||||
|
case WM_LBUTTONUP: case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK:
|
||||||
|
case WM_RBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
|
||||||
|
case WM_MBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK:
|
||||||
|
case WM_XBUTTONUP: case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
|
||||||
|
case WM_KEYDOWN: case WM_KEYUP:
|
||||||
|
case WM_SYSKEYDOWN: case WM_SYSKEYUP:
|
||||||
|
case WM_CHAR:
|
||||||
|
// We ignore theses message in the game windows, but our overlay needs them.
|
||||||
|
HookWndProc(lpMsg->hwnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT Steam_Overlay::HookWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
LRESULT Steam_Overlay::HookWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
@ -44,27 +62,9 @@ LRESULT Steam_Overlay::HookWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
|
||||||
return CallWindowProc(game_hwnd_proc, hWnd, uMsg, wParam, lParam);
|
return CallWindowProc(game_hwnd_proc, hWnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Steam_Overlay::IgnoreMsg(const MSG* lpMsg)
|
LRESULT CALLBACK Steam_Overlay::sHookWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
if (lpMsg->hwnd == game_hwnd && show_overlay)
|
return Hook_Manager::Inst().GetOverlay()->HookWndProc(hWnd, uMsg, wParam, lParam);
|
||||||
{
|
|
||||||
switch (lpMsg->message)
|
|
||||||
{
|
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL:
|
|
||||||
case WM_LBUTTONUP: case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK:
|
|
||||||
case WM_RBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
|
|
||||||
case WM_MBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK:
|
|
||||||
case WM_XBUTTONUP: case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
|
|
||||||
case WM_KEYDOWN: case WM_KEYUP:
|
|
||||||
case WM_SYSKEYDOWN: case WM_SYSKEYUP:
|
|
||||||
case WM_CHAR:
|
|
||||||
// We ignore theses message in the game windows, but our overlay needs them.
|
|
||||||
HookWndProc(lpMsg->hwnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT WINAPI Steam_Overlay::MyDispatchMessageA(const MSG* lpMsg)
|
LRESULT WINAPI Steam_Overlay::MyDispatchMessageA(const MSG* lpMsg)
|
||||||
|
@ -83,6 +83,18 @@ LRESULT WINAPI Steam_Overlay::MyDispatchMessageW(const MSG* lpMsg)
|
||||||
return _DispatchMessageW(lpMsg);
|
return _DispatchMessageW(lpMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Steam_Overlay::steam_overlay_run_every_runcb(void* object)
|
||||||
|
{
|
||||||
|
Steam_Overlay* _this = reinterpret_cast<Steam_Overlay*>(object);
|
||||||
|
_this->RunCallbacks();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Steam_Overlay::steam_overlay_callback(void* object, Common_Message* msg)
|
||||||
|
{
|
||||||
|
Steam_Overlay* _this = reinterpret_cast<Steam_Overlay*>(object);
|
||||||
|
_this->Callback(msg);
|
||||||
|
}
|
||||||
|
|
||||||
Steam_Overlay::Steam_Overlay(Settings* settings, SteamCallResults* callback_results, SteamCallBacks* callbacks, RunEveryRunCB* run_every_runcb, Networking *network) :
|
Steam_Overlay::Steam_Overlay(Settings* settings, SteamCallResults* callback_results, SteamCallBacks* callbacks, RunEveryRunCB* run_every_runcb, Networking *network) :
|
||||||
settings(settings),
|
settings(settings),
|
||||||
callback_results(callback_results),
|
callback_results(callback_results),
|
||||||
|
@ -107,18 +119,6 @@ Steam_Overlay::~Steam_Overlay()
|
||||||
run_every_runcb->remove(&Steam_Overlay::steam_overlay_run_every_runcb, this);
|
run_every_runcb->remove(&Steam_Overlay::steam_overlay_run_every_runcb, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Steam_Overlay::steam_overlay_callback(void* object, Common_Message* msg)
|
|
||||||
{
|
|
||||||
Steam_Overlay* _this = reinterpret_cast<Steam_Overlay*>(object);
|
|
||||||
_this->Callback(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Steam_Overlay::steam_overlay_run_every_runcb(void* object)
|
|
||||||
{
|
|
||||||
Steam_Overlay* _this = reinterpret_cast<Steam_Overlay*>(object);
|
|
||||||
_this->RunCallbacks();
|
|
||||||
}
|
|
||||||
|
|
||||||
HWND Steam_Overlay::GetGameHwnd() const
|
HWND Steam_Overlay::GetGameHwnd() const
|
||||||
{
|
{
|
||||||
return game_hwnd;
|
return game_hwnd;
|
||||||
|
@ -182,7 +182,6 @@ void Steam_Overlay::HookReady(void* hWnd)
|
||||||
|
|
||||||
void Steam_Overlay::OpenOverlayInvite(CSteamID lobbyId)
|
void Steam_Overlay::OpenOverlayInvite(CSteamID lobbyId)
|
||||||
{
|
{
|
||||||
//this->lobbyId = lobbyId;
|
|
||||||
ShowOverlay(true);
|
ShowOverlay(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,7 +226,6 @@ void Steam_Overlay::ShowOverlay(bool state)
|
||||||
clipRect.bottom -= borderWidth;
|
clipRect.bottom -= borderWidth;
|
||||||
|
|
||||||
ClipCursor(&clipRect);
|
ClipCursor(&clipRect);
|
||||||
|
|
||||||
ImGui::GetIO().MouseDrawCursor = true;
|
ImGui::GetIO().MouseDrawCursor = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -281,20 +279,62 @@ void Steam_Overlay::FriendDisconnect(Friend _friend)
|
||||||
friends.erase(it);
|
friends.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Steam_Overlay::FriendHasLobby(uint64 friend_id)
|
||||||
|
{
|
||||||
|
Steam_Friends* steamFriends = get_steam_client()->steam_friends;
|
||||||
|
|
||||||
|
if( std::string(steamFriends->GetFriendRichPresence(friend_id, "connect")).length() > 0 )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
FriendGameInfo_t friend_game_info = {};
|
||||||
|
steamFriends->GetFriendGamePlayed(friend_id, &friend_game_info);
|
||||||
|
if (friend_game_info.m_steamIDLobby.IsValid())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Steam_Overlay::IHaveLobby()
|
||||||
|
{
|
||||||
|
Steam_Friends* steamFriends = get_steam_client()->steam_friends;
|
||||||
|
if (std::string(steamFriends->GetFriendRichPresence(settings->get_local_steam_id(), "connect")).length() > 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (settings->get_lobby().IsValid())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void Steam_Overlay::BuildContextMenu(Friend const& frd, friend_window_state& state)
|
void Steam_Overlay::BuildContextMenu(Friend const& frd, friend_window_state& state)
|
||||||
{
|
{
|
||||||
if (ImGui::BeginPopupContextItem("Friends", 1))
|
if (ImGui::BeginPopupContextItem("Friends", 1))
|
||||||
{
|
{
|
||||||
if (ImGui::Button("Invite"))
|
bool close_popup = false;
|
||||||
|
|
||||||
|
if (ImGui::Button("Chat"))
|
||||||
|
{
|
||||||
|
state.window_state |= window_state_show;
|
||||||
|
close_popup = true;
|
||||||
|
}
|
||||||
|
if (IHaveLobby() && ImGui::Button("Invite"))
|
||||||
{
|
{
|
||||||
state.window_state |= window_state_invite;
|
state.window_state |= window_state_invite;
|
||||||
has_friend_action.push(frd);
|
has_friend_action.push(frd);
|
||||||
|
close_popup = true;
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Join"))
|
if (FriendHasLobby(frd.id()) && ImGui::Button("Join"))
|
||||||
{
|
{
|
||||||
state.window_state |= window_state_join;
|
state.window_state |= window_state_join;
|
||||||
has_friend_action.push(frd);
|
has_friend_action.push(frd);
|
||||||
|
close_popup = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( close_popup)
|
||||||
|
{
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -305,6 +345,7 @@ void Steam_Overlay::BuildFriendWindow(Friend const& frd, friend_window_state& st
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool show = true;
|
bool show = true;
|
||||||
|
bool send_chat_msg = false;
|
||||||
|
|
||||||
if (ImGui::Begin(frd.name().c_str(), &show))
|
if (ImGui::Begin(frd.name().c_str(), &show))
|
||||||
{
|
{
|
||||||
|
@ -330,16 +371,17 @@ void Steam_Overlay::BuildFriendWindow(Friend const& frd, friend_window_state& st
|
||||||
|
|
||||||
if (ImGui::InputText("##chat_line", state.chat_input, max_chat_len, ImGuiInputTextFlags_EnterReturnsTrue))
|
if (ImGui::InputText("##chat_line", state.chat_input, max_chat_len, ImGuiInputTextFlags_EnterReturnsTrue))
|
||||||
{
|
{
|
||||||
if (!(state.window_state & window_state_send_message))
|
send_chat_msg = true;
|
||||||
{
|
|
||||||
has_friend_action.push(frd);
|
|
||||||
state.window_state |= window_state_send_message;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
if (ImGui::Button("Send"))
|
if (ImGui::Button("Send"))
|
||||||
|
{
|
||||||
|
send_chat_msg = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (send_chat_msg)
|
||||||
{
|
{
|
||||||
if (!(state.window_state & window_state_send_message))
|
if (!(state.window_state & window_state_send_message))
|
||||||
{
|
{
|
||||||
|
@ -351,6 +393,7 @@ void Steam_Overlay::BuildFriendWindow(Friend const& frd, friend_window_state& st
|
||||||
// User closed the friend window
|
// User closed the friend window
|
||||||
if (!show)
|
if (!show)
|
||||||
state.window_state &= ~window_state_show;
|
state.window_state &= ~window_state_show;
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -443,7 +486,7 @@ void Steam_Overlay::RunCallbacks()
|
||||||
if (friend_info != friends.end())
|
if (friend_info != friends.end())
|
||||||
{
|
{
|
||||||
uint64 friend_id = friend_info->first.id();
|
uint64 friend_id = friend_info->first.id();
|
||||||
// The user clicken on "Send"
|
// The user clicked on "Send"
|
||||||
if (friend_info->second.window_state & window_state_send_message)
|
if (friend_info->second.window_state & window_state_send_message)
|
||||||
{
|
{
|
||||||
char* input = friend_info->second.chat_input;
|
char* input = friend_info->second.chat_input;
|
||||||
|
@ -451,6 +494,7 @@ void Steam_Overlay::RunCallbacks()
|
||||||
char* printable_char = std::find_if(input, end_input, [](char c) {
|
char* printable_char = std::find_if(input, end_input, [](char c) {
|
||||||
return std::isgraph(c);
|
return std::isgraph(c);
|
||||||
});
|
});
|
||||||
|
// Check if the message contains something else than blanks
|
||||||
if (printable_char != end_input)
|
if (printable_char != end_input)
|
||||||
{
|
{
|
||||||
// Handle chat send
|
// Handle chat send
|
||||||
|
@ -500,7 +544,7 @@ void Steam_Overlay::RunCallbacks()
|
||||||
|
|
||||||
friend_info->second.window_state &= ~window_state_join;
|
friend_info->second.window_state &= ~window_state_join;
|
||||||
}
|
}
|
||||||
// The user got a lobby invite and accepeted it
|
// The user got a lobby invite and accepted it
|
||||||
if (friend_info->second.window_state & window_state_lobby_invite)
|
if (friend_info->second.window_state & window_state_lobby_invite)
|
||||||
{
|
{
|
||||||
GameLobbyJoinRequested_t data;
|
GameLobbyJoinRequested_t data;
|
||||||
|
@ -510,7 +554,7 @@ void Steam_Overlay::RunCallbacks()
|
||||||
|
|
||||||
friend_info->second.window_state &= ~window_state_lobby_invite;
|
friend_info->second.window_state &= ~window_state_lobby_invite;
|
||||||
}
|
}
|
||||||
// The user got a rich presence invite and accepeted it
|
// The user got a rich presence invite and accepted it
|
||||||
if (friend_info->second.window_state & window_state_rich_invite)
|
if (friend_info->second.window_state & window_state_rich_invite)
|
||||||
{
|
{
|
||||||
GameRichPresenceJoinRequested_t data = {};
|
GameRichPresenceJoinRequested_t data = {};
|
||||||
|
|
|
@ -80,6 +80,9 @@ class Steam_Overlay
|
||||||
void Callback(Common_Message* msg);
|
void Callback(Common_Message* msg);
|
||||||
void RunCallbacks();
|
void RunCallbacks();
|
||||||
|
|
||||||
|
bool FriendHasLobby(uint64 friend_id);
|
||||||
|
bool IHaveLobby();
|
||||||
|
|
||||||
// Right click on friend
|
// Right click on friend
|
||||||
void BuildContextMenu(Friend const& frd, friend_window_state &state);
|
void BuildContextMenu(Friend const& frd, friend_window_state &state);
|
||||||
// Double click on friend
|
// Double click on friend
|
||||||
|
|
Loading…
Reference in a new issue