diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -89,6 +89,9 @@ void SetLocalCompany(CompanyID new_compa /* 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 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -95,6 +95,15 @@ static ClientID _network_client_id = CLI 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 * @return return a pointer to the corresponding NetworkClientInfo struct diff --git a/src/network/network_base.h b/src/network/network_base.h --- a/src/network/network_base.h +++ b/src/network/network_base.h @@ -30,7 +30,7 @@ struct NetworkClientInfo : NetworkClient 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 --- a/src/network/network_chat_gui.cpp +++ b/src/network/network_chat_gui.cpp @@ -277,7 +277,7 @@ struct NetworkChatWindow : public QueryS 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 QueryS 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 QueryS { 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_des 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 */