summaryrefslogtreecommitdiff
path: root/src/core/stdmsg
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/stdmsg')
-rw-r--r--src/core/stdmsg/src/chat_window.cpp45
-rw-r--r--src/core/stdmsg/src/globals.cpp6
-rw-r--r--src/core/stdmsg/src/msgdialog.cpp200
-rw-r--r--src/core/stdmsg/src/msgs.cpp27
-rw-r--r--src/core/stdmsg/src/msgs.h21
-rw-r--r--src/core/stdmsg/src/stdafx.h1
-rw-r--r--src/core/stdmsg/src/tabs.cpp24
7 files changed, 140 insertions, 184 deletions
diff --git a/src/core/stdmsg/src/chat_window.cpp b/src/core/stdmsg/src/chat_window.cpp
index 75eac732e4..3f98522e12 100644
--- a/src/core/stdmsg/src/chat_window.cpp
+++ b/src/core/stdmsg/src/chat_window.cpp
@@ -29,14 +29,8 @@ static wchar_t szTrimString[] = L":;,.!?\'\"><()[]- \r\n";
/////////////////////////////////////////////////////////////////////////////////////////
CChatRoomDlg::CChatRoomDlg(CTabbedWindow *pOwner, SESSION_INFO *si) :
- CSuper(pOwner, IDD_CHANNEL, si),
- m_btnOk(this, IDOK),
-
- m_splitterX(this, IDC_SPLITTERX),
- m_splitterY(this, IDC_SPLITTERY)
+ CSuper(pOwner, IDD_CHANNEL, si)
{
- m_szProto = si->pszModule;
-
m_btnOk.OnClick = Callback(this, &CChatRoomDlg::onClick_Ok);
m_btnFilter.OnClick = Callback(this, &CChatRoomDlg::onClick_Filter);
@@ -1057,26 +1051,6 @@ INT_PTR CChatRoomDlg::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, TRUE);
return TRUE;
}
- break;
-
- case TTN_NEEDTEXT:
- if (((LPNMHDR)lParam)->idFrom == (UINT_PTR)m_nickList.GetHwnd()) {
- LPNMTTDISPINFO lpttd = (LPNMTTDISPINFO)lParam;
- SESSION_INFO* parentdat = (SESSION_INFO*)GetWindowLongPtr(m_hwnd, GWLP_USERDATA);
- POINT p;
- GetCursorPos(&p);
- ScreenToClient(m_nickList.GetHwnd(), &p);
- int item = LOWORD(m_nickList.SendMsg(LB_ITEMFROMPOINT, 0, MAKELPARAM(p.x, p.y)));
- USERINFO *ui = g_chatApi.SM_GetUserFromIndex(parentdat->ptszID, parentdat->pszModule, item);
- if (ui != nullptr) {
- static wchar_t ptszBuf[1024];
- mir_snwprintf(ptszBuf, L"%s: %s\r\n%s: %s\r\n%s: %s",
- TranslateT("Nickname"), ui->pszNick,
- TranslateT("Unique ID"), ui->pszUID,
- TranslateT("Status"), g_chatApi.TM_WordToString(parentdat->pStatuses, ui->Status));
- lpttd->lpszText = ptszBuf;
- }
- }
}
break;
@@ -1097,23 +1071,6 @@ INT_PTR CChatRoomDlg::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
UpdateTitle();
break;
- case DM_CLOSETAB:
- CloseTab();
- break;
-
- case DM_CASCADENEWWINDOW:
- if ((HWND)wParam != m_pOwner->GetHwnd()) {
- RECT rcThis, rcNew;
- GetWindowRect(m_pOwner->GetHwnd(), &rcThis);
- GetWindowRect((HWND)wParam, &rcNew);
- if (abs(rcThis.left - rcNew.left) < 3 && abs(rcThis.top - rcNew.top) < 3) {
- int offset = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
- SetWindowPos((HWND)wParam, nullptr, rcNew.left + offset, rcNew.top + offset, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE);
- *(int *)lParam = 1;
- }
- }
- break;
-
case WM_LBUTTONDBLCLK:
if (LOWORD(lParam) < 30)
ScrollToBottom();
diff --git a/src/core/stdmsg/src/globals.cpp b/src/core/stdmsg/src/globals.cpp
index d4561e6007..3d0cacca0c 100644
--- a/src/core/stdmsg/src/globals.cpp
+++ b/src/core/stdmsg/src/globals.cpp
@@ -53,9 +53,9 @@ static int OnShutdown(WPARAM, LPARAM)
static int OnMetaChanged(WPARAM hMeta, LPARAM)
{
if (hMeta) {
- HWND hwnd = Srmm_FindWindow(hMeta);
- if (hwnd != nullptr)
- SendMessage(hwnd, DM_GETAVATAR, 0, 0);
+ auto *pDlg = Srmm_FindDialog(hMeta);
+ if (pDlg != nullptr)
+ pDlg->UpdateAvatar();
}
return 0;
}
diff --git a/src/core/stdmsg/src/msgdialog.cpp b/src/core/stdmsg/src/msgdialog.cpp
index 1f5b7d25a6..52519ebf1d 100644
--- a/src/core/stdmsg/src/msgdialog.cpp
+++ b/src/core/stdmsg/src/msgdialog.cpp
@@ -33,23 +33,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define ENTERCLICKTIME 1000 //max time in ms during which a double-tap on enter will cause a send
-static int CompareDialogs(const CMsgDialog *p1, const CMsgDialog *p2)
-{
- if (p1->GetHwnd() == p2->GetHwnd())
- return 0;
-
- return (p1->GetHwnd() < p2->GetHwnd()) ? -1 : 1;
-}
-
-LIST<CMsgDialog> g_arDialogs(10, CompareDialogs);
+LIST<CMsgDialog> g_arDialogs(10, PtrKeySortT);
/////////////////////////////////////////////////////////////////////////////////////////
-static void AddToFileList(wchar_t ***pppFiles, int *totalCount, const wchar_t *szFilename)
+static void AddToFileList(wchar_t ***pppFiles, int &totalCount, const wchar_t *szFilename)
{
- *pppFiles = (wchar_t **)mir_realloc(*pppFiles, (++ * totalCount + 1) * sizeof(wchar_t *));
- (*pppFiles)[*totalCount] = nullptr;
- (*pppFiles)[*totalCount - 1] = mir_wstrdup(szFilename);
+ *pppFiles = (wchar_t **)mir_realloc(*pppFiles, (++totalCount + 1) * sizeof(wchar_t *));
+ (*pppFiles)[totalCount] = nullptr;
+ (*pppFiles)[totalCount - 1] = mir_wstrdup(szFilename);
if (GetFileAttributes(szFilename) & FILE_ATTRIBUTE_DIRECTORY) {
WIN32_FIND_DATA fd;
@@ -78,6 +70,8 @@ static void SetEditorText(HWND hwnd, const wchar_t *txt)
CMsgDialog::CMsgDialog(CTabbedWindow *pOwner, int iDialogId, SESSION_INFO *si) :
CSuper(g_plugin, iDialogId, si),
m_btnOk(this, IDOK),
+ m_splitterX(this, IDC_SPLITTERX),
+ m_splitterY(this, IDC_SPLITTERY),
m_pOwner(pOwner)
{
m_autoClose = 0;
@@ -86,9 +80,17 @@ CMsgDialog::CMsgDialog(CTabbedWindow *pOwner, int iDialogId, SESSION_INFO *si) :
g_arDialogs.insert(this);
}
+bool CMsgDialog::OnInitDialog()
+{
+ m_szProto = GetContactProto(m_hContact);
+
+ return CSuper::OnInitDialog();
+}
+
void CMsgDialog::OnDestroy()
{
- g_arDialogs.remove(this);
+ if (g_arDialogs.remove(this) == -1)
+ DebugBreak();
CSuper::OnDestroy();
}
@@ -164,6 +166,8 @@ LRESULT CMsgDialog::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam)
return CSuper::WndProc_Message(msg, wParam, lParam);
}
+/////////////////////////////////////////////////////////////////////////////////////////
+
int CMsgDialog::GetImageId() const
{
if (m_nFlash & 1)
@@ -215,7 +219,6 @@ void CMsgDialog::StopFlash()
CSrmmWindow::CSrmmWindow(CTabbedWindow *pOwner, MCONTACT hContact) :
CSuper(pOwner, IDD_MSG),
- m_splitter(this, IDC_SPLITTERY),
m_avatar(this, IDC_AVATAR),
m_cmdList(20),
m_bNoActivate(g_dat.bDoNotStealFocus)
@@ -223,7 +226,7 @@ CSrmmWindow::CSrmmWindow(CTabbedWindow *pOwner, MCONTACT hContact) :
m_hContact = hContact;
m_btnOk.OnClick = Callback(this, &CSrmmWindow::onClick_Ok);
- m_splitter.OnChange = Callback(this, &CSrmmWindow::OnSplitterMoved);
+ m_splitterY.OnChange = Callback(this, &CSrmmWindow::OnSplitterMoved);
}
bool CSrmmWindow::OnInitDialog()
@@ -243,8 +246,6 @@ bool CSrmmWindow::OnInitDialog()
mir_free(m_wszInitialText);
}
- m_szProto = GetContactProto(m_hContact);
-
// avatar stuff
m_limitAvatarH = g_dat.bLimitAvatarHeight ? g_dat.iAvatarHeight : 0;
@@ -259,7 +260,7 @@ bool CSrmmWindow::OnInitDialog()
GetWindowRect(m_message.GetHwnd(), &m_minEditInit);
m_iSplitterY = g_plugin.getDword(g_dat.bSavePerContact ? m_hContact : 0, "splitterPos", m_minEditInit.bottom - m_minEditInit.top);
- SendMessage(m_hwnd, DM_UPDATESIZEBAR, 0, 0);
+ UpdateSizeBar();
m_avatar.Enable(false);
@@ -378,7 +379,7 @@ bool CSrmmWindow::OnInitDialog()
SetFocus(m_message.GetHwnd());
}
- SendMessage(m_hwnd, DM_GETAVATAR, 0, 0);
+ UpdateAvatar();
NotifyEvent(MSG_WINDOW_EVT_OPEN);
return true;
}
@@ -502,7 +503,7 @@ void CSrmmWindow::OnOptionsApplied(bool bUpdateAvatar)
}
ShowWindow(GetDlgItem(m_hwnd, IDCANCEL), SW_HIDE);
- m_splitter.Show();
+ m_splitterY.Show();
m_btnOk.Show(g_dat.bSendButton);
m_btnOk.Enable(GetWindowTextLength(m_message.GetHwnd()) != 0);
@@ -529,7 +530,7 @@ void CSrmmWindow::OnOptionsApplied(bool bUpdateAvatar)
m_limitAvatarH = g_dat.bLimitAvatarHeight ? g_dat.iAvatarHeight : 0;
if (bUpdateAvatar)
- SendMessage(m_hwnd, DM_GETAVATAR, 0, 0);
+ UpdateAvatar();
InvalidateRect(m_message.GetHwnd(), nullptr, FALSE);
@@ -636,7 +637,7 @@ void CSrmmWindow::ProcessFileDrop(HDROP hDrop)
wchar_t **ppFiles = nullptr;
for (int i = 0; i < fileCount; i++) {
DragQueryFile(hDrop, i, szFilename, _countof(szFilename));
- AddToFileList(&ppFiles, &totalCount, szFilename);
+ AddToFileList(&ppFiles, totalCount, szFilename);
}
CallServiceSync(MS_FILE_SENDSPECIFICFILEST, m_hContact, (LPARAM)ppFiles);
if (ppFiles) {
@@ -658,8 +659,8 @@ void CSrmmWindow::ShowAvatar()
}
else m_avatarPic = nullptr;
- SendMessage(m_hwnd, DM_UPDATESIZEBAR, 0, 0);
- SendMessage(m_hwnd, DM_AVATARSIZECHANGE, 0, 0);
+ UpdateSizeBar();
+ Resize();
}
void CSrmmWindow::ShowTime(bool bForce)
@@ -713,6 +714,16 @@ void CSrmmWindow::SetStatusText(const wchar_t *wszText, HICON hIcon)
SendMessage(m_pOwner->m_hwndStatus, SB_SETTEXT, 0, (LPARAM)(wszText == nullptr ? L"" : wszText));
}
+void CSrmmWindow::UpdateAvatar()
+{
+ PROTO_AVATAR_INFORMATION ai = {};
+ ai.hContact = m_hContact;
+ CallProtoService(m_szProto, PS_GETAVATARINFO, GAIF_FORCE, (LPARAM)&ai);
+
+ ShowAvatar();
+ SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, 1);
+}
+
void CSrmmWindow::UpdateIcon(WPARAM wParam)
{
if (!m_hContact || !m_szProto)
@@ -764,6 +775,39 @@ void CSrmmWindow::UpdateReadChars()
}
}
+void CSrmmWindow::UpdateSizeBar()
+{
+ m_minEditBoxSize.cx = m_minEditInit.right - m_minEditInit.left;
+ m_minEditBoxSize.cy = m_minEditInit.bottom - m_minEditInit.top;
+ if (g_dat.bShowAvatar) {
+ if (m_avatarPic == nullptr || !g_dat.bShowAvatar) {
+ m_avatarWidth = 50;
+ m_avatarHeight = 50;
+ m_avatar.Hide();
+ return;
+ }
+ else {
+ BITMAP bminfo;
+ GetObject(m_avatarPic, sizeof(bminfo), &bminfo);
+ m_avatarWidth = bminfo.bmWidth + 2;
+ m_avatarHeight = bminfo.bmHeight + 2;
+ if (m_limitAvatarH && m_avatarHeight > m_limitAvatarH) {
+ m_avatarWidth = bminfo.bmWidth * m_limitAvatarH / bminfo.bmHeight + 2;
+ m_avatarHeight = m_limitAvatarH + 2;
+ }
+ m_avatar.Show();
+ }
+
+ if (m_avatarPic && m_minEditBoxSize.cy <= m_avatarHeight) {
+ m_minEditBoxSize.cy = m_avatarHeight + 8;
+ if (m_iSplitterY < m_minEditBoxSize.cy) {
+ m_iSplitterY = m_minEditBoxSize.cy;
+ Resize();
+ }
+ }
+ }
+}
+
void CSrmmWindow::UpdateTitle()
{
wchar_t newtitle[256];
@@ -790,6 +834,11 @@ void CSrmmWindow::UpdateTitle()
}
}
+void CSrmmWindow::UserTyping(int nSecs)
+{
+ m_nTypeSecs = (nSecs > 0) ? nSecs : 0;
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
int CSrmmWindow::Resizer(UTILRESIZECONTROL *urc)
@@ -1102,75 +1151,6 @@ INT_PTR CSrmmWindow::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
ShowAvatar();
break;
- case DM_AVATARCALCSIZE:
- if (m_avatarPic == nullptr || !g_dat.bShowAvatar) {
- m_avatarWidth = 50;
- m_avatarHeight = 50;
- m_avatar.Hide();
- return 0;
- }
- else {
- BITMAP bminfo;
- GetObject(m_avatarPic, sizeof(bminfo), &bminfo);
- m_avatarWidth = bminfo.bmWidth + 2;
- m_avatarHeight = bminfo.bmHeight + 2;
- if (m_limitAvatarH && m_avatarHeight > m_limitAvatarH) {
- m_avatarWidth = bminfo.bmWidth * m_limitAvatarH / bminfo.bmHeight + 2;
- m_avatarHeight = m_limitAvatarH + 2;
- }
- m_avatar.Show();
- }
- break;
-
- case DM_UPDATESIZEBAR:
- m_minEditBoxSize.cx = m_minEditInit.right - m_minEditInit.left;
- m_minEditBoxSize.cy = m_minEditInit.bottom - m_minEditInit.top;
- if (g_dat.bShowAvatar) {
- SendMessage(m_hwnd, DM_AVATARCALCSIZE, 0, 0);
- if (m_avatarPic && m_minEditBoxSize.cy <= m_avatarHeight) {
- m_minEditBoxSize.cy = m_avatarHeight + 8;
- if (m_iSplitterY < m_minEditBoxSize.cy) {
- m_iSplitterY = m_minEditBoxSize.cy;
- Resize();
- }
- }
- }
- break;
-
- case DM_AVATARSIZECHANGE:
- GetWindowRect(m_message.GetHwnd(), &rc);
- Resize();
- break;
-
- case DM_GETAVATAR:
- {
- PROTO_AVATAR_INFORMATION ai = {};
- ai.hContact = m_hContact;
- CallProtoService(m_szProto, PS_GETAVATARINFO, GAIF_FORCE, (LPARAM)&ai);
-
- ShowAvatar();
- SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, 1);
- }
- break;
-
- case DM_TYPING:
- m_nTypeSecs = (INT_PTR)lParam > 0 ? (int)lParam : 0;
- break;
-
- case DM_USERNAMETOCLIP:
- if (m_hContact) {
- ptrW id(Contact_GetInfo(CNF_UNIQUEID, m_hContact, m_szProto));
- if (id != nullptr && OpenClipboard(m_hwnd)) {
- EmptyClipboard();
- HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE, mir_wstrlen(id) * sizeof(wchar_t) + 1);
- mir_wstrcpy((wchar_t*)GlobalLock(hData), id);
- GlobalUnlock(hData);
- SetClipboardData(CF_UNICODETEXT, hData);
- CloseClipboard();
- }
- }
- break;
-
case DM_OPTIONSAPPLIED:
OnOptionsApplied(wParam != 0);
break;
@@ -1181,19 +1161,6 @@ INT_PTR CSrmmWindow::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
Resize();
break;
- case DM_CASCADENEWWINDOW:
- if ((HWND)wParam != m_hwnd) {
- RECT rcThis, rcNew;
- GetWindowRect(m_pOwner->GetHwnd(), &rcThis);
- GetWindowRect((HWND)wParam, &rcNew);
- if (abs(rcThis.left - rcNew.left) < 3 && abs(rcThis.top - rcNew.top) < 3) {
- int offset = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
- SetWindowPos((HWND)wParam, nullptr, rcNew.left + offset, rcNew.top + offset, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE);
- *(int *)lParam = 1;
- }
- }
- break;
-
case WM_CBD_LOADICONS:
Srmm_UpdateToolbarIcons(m_hwnd);
break;
@@ -1363,8 +1330,19 @@ INT_PTR CSrmmWindow::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_USERMENU:
- if (GetKeyState(VK_SHIFT) & 0x8000) // copy user name
- SendMessage(m_hwnd, DM_USERNAMETOCLIP, 0, 0);
+ if (GetKeyState(VK_SHIFT) & 0x8000) { // copy user name
+ ptrW id(Contact_GetInfo(CNF_UNIQUEID, m_hContact, m_szProto));
+ if (id != nullptr && OpenClipboard(m_hwnd)) {
+ HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE, mir_wstrlen(id) * sizeof(wchar_t) + 1);
+ if (hData) {
+ EmptyClipboard();
+ mir_wstrcpy((wchar_t*)GlobalLock(hData), id);
+ GlobalUnlock(hData);
+ SetClipboardData(CF_UNICODETEXT, hData);
+ CloseClipboard();
+ }
+ }
+ }
else {
HMENU hMenu = Menu_BuildContactMenu(m_hContact);
GetWindowRect(GetDlgItem(m_hwnd, LOWORD(wParam)), &rc);
@@ -1486,10 +1464,6 @@ INT_PTR CSrmmWindow::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
UpdateTitle();
break;
- case DM_CLOSETAB:
- CloseTab();
- break;
-
case DM_STATUSICONCHANGE:
SendMessage(m_pOwner->m_hwndStatus, SB_SETTEXT, (SBT_OWNERDRAW | (SendMessage(m_pOwner->m_hwndStatus, SB_GETPARTS, 0, 0) - 1)), 0);
break;
diff --git a/src/core/stdmsg/src/msgs.cpp b/src/core/stdmsg/src/msgs.cpp
index c6995229d5..71b7b90e38 100644
--- a/src/core/stdmsg/src/msgs.cpp
+++ b/src/core/stdmsg/src/msgs.cpp
@@ -29,6 +29,14 @@ int OnCheckPlugins(WPARAM, LPARAM);
/////////////////////////////////////////////////////////////////////////////////////////
+CMsgDialog* Srmm_FindDialog(MCONTACT hContact)
+{
+ HWND hwnd = Srmm_FindWindow(hContact);
+ return (hwnd) ? (CMsgDialog *)GetWindowLongPtr(hwnd, GWLP_USERDATA) : nullptr;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
int SendMessageDirect(const wchar_t *szMsg, MCONTACT hContact)
{
if (hContact == 0)
@@ -175,9 +183,9 @@ static int TypingMessage(WPARAM hContact, LPARAM lParam)
Skin_PlaySound((lParam) ? "TNStart" : "TNStop");
- HWND hwnd = Srmm_FindWindow(hContact);
- if (hwnd)
- SendMessage(hwnd, DM_TYPING, 0, lParam);
+ auto *pDlg = Srmm_FindDialog(hContact);
+ if (pDlg)
+ pDlg->UserTyping(lParam);
else if (lParam && g_dat.bShowTypingTray) {
wchar_t szTip[256];
mir_snwprintf(szTip, TranslateT("%s is typing a message"), Clist_GetContactDisplayName(hContact));
@@ -224,9 +232,9 @@ static int MessageSettingChanged(WPARAM hContact, LPARAM lParam)
// If a contact gets deleted, close its message window if there is any
static int ContactDeleted(WPARAM wParam, LPARAM)
{
- HWND hwnd = Srmm_FindWindow(wParam);
- if (hwnd)
- SendMessage(hwnd, DM_CLOSETAB, 0, 0);
+ auto *pDlg = Srmm_FindDialog(wParam);
+ if (pDlg)
+ pDlg->CloseTab();
return 0;
}
@@ -459,9 +467,10 @@ static int SplitmsgModulesLoaded(WPARAM, LPARAM)
return 0;
}
-int PreshutdownSendRecv(WPARAM, LPARAM)
+static int Preshutdown(WPARAM, LPARAM)
{
- Srmm_Broadcast(DM_CLOSETAB, 0, 0);
+ for (auto &it : g_arDialogs.rev_iter())
+ it->CloseTab();
return 0;
}
@@ -515,7 +524,7 @@ int LoadSendRecvMessageModule(void)
HookEvent(ME_PROTO_CONTACTISTYPING, TypingMessage);
HookEvent(ME_SKIN_ICONSCHANGED, IconsChanged);
HookEvent(ME_SYSTEM_MODULESLOADED, SplitmsgModulesLoaded);
- HookEvent(ME_SYSTEM_PRESHUTDOWN, PreshutdownSendRecv);
+ HookEvent(ME_SYSTEM_PRESHUTDOWN, Preshutdown);
CreateServiceFunction(MS_MSG_SENDMESSAGE, SendMessageCommand);
CreateServiceFunction(MS_MSG_SENDMESSAGEW, SendMessageCommand_W);
diff --git a/src/core/stdmsg/src/msgs.h b/src/core/stdmsg/src/msgs.h
index cc7b57a17f..c96dffe46b 100644
--- a/src/core/stdmsg/src/msgs.h
+++ b/src/core/stdmsg/src/msgs.h
@@ -23,18 +23,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define SRMM_MSGS_H
#define HM_DBEVENTADDED (WM_USER+12)
-#define DM_CASCADENEWWINDOW (WM_USER+13)
#define DM_OPTIONSAPPLIED (WM_USER+14)
-#define DM_CLOSETAB (WM_USER+15)
#define DM_UPDATETITLE (WM_USER+16)
#define DM_NEWTIMEZONE (WM_USER+18)
-#define DM_TYPING (WM_USER+20)
-#define DM_UPDATEWINICON (WM_USER+21)
-#define DM_USERNAMETOCLIP (WM_USER+23)
-#define DM_AVATARSIZECHANGE (WM_USER+24)
-#define DM_AVATARCALCSIZE (WM_USER+25)
-#define DM_GETAVATAR (WM_USER+26)
-#define DM_UPDATESIZEBAR (WM_USER+27)
#define HM_AVATARACK (WM_USER+28)
#define DM_STATUSICONCHANGE (WM_USER+31)
@@ -48,6 +39,8 @@ class CMsgDialog : public CSrmmBaseDialog
protected:
CCtrlButton m_btnOk;
+ CSplitter m_splitterX, m_splitterY;
+
CTabbedWindow *m_pOwner;
DWORD m_nFlash = 0;
char *m_szProto = nullptr;
@@ -58,6 +51,7 @@ protected:
virtual void OnActivate() PURE;
+ bool OnInitDialog() override;
void OnDestroy() override;
INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) override;
@@ -65,6 +59,8 @@ protected:
public:
virtual void RemakeLog() {}
+ virtual void UpdateAvatar() {}
+ virtual void UserTyping(int) {}
int GetImageId() const;
@@ -88,7 +84,6 @@ class CSrmmWindow : public CMsgDialog
LRESULT WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) override;
CCtrlBase m_avatar;
- CSplitter m_splitter;
void NotifyTyping(int mode);
void ProcessFileDrop(HDROP hDrop);
@@ -98,6 +93,7 @@ class CSrmmWindow : public CMsgDialog
void StreamInEvents(MEVENT hDbEventFirst, int count, bool bAppend);
void UpdateIcon(WPARAM wParam);
void UpdateLastMessage(void);
+ void UpdateSizeBar(void);
HICON m_hStatusIcon = nullptr;
HFONT m_hFont = nullptr;
@@ -144,7 +140,9 @@ public:
void LoadSettings() override {}
void RemakeLog() override;
void SetStatusText(const wchar_t*, HICON) override;
+ void UpdateAvatar() override;
void UpdateTitle() override;
+ void UserTyping(int nSecs) override;
void OnSplitterMoved(CSplitter*);
@@ -176,9 +174,6 @@ class CChatRoomDlg : public CMsgDialog
wchar_t szTabSave[20];
- CCtrlButton m_btnOk;
- CSplitter m_splitterX, m_splitterY;
-
int m_iSplitterX, m_iSplitterY;
public:
diff --git a/src/core/stdmsg/src/stdafx.h b/src/core/stdmsg/src/stdafx.h
index 918f63a017..2426997b54 100644
--- a/src/core/stdmsg/src/stdafx.h
+++ b/src/core/stdmsg/src/stdafx.h
@@ -180,6 +180,7 @@ SESSION_INFO* SM_GetNextWindow(SESSION_INFO *si);
void AddIcons(void);
// tools.cpp
+CMsgDialog* Srmm_FindDialog(MCONTACT hContact);
void SetButtonsPos(HWND hwndDlg, bool bIsChat);
#pragma comment(lib,"comctl32.lib")
diff --git a/src/core/stdmsg/src/tabs.cpp b/src/core/stdmsg/src/tabs.cpp
index 0494c08cc4..15c3d47d9f 100644
--- a/src/core/stdmsg/src/tabs.cpp
+++ b/src/core/stdmsg/src/tabs.cpp
@@ -399,8 +399,28 @@ void CTabbedWindow::SetWindowPosition()
else SetWindowPos(m_hwnd, nullptr, 0, 0, 550, 400, SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW);
}
- if (!g_dat.bSavePerContact && g_dat.bCascade)
- Srmm_Broadcast(DM_CASCADENEWWINDOW, (WPARAM)m_hwnd, (LPARAM)&m_windowWasCascaded);
+ if (!g_dat.bSavePerContact && g_dat.bCascade) {
+ RECT rc, rcMax = {};
+ CTabbedWindow *pMaxTab = nullptr;
+
+ for (auto &it : g_arDialogs) {
+ auto *pTab = it->m_pOwner;
+ if (pTab == this)
+ continue;
+
+ GetWindowRect(pTab->GetHwnd(), &rc);
+ if (rc.left > rcMax.left && rc.top > rcMax.top) {
+ pMaxTab = pTab;
+ rcMax = rc;
+ }
+ }
+
+ if (pMaxTab) {
+ m_windowWasCascaded = 1;
+ int offset = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
+ SetWindowPos(m_hwnd, nullptr, rcMax.left + offset, rcMax.top + offset, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE);
+ }
+ }
}
void CTabbedWindow::SwitchNextTab()