From 819d4cd22fc5e6f8c3e8497c64346c13d76f04ad Mon Sep 17 00:00:00 2001 From: George Hazan Date: Wed, 9 Feb 2022 19:57:44 +0300 Subject: fixes #1950 (Remove notification engine from TabSRMM) --- plugins/NewEventNotify/src/main.cpp | 6 +- plugins/NewEventNotify/src/options.cpp | 42 +++++---- plugins/NewEventNotify/src/popup.cpp | 154 +++++++++++++++++++-------------- plugins/NewEventNotify/src/stdafx.h | 52 ++++++----- 4 files changed, 148 insertions(+), 106 deletions(-) (limited to 'plugins/NewEventNotify/src') diff --git a/plugins/NewEventNotify/src/main.cpp b/plugins/NewEventNotify/src/main.cpp index 2897ceca63..0d164e9d7f 100644 --- a/plugins/NewEventNotify/src/main.cpp +++ b/plugins/NewEventNotify/src/main.cpp @@ -24,8 +24,6 @@ #include "stdafx.h" -extern PLUGIN_DATA* PopupList[20]; - //--------------------------- //---Some global variables for the plugin @@ -86,8 +84,8 @@ int HookedNewEvent(WPARAM hContact, LPARAM hDbEvent) if (dbe.flags & DBEF_SENT) { // JK, only message event, do not influence others if (g_plugin.bHideSend && NumberPopupData(hContact, EVENTTYPE_MESSAGE) != -1) { - PLUGIN_DATA *pdata = PopupList[NumberPopupData(hContact, EVENTTYPE_MESSAGE)]; - PopupAct(pdata->hWnd, MASK_DISMISS, pdata); // JK, only dismiss, i.e. do not kill event (e.g. file transfer) + if (auto *pdata = PU_GetByContact(hContact, EVENTTYPE_MESSAGE)) + PopupAct(pdata->hWnd, MASK_DISMISS, pdata); // JK, only dismiss, i.e. do not kill event (e.g. file transfer) } return 0; } diff --git a/plugins/NewEventNotify/src/options.cpp b/plugins/NewEventNotify/src/options.cpp index 9bb9d51fdb..d004a1cfb7 100644 --- a/plugins/NewEventNotify/src/options.cpp +++ b/plugins/NewEventNotify/src/options.cpp @@ -28,42 +28,49 @@ BOOL bWmNotify; void CMPlugin::OptionsRead(void) { - bDisable = getByte(OPT_DISABLE, FALSE); - bPreview = getByte(OPT_PREVIEW, TRUE); - bMenuitem = getByte(OPT_MENUITEM, FALSE); - bDefaultColorMsg = getByte(OPT_COLDEFAULT_MESSAGE, FALSE); - bDefaultColorFile = getByte(OPT_COLDEFAULT_FILE, FALSE); - bDefaultColorOthers = getByte(OPT_COLDEFAULT_OTHERS, FALSE); + bDisable = getBool(OPT_DISABLE, false); + bMUCDisable = getBool(OPT_MUCDISABLE, false); + + bPreview = getBool(OPT_PREVIEW, true); + bMenuitem = getBool(OPT_MENUITEM, false); + bMergePopup = getBool(OPT_MERGEPOPUP, true); + bMsgWindowCheck = getBool(OPT_MSGWINDOWCHECK, true); + bMsgReplyWindow = getBool(OPT_MSGREPLYWINDOW, false); + bDefaultColorMsg = getBool(OPT_COLDEFAULT_MESSAGE, false); + bDefaultColorFile = getBool(OPT_COLDEFAULT_FILE, false); + bDefaultColorOthers = getBool(OPT_COLDEFAULT_OTHERS, false); + colBackMsg = getDword(OPT_COLBACK_MESSAGE, DEFAULT_COLBACK); colTextMsg = getDword(OPT_COLTEXT_MESSAGE, DEFAULT_COLTEXT); colBackFile = getDword(OPT_COLBACK_FILE, DEFAULT_COLBACK); colTextFile = getDword(OPT_COLTEXT_FILE, DEFAULT_COLTEXT); colBackOthers = getDword(OPT_COLBACK_OTHERS, DEFAULT_COLBACK); colTextOthers = getDword(OPT_COLTEXT_OTHERS, DEFAULT_COLTEXT); + maskNotify = getByte(OPT_MASKNOTIFY, DEFAULT_MASKNOTIFY); maskActL = getByte(OPT_MASKACTL, DEFAULT_MASKACTL); maskActR = getByte(OPT_MASKACTR, DEFAULT_MASKACTR); maskActTE = getByte(OPT_MASKACTTE, DEFAULT_MASKACTE); - bMsgWindowCheck = getByte(OPT_MSGWINDOWCHECK, TRUE); - bMsgReplyWindow = getByte(OPT_MSGREPLYWINDOW, FALSE); - bMergePopup = getByte(OPT_MERGEPOPUP, TRUE); + iDelayMsg = getDword(OPT_DELAY_MESSAGE, DEFAULT_DELAY); iDelayFile = getDword(OPT_DELAY_FILE, DEFAULT_DELAY); iDelayOthers = getDword(OPT_DELAY_OTHERS, DEFAULT_DELAY); iDelayDefault = DBGetContactSettingRangedWord(NULL, "Popup", "Seconds", SETTING_LIFETIME_DEFAULT, SETTING_LIFETIME_MIN, SETTING_LIFETIME_MAX); - bShowDate = getByte(OPT_SHOW_DATE, TRUE); - bShowTime = getByte(OPT_SHOW_TIME, TRUE); - bShowHeaders = getByte(OPT_SHOW_HEADERS, TRUE); - iNumberMsg = getByte(OPT_NUMBER_MSG, TRUE); - bShowON = getByte(OPT_SHOW_ON, TRUE); - bHideSend = getByte(OPT_HIDESEND, TRUE); - bNoRSS = getByte(OPT_NORSS, FALSE); - bReadCheck = getByte(OPT_READCHECK, FALSE); + + bShowDate = getBool(OPT_SHOW_DATE, true); + bShowTime = getBool(OPT_SHOW_TIME, true); + bShowHeaders = getBool(OPT_SHOW_HEADERS, false); + iNumberMsg = getByte(OPT_NUMBER_MSG, 1); + bShowON = getBool(OPT_SHOW_ON, true); + bHideSend = getBool(OPT_HIDESEND, true); + bNoRSS = getBool(OPT_NORSS, false); + bReadCheck = getBool(OPT_READCHECK, false); } void CMPlugin::OptionsWrite(void) { setByte(OPT_DISABLE, bDisable); + setByte(OPT_MUCDISABLE, bMUCDisable); setByte(OPT_PREVIEW, bPreview); setByte(OPT_MENUITEM, bMenuitem); setByte(OPT_COLDEFAULT_MESSAGE, bDefaultColorMsg); @@ -75,6 +82,7 @@ void CMPlugin::OptionsWrite(void) setDword(OPT_COLTEXT_FILE, colTextFile); setDword(OPT_COLBACK_OTHERS, colBackOthers); setDword(OPT_COLTEXT_OTHERS, colTextOthers); + setDword(OPT_LIMITPREVIEW, iLimitPreview); setByte(OPT_MASKNOTIFY, (uint8_t)maskNotify); setByte(OPT_MASKACTL, (uint8_t)maskActL); setByte(OPT_MASKACTR, (uint8_t)maskActR); diff --git a/plugins/NewEventNotify/src/popup.cpp b/plugins/NewEventNotify/src/popup.cpp index 6fdb090a42..71bb4a55f5 100644 --- a/plugins/NewEventNotify/src/popup.cpp +++ b/plugins/NewEventNotify/src/popup.cpp @@ -26,35 +26,29 @@ extern int g_IsServiceAvail; -static int PopupCount = 0; +static LIST arPopupList(10, NumericKeySortT); -PLUGIN_DATA* PopupList[MAX_POPUPS]; - -int NumberPopupData(MCONTACT hContact, int eventType) +PLUGIN_DATA* PU_GetByContact(MCONTACT hContact, UINT eventType) { - for (int n = 0; n < MAX_POPUPS; n++) { - if (!PopupList[n] && !hContact && eventType == -1) - return n; + for (auto &it : arPopupList) + if (it->hContact == hContact && (eventType == -1 || it->eventType == (UINT)eventType)) + return it; - if (PopupList[n] && (PopupList[n]->hContact == hContact) && (PopupList[n]->iLock == 0) && (eventType == -1 || PopupList[n]->eventType == (UINT)eventType)) - return n; - } - return -1; + return nullptr; } -static int FindPopupData(PLUGIN_DATA* pdata) +int NumberPopupData(MCONTACT hContact, UINT eventType) { - for (int n = 0; n < MAX_POPUPS; n++) - if (PopupList[n] == pdata) - return n; + for (auto &it : arPopupList) + if (it->hContact == hContact && (eventType == -1 || it->eventType == (UINT)eventType)) + return arPopupList.indexOf(&it); return -1; } -static void FreePopupEventData(PLUGIN_DATA* pdata) +static void FreePopupEventData(PLUGIN_DATA *pdata) { - pdata->iLock = 1; - EVENT_DATA_EX* eventData = pdata->firstEventData; + EVENT_DATA_EX *eventData = pdata->firstEventData; while (eventData) { if (eventData->next) { eventData = eventData->next; @@ -66,19 +60,26 @@ static void FreePopupEventData(PLUGIN_DATA* pdata) eventData = nullptr; } } - pdata->lastEventData = pdata->firstEventData = pdata->firstShowEventData = nullptr; - // remove from popup list if present - if (FindPopupData(pdata) != -1) - PopupList[FindPopupData(pdata)] = nullptr; } -int PopupAct(HWND hWnd, UINT mask, PLUGIN_DATA* pdata) +static void DoDefaultHandling(PLUGIN_DATA *pdata) +{ + if (pdata->hContact == 0) + return; + + auto *pDlg = Srmm_FindDialog(pdata->hContact); + if (pDlg && IsWindow(pDlg->GetHwnd())) + CallService(MS_MSG_SENDMESSAGE, pdata->hContact, 0); + else + Clist_ContactDoubleClicked(pdata->hContact); +} + +int PopupAct(HWND hWnd, UINT mask, PLUGIN_DATA *pdata) { if (mask & MASK_OPEN) { if (pdata) { - // do MS_MSG_SENDMESSAGE instead if wanted to reply and not read! if (g_plugin.bMsgReplyWindow && pdata->eventType == EVENTTYPE_MESSAGE) - CallServiceSync(MS_MSG_SENDMESSAGE, (WPARAM)pdata->hContact, 0); // JK, use core (since 0.3.3+) + DoDefaultHandling(pdata); else { EVENT_DATA_EX *eventData = pdata->firstEventData; if (eventData == nullptr) @@ -86,8 +87,10 @@ int PopupAct(HWND hWnd, UINT mask, PLUGIN_DATA* pdata) for (int idx = 0;; idx++) { CLISTEVENT *cle = g_clistApi.pfnGetEvent(pdata->hContact, idx); - if (cle == nullptr) + if (cle == nullptr) { + DoDefaultHandling(pdata); break; + } if (cle->hDbEvent == eventData->hEvent) { if (ServiceExists(cle->pszService)) @@ -102,7 +105,6 @@ int PopupAct(HWND hWnd, UINT mask, PLUGIN_DATA* pdata) if (mask & MASK_REMOVE) { if (pdata) { EVENT_DATA_EX *eventData = pdata->firstEventData; - pdata->iLock = 1; while (eventData) { g_clistApi.pfnRemoveEvent(pdata->hContact, eventData->hEvent); db_event_markRead(pdata->hContact, eventData->hEvent); @@ -123,10 +125,12 @@ int PopupAct(HWND hWnd, UINT mask, PLUGIN_DATA* pdata) static LRESULT CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - PLUGIN_DATA *pdata = (PLUGIN_DATA*)PUGetPluginData(hWnd); + auto *pdata = (PLUGIN_DATA*)PUGetPluginData(hWnd); if (pdata == nullptr) return FALSE; + RECT rc; + POINT pt; switch (message) { case WM_COMMAND: PopupAct(hWnd, g_plugin.maskActL, pdata); @@ -135,12 +139,12 @@ static LRESULT CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPA PopupAct(hWnd, g_plugin.maskActR, pdata); break; case UM_FREEPLUGINDATA: - PopupCount--; mir_free(pdata); return TRUE; case UM_INITPOPUP: pdata->hWnd = hWnd; - SetTimer(hWnd, TIMER_TO_ACTION, pdata->iSeconds * 1000, nullptr); + if (pdata->iSeconds > 0) + SetTimer(hWnd, TIMER_TO_ACTION, pdata->iSeconds * 1000, nullptr); break; case WM_MOUSEWHEEL: if ((short)HIWORD(wParam) > 0 && pdata->firstShowEventData->prev && @@ -160,43 +164,70 @@ static LRESULT CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPA case WM_TIMER: if (wParam != TIMER_TO_ACTION) break; + + GetCursorPos(&pt); + GetWindowRect(hWnd, &rc); + if (PtInRect(&rc, pt)) + break; + + if (pdata->iSeconds > 0) + KillTimer(hWnd, TIMER_TO_ACTION); PopupAct(hWnd, g_plugin.maskActTE, pdata); break; } return DefWindowProc(hWnd, message, wParam, lParam); } +///////////////////////////////////////////////////////////////////////////////////////// + +static wchar_t *ShortenPreview(DBEVENTINFO *dbe) +{ + bool fAddEllipsis = false; + size_t iPreviewLimit = g_plugin.iLimitPreview; + if (iPreviewLimit > 500 || iPreviewLimit == 0) + iPreviewLimit = 500; + + wchar_t *buf = DbEvent_GetTextW(dbe, CP_ACP); + if (mir_wstrlen(buf) > iPreviewLimit) { + fAddEllipsis = true; + size_t iIndex = iPreviewLimit; + size_t iWordThreshold = 20; + while (iIndex && buf[iIndex] != ' ' && iWordThreshold--) + buf[iIndex--] = 0; + + buf[iIndex] = 0; + } + if (fAddEllipsis) { + buf = (wchar_t *)mir_realloc(buf, (mir_wstrlen(buf) + 5) * sizeof(wchar_t)); + mir_wstrcat(buf, L"..."); + } + return buf; +} + static wchar_t* GetEventPreview(DBEVENTINFO *dbei) { wchar_t *comment1 = nullptr; wchar_t *comment2 = nullptr; char *commentFix = nullptr; + char *pBlob = (char *)dbei->pBlob; // now get text switch (dbei->eventType) { case EVENTTYPE_MESSAGE: - if (dbei->pBlob) { - if (dbei->flags & DBEF_UTF) { - // utf-8 in blob - comment1 = mir_utf8decodeW((char*)dbei->pBlob); - } - else if (dbei->cbBlob == (mir_wstrlen((wchar_t *)dbei->pBlob) + 1)*(sizeof(wchar_t) + 1)) { - // wchar in blob (the old hack) - comment1 = mir_wstrdup((wchar_t*)dbei->pBlob); - } - else comment1 = mir_a2u((char *)dbei->pBlob); - } + if (pBlob) + comment1 = ShortenPreview(dbei); commentFix = POPUP_COMMENT_MESSAGE; break; case EVENTTYPE_FILE: - if (dbei->pBlob) { - char *p = (char*)dbei->pBlob + sizeof(uint32_t); + if (pBlob) { + char *p = pBlob + sizeof(uint32_t); // filenames - comment2 = (dbei->flags & DBEF_UTF) ? mir_utf8decodeW(p) : mir_a2u(p); - p += mir_strlen(p) + 1; + comment2 = DbEvent_GetString(dbei, p); // description - comment1 = (dbei->flags & DBEF_UTF) ? mir_utf8decodeW(p) : mir_a2u(p); + p += mir_strlen(p) + 1; + if (*p) + comment1 = DbEvent_GetString(dbei, p); } commentFix = POPUP_COMMENT_FILE; break; @@ -205,10 +236,10 @@ static wchar_t* GetEventPreview(DBEVENTINFO *dbei) // blob format is: // ASCIIZ nick // ASCIIZ UID - if (dbei->pBlob) { + if (pBlob) { // count contacts in event - char* pcBlob = (char *)dbei->pBlob; - char* pcEnd = (char *)(dbei->pBlob + dbei->cbBlob); + char* pcBlob = pBlob; + char* pcEnd = pBlob + dbei->cbBlob; int nContacts; wchar_t szBuf[512]; @@ -235,16 +266,16 @@ static wchar_t* GetEventPreview(DBEVENTINFO *dbei) // ASCIIZ first name // ASCIIZ last name // ASCIIZ email (or YID) - if (dbei->pBlob) { + if (pBlob) { char szUin[16]; wchar_t szBuf[2048]; wchar_t* szNick = nullptr; - char *pszNick = (char *)dbei->pBlob + 8; + char *pszNick = pBlob + 8; char *pszFirst = pszNick + mir_strlen(pszNick) + 1; char *pszLast = pszFirst + mir_strlen(pszFirst) + 1; char *pszEmail = pszLast + mir_strlen(pszLast) + 1; - mir_snprintf(szUin, "%d", *((uint32_t*)dbei->pBlob)); + mir_snprintf(szUin, "%d", *((uint32_t*)pBlob)); if (mir_strlen(pszNick) > 0) { if (dbei->flags & DBEF_UTF) szNick = mir_utf8decodeW(pszNick); @@ -257,7 +288,7 @@ static wchar_t* GetEventPreview(DBEVENTINFO *dbei) else szNick = mir_a2u(pszEmail); } - else if (*((uint32_t*)dbei->pBlob) > 0) + else if (*((uint32_t*)pBlob) > 0) szNick = mir_a2u(szUin); if (szNick) { @@ -271,7 +302,7 @@ static wchar_t* GetEventPreview(DBEVENTINFO *dbei) break; case EVENTTYPE_AUTHREQUEST: - if (dbei->pBlob) { + if (pBlob) { DB::AUTH_BLOB blob(dbei->pBlob); wchar_t *szNick = nullptr; @@ -293,7 +324,7 @@ static wchar_t* GetEventPreview(DBEVENTINFO *dbei) default: DBEVENTTYPEDESCR *pei = DbEvent_GetType(dbei->szModule, dbei->eventType); // support for custom database event types - if (pei && dbei->pBlob) { + if (pBlob) { comment1 = DbEvent_GetTextW(dbei, CP_ACP); commentFix = pei->descr; } @@ -318,10 +349,6 @@ int PopupShow(MCONTACT hContact, MEVENT hEvent, UINT eventType) wchar_t *sampleEvent; long iSeconds; - // there has to be a maximum number of popups shown at the same time - if (PopupCount >= MAX_POPUPS) - return 2; - // check if we should report this kind of event // get the prefered icon as well // CHANGE: iSeconds is -1 because I use my timer to hide popup @@ -380,7 +407,6 @@ int PopupShow(MCONTACT hContact, MEVENT hEvent, UINT eventType) pdata->eventType = eventType; pdata->hContact = hContact; pdata->countEvent = 1; - pdata->iLock = 0; pdata->iSeconds = (iSeconds > 0) ? iSeconds : g_plugin.iDelayDefault; pdata->firstEventData = pdata->firstShowEventData = pdata->lastEventData = eventData; @@ -399,13 +425,11 @@ int PopupShow(MCONTACT hContact, MEVENT hEvent, UINT eventType) wcsncpy(pudw.lpwzText, ptrW(GetEventPreview(&dbe)), MAX_SECONDLINE); } - PopupCount++; + arPopupList.insert(pdata); - PopupList[NumberPopupData(NULL, -1)] = pdata; // send data to popup plugin - - // popup creation failed, release popupdata if (PUAddPopupW(&pudw) < 0) { + // popup creation failed, release popupdata FreePopupEventData(pdata); mir_free(pdata); } @@ -417,7 +441,7 @@ int PopupShow(MCONTACT hContact, MEVENT hEvent, UINT eventType) int PopupUpdate(MCONTACT hContact, MEVENT hEvent) { // merge only message popups - PLUGIN_DATA *pdata = (PLUGIN_DATA*)PopupList[NumberPopupData(hContact, EVENTTYPE_MESSAGE)]; + PLUGIN_DATA *pdata = arPopupList[NumberPopupData(hContact, EVENTTYPE_MESSAGE)]; if (hEvent) { pdata->countEvent++; diff --git a/plugins/NewEventNotify/src/stdafx.h b/plugins/NewEventNotify/src/stdafx.h index 1938092f4c..9ef71031b2 100644 --- a/plugins/NewEventNotify/src/stdafx.h +++ b/plugins/NewEventNotify/src/stdafx.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -55,7 +56,6 @@ //---Definitions #define MODULENAME "NewEventNotify" -#define MAX_POPUPS 20 #define DEFAULT_COLBACK RGB(255,255,128) #define DEFAULT_COLTEXT RGB(0,0,0) @@ -86,8 +86,10 @@ //Entries in the database, don't translate #define OPT_DISABLE "Disabled" +#define OPT_MUCDISABLE "MUCDisabled" #define OPT_PREVIEW "Preview" #define OPT_MENUITEM "MenuItem" +#define OPT_LIMITPREVIEW "LimitPreview" #define OPT_COLDEFAULT_MESSAGE "DefaultColorMsg" #define OPT_COLBACK_MESSAGE "ColorBackMsg" #define OPT_COLTEXT_MESSAGE "ColorTextMsg" @@ -143,36 +145,45 @@ struct CMPlugin : public PLUGIN void OptionsRead(void); void OptionsWrite(void); - BOOL bDisable; - BOOL bPreview; - BOOL bMenuitem; - BOOL bDefaultColorMsg; - BOOL bDefaultColorFile; - BOOL bDefaultColorOthers; + bool bDisable; + bool bMUCDisable; + bool bPreview; + bool bMenuitem; + bool bDefaultColorMsg; + bool bDefaultColorFile; + bool bDefaultColorOthers; + bool bDisableNonMessage; + bool bMsgWindowCheck; + bool bMsgReplyWindow; + bool bMergePopup; + bool bShowDate; + bool bShowTime; + bool bShowHeaders; + bool bShowON; + bool bHideSend; + bool bNoRSS; + bool iNoSounds; + bool bReadCheck; + bool bWindowCheck; + COLORREF colBackMsg; COLORREF colTextMsg; COLORREF colBackFile; COLORREF colTextFile; COLORREF colBackOthers; COLORREF colTextOthers; + UINT maskNotify; UINT maskActL; UINT maskActR; UINT maskActTE; - BOOL bMsgWindowCheck; - BOOL bMsgReplyWindow; + int iDelayMsg; int iDelayFile; int iDelayOthers; int iDelayDefault; - BOOL bMergePopup; - BOOL bShowDate; - BOOL bShowTime; - BOOL bShowHeaders; - BOOL bShowON; - BOOL bHideSend; - BOOL bNoRSS; - BOOL bReadCheck; + int iLimitPreview; + uint8_t iNumberMsg; }; @@ -186,15 +197,14 @@ struct EVENT_DATA_EX struct PLUGIN_DATA { - UINT eventType; MCONTACT hContact; + UINT eventType; HWND hWnd; struct EVENT_DATA_EX* firstEventData; struct EVENT_DATA_EX* firstShowEventData; struct EVENT_DATA_EX* lastEventData; long countEvent; long iSeconds; - int iLock; }; //--------------------------- @@ -208,5 +218,7 @@ int OptionsAdd(WPARAM addInfo, LPARAM); int Opt_DisableNEN(BOOL Status); int MenuitemInit(BOOL bStatus); int MenuitemUpdate(BOOL bStatus); -int NumberPopupData(MCONTACT hContact, int eventType); +int NumberPopupData(MCONTACT hContact, UINT eventType); int CheckMsgWnd(MCONTACT hContact); + +PLUGIN_DATA* PU_GetByContact(MCONTACT hContact, UINT eventType); -- cgit v1.2.3