From 757cf804d44e1e337bb060d6e6797b3cfab0c0d2 Mon Sep 17 00:00:00 2001
From: Amos <k.mazidjatari@gmail.com>
Date: Mon, 19 Jul 2021 10:14:46 -0700
Subject: [PATCH] Fix crash in ServerBrowser while executing commands

---
 r5dev/include/overlay.h     | 198 ++++++++++++++++++------------------
 r5dev/src/overlay.cpp       |  53 +++++++---
 r5dev/src/serverlisting.cpp |   2 +-
 3 files changed, 142 insertions(+), 111 deletions(-)

diff --git a/r5dev/include/overlay.h b/r5dev/include/overlay.h
index 30dbb7b4..bb366bdd 100644
--- a/r5dev/include/overlay.h
+++ b/r5dev/include/overlay.h
@@ -78,58 +78,58 @@ public:
         ImGuiStyle& style = ImGui::GetStyle();
         ImVec4* colors = style.Colors;
 
-        colors[ImGuiCol_Text] = ImVec4(0.81f, 0.81f, 0.81f, 1.00f);
-        colors[ImGuiCol_TextDisabled] = ImVec4(0.56f, 0.56f, 0.56f, 1.00f);
-        colors[ImGuiCol_WindowBg] = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
-        colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
-        colors[ImGuiCol_PopupBg] = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
-        colors[ImGuiCol_Border] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
-        colors[ImGuiCol_BorderShadow] = ImVec4(0.04f, 0.04f, 0.04f, 0.64f);
-        colors[ImGuiCol_FrameBg] = ImVec4(0.13f, 0.13f, 0.13f, 1.00f);
-        colors[ImGuiCol_FrameBgHovered] = ImVec4(0.19f, 0.19f, 0.19f, 1.00f);
-        colors[ImGuiCol_FrameBgActive] = ImVec4(0.24f, 0.24f, 0.24f, 1.00f);
-        colors[ImGuiCol_TitleBg] = ImVec4(0.22f, 0.22f, 0.22f, 1.00f);
-        colors[ImGuiCol_TitleBgActive] = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
-        colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
-        colors[ImGuiCol_MenuBarBg] = ImVec4(0.22f, 0.22f, 0.22f, 1.00f);
-        colors[ImGuiCol_ScrollbarBg] = ImVec4(0.10f, 0.10f, 0.10f, 1.00f);
-        colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
-        colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
-        colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
-        colors[ImGuiCol_CheckMark] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f);
-        colors[ImGuiCol_SliderGrab] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
-        colors[ImGuiCol_SliderGrabActive] = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
-        colors[ImGuiCol_Button] = ImVec4(0.35f, 0.35f, 0.35f, 1.00f);
-        colors[ImGuiCol_ButtonHovered] = ImVec4(0.45f, 0.45f, 0.45f, 1.00f);
-        colors[ImGuiCol_ButtonActive] = ImVec4(0.52f, 0.52f, 0.52f, 1.00f);
-        colors[ImGuiCol_Header] = ImVec4(0.35f, 0.35f, 0.35f, 1.00f);
-        colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.45f, 1.00f);
-        colors[ImGuiCol_HeaderActive] = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
-        colors[ImGuiCol_Separator] = ImVec4(0.53f, 0.53f, 0.57f, 1.00f);
-        colors[ImGuiCol_SeparatorHovered] = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
-        colors[ImGuiCol_SeparatorActive] = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
-        colors[ImGuiCol_ResizeGrip] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
-        colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.52f, 0.52f, 0.52f, 1.00f);
-        colors[ImGuiCol_ResizeGripActive] = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
-        colors[ImGuiCol_Tab] = ImVec4(0.18f, 0.18f, 0.18f, 1.00f);
-        colors[ImGuiCol_TabHovered] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
-        colors[ImGuiCol_TabActive] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
+        colors[ImGuiCol_Text]                   = ImVec4(0.81f, 0.81f, 0.81f, 1.00f);
+        colors[ImGuiCol_TextDisabled]           = ImVec4(0.56f, 0.56f, 0.56f, 1.00f);
+        colors[ImGuiCol_WindowBg]               = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
+        colors[ImGuiCol_ChildBg]                = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
+        colors[ImGuiCol_PopupBg]                = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
+        colors[ImGuiCol_Border]                 = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
+        colors[ImGuiCol_BorderShadow]           = ImVec4(0.04f, 0.04f, 0.04f, 0.64f);
+        colors[ImGuiCol_FrameBg]                = ImVec4(0.13f, 0.13f, 0.13f, 1.00f);
+        colors[ImGuiCol_FrameBgHovered]         = ImVec4(0.19f, 0.19f, 0.19f, 1.00f);
+        colors[ImGuiCol_FrameBgActive]          = ImVec4(0.24f, 0.24f, 0.24f, 1.00f);
+        colors[ImGuiCol_TitleBg]                = ImVec4(0.22f, 0.22f, 0.22f, 1.00f);
+        colors[ImGuiCol_TitleBgActive]          = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
+        colors[ImGuiCol_TitleBgCollapsed]       = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
+        colors[ImGuiCol_MenuBarBg]              = ImVec4(0.22f, 0.22f, 0.22f, 1.00f);
+        colors[ImGuiCol_ScrollbarBg]            = ImVec4(0.10f, 0.10f, 0.10f, 1.00f);
+        colors[ImGuiCol_ScrollbarGrab]          = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
+        colors[ImGuiCol_ScrollbarGrabHovered]   = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
+        colors[ImGuiCol_ScrollbarGrabActive]    = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
+        colors[ImGuiCol_CheckMark]              = ImVec4(0.61f, 0.61f, 0.61f, 1.00f);
+        colors[ImGuiCol_SliderGrab]             = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
+        colors[ImGuiCol_SliderGrabActive]       = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
+        colors[ImGuiCol_Button]                 = ImVec4(0.35f, 0.35f, 0.35f, 1.00f);
+        colors[ImGuiCol_ButtonHovered]          = ImVec4(0.45f, 0.45f, 0.45f, 1.00f);
+        colors[ImGuiCol_ButtonActive]           = ImVec4(0.52f, 0.52f, 0.52f, 1.00f);
+        colors[ImGuiCol_Header]                 = ImVec4(0.35f, 0.35f, 0.35f, 1.00f);
+        colors[ImGuiCol_HeaderHovered]          = ImVec4(0.45f, 0.45f, 0.45f, 1.00f);
+        colors[ImGuiCol_HeaderActive]           = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
+        colors[ImGuiCol_Separator]              = ImVec4(0.53f, 0.53f, 0.57f, 1.00f);
+        colors[ImGuiCol_SeparatorHovered]       = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
+        colors[ImGuiCol_SeparatorActive]        = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
+        colors[ImGuiCol_ResizeGrip]             = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
+        colors[ImGuiCol_ResizeGripHovered]      = ImVec4(0.52f, 0.52f, 0.52f, 1.00f);
+        colors[ImGuiCol_ResizeGripActive]       = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
+        colors[ImGuiCol_Tab]                    = ImVec4(0.18f, 0.18f, 0.18f, 1.00f);
+        colors[ImGuiCol_TabHovered]             = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
+        colors[ImGuiCol_TabActive]              = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
 
-        style.WindowBorderSize = 0.0f;
-        style.FrameBorderSize = 1.0f;
-        style.ChildBorderSize = 1.0f;
-        style.PopupBorderSize = 1.0f;
-        style.TabBorderSize = 1.0f;
+        style.WindowBorderSize  = 0.0f;
+        style.FrameBorderSize   = 1.0f;
+        style.ChildBorderSize   = 1.0f;
+        style.PopupBorderSize   = 1.0f;
+        style.TabBorderSize     = 1.0f;
 
-        style.WindowRounding = 2.5f;
-        style.FrameRounding = 0.0f;
-        style.ChildRounding = 0.0f;
-        style.PopupRounding = 0.0f;
-        style.TabRounding = 1.0f;
+        style.WindowRounding    = 2.5f;
+        style.FrameRounding     = 0.0f;
+        style.ChildRounding     = 0.0f;
+        style.PopupRounding     = 0.0f;
+        style.TabRounding       = 1.0f;
         style.ScrollbarRounding = 1.0f;
 
-        style.ItemSpacing = ImVec2(4, 4);
-        style.WindowPadding = ImVec2(5, 5);
+        style.ItemSpacing       = ImVec2(4, 4);
+        style.WindowPadding     = ImVec2(5, 5);
     }
 };
 
@@ -199,58 +199,58 @@ public:
         ImGuiStyle& style = ImGui::GetStyle();
         ImVec4* colors = style.Colors;
 
-        colors[ImGuiCol_Text] = ImVec4(0.81f, 0.81f, 0.81f, 1.00f);
-        colors[ImGuiCol_TextDisabled] = ImVec4(0.56f, 0.56f, 0.56f, 1.00f);
-        colors[ImGuiCol_WindowBg] = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
-        colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
-        colors[ImGuiCol_PopupBg] = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
-        colors[ImGuiCol_Border] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
-        colors[ImGuiCol_BorderShadow] = ImVec4(0.04f, 0.04f, 0.04f, 0.64f);
-        colors[ImGuiCol_FrameBg] = ImVec4(0.13f, 0.13f, 0.13f, 1.00f);
-        colors[ImGuiCol_FrameBgHovered] = ImVec4(0.19f, 0.19f, 0.19f, 1.00f);
-        colors[ImGuiCol_FrameBgActive] = ImVec4(0.24f, 0.24f, 0.24f, 1.00f);
-        colors[ImGuiCol_TitleBg] = ImVec4(0.22f, 0.22f, 0.22f, 1.00f);
-        colors[ImGuiCol_TitleBgActive] = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
-        colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
-        colors[ImGuiCol_MenuBarBg] = ImVec4(0.22f, 0.22f, 0.22f, 1.00f);
-        colors[ImGuiCol_ScrollbarBg] = ImVec4(0.10f, 0.10f, 0.10f, 1.00f);
-        colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
-        colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
-        colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
-        colors[ImGuiCol_CheckMark] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f);
-        colors[ImGuiCol_SliderGrab] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
-        colors[ImGuiCol_SliderGrabActive] = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
-        colors[ImGuiCol_Button] = ImVec4(0.35f, 0.35f, 0.35f, 1.00f);
-        colors[ImGuiCol_ButtonHovered] = ImVec4(0.45f, 0.45f, 0.45f, 1.00f);
-        colors[ImGuiCol_ButtonActive] = ImVec4(0.52f, 0.52f, 0.52f, 1.00f);
-        colors[ImGuiCol_Header] = ImVec4(0.35f, 0.35f, 0.35f, 1.00f);
-        colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.45f, 1.00f);
-        colors[ImGuiCol_HeaderActive] = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
-        colors[ImGuiCol_Separator] = ImVec4(0.53f, 0.53f, 0.57f, 1.00f);
-        colors[ImGuiCol_SeparatorHovered] = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
-        colors[ImGuiCol_SeparatorActive] = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
-        colors[ImGuiCol_ResizeGrip] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
-        colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.52f, 0.52f, 0.52f, 1.00f);
-        colors[ImGuiCol_ResizeGripActive] = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
-        colors[ImGuiCol_Tab] = ImVec4(0.18f, 0.18f, 0.18f, 1.00f);
-        colors[ImGuiCol_TabHovered] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
-        colors[ImGuiCol_TabActive] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
+        colors[ImGuiCol_Text]                   = ImVec4(0.81f, 0.81f, 0.81f, 1.00f);
+        colors[ImGuiCol_TextDisabled]           = ImVec4(0.56f, 0.56f, 0.56f, 1.00f);
+        colors[ImGuiCol_WindowBg]               = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
+        colors[ImGuiCol_ChildBg]                = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
+        colors[ImGuiCol_PopupBg]                = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
+        colors[ImGuiCol_Border]                 = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
+        colors[ImGuiCol_BorderShadow]           = ImVec4(0.04f, 0.04f, 0.04f, 0.64f);
+        colors[ImGuiCol_FrameBg]                = ImVec4(0.13f, 0.13f, 0.13f, 1.00f);
+        colors[ImGuiCol_FrameBgHovered]         = ImVec4(0.19f, 0.19f, 0.19f, 1.00f);
+        colors[ImGuiCol_FrameBgActive]          = ImVec4(0.24f, 0.24f, 0.24f, 1.00f);
+        colors[ImGuiCol_TitleBg]                = ImVec4(0.22f, 0.22f, 0.22f, 1.00f);
+        colors[ImGuiCol_TitleBgActive]          = ImVec4(0.27f, 0.27f, 0.27f, 1.00f);
+        colors[ImGuiCol_TitleBgCollapsed]       = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);
+        colors[ImGuiCol_MenuBarBg]              = ImVec4(0.22f, 0.22f, 0.22f, 1.00f);
+        colors[ImGuiCol_ScrollbarBg]            = ImVec4(0.10f, 0.10f, 0.10f, 1.00f);
+        colors[ImGuiCol_ScrollbarGrab]          = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
+        colors[ImGuiCol_ScrollbarGrabHovered]   = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
+        colors[ImGuiCol_ScrollbarGrabActive]    = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
+        colors[ImGuiCol_CheckMark]              = ImVec4(0.61f, 0.61f, 0.61f, 1.00f);
+        colors[ImGuiCol_SliderGrab]             = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
+        colors[ImGuiCol_SliderGrabActive]       = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
+        colors[ImGuiCol_Button]                 = ImVec4(0.35f, 0.35f, 0.35f, 1.00f);
+        colors[ImGuiCol_ButtonHovered]          = ImVec4(0.45f, 0.45f, 0.45f, 1.00f);
+        colors[ImGuiCol_ButtonActive]           = ImVec4(0.52f, 0.52f, 0.52f, 1.00f);
+        colors[ImGuiCol_Header]                 = ImVec4(0.35f, 0.35f, 0.35f, 1.00f);
+        colors[ImGuiCol_HeaderHovered]          = ImVec4(0.45f, 0.45f, 0.45f, 1.00f);
+        colors[ImGuiCol_HeaderActive]           = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
+        colors[ImGuiCol_Separator]              = ImVec4(0.53f, 0.53f, 0.57f, 1.00f);
+        colors[ImGuiCol_SeparatorHovered]       = ImVec4(0.53f, 0.53f, 0.53f, 1.00f);
+        colors[ImGuiCol_SeparatorActive]        = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
+        colors[ImGuiCol_ResizeGrip]             = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);
+        colors[ImGuiCol_ResizeGripHovered]      = ImVec4(0.52f, 0.52f, 0.52f, 1.00f);
+        colors[ImGuiCol_ResizeGripActive]       = ImVec4(0.63f, 0.63f, 0.63f, 1.00f);
+        colors[ImGuiCol_Tab]                    = ImVec4(0.18f, 0.18f, 0.18f, 1.00f);
+        colors[ImGuiCol_TabHovered]             = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
+        colors[ImGuiCol_TabActive]              = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
 
-        style.WindowBorderSize = 0.0f;
-        style.FrameBorderSize = 1.0f;
-        style.ChildBorderSize = 1.0f;
-        style.PopupBorderSize = 1.0f;
-        style.TabBorderSize = 1.0f;
+        style.WindowBorderSize  = 0.0f;
+        style.FrameBorderSize   = 1.0f;
+        style.ChildBorderSize   = 1.0f;
+        style.PopupBorderSize   = 1.0f;
+        style.TabBorderSize     = 1.0f;
 
-        style.WindowRounding = 2.5f;
-        style.FrameRounding = 0.0f;
-        style.ChildRounding = 0.0f;
-        style.PopupRounding = 0.0f;
-        style.TabRounding = 1.0f;
+        style.WindowRounding    = 2.5f;
+        style.FrameRounding     = 0.0f;
+        style.ChildRounding     = 0.0f;
+        style.PopupRounding     = 0.0f;
+        style.TabRounding       = 1.0f;
         style.ScrollbarRounding = 1.0f;
 
-        style.ItemSpacing = ImVec2(4, 4);
-        style.WindowPadding = ImVec2(5, 5);
+        style.ItemSpacing       = ImVec2(4, 4);
+        style.WindowPadding     = ImVec2(5, 5);
     }
 
     void RefreshServerList();
@@ -261,4 +261,8 @@ public:
     void HostServerSection();
     void Draw(const char* title);
     void UpdateHostingStatus();
-};
\ No newline at end of file
+    void ProcessCommand(const char* command_line);
+    void ExecCommand(const char* command_line);
+};
+
+extern CCompanion* g_ServerBrowser;
\ No newline at end of file
diff --git a/r5dev/src/overlay.cpp b/r5dev/src/overlay.cpp
index b55d4ea1..2783c6f2 100644
--- a/r5dev/src/overlay.cpp
+++ b/r5dev/src/overlay.cpp
@@ -6,10 +6,10 @@
 #include "patterns.h"
 #include "gameclasses.h"
 
-
 #define DebugOverlay
 
 CGameConsole* g_GameConsole = nullptr;
+CCompanion* g_ServerBrowser = nullptr;
 
 /*-----------------------------------------------------------------------------
  * _overlay.cpp
@@ -194,6 +194,7 @@ void CGameConsole::Draw(const char* title)
         strcpy_s(s, sizeof(replace), replace);
         reclaim_focus = true;
     }
+
     ImGui::SameLine();
     if (ImGui::Button("Submit"))
     {
@@ -206,8 +207,10 @@ void CGameConsole::Draw(const char* title)
 
     // Auto-focus on window apparition
     ImGui::SetItemDefaultFocus();
+
+    // Auto focus previous widget
     if (reclaim_focus)
-    {// Auto focus previous widget
+    {
         ImGui::SetKeyboardFocusHere(-1);
     }
 
@@ -319,7 +322,6 @@ int CGameConsole::TextEditCallback(ImGuiInputTextCallbackData* data)
 
 ///////////////////////////////////////////////////////////////////////////
 // Companion
-
 CCompanion::CCompanion()
 {
     memset(MatchmakingServerStringBuffer, 0, sizeof(MatchmakingServerStringBuffer));
@@ -487,9 +489,9 @@ void CCompanion::ServerBrowserSection()
     ImGui::EndGroup();
     ImGui::Separator();
 
-    ImGui::BeginChild("ServerListChild", { 0, 780 }, false, ImGuiWindowFlags_HorizontalScrollbar);
+    ImGui::BeginChild("ServerListChild", { 0, 780 }, true, ImGuiWindowFlags_NoScrollbar);
     {
-        ImGui::BeginTable("##ServerBrowser_ServerList", 4);
+        ImGui::BeginTable("##ServerBrowser_ServerList", 4, ImGuiWindowFlags_None);
         {
             ImGui::TableSetupColumn("Name", 0, 35);
             ImGui::TableSetupColumn("Map", 0, 25);
@@ -535,12 +537,14 @@ void CCompanion::ServerBrowserSection()
 
     ImGui::Separator();
     ImGui::InputTextWithHint("##ServerBrowser_ServerConnString", "Enter an ip address or \"localhost\"", ServerConnStringBuffer, IM_ARRAYSIZE(ServerConnStringBuffer));
+
     ImGui::SameLine();
     if (ImGui::Button("Connect to the server", ImVec2(ImGui::GetWindowSize().x * (1.f / 3.f), 19)))
     {
+        //const char* replace = ""; // For history pos soon
         std::stringstream cmd;
         cmd << "connect " << ServerConnStringBuffer;
-        g_GameConsole->ProcessCommand(cmd.str().c_str());
+        //strcpy_s(ServerConnStringBuffer, sizeof(replace), replace); // For history pos soon
     }
 }
 
@@ -580,7 +584,7 @@ void CCompanion::HostServerSection()
 
             std::stringstream cmd;
             cmd << "map " << SelectedMap->c_str();
-            g_GameConsole->ProcessCommand(cmd.str().c_str());
+            ProcessCommand(cmd.str().c_str());
 
             if (StartAsDedi)
             {
@@ -600,12 +604,12 @@ void CCompanion::HostServerSection()
     {
         if (ImGui::Button("Reload Scripts##ServerHost_ReloadServerButton", ImVec2(ImGui::GetWindowSize().x, 32)))
         {
-            g_GameConsole->ProcessCommand("reparse_weapons");
-            g_GameConsole->ProcessCommand("reload");
+            ProcessCommand("reparse_weapons");
+            ProcessCommand("reload");
         }
         if (ImGui::Button("Stop The Server##ServerHost_StopServerButton", ImVec2(ImGui::GetWindowSize().x, 32)))
         {
-            g_GameConsole->ProcessCommand("disconnect");
+            ProcessCommand("disconnect");
         }
     }
 }
@@ -626,7 +630,7 @@ void CCompanion::Draw(const char* title)
     ImGui::SetNextWindowSize(ImVec2(800, 890), ImGuiCond_FirstUseEver);
     ImGui::SetWindowPos(ImVec2(-500, 50), ImGuiCond_FirstUseEver);
 
-    if (!ImGui::Begin(title, NULL))
+    if (!ImGui::Begin(title, NULL, ImGuiWindowFlags_NoScrollbar))
     {
         ImGui::End();
         return;
@@ -652,8 +656,27 @@ void CCompanion::Draw(const char* title)
     ImGui::End();
 }
 
-///////////////////////////////////////////////////////////////////////////
-// Internals
+void CCompanion::ProcessCommand(const char* command_line)
+{
+    std::thread t(&CCompanion::ExecCommand, this, command_line);
+    t.detach();
+
+    // HACK: This is to avoid a race condition.
+    std::this_thread::sleep_for(std::chrono::milliseconds(1));
+
+    // TODO:
+    //ScrollToBottom = true;
+}
+
+void CCompanion::ExecCommand(const char* command_line)
+{
+    org_CommandExecute(NULL, command_line);
+}
+
+//#############################################################################
+// INTERNALS
+//#############################################################################
+
 int Stricmp(const char* s1, const char* s2)
 {
     int d;
@@ -708,5 +731,9 @@ void DrawConsole()
 void DrawBrowser()
 {
     static CCompanion browser;
+    static bool AssignPtr = []() {
+        g_ServerBrowser = &browser;
+        return true;
+    } ();
     browser.Draw("Companion");
 }
\ No newline at end of file
diff --git a/r5dev/src/serverlisting.cpp b/r5dev/src/serverlisting.cpp
index 86b08adf..0b50bf14 100644
--- a/r5dev/src/serverlisting.cpp
+++ b/r5dev/src/serverlisting.cpp
@@ -6,5 +6,5 @@ void ServerListing::Select()
 {
 	std::stringstream cmd;
 	cmd << "connect " << this->ip;
-	g_GameConsole->ProcessCommand(cmd.str().c_str());
+	g_ServerBrowser->ProcessCommand(cmd.str().c_str());
 }
\ No newline at end of file