summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/company_cmd.cpp3
-rw-r--r--src/network/network.cpp9
-rw-r--r--src/network/network_base.h2
-rw-r--r--src/network/network_chat_gui.cpp15
4 files changed, 23 insertions, 6 deletions
diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp
index a2dbbab7b..37e857a3f 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 55794fa4d..5255b30ef 100644
--- a/src/network/network.cpp
+++ b/src/network/network.cpp
@@ -95,6 +95,15 @@ static ClientID _network_client_id = CLIENT_ID_FIRST;
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
index 816b9d5e7..4ed03e1f2 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 317b547c2..3d10b72d0 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 */