diff options
author | George Hazan <ghazan@miranda.im> | 2017-06-28 22:48:18 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2017-06-28 22:48:18 +0300 |
commit | 3b8f809c7b6244352d908c9d3f4718335c4f2eed (patch) | |
tree | 38dbb05b053ea28aa43b332945d82d808499a72f | |
parent | 16a9a859b4d84186c2162cc3d3ee450433921dbc (diff) |
fixes #769 (Broken colors in TabSRMM niclkist when IRC reconnects)
-rw-r--r-- | src/mir_app/src/chat.h | 4 | ||||
-rw-r--r-- | src/mir_app/src/chat_manager.cpp | 29 | ||||
-rw-r--r-- | src/mir_app/src/chat_svc.cpp | 22 |
3 files changed, 41 insertions, 14 deletions
diff --git a/src/mir_app/src/chat.h b/src/mir_app/src/chat.h index 7fff02b700..136ea36752 100644 --- a/src/mir_app/src/chat.h +++ b/src/mir_app/src/chat.h @@ -67,8 +67,8 @@ void SM_RemoveAll(void); int SM_RemoveSession(const wchar_t *pszID, const char *pszModule, bool removeContact);
BOOL SM_RemoveUser(const wchar_t *pszID, const char *pszModule, const wchar_t *pszUID);
BOOL SM_SetContactStatus(const wchar_t *pszID, const char *pszModule, const wchar_t *pszUID, WORD wStatus);
-BOOL SM_SetOffline(SESSION_INFO *si);
-BOOL SM_SetStatus(SESSION_INFO *si, int wStatus);
+BOOL SM_SetOffline(const char *pszModule, SESSION_INFO *si);
+BOOL SM_SetStatus(const char *pszModule, SESSION_INFO *si, int wStatus);
BOOL SM_TakeStatus(const wchar_t *pszID, const char *pszModule, const wchar_t *pszUID, const wchar_t *pszStatus);
SESSION_INFO* SM_FindSession(const wchar_t *pszID, const char *pszModule);
diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp index f2b6fa00cb..378d3d6812 100644 --- a/src/mir_app/src/chat_manager.cpp +++ b/src/mir_app/src/chat_manager.cpp @@ -159,10 +159,19 @@ SESSION_INFO* SM_FindSession(const wchar_t *pszID, const char *pszModule) return g_arSessions.find(&tmp);
}
-BOOL SM_SetOffline(SESSION_INFO *si)
+BOOL SM_SetOffline(const char *pszModule, SESSION_INFO *si)
{
- if (si == nullptr)
- return FALSE;
+ if (si == nullptr) {
+ if (pszModule == nullptr)
+ return FALSE;
+
+ for (int i = 0; i < g_arSessions.getCount(); i++) {
+ si = g_arSessions[i];
+ if (!_strcmpi(si->pszModule, pszModule))
+ SM_SetOffline(pszModule, si);
+ }
+ return TRUE;
+ }
chatApi.UM_RemoveAll(&si->pUsers);
si->pMe = nullptr;
@@ -329,8 +338,20 @@ static BOOL SM_BroadcastMessage(const char *pszModule, UINT msg, WPARAM wParam, return TRUE;
}
-BOOL SM_SetStatus(SESSION_INFO *si, int wStatus)
+BOOL SM_SetStatus(const char *pszModule, SESSION_INFO *si, int wStatus)
{
+ if (si == nullptr) {
+ if (pszModule == nullptr)
+ return FALSE;
+
+ for (int i = 0; i < g_arSessions.getCount(); i++) {
+ si = g_arSessions[i];
+ if (!_strcmpi(si->pszModule, pszModule))
+ SM_SetStatus(pszModule, si, wStatus);
+ }
+ return TRUE;
+ }
+
si->wStatus = wStatus;
if (si->hContact) {
if (si->iType != GCW_SERVER && wStatus != ID_STATUS_OFFLINE)
diff --git a/src/mir_app/src/chat_svc.cpp b/src/mir_app/src/chat_svc.cpp index 5b57d79b00..cc64cd31d1 100644 --- a/src/mir_app/src/chat_svc.cpp +++ b/src/mir_app/src/chat_svc.cpp @@ -279,39 +279,45 @@ static INT_PTR __stdcall stubRoomControl(void *param) ChatConrolParam *p = (ChatConrolParam*)param;
mir_cslock lck(csChat);
- SESSION_INFO *si = chatApi.SM_FindSession(p->wszId, p->szModule);
- if (si == nullptr)
- return GC_EVENT_ERROR;
+ SESSION_INFO *si = nullptr;
+ if (p->szModule)
+ si = chatApi.SM_FindSession(p->wszId, p->szModule);
switch (p->command) {
case WINDOW_HIDDEN:
+ if (si == nullptr)
+ return GC_EVENT_ERROR;
SetInitDone(si);
chatApi.SetActiveSession(si);
break;
case WINDOW_VISIBLE:
case SESSION_INITDONE:
+ if (si == nullptr)
+ return GC_EVENT_ERROR;
SetInitDone(si);
if (p->command != SESSION_INITDONE || db_get_b(0, CHAT_MODULE, "PopupOnJoin", 0) == 0)
chatApi.ShowRoom(si);
break;
case SESSION_OFFLINE:
- SM_SetOffline(si);
- SM_SetStatus(si, ID_STATUS_OFFLINE);
- if (si->pDlg) {
+ SM_SetOffline(p->szModule, si);
+ SM_SetStatus(p->szModule, si, ID_STATUS_OFFLINE);
+ if (si && si->pDlg) {
si->pDlg->UpdateStatusBar();
si->pDlg->UpdateNickList();
}
break;
case SESSION_ONLINE:
- SM_SetStatus(si, ID_STATUS_ONLINE);
- if (si->pDlg)
+ SM_SetStatus(p->szModule, si, ID_STATUS_ONLINE);
+ if (si && si->pDlg)
si->pDlg->UpdateStatusBar();
break;
case WINDOW_CLEARLOG:
+ if (si == nullptr)
+ return GC_EVENT_ERROR;
chatApi.LM_RemoveAll(&si->pLog, &si->pLogEnd);
si->iEventCount = 0;
si->LastTime = 0;
|