diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index a2dbbab7b6..37e857a3f5 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -89,6 +89,9 @@ void SetLocalCompany(CompanyID new_company) /* company could also be COMPANY_SPECTATOR or OWNER_NONE */ assert(Company::IsValidID(new_company) || new_company == COMPANY_SPECTATOR || new_company == OWNER_NONE); + /* Delete the chat window, if you were team chatting. */ + InvalidateWindowData(WC_SEND_NETWORK_MSG, DESTTYPE_TEAM, _local_company); + _local_company = new_company; /* Delete any construction windows... */ diff --git a/src/network/network.cpp b/src/network/network.cpp index 55794fa4d4..5255b30ef7 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -94,6 +94,15 @@ static ClientID _network_client_id = CLIENT_ID_FIRST; /* Some externs / forwards */ extern void StateGameLoop(); +/** + * Basically a client is leaving us right now. + */ +NetworkClientInfo::~NetworkClientInfo() +{ + /* Delete the chat window, if you were chatting with this client. */ + InvalidateWindowData(WC_SEND_NETWORK_MSG, DESTTYPE_CLIENT, this->client_id); +} + /** * Return the CI given it's raw index * @param index the index to search for diff --git a/src/network/network_base.h b/src/network/network_base.h index 816b9d5e7f..4ed03e1f2f 100644 --- a/src/network/network_base.h +++ b/src/network/network_base.h @@ -30,7 +30,7 @@ struct NetworkClientInfo : NetworkClientInfoPool::PoolItem<&_networkclientinfo_p char unique_id[NETWORK_UNIQUE_ID_LENGTH]; ///< Every play sends an unique id so we can indentify him NetworkClientInfo(ClientID client_id = INVALID_CLIENT_ID) : client_id(client_id) {} - ~NetworkClientInfo() { client_id = INVALID_CLIENT_ID; } + ~NetworkClientInfo(); }; #define FOR_ALL_CLIENT_INFOS_FROM(var, start) FOR_ALL_ITEMS_FROM(NetworkClientInfo, clientinfo_index, var, start) diff --git a/src/network/network_chat_gui.cpp b/src/network/network_chat_gui.cpp index 317b547c2c..3d10b72d0c 100644 --- a/src/network/network_chat_gui.cpp +++ b/src/network/network_chat_gui.cpp @@ -277,7 +277,7 @@ struct NetworkChatWindow : public QueryStringBaseWindow { StringID dest_string; int dest; - NetworkChatWindow (const WindowDesc *desc, DestType type, int dest) : QueryStringBaseWindow(NETWORK_CHAT_LENGTH) + NetworkChatWindow(const WindowDesc *desc, DestType type, int dest) : QueryStringBaseWindow(NETWORK_CHAT_LENGTH) { this->dtype = type; this->dest = dest; @@ -292,14 +292,14 @@ struct NetworkChatWindow : public QueryStringBaseWindow { assert((uint)this->dtype < lengthof(chat_captions)); this->dest_string = chat_captions[this->dtype]; - this->InitNested(desc); + this->InitNested(desc, type); this->SetFocusedWidget(NWCW_TEXTBOX); InvalidateWindowData(WC_NEWS_WINDOW, 0, this->height); _chat_tab_completion_active = false; } - ~NetworkChatWindow () + ~NetworkChatWindow() { InvalidateWindowData(WC_NEWS_WINDOW, 0, 0); } @@ -505,6 +505,11 @@ struct NetworkChatWindow : public QueryStringBaseWindow { { ShowOnScreenKeyboard(this, wid, NWCW_CLOSE, NWCW_SENDBUTTON); } + + virtual void OnInvalidateData(int data) + { + if (data == this->dest) delete this; + } }; static const NWidgetPart _nested_chat_window_widgets[] = { @@ -530,8 +535,8 @@ static const WindowDesc _chat_window_desc( void ShowNetworkChatQueryWindow(DestType type, int dest) { - DeleteWindowById(WC_SEND_NETWORK_MSG, 0); - new NetworkChatWindow (&_chat_window_desc, type, dest); + DeleteWindowByClass(WC_SEND_NETWORK_MSG); + new NetworkChatWindow(&_chat_window_desc, type, dest); } #endif /* ENABLE_NETWORK */