summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/m_chat_int.h10
-rw-r--r--plugins/TabSRMM/src/chat_window.cpp78
-rw-r--r--plugins/TabSRMM/src/contactcache.cpp135
-rw-r--r--plugins/TabSRMM/src/contactcache.h20
-rw-r--r--plugins/TabSRMM/src/globals.cpp2
-rw-r--r--plugins/TabSRMM/src/msgdialog.cpp14
-rw-r--r--plugins/TabSRMM/src/msgs.cpp8
-rw-r--r--plugins/TabSRMM/src/msgs.h221
-rw-r--r--src/core/stdmsg/src/msgdialog.cpp2
-rw-r--r--src/mir_app/src/chat_manager.cpp81
10 files changed, 175 insertions, 396 deletions
diff --git a/include/m_chat_int.h b/include/m_chat_int.h
index 924d42d3e2..272e4c782f 100644
--- a/include/m_chat_int.h
+++ b/include/m_chat_int.h
@@ -108,12 +108,6 @@ struct MIR_APP_EXPORT GCModuleInfoBase : public MZeroedObject, public MNonCopyab
int iMaxText;
};
-struct COMMANDINFO
-{
- char *lpCommand;
- COMMANDINFO *last, *next;
-};
-
struct FONTINFO
{
LOGFONT lf;
@@ -173,7 +167,6 @@ struct MIR_APP_EXPORT GCSessionInfoBase : public MZeroedObject, public MNonCopya
int currentHovered;
CMsgDialog *pDlg;
- COMMANDINFO *lpCommands, *lpCurrentCommand;
LOGINFO *pLog, *pLogEnd;
USERINFO *pMe;
STATUSINFO *pStatuses;
@@ -293,9 +286,6 @@ struct CHAT_MANAGER
SESSION_INFO* (*SM_FindSession)(const wchar_t *pszID, const char *pszModule);
HICON (*SM_GetStatusIcon)(SESSION_INFO *si, USERINFO * ui);
BOOL (*SM_BroadcastMessage)(const char *pszModule, UINT msg, WPARAM wParam, LPARAM lParam, BOOL bAsync);
- void (*SM_AddCommand)(const wchar_t *pszID, const char *pszModule, const char* lpNewCommand);
- char* (*SM_GetPrevCommand)(const wchar_t *pszID, const char *pszModule);
- char* (*SM_GetNextCommand)(const wchar_t *pszID, const char *pszModule);
int (*SM_GetCount)(const char *pszModule);
SESSION_INFO* (*SM_FindSessionByIndex)(const char *pszModule, int iItem);
USERINFO* (*SM_GetUserFromIndex)(const wchar_t *pszID, const char *pszModule, int index);
diff --git a/plugins/TabSRMM/src/chat_window.cpp b/plugins/TabSRMM/src/chat_window.cpp
index 1eac103c3e..a447a4db17 100644
--- a/plugins/TabSRMM/src/chat_window.cpp
+++ b/plugins/TabSRMM/src/chat_window.cpp
@@ -460,7 +460,7 @@ static void __cdecl phase2(SESSION_INFO *si)
// which is usually a (tabbed) child of a container class window.
CMsgDialog::CMsgDialog(SESSION_INFO *si)
- : CTabBaseDlg(IDD_CHANNEL, si),
+ : CSuper(IDD_CHANNEL, si),
m_btnOk(this, IDOK)
{
m_szProto = GetContactProto(m_hContact);
@@ -498,7 +498,7 @@ void CMsgDialog::tabClearLog()
bool CMsgDialog::OnInitDialog()
{
- CTabBaseDlg::OnInitDialog();
+ CSuper::OnInitDialog();
m_si->pDlg = this;
@@ -612,7 +612,6 @@ void CMsgDialog::OnDestroy()
if (m_pContainer->m_dwFlags & CNT_SIDEBAR)
m_pContainer->m_pSideBar->removeSession(this);
- mir_free(m_enteredText);
CSuper::OnDestroy();
}
@@ -623,12 +622,14 @@ void CMsgDialog::onClick_OK(CCtrlButton*)
return;
ptrA pszRtf(m_message.GetRichTextRtf());
- g_chatApi.SM_AddCommand(m_si->ptszID, m_si->pszModule, pszRtf);
+ if (pszRtf == nullptr)
+ return;
CMStringW ptszText(ptrW(mir_utf8decodeW(pszRtf)));
if (ptszText.IsEmpty())
return;
+ m_cache->saveHistory();
DoRtfToTags(ptszText);
ptszText.Trim();
@@ -1296,72 +1297,13 @@ LRESULT CMsgDialog::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam)
return 0;
}
- if (wParam == VK_UP && isCtrl && !isAlt) {
- char *lpPrevCmd = g_chatApi.SM_GetPrevCommand(m_si->ptszID, m_si->pszModule);
-
- if (!m_si->lpCurrentCommand || !m_si->lpCurrentCommand->last) {
- // Next command is not defined. It means currently entered text is not saved in the history and it
- // need to be saved in the window context.
- char *enteredText = m_message.GetRichTextRtf();
- if (m_enteredText)
- mir_free(m_enteredText);
-
- m_enteredText = enteredText;
- }
-
- m_message.SendMsg(WM_SETREDRAW, FALSE, 0);
-
- LOGFONTA lf;
- LoadLogfont(FONTSECTION_IM, MSGFONTID_MESSAGEAREA, &lf, nullptr, FONTMODULE);
-
- SETTEXTEX ste;
- ste.flags = ST_DEFAULT;
- ste.codepage = CP_ACP;
- if (lpPrevCmd)
- m_message.SendMsg(EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)lpPrevCmd);
- else
- m_message.SetText(L"");
-
- GETTEXTLENGTHEX gtl = { 0 };
- gtl.flags = GTL_PRECISE;
- gtl.codepage = CP_ACP;
- int iLen = m_message.SendMsg(EM_GETTEXTLENGTHEX, (WPARAM)&gtl, 0);
- m_message.SendMsg(EM_SCROLLCARET, 0, 0);
- m_message.SendMsg(WM_SETREDRAW, TRUE, 0);
- RedrawWindow(m_message.GetHwnd(), nullptr, nullptr, RDW_INVALIDATE);
- m_message.SendMsg(EM_SETSEL, iLen, iLen);
+ // input history scrolling (ctrl-up / down)
+ if (isCtrl && !isAlt && !isShift && (wParam == VK_UP || wParam == VK_DOWN)) {
m_iLastEnterTime = 0;
+ m_cache->inputHistoryEvent(wParam);
return 0;
}
- if (wParam == VK_DOWN && isCtrl && !isAlt) {
- m_message.SendMsg(WM_SETREDRAW, FALSE, 0);
-
- SETTEXTEX ste;
- ste.flags = ST_DEFAULT;
- ste.codepage = CP_ACP;
-
- char *lpPrevCmd = g_chatApi.SM_GetNextCommand(m_si->ptszID, m_si->pszModule);
- if (lpPrevCmd)
- m_message.SendMsg(EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)lpPrevCmd);
- else if (m_enteredText) {
- // If we cannot load the message from history, load the last edited text.
- m_message.SendMsg(EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)m_enteredText);
- mir_free(m_enteredText);
- m_enteredText = nullptr;
- }
-
- GETTEXTLENGTHEX gtl = { 0 };
- gtl.flags = GTL_PRECISE;
- gtl.codepage = CP_ACP;
- int iLen = m_message.SendMsg(EM_GETTEXTLENGTHEX, (WPARAM)&gtl, 0);
- m_message.SendMsg(EM_SCROLLCARET, 0, 0);
- m_message.SendMsg(WM_SETREDRAW, TRUE, 0);
- RedrawWindow(m_message.GetHwnd(), nullptr, nullptr, RDW_INVALIDATE);
- m_message.SendMsg(EM_SETSEL, iLen, iLen);
- m_iLastEnterTime = 0;
- return 0;
- }
__fallthrough;
case WM_LBUTTONDOWN:
@@ -1678,7 +1620,7 @@ INT_PTR CMsgDialog::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
GetClientRect(m_hwnd, &rc);
int cx = rc.right;
- CTabBaseDlg::DlgProc(uMsg, 0, 0); // call basic window resizer
+ CSuper::DlgProc(uMsg, 0, 0); // call basic window resizer
BB_SetButtonsPos();
@@ -2357,7 +2299,7 @@ INT_PTR CMsgDialog::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
VerifyProxy();
break;
}
- return CTabBaseDlg::DlgProc(uMsg, wParam, lParam);
+ return CSuper::DlgProc(uMsg, wParam, lParam);
}
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/TabSRMM/src/contactcache.cpp b/plugins/TabSRMM/src/contactcache.cpp
index 25206acf8d..790f7c197b 100644
--- a/plugins/TabSRMM/src/contactcache.cpp
+++ b/plugins/TabSRMM/src/contactcache.cpp
@@ -35,7 +35,8 @@ static OBJLIST<CContactCache> arContacts(50, NumericKeySortT);
static DBCachedContact ccInvalid;
-CContactCache::CContactCache(MCONTACT hContact)
+CContactCache::CContactCache(MCONTACT hContact) :
+ m_history(10)
{
m_hContact = hContact;
@@ -199,13 +200,11 @@ void CContactCache::updateStats(int iType, size_t value)
//
// @param dat: CSrmmWindow* - window data structure
-void CContactCache::setWindowData(CSrmmWindow *dat)
+void CContactCache::setWindowData(CTabBaseDlg *dat)
{
m_dat = dat;
if (dat) {
- if (m_history == nullptr)
- allocHistory();
updateStatusMsg();
}
else {
@@ -220,55 +219,17 @@ void CContactCache::setWindowData(CSrmmWindow *dat)
// saves message to the input history.
// it's using streamout in UTF8 format - no unicode "issues" and all RTF formatting is saved to the history.
-void CContactCache::saveHistory(int iHistorySize)
+void CContactCache::saveHistory()
{
if (m_dat == nullptr)
return;
- int oldTop = 0;
- if (iHistorySize) {
- oldTop = m_iHistoryTop;
- m_iHistoryTop = iHistorySize;
- }
-
CCtrlRichEdit &pEntry = m_dat->GetEntry();
ptrA szFromStream(pEntry.GetRichTextRtf());
if (szFromStream != nullptr) {
- size_t iLength, iStreamLength;
- iLength = iStreamLength = mir_strlen(szFromStream) + 1;
-
- if (iLength > 0 && m_history != nullptr) { // XXX: iLength > 1 ?
- if (m_iHistoryTop == m_iHistorySize && oldTop == 0) { // shift the stack down...
- TInputHistory ihTemp = m_history[0];
- m_iHistoryTop--;
- ::memmove((void*)&m_history[0], (void*)&m_history[1], (m_iHistorySize - 1) * sizeof(TInputHistory));
- m_history[m_iHistoryTop] = ihTemp;
- }
- if (iLength > m_history[m_iHistoryTop].lLen) {
- if (m_history[m_iHistoryTop].szText == nullptr) {
- if (iLength < HISTORY_INITIAL_ALLOCSIZE)
- iLength = HISTORY_INITIAL_ALLOCSIZE;
- m_history[m_iHistoryTop].szText = (wchar_t*)mir_alloc(iLength);
- m_history[m_iHistoryTop].lLen = iLength;
- }
- else {
- if (iLength > m_history[m_iHistoryTop].lLen) {
- m_history[m_iHistoryTop].szText = (wchar_t*)mir_realloc(m_history[m_iHistoryTop].szText, iLength);
- m_history[m_iHistoryTop].lLen = iLength;
- }
- }
- }
- ::memcpy(m_history[m_iHistoryTop].szText, szFromStream, iStreamLength);
- if (!oldTop) {
- if (m_iHistoryTop < m_iHistorySize) {
- m_iHistoryTop++;
- m_iHistoryCurrent = m_iHistoryTop;
- }
- }
- }
+ m_iHistoryCurrent = -1;
+ m_history.insert(szFromStream.detach());
}
- if (oldTop)
- m_iHistoryTop = oldTop;
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -280,67 +241,39 @@ void CContactCache::inputHistoryEvent(WPARAM wParam)
if (m_dat == nullptr)
return;
- if (m_history != nullptr && m_history[0].szText != nullptr) { // at least one entry needs to be alloced, otherwise we get a nice infinite loop ;)
- CCtrlRichEdit &pEntry = m_dat->GetEntry();
-
- SETTEXTEX stx = { ST_DEFAULT, CP_UTF8 };
-
- if (m_dat->m_dwFlags & MWF_NEEDHISTORYSAVE) {
- m_iHistoryCurrent = m_iHistoryTop;
- if (::GetWindowTextLength(pEntry.GetHwnd()) > 0)
- saveHistory(m_iHistorySize);
- else
- m_history[m_iHistorySize].szText[0] = (wchar_t)'\0';
- }
+ CCtrlRichEdit &pEntry = m_dat->GetEntry();
+ if (m_history.getCount() > 0) {
+ char *pszText;
if (wParam == VK_UP) {
if (m_iHistoryCurrent == 0)
return;
- m_iHistoryCurrent--;
+
+ if (m_iHistoryCurrent < 0)
+ m_iHistoryCurrent = m_history.getCount()-1;
+ else
+ m_iHistoryCurrent--;
+ pszText = m_history[m_iHistoryCurrent];
}
else {
- m_iHistoryCurrent++;
- if (m_iHistoryCurrent > m_iHistoryTop)
- m_iHistoryCurrent = m_iHistoryTop;
- }
- if (m_iHistoryCurrent == m_iHistoryTop) {
- if (m_history[m_iHistorySize].szText != nullptr) { // replace the temp buffer
- pEntry.SetText(L"");
- pEntry.SendMsg(EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)m_history[m_iHistorySize].szText);
- pEntry.SendMsg(EM_SETSEL, -1, -1);
+ if (m_iHistoryCurrent == -1)
+ return;
+
+ if (m_iHistoryCurrent == m_history.getCount() - 1) {
+ m_iHistoryCurrent = -1;
+ pszText = "";
}
- }
- else {
- pEntry.SetText(L"");
- if (m_history[m_iHistoryCurrent].szText != nullptr) {
- pEntry.SendMsg(EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)m_history[m_iHistoryCurrent].szText);
- pEntry.SendMsg(EM_SETSEL, -1, -1);
+ else {
+ m_iHistoryCurrent++;
+ pszText = m_history[m_iHistoryCurrent];
}
}
- pEntry.OnChange(&pEntry);
- m_dat->m_dwFlags &= ~MWF_NEEDHISTORYSAVE;
- }
-}
-/////////////////////////////////////////////////////////////////////////////////////////
-// allocate the input history(on - demand, when it is requested by
-// opening a message window for this contact).
-//
-// note: it allocs historysize + 1 elements, because the + 1 is used
-// for the temporary buffer which saves the current input line when
-// using input history scrolling.
+ SETTEXTEX stx = { ST_DEFAULT, CP_UTF8 };
+ pEntry.SendMsg(EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)pszText);
+ pEntry.SendMsg(EM_SETSEL, -1, -1);
+ }
-void CContactCache::allocHistory()
-{
- m_iHistorySize = M.GetByte("historysize", 15);
- if (m_iHistorySize < 10)
- m_iHistorySize = 10;
- m_history = (TInputHistory *)mir_alloc(sizeof(TInputHistory) * (m_iHistorySize + 1));
- m_iHistoryCurrent = 0;
- m_iHistoryTop = 0;
- if (m_history)
- memset(m_history, 0, (sizeof(TInputHistory) * m_iHistorySize));
- m_history[m_iHistorySize].szText = (wchar_t*)mir_alloc((HISTORY_INITIAL_ALLOCSIZE + 1) * sizeof(wchar_t));
- m_history[m_iHistorySize].lLen = HISTORY_INITIAL_ALLOCSIZE;
+ pEntry.OnChange(&pEntry);
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -353,13 +286,9 @@ void CContactCache::releaseAlloced()
m_stats = nullptr;
}
- if (m_history) {
- for (int i = 0; i <= m_iHistorySize; i++)
- mir_free(m_history[i].szText);
-
- mir_free(m_history);
- m_history = nullptr;
- }
+ for (auto &it : m_history)
+ mir_free(it);
+ m_history.destroy();
mir_free(m_szStatusMsg);
m_szStatusMsg = nullptr;
diff --git a/plugins/TabSRMM/src/contactcache.h b/plugins/TabSRMM/src/contactcache.h
index fd67ebe706..aeafd8f1e2 100644
--- a/plugins/TabSRMM/src/contactcache.h
+++ b/plugins/TabSRMM/src/contactcache.h
@@ -32,12 +32,6 @@
#define C_INVALID_ACCOUNT L"<account error>"
#define HISTORY_INITIAL_ALLOCSIZE 300
-struct TInputHistory
-{
- wchar_t* szText;
- size_t lLen;
-};
-
struct TSessionStats : public MZeroedObject
{
enum {
@@ -70,15 +64,15 @@ class CContactCache : public MZeroedObject
bool m_isMeta;
bool m_isValid;
int m_nMax;
- int m_iHistoryCurrent, m_iHistoryTop, m_iHistorySize;
- CSrmmWindow *m_dat;
+ CTabBaseDlg *m_dat;
TSessionStats *m_stats;
- TInputHistory *m_history;
DBCachedContact *cc;
+ LIST<char> m_history;
+ int m_iHistoryCurrent;
+
void initPhaseTwo();
- void allocHistory();
void releaseAlloced();
public:
@@ -112,7 +106,7 @@ public:
__forceinline DWORD getSessionStart() const { return m_stats->started; }
__forceinline int getSessionMsgCount() const { return (int)m_stats->messageCount; }
- __forceinline CSrmmWindow* getDat() const { return m_dat; }
+ __forceinline CTabBaseDlg* getDat() const { return m_dat; }
size_t getMaxMessageLength();
void updateStats(int iType, size_t value = 0);
@@ -124,7 +118,7 @@ public:
void updateMeta();
bool updateUIN();
void updateStatusMsg(const char *szKey = nullptr);
- void setWindowData(CSrmmWindow *dat = nullptr);
+ void setWindowData(CTabBaseDlg *dat = nullptr);
void resetMeta();
void closeWindow();
void deletedHandler();
@@ -133,7 +127,7 @@ public:
HICON getIcon(int& iSize) const;
// input history
- void saveHistory(int iHistorySize = 0);
+ void saveHistory();
void inputHistoryEvent(WPARAM wParam);
static CContactCache* getContactCache(MCONTACT hContact);
diff --git a/plugins/TabSRMM/src/globals.cpp b/plugins/TabSRMM/src/globals.cpp
index ba5d2cedba..60d681e88d 100644
--- a/plugins/TabSRMM/src/globals.cpp
+++ b/plugins/TabSRMM/src/globals.cpp
@@ -530,7 +530,7 @@ void CGlobals::logStatusChange(WPARAM wParam, const CContactCache *c)
if (c == nullptr)
return;
- CSrmmWindow *dat = c->getDat();
+ CTabBaseDlg *dat = c->getDat();
if (dat == nullptr || !c->isValid())
return;
diff --git a/plugins/TabSRMM/src/msgdialog.cpp b/plugins/TabSRMM/src/msgdialog.cpp
index 5f8699b3a1..5f57d9b34e 100644
--- a/plugins/TabSRMM/src/msgdialog.cpp
+++ b/plugins/TabSRMM/src/msgdialog.cpp
@@ -563,7 +563,7 @@ LRESULT CALLBACK SplitterSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
/////////////////////////////////////////////////////////////////////////////////////////
CSrmmWindow::CSrmmWindow()
- : CTabBaseDlg(IDD_MSGSPLITNEW),
+ : CSuper(IDD_MSGSPLITNEW),
m_btnOk(this, IDOK),
m_btnAdd(this, IDC_ADD),
m_btnQuote(this, IDC_QUOTE),
@@ -605,9 +605,7 @@ CThumbBase* CSrmmWindow::tabCreateThumb(CProxyWindow *pProxy) const
bool CSrmmWindow::OnInitDialog()
{
- CTabBaseDlg::OnInitDialog();
-
- m_cache->setWindowData(this);
+ CSuper::OnInitDialog();
m_szProto = const_cast<char *>(m_cache->getProto());
m_bIsMeta = m_cache->isMeta();
@@ -858,7 +856,7 @@ void CSrmmWindow::OnDestroy()
PostMessage(m_pContainer->m_hwnd, WM_SIZE, 0, 1);
if (m_pContainer->m_dwFlags & CNT_SIDEBAR)
m_pContainer->m_pSideBar->removeSession(this);
- m_cache->setWindowData();
+
if (m_hContact && M.GetByte("deletetemp", 0))
if (db_get_b(m_hContact, "CList", "NotOnList", 0))
db_delete_contact(m_hContact);
@@ -1268,7 +1266,7 @@ void CSrmmWindow::onChange_Message(CCtrlEdit*)
{
if (m_pContainer->m_hwndActive == m_hwnd)
UpdateReadChars();
- m_dwFlags |= MWF_NEEDHISTORYSAVE;
+
m_dwLastActivity = GetTickCount();
m_pContainer->m_dwLastActivity = m_dwLastActivity;
UpdateSaveAndSendButton();
@@ -2270,7 +2268,7 @@ INT_PTR CSrmmWindow::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
GetClientRect(m_hwnd, &rc);
- CTabBaseDlg::DlgProc(uMsg, 0, 0); // call basic window resizer
+ CSuper::DlgProc(uMsg, 0, 0); // call basic window resizer
BB_SetButtonsPos();
@@ -2986,5 +2984,5 @@ INT_PTR CSrmmWindow::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0;
}
- return CTabBaseDlg::DlgProc(uMsg, wParam, lParam);
+ return CSuper::DlgProc(uMsg, wParam, lParam);
}
diff --git a/plugins/TabSRMM/src/msgs.cpp b/plugins/TabSRMM/src/msgs.cpp
index 9066819205..e3f1619744 100644
--- a/plugins/TabSRMM/src/msgs.cpp
+++ b/plugins/TabSRMM/src/msgs.cpp
@@ -154,11 +154,19 @@ bool CTabBaseDlg::OnInitDialog()
m_cache = CContactCache::getContactCache(m_hContact);
m_cache->updateNick();
m_cache->updateUIN();
+ m_cache->setWindowData(this);
m_bIsAutosizingInput = IsAutoSplitEnabled();
return true;
}
+void CTabBaseDlg::OnDestroy()
+{
+ m_cache->setWindowData();
+
+ CSuper::OnDestroy();
+}
+
INT_PTR CTabBaseDlg::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
diff --git a/plugins/TabSRMM/src/msgs.h b/plugins/TabSRMM/src/msgs.h
index d370ef6af5..1604b40ec6 100644
--- a/plugins/TabSRMM/src/msgs.h
+++ b/plugins/TabSRMM/src/msgs.h
@@ -35,13 +35,14 @@
#define MSGERROR_RETRY 1
#define MSGERROR_SENDLATER 2
+#define EVENT_QUEUE_SIZE 10
+
#define CONTAINER_NAMELEN 25
#define TITLE_FORMATLEN 30
#define MWF_SAVEBTN_SAV 2
#define MWF_DEFERREDSCROLL 4
-#define MWF_NEEDHISTORYSAVE 8
#define MWF_WASBACKGROUNDCREATE 16
//#define MWF_MOUSEDOWN 32
#define MWF_ERRORSTATE 128
@@ -244,122 +245,121 @@ class CTabBaseDlg : public CSrmmBaseDialog
friend class CInfoPanel;
protected:
- void CloseTab() override;
- void LoadSettings() override;
- void SetStatusText(const wchar_t*, HICON) override;
-
- void DM_AddDivider();
- void DM_DismissTip(const POINT& pt);
- void DM_ErrorDetected(int type, int flag);
- bool DM_GenericHotkeysCheck(MSG *message);
- int DM_SplitterGlobalEvent(WPARAM wParam, LPARAM lParam);
- void DM_UpdateLastMessage() const;
-
- void DetermineMinHeight();
- void FindFirstEvent();
- int FindRTLLocale();
- void GetSendFormat();
- bool IsAutoSplitEnabled() const;
- void ReplaceIcons(LONG startAt, int fAppend, BOOL isSent);
- void ResizeIeView();
- void ShowPopupMenu(const CCtrlBase&, POINT pt);
- void VerifyProxy();
- LRESULT WMCopyHandler(UINT uMsg, WPARAM wParam, LPARAM lParam);
-
- WORD m_wStatus, m_wOldStatus;
- size_t m_iSendBufferSize;
- int m_iSendLength; // message length in utf-8 octets
- HICON m_hSmileyIcon;
- HWND m_hwndContactPic, m_hwndPanelPic, m_hwndPanelPicParent;
- UINT m_bbLSideWidth, m_bbRSideWidth;
- BYTE kstate[256];
-
- RECT m_rcNick, m_rcUIN, m_rcStatus, m_rcPic;
- int m_originalSplitterY;
- SIZE m_minEditBoxSize;
- int m_nTypeMode;
- DWORD m_nLastTyping;
- DWORD m_lastMessage;
- DWORD m_dwTickLastEvent;
- HBITMAP m_hOwnPic;
- SIZE m_pic;
+ void CloseTab() override;
+ void LoadSettings() override;
+ void SetStatusText(const wchar_t*, HICON) override;
+
+ void DM_AddDivider();
+ void DM_DismissTip(const POINT& pt);
+ void DM_ErrorDetected(int type, int flag);
+ bool DM_GenericHotkeysCheck(MSG *message);
+ int DM_SplitterGlobalEvent(WPARAM wParam, LPARAM lParam);
+ void DM_UpdateLastMessage() const;
+
+ void DetermineMinHeight();
+ void FindFirstEvent();
+ int FindRTLLocale();
+ void GetSendFormat();
+ bool IsAutoSplitEnabled() const;
+ void ReplaceIcons(LONG startAt, int fAppend, BOOL isSent);
+ void ResizeIeView();
+ void ShowPopupMenu(const CCtrlBase&, POINT pt);
+ void VerifyProxy();
+ LRESULT WMCopyHandler(UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+ WORD m_wStatus, m_wOldStatus;
+ size_t m_iSendBufferSize;
+ int m_iSendLength; // message length in utf-8 octets
+ HICON m_hSmileyIcon;
+ HWND m_hwndContactPic, m_hwndPanelPic, m_hwndPanelPicParent;
+ UINT m_bbLSideWidth, m_bbRSideWidth;
+ BYTE kstate[256];
+
+ RECT m_rcNick, m_rcUIN, m_rcStatus, m_rcPic;
+ int m_originalSplitterY;
+ SIZE m_minEditBoxSize;
+ int m_nTypeMode;
+ DWORD m_nLastTyping;
+ DWORD m_lastMessage;
+ DWORD m_dwTickLastEvent;
+ HBITMAP m_hOwnPic;
+ SIZE m_pic;
CMStringW m_szStatusText;
HICON m_szStatusIcon;
bool m_bStatusSet;
- bool m_bShowInfoAvatar, m_bShowUIElements;
- bool m_bUseOffset;
- bool m_bkeyProcessed;
- bool m_fLimitedUpdate;
- bool m_bClrAdded;
- bool m_bInsertMode;
-
- int m_iRealAvatarHeight;
- int m_iButtonBarReallyNeeds;
- DWORD m_dwLastActivity;
- MEVENT m_hFlashingEvent;
- int m_SendFormat;
- MEVENT *m_hQueuedEvents;
- int m_iNextQueuedEvent;
-#define EVENT_QUEUE_SIZE 10
- int m_iEventQueueSize;
- LCID m_lcid;
- wchar_t m_lcID[10];
- int m_iPanelAvatarX, m_iPanelAvatarY;
- HWND m_hwndTip;
- TOOLINFO ti;
- DWORD m_panelStatusCX;
- int m_textLen; // current text len
- LONG m_ipFieldHeight;
- WPARAM m_wParam; // used for "delayed" actions like moved splitters in minimized windows
- LPARAM m_lParam;
- int m_iHaveRTLLang;
-
- DWORD m_iSplitterSaved;
- POINT m_ptTipActivation;
- char *m_enteredText; // Used for history in chats.
+ bool m_bShowInfoAvatar, m_bShowUIElements;
+ bool m_bUseOffset;
+ bool m_bkeyProcessed;
+ bool m_fLimitedUpdate;
+ bool m_bClrAdded;
+ bool m_bInsertMode;
+
+ MEVENT *m_hQueuedEvents;
+ int m_iNextQueuedEvent;
+ int m_iEventQueueSize;
+
+ int m_iRealAvatarHeight;
+ int m_iButtonBarReallyNeeds;
+ DWORD m_dwLastActivity;
+ MEVENT m_hFlashingEvent;
+ int m_SendFormat;
+ LCID m_lcid;
+ wchar_t m_lcID[10];
+ int m_iPanelAvatarX, m_iPanelAvatarY;
+ HWND m_hwndTip;
+ TOOLINFO ti;
+ DWORD m_panelStatusCX;
+ int m_textLen; // current text len
+ LONG m_ipFieldHeight;
+ WPARAM m_wParam; // used for "delayed" actions like moved splitters in minimized windows
+ LPARAM m_lParam;
+ int m_iHaveRTLLang;
+
+ DWORD m_iSplitterSaved;
+ POINT m_ptTipActivation;
public:
- char *m_szProto;
- int m_iTabID;
- BYTE m_bShowTyping;
- bool m_bIsHistory, m_bNotOnList;
- bool m_bActualHistory;
- bool m_bIsAutosizingInput;
- bool m_bCanFlashTab, m_bTabFlash;
- bool m_bEditNotesActive;
- bool m_bShowAvatar;
- int m_sendMode;
- HKL m_hkl; // keyboard layout identifier
- DWORD m_isAutoRTL;
- DWORD m_idle;
- DWORD m_dwFlags, m_dwFlagsEx;
- DWORD m_dwUnread;
- HANDLE m_hTheme, m_hThemeIP, m_hThemeToolbar;
- HWND m_hwndIEView, m_hwndIWebBrowserControl, m_hwndHPP;
- HICON m_hXStatusIcon, m_hTabStatusIcon, m_hTabIcon, m_iFlashIcon, m_hTaskbarIcon, m_hClientIcon;
- MEVENT m_hDbEventFirst, m_hDbEventLast;
- HANDLE m_hTimeZone;
- MEVENT *m_hHistoryEvents;
- time_t m_lastEventTime;
- int m_iLastEventType;
- int m_nTypeSecs;
- int m_iOpenJobs;
- int m_iInputAreaHeight;
- int m_maxHistory, m_curHistory;
- int m_iCurrentQueueError;
- int m_iSplitterY, m_dynaSplitter;
- int m_savedSplitterY, m_savedDynaSplit;
- char *m_sendBuffer;
- int m_nMax; // max message size
-
- wchar_t m_wszMyNickname[130];
- wchar_t m_wszStatus[50];
- wchar_t m_wszTitle[130]; // tab title...
- wchar_t m_myUin[80];
- wchar_t m_wszStatusBar[100];
- char m_szMicroLf[128];
+ char *m_szProto;
+ int m_iTabID;
+ BYTE m_bShowTyping;
+ bool m_bIsHistory, m_bNotOnList;
+ bool m_bActualHistory;
+ bool m_bIsAutosizingInput;
+ bool m_bCanFlashTab, m_bTabFlash;
+ bool m_bEditNotesActive;
+ bool m_bShowAvatar;
+ int m_sendMode;
+ HKL m_hkl; // keyboard layout identifier
+ DWORD m_isAutoRTL;
+ DWORD m_idle;
+ DWORD m_dwFlags, m_dwFlagsEx;
+ DWORD m_dwUnread;
+ HANDLE m_hTheme, m_hThemeIP, m_hThemeToolbar;
+ HWND m_hwndIEView, m_hwndIWebBrowserControl, m_hwndHPP;
+ HICON m_hXStatusIcon, m_hTabStatusIcon, m_hTabIcon, m_iFlashIcon, m_hTaskbarIcon, m_hClientIcon;
+ MEVENT m_hDbEventFirst, m_hDbEventLast;
+ HANDLE m_hTimeZone;
+ MEVENT *m_hHistoryEvents;
+ time_t m_lastEventTime;
+ int m_iLastEventType;
+ int m_nTypeSecs;
+ int m_iOpenJobs;
+ int m_iInputAreaHeight;
+ int m_maxHistory, m_curHistory;
+ int m_iCurrentQueueError;
+ int m_iSplitterY, m_dynaSplitter;
+ int m_savedSplitterY, m_savedDynaSplit;
+ char *m_sendBuffer;
+ int m_nMax; // max message size
+
+ wchar_t m_wszMyNickname[130];
+ wchar_t m_wszStatus[50];
+ wchar_t m_wszTitle[130]; // tab title...
+ wchar_t m_myUin[80];
+ wchar_t m_wszStatusBar[100];
+ char m_szMicroLf[128];
CInfoPanel m_pPanel;
CContactCache *m_cache;
@@ -373,6 +373,7 @@ public:
virtual ~CTabBaseDlg();
bool OnInitDialog() override;
+ void OnDestroy() override;
INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) override;
virtual CThumbBase* tabCreateThumb(CProxyWindow*) const = 0;
diff --git a/src/core/stdmsg/src/msgdialog.cpp b/src/core/stdmsg/src/msgdialog.cpp
index c60df8ca63..876f3fa326 100644
--- a/src/core/stdmsg/src/msgdialog.cpp
+++ b/src/core/stdmsg/src/msgdialog.cpp
@@ -399,8 +399,6 @@ void CMsgDialog::onClick_Ok(CCtrlButton *pButton)
return;
if (isChat()) {
- g_chatApi.SM_AddCommand(m_si->ptszID, m_si->pszModule, msgText);
-
CMStringW ptszText(ptrW(mir_utf8decodeW(msgText)));
g_chatApi.DoRtfToTags(ptszText, 0, nullptr);
ptszText.Trim();
diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp
index 5563bee8d3..76f85012db 100644
--- a/src/mir_app/src/chat_manager.cpp
+++ b/src/mir_app/src/chat_manager.cpp
@@ -126,14 +126,6 @@ static void SM_FreeSession(SESSION_INFO *si, bool bRemoveContact = false)
mir_free(si->ptszName);
mir_free(si->ptszStatusbarText);
mir_free(si->ptszTopic);
-
- while (si->lpCommands != nullptr) {
- COMMANDINFO *pNext = si->lpCommands->next;
- mir_free(si->lpCommands->lpCommand);
- mir_free(si->lpCommands);
- si->lpCommands = pNext;
- }
-
delete si;
}
@@ -393,76 +385,6 @@ void SM_RemoveAll(void)
}
}
-static void SM_AddCommand(const wchar_t *pszID, const char *pszModule, const char* lpNewCommand)
-{
- SESSION_INFO *si = SM_FindSession(pszID, pszModule);
- if (si == nullptr)
- return;
-
- COMMANDINFO *node = (COMMANDINFO *)mir_alloc(sizeof(COMMANDINFO));
- node->lpCommand = mir_strdup(lpNewCommand);
- node->last = nullptr; // always added at beginning!
-
- // new commands are added at start
- if (si->lpCommands == nullptr) {
- node->next = nullptr;
- si->lpCommands = node;
- }
- else {
- node->next = si->lpCommands;
- si->lpCommands->last = node; // hmm, weird
- si->lpCommands = node;
- }
- si->lpCurrentCommand = nullptr; // current command
- si->wCommandsNum++;
-
- if (si->wCommandsNum > WINDOWS_COMMANDS_MAX) {
- COMMANDINFO *pCurComm = si->lpCommands;
- while (pCurComm->next != nullptr)
- pCurComm = pCurComm->next;
-
- COMMANDINFO *pLast = pCurComm->last;
- mir_free(pCurComm->lpCommand);
- mir_free(pCurComm);
- pLast->next = nullptr;
- // done
- si->wCommandsNum--;
- }
-}
-
-static char* SM_GetPrevCommand(const wchar_t *pszID, const char *pszModule) // get previous command. returns nullptr if previous command does not exist. current command remains as it was.
-{
- SESSION_INFO *si = SM_FindSession(pszID, pszModule);
- if (si == nullptr)
- return nullptr;
-
- COMMANDINFO *pPrevCmd = nullptr;
- if (si->lpCurrentCommand != nullptr) {
- if (si->lpCurrentCommand->next != nullptr) // not nullptr
- pPrevCmd = si->lpCurrentCommand->next; // next command (newest at beginning)
- else
- pPrevCmd = si->lpCurrentCommand;
- }
- else pPrevCmd = si->lpCommands;
-
- si->lpCurrentCommand = pPrevCmd; // make it the new command
- return (pPrevCmd) ? pPrevCmd->lpCommand : nullptr;
-}
-
-static char* SM_GetNextCommand(const wchar_t *pszID, const char *pszModule) // get next command. returns nullptr if next command does not exist. current command becomes nullptr (a prev command after this one will get you the last command)
-{
- SESSION_INFO *si = SM_FindSession(pszID, pszModule);
- if (si == nullptr)
- return nullptr;
-
- COMMANDINFO *pNextCmd = nullptr;
- if (si->lpCurrentCommand != nullptr)
- pNextCmd = si->lpCurrentCommand->last; // last command (newest at beginning)
-
- si->lpCurrentCommand = pNextCmd; // make it the new command
- return (pNextCmd) ? pNextCmd->lpCommand : nullptr;
-}
-
static int SM_GetCount(const char *pszModule)
{
int count = 0;
@@ -948,9 +870,6 @@ static void ResetApi()
g_chatApi.SM_FindSession = ::SM_FindSession;
g_chatApi.SM_GetStatusIcon = ::SM_GetStatusIcon;
g_chatApi.SM_BroadcastMessage = ::SM_BroadcastMessage;
- g_chatApi.SM_AddCommand = ::SM_AddCommand;
- g_chatApi.SM_GetPrevCommand = ::SM_GetPrevCommand;
- g_chatApi.SM_GetNextCommand = ::SM_GetNextCommand;
g_chatApi.SM_GetCount = ::SM_GetCount;
g_chatApi.SM_FindSessionByIndex = ::SM_FindSessionByIndex;
g_chatApi.SM_GetUserFromIndex = ::SM_GetUserFromIndex;