From cb4a46e7fbe62d788e66ed6121c717a2d22a4d7c Mon Sep 17 00:00:00 2001 From: watcherhd Date: Thu, 21 Apr 2011 14:14:52 +0000 Subject: svn.miranda.im is moving to a new home! git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- popup/src/services.cpp | 846 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 846 insertions(+) create mode 100644 popup/src/services.cpp (limited to 'popup/src/services.cpp') diff --git a/popup/src/services.cpp b/popup/src/services.cpp new file mode 100644 index 0000000..d9f950a --- /dev/null +++ b/popup/src/services.cpp @@ -0,0 +1,846 @@ +/* +Popup Plus plugin for Miranda IM + +Copyright © 2002 Luca Santarelli, + © 2004-2007 Victor Pavlychko + © 2010 MPK + © 2010 Merlin_de + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +=============================================================================== + +File name : $HeadURL: http://svn.miranda.im/mainrepo/popup/trunk/src/services.cpp $ +Revision : $Revision: 1651 $ +Last change on : $Date: 2010-07-15 20:31:06 +0300 (Чт, 15 июл 2010) $ +Last change by : $Author: Merlin_de $ + +=============================================================================== +*/ + +#include "headers.h" + +int num_classes = 0; //for core class api support + +// isWorkstationLocked() code from YAPP plugin +bool isWorkstationLocked() +{ + bool rc = false; + HDESK hDesk = OpenDesktop(_T("default"), 0, FALSE, DESKTOP_SWITCHDESKTOP); + if(hDesk != 0) { + HDESK hDeskInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP); + if(hDeskInput == 0) { + rc = true; + } else + CloseDesktop(hDeskInput); + + CloseDesktop(hDesk); + } + + return rc; +} + +struct TFullScreenCheckData +{ + int w, h; + HWND ForegroundWindow, hwndDesktop, hwndShell; + bool isFullScreen; +}; + +static BOOL CALLBACK isFullScreenEnumProc(HWND hwnd, LPARAM lParam) +{ + TFullScreenCheckData *dat = (TFullScreenCheckData *)lParam; + dat->isFullScreen = false; + if ( hwnd && + hwnd != dat->hwndDesktop && + hwnd != dat->hwndShell && + IsWindowVisible(hwnd) ){ + RECT rcClient; + GetClientRect(hwnd, &rcClient); + + if ((rcClient.right - rcClient.left) >= dat->w && (rcClient.bottom - rcClient.top) >= dat->h) { + dat->isFullScreen = true; + return FALSE; + } + //check for eg cmd.exe (must be rework coz == 0 is not best way) + if (rcClient.right == 0 && rcClient.left == 0 && rcClient.bottom == 0 && rcClient.top == 0) { + dat->isFullScreen = true; + return FALSE; + } + } + return TRUE; +} + +static bool isFullScreen() +{ + TFullScreenCheckData dat = {0}; +// dat.w = GetSystemMetrics(SM_CXFULLSCREEN); +// dat.h = GetSystemMetrics(SM_CYFULLSCREEN); + dat.ForegroundWindow = GetForegroundWindow(); + dat.hwndDesktop = GetDesktopWindow(); + dat.hwndShell = GetShellWindow(); + +#if !defined(_UNICODE) + //Win95 or NT don't have the support for multi monitor. + if (!MyGetMonitorInfo) { + dat.w = GetSystemMetrics(SM_CXSCREEN); + dat.h = GetSystemMetrics(SM_CYSCREEN); + } + //Windows 98/ME/2000/XP do have it. + else +#endif + if (GetSystemMetrics(SM_CMONITORS)==1) { //we have only one monitor (cant check it together with 1.if) + dat.w = GetSystemMetrics(SM_CXSCREEN); + dat.h = GetSystemMetrics(SM_CYSCREEN); + } + else { //Multimonitor stuff (we have more then 1) + HWND hWnd = NULL; + MONITORINFOEX mnti; // = { 0 }; +#if defined(_UNICODE) + HMONITOR hMonitor = MonitorFromWindow(dat.ForegroundWindow, MONITOR_DEFAULTTOPRIMARY); + HMONITOR hMonMir = MonitorFromWindow((HWND)CallService(MS_CLUI_GETHWND,0,0), MONITOR_DEFAULTTOPRIMARY); +#else + HMONITOR hMonitor = MyMonitorFromWindow(dat.ForegroundWindow, MONITOR_DEFAULTTOPRIMARY); + HMONITOR hMonMir = MyMonitorFromWindow((HWND)CallService(MS_CLUI_GETHWND,0,0), MONITOR_DEFAULTTOPRIMARY); +#endif + if ( (PopUpOptions.Monitor == MN_MIRANDA) && + (hMonitor != hMonMir) + ) return false; //popup monitor is diffrent from fullscreen monitor + + mnti.cbSize = sizeof(MONITORINFOEX); + +#if defined(_UNICODE) + if (GetMonitorInfo(hMonitor, (LPMONITORINFO)&mnti) != 0) { + dat.w = mnti.rcMonitor.right - mnti.rcMonitor.left; + dat.h = mnti.rcMonitor.bottom - mnti.rcMonitor.top; + } +#else + if (MyGetMonitorInfo(hMonitor, (LPMONITORINFO)&mnti) != 0) { + dat.w = mnti.rcMonitor.right - mnti.rcMonitor.left; + dat.h = mnti.rcMonitor.bottom - mnti.rcMonitor.top; + } +#endif + } + + // check foregroundwindow + isFullScreenEnumProc(dat.ForegroundWindow, (LPARAM)&dat); + if(dat.isFullScreen) + return true; + + // check other top level windows (EnumChildWindows works for now) + EnumChildWindows(dat.ForegroundWindow,isFullScreenEnumProc, (LPARAM)&dat); + return dat.isFullScreen; +} + +//===== Hook clist services +static LRESULT CALLBACK ClistEventPopupWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +INT_PTR (*pfnRealCallService)(const char *,WPARAM,LPARAM); +static INT_PTR HookCallService(const char *svc, WPARAM wParam, LPARAM lParam) +{ + if (PopUpOptions.EnableHookClistEvents) { + if (!lstrcmpA(svc, MS_CLIST_ADDEVENT)) { + CLISTEVENT *pCle = (CLISTEVENT *)lParam; + if (pCle->cbSize == sizeof(CLISTEVENT)) { + CLISTEVENT *data = (CLISTEVENT *)mir_alloc(sizeof(CLISTEVENT)); + *data = *pCle; + data->pszService = mir_strdup(data->pszService); + + if (g_popup.isOsUnicode && (pCle->flags & CLEF_UNICODE)) { + data->pszTooltip = (char *)mir_wstrdup((WCHAR *)data->pszTooltip); + + POPUPDATAW_V2 pd = {0}; + pd.lchContact = pCle->hContact; + pd.lchIcon = pCle->hIcon; + if (pCle->hContact) { + lstrcpynW(pd.lpwzContactName, + (WCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)pCle->hContact, GCDNF_UNICODE), + SIZEOF(pd.lpwzContactName)); + } + else { + lstrcpynW(pd.lpwzContactName, L"Incoming Event", SIZEOF(pd.lpwzContactName)); + } + lstrcpynW(pd.lpwzText, (WCHAR *)pCle->pszTooltip, SIZEOF(pd.lpwzText)); + pd.PluginData = data; + pd.PluginWindowProc = ClistEventPopupWndProc; + pd.iSeconds = (pCle->flags & CLEF_ONLYAFEW) ? 0 : -1; + CallService(MS_POPUP_ADDPOPUPW, (WPARAM)&pd, 0); + } + else { + data->pszTooltip = mir_strdup(data->pszTooltip); + + POPUPDATAEX_V2 pd = {0}; + pd.lchContact = pCle->hContact; + pd.lchIcon = pCle->hIcon; + if (pCle->hContact) { + lstrcpynA(pd.lpzContactName, + (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)pCle->hContact, 0), + SIZEOF(pd.lpzContactName)); + } + else { + lstrcpynA(pd.lpzContactName, "Incoming Event", SIZEOF(pd.lpzContactName)); + } + lstrcpynA(pd.lpzText, pCle->pszTooltip, SIZEOF(pd.lpzText)); + pd.PluginData = data; + pd.PluginWindowProc = ClistEventPopupWndProc; + pd.iSeconds = (pCle->flags & CLEF_ONLYAFEW) ? 0 : -1; + CallService(MS_POPUP_ADDPOPUPEX, (WPARAM)&pd, 0); + } + } + } +/* else if (!lstrcmp(svc, MS_CLIST_REMOVEEVENT)) { + ; + } +*/ + } + + return pfnRealCallService(svc, wParam, lParam); +} + +void SetCallServiceHook() +{ + pfnRealCallService = pluginLink->CallService; + pluginLink->CallService = HookCallService; +} + +void RemoveCallServiceHook() +{ + pluginLink->CallService = pfnRealCallService; +} + +static LRESULT CALLBACK ClistEventPopupWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_COMMAND: + { + CLISTEVENT *pCle = (CLISTEVENT *)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hwnd, 0); + if (pCle && pCle->pszService) + { + CallServiceSync(pCle->pszService, 0, (LPARAM)pCle); + CallService(MS_CLIST_REMOVEEVENT, (WPARAM)pCle->hContact, (LPARAM)pCle->hDbEvent); + } + PUDeletePopUp(hwnd); + return TRUE; + } + + case WM_CONTEXTMENU: + { + CLISTEVENT *pCle = (CLISTEVENT *)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hwnd, 0); + if (pCle) + CallService(MS_CLIST_REMOVEEVENT, (WPARAM)pCle->hContact, (LPARAM)pCle->hDbEvent); + PUDeletePopUp(hwnd); + return TRUE; + } + + case UM_INITPOPUP: + return TRUE; + + case UM_FREEPLUGINDATA: + { + CLISTEVENT *pCle = (CLISTEVENT *)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hwnd, 0); + if (pCle) + { + mir_free(pCle->pszTooltip); + mir_free(pCle->pszService); + mir_free(pCle); + } + return TRUE; + } + } + + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +//===== PopUp/AddPopUp +INT_PTR PopUp_AddPopUp(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + POPUPDATA *ppd = (POPUPDATA*)wParam; + if (!ppd) return -1; + + POPUPDATA2 ppd2 = {0}; + ppd2.cbSize = sizeof(ppd2); + ppd2.flags = PU2_ANSI; + ppd2.lchContact = ppd->lchContact; + ppd2.lchIcon = ppd->lchIcon; + ppd2.lpzTitle = ppd->lpzContactName; + ppd2.lpzText = ppd->lpzText; + ppd2.colorBack = ppd->colorBack; + ppd2.colorText = ppd->colorText; + ppd2.PluginWindowProc = ppd->PluginWindowProc; + ppd2.PluginData = ppd->PluginData; + ppd2.iSeconds = PopUpOptions.Seconds; + return PopUp_AddPopUp2((WPARAM)&ppd2, lParam); +/* + PopupWnd2 *wnd = new PopupWnd2(ppd); + + if (lParam & APF_RETURN_HWND) + { + while (!wnd->bWindowCreated) Sleep(1); + return (int)wnd->getHwnd(); + } + + return 1; +*/ +} + +//===== PopUp/AddPopUpEx +INT_PTR PopUp_AddPopUpEx(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + POPUPDATAEX_V2 *ppd = (POPUPDATAEX_V2*)wParam; + if (!ppd) return -1; + + POPUPDATA2 ppd2 = {0}; + ppd2.cbSize = sizeof(ppd2); + ppd2.flags = PU2_ANSI; + ppd2.lchContact = ppd->lchContact; + ppd2.lchIcon = ppd->lchIcon; + ppd2.lpzTitle = ppd->lpzContactName; + ppd2.lpzText = ppd->lpzText; + ppd2.colorBack = ppd->colorBack; + ppd2.colorText = ppd->colorText; + ppd2.PluginWindowProc = ppd->PluginWindowProc; + ppd2.PluginData = ppd->PluginData; + ppd2.iSeconds = ppd->iSeconds; + + if (lParam&APF_NEWDATA) + { + ppd2.lchNotification = ppd->hNotification; + ppd2.actionCount = ppd->actionCount; + ppd2.lpActions = ppd->lpActions; +// ppd2.hbmAvatar = ppd->hbmAvatar; + } + + return PopUp_AddPopUp2((WPARAM)&ppd2, lParam); + +/* + if (lParam & APF_RETURN_HWND) + { + while (!wnd->bWindowCreated) Sleep(1); + return (int)wnd->getHwnd(); + } + + return 1; +*/ +} + +//===== PopUp/AddPopupW +INT_PTR PopUp_AddPopUpW(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + POPUPDATAW_V2 *ppd = (POPUPDATAW_V2*)wParam; + if (!ppd) return -1; + + POPUPDATA2 ppd2 = {0}; + ppd2.cbSize = sizeof(ppd2); + ppd2.flags = PU2_UNICODE; + ppd2.lchContact = ppd->lchContact; + ppd2.lchIcon = ppd->lchIcon; + ppd2.lpwzTitle = ppd->lpwzContactName; + ppd2.lpwzText = ppd->lpwzText; + ppd2.colorBack = ppd->colorBack; + ppd2.colorText = ppd->colorText; + ppd2.PluginWindowProc = ppd->PluginWindowProc; + ppd2.PluginData = ppd->PluginData; + ppd2.iSeconds = ppd->iSeconds; + ppd2.lchNotification = ppd->hNotification; + + if (lParam&APF_NEWDATA) + { + ppd2.actionCount = ppd->actionCount; + ppd2.lpActions = ppd->lpActions; +// ppd2.hbmAvatar = ppd->hbmAvatar; + } + + return PopUp_AddPopUp2((WPARAM)&ppd2, lParam); + +/* + if (lParam & APF_RETURN_HWND) + { + while (!wnd->bWindowCreated) Sleep(1); + return (int)wnd->getHwnd(); + } + + return 1; +*/ +} + +//===== PopUp/AddPopup2 +static __forceinline DWORD Proto_Status2Flag_My(DWORD status) +{ + if (DWORD res = Proto_Status2Flag(status)) + return res; + return PF2_IDLE; +} + +INT_PTR PopUp_AddPopUp2(WPARAM wParam, LPARAM lParam) +{ + /* NOTE: we will return 0 instead of -1 since tabSRMM stops using popup after first failure :/ */ + + if (!gbPopupLoaded) return -1; + + POPUPDATA2 *ppdIn = (POPUPDATA2 *)wParam; + if (!ppdIn) return -1; + + POPUPDATA2 ppdFixed = {0}; + POPUPDATA2 *ppd = &ppdFixed; + CopyMemory(ppd, ppdIn, min(ppdIn->cbSize, sizeof(POPUPDATA2))); + + DWORD disableWhen; + FillNotificationData(ppd, &disableWhen); + + if (!(lParam&APF_NO_HISTORY)) + PopupHistoryAdd(ppd); + + if (PopupThreadIsFull()) + return -1; + + #ifdef _DEBUG + char temp[128]; + OutputDebugStringA("isWorkstationLocked: \t"); + OutputDebugStringA(isWorkstationLocked() ? "true":"false"); + OutputDebugStringA("\n"); + #endif + + if (isWorkstationLocked()) + return -1; + + // Check if contact handle is valid. + char *proto = NULL; + if (ppd->lchContact) + proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)ppd->lchContact, 0); + + BYTE bShowMode = proto ? DBGetContactSettingByte(ppd->lchContact, MODULNAME, "ShowMode", PU_SHOWMODE_AUTO) : PU_SHOWMODE_AUTO; + + if (bShowMode == PU_SHOWMODE_BLOCK) + return -1; + + if (bShowMode != PU_SHOWMODE_FAVORITE) + { + if (!PopUpOptions.ModuleIsEnabled) + return -1; + #ifdef _DEBUG + itoa(PopUpOptions.DisableWhenFullscreen,temp,10); + OutputDebugStringA("PopUpOptions.DisableWhenFullscreen: \t"); + OutputDebugStringA(temp); + OutputDebugStringA("\n"); + itoa(bShowMode,temp,10); + OutputDebugStringA("bShowMode: \t"); + OutputDebugStringA(temp); + OutputDebugStringA("\n"); + OutputDebugStringA("isFullScreen: \t"); + OutputDebugStringA(isFullScreen() ? "true":"false"); + OutputDebugStringA("\n"); + #endif + + if (PopUpOptions.DisableWhenFullscreen && (bShowMode != PU_SHOWMODE_FULLSCREEN) && isFullScreen()) + return -1; + + if (DBGetContactSettingDword(NULL, MODULNAME, "Global Status", 0) & + Proto_Status2Flag_My(CallService(MS_CLIST_GETSTATUSMODE, 0, 0))) + return -1; + + if ((disableWhen & 0x0000FFFF) & Proto_Status2Flag_My(CallService(MS_CLIST_GETSTATUSMODE, 0, 0))) + return -1; + + if (proto) + { + char prefix[128]; + mir_snprintf(prefix, sizeof(prefix), "Protocol Status/%s", (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)ppd->lchContact, 0)); + if (DBGetContactSettingDword(NULL, MODULNAME, prefix, 0) & + Proto_Status2Flag_My(CallProtoService(proto, PS_GETSTATUS, 0, 0))) + return -1; + if (((disableWhen >> 16) & 0xFFFF0000) & Proto_Status2Flag_My(CallProtoService(proto, PS_GETSTATUS, 0, 0))) + return -1; + } + } + + if (lParam&APF_CUSTOM_POPUP) + ppd->flags |= PU2_CUSTOM_POPUP; + PopupWnd2 *wnd = new PopupWnd2(ppd, NULL, false); + + if (lParam & APF_RETURN_HWND) + { + while (!wnd->m_bWindowCreated) Sleep(1); + return (INT_PTR)wnd->getHwnd(); + } + + return 0; +} + +//===== PopUp/GetContact +INT_PTR PopUp_GetContact(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + HWND hwnd = (HWND)wParam; + PopupWnd2 *wnd = (PopupWnd2 *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (wnd && IsValidPopupObject(wnd)) return (INT_PTR)wnd->getContactPassed(); + return (INT_PTR)(-1); +} + +//===== PopUp/GetPluginData +INT_PTR PopUp_GetPluginData(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + HWND hwnd = (HWND)wParam; + PopupWnd2 *wnd = (PopupWnd2 *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (wnd && IsValidPopupObject(wnd)) return (INT_PTR)wnd->getData(); + return (INT_PTR)(-1); +} + +//===== PopUp/IsSecondLineShown +INT_PTR PopUp_IsSecondLineShown(WPARAM wParam, LPARAM lParam) +{ + return 1; +} + +//===== PopUp/ChangeText +INT_PTR PopUp_ChangeText(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + if (!wParam) return -1; + PopupWnd2 *wnd = (PopupWnd2 *)GetWindowLongPtr((HWND)wParam, GWLP_USERDATA); + if (!wnd || !IsValidPopupObject(wnd)) return -1; + wnd->callMethodSync(&PopupWnd2::m_updateText, lParam); +/* + char *str = (char *)mir_alloc(sizeof(char) * (strlen((char *)lParam) + 1)); + strcpy(str, (char *)lParam); + PostMessage((HWND)wParam, UM_CHANGEPOPUP, CPT_TEXT, (LPARAM)str); +*/ + return 0; +} + +//===== PopUp/ChangeTextW +INT_PTR PopUp_ChangeTextW(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + if (!wParam) return -1; + PopupWnd2 *wnd = (PopupWnd2 *)GetWindowLongPtr((HWND)wParam, GWLP_USERDATA); + if (!wnd || !IsValidPopupObject(wnd)) return -1; + wnd->callMethodSync(&PopupWnd2::m_updateTextW, lParam); +/* + WCHAR *str = (WCHAR *)mir_alloc(sizeof(WCHAR) * (wcslen((WCHAR *)lParam) + 1)); + wcscpy(str, (WCHAR *)lParam); + PostMessage((HWND)wParam, UM_CHANGEPOPUP, CPT_TEXTW, (LPARAM)str); +*/ + return 0; +} + +//===== PopUp/Change +INT_PTR PopUp_Change(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + if (!wParam) return -1; + PopupWnd2 *wnd = (PopupWnd2 *)GetWindowLongPtr((HWND)wParam, GWLP_USERDATA); + if (!wnd || !IsValidPopupObject(wnd)) return -1; + wnd->callMethodSync(&PopupWnd2::m_updateData_POPUPDATAEX_V2, lParam); +/* + POPUPDATAEX_V2 *ppdx = (POPUPDATAEX_V2 *)mir_alloc(sizeof(POPUPDATAEX_V2)); + memcpy(ppdx, (POPUPDATAEX_V2 *)lParam, sizeof(POPUPDATAEX_V2)); + PostMessage((HWND)wParam, UM_CHANGEPOPUP, CPT_DATA, (LPARAM)ppdx); +*/ + return 0; +} + +//===== PopUp/ChangeW +INT_PTR PopUp_ChangeW(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + if (!wParam) return -1; + PopupWnd2 *wnd = (PopupWnd2 *)GetWindowLongPtr((HWND)wParam, GWLP_USERDATA); + if (!wnd || !IsValidPopupObject(wnd)) return -1; + wnd->callMethodSync(&PopupWnd2::m_updateData_POPUPDATAW_V2, lParam); +/* + POPUPDATAW_V2 *ppdw = (POPUPDATAW_V2 *)mir_alloc(sizeof(POPUPDATAW_V2)); + memcpy(ppdw, (POPUPDATAW_V2 *)lParam, sizeof(POPUPDATAW_V2)); + PostMessage((HWND)wParam, UM_CHANGEPOPUP, CPT_DATA, (LPARAM)ppdw); +*/ + return 0; +} + +//===== PopUp/Change2 +INT_PTR PopUp_Change2(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + if (!wParam) return -1; + PopupWnd2 *wnd = (PopupWnd2 *)GetWindowLongPtr((HWND)wParam, GWLP_USERDATA); + if (!wnd || IsValidPopupObject(wnd)) return -1; + wnd->callMethodSync(&PopupWnd2::m_updateData_POPUPDATA2, lParam); + return 0; +} + +//===== PopUp/ShowMessage +INT_PTR PopUp_ShowMessage(WPARAM wParam, LPARAM lParam) { + if(!gbPopupLoaded || !wParam || !lParam) return -1; + if(closing) return 0; + + POPUPDATA2 ppd2 = {0}; + ppd2.cbSize = sizeof(ppd2); + ppd2.flags = PU2_ANSI; + ppd2.lpzText = (char*)wParam; + switch (lParam&0x7fffffff) { + case SM_ERROR: + ppd2.lchIcon = IcoLib_GetIcon(ICO_MISC_ERROR,0); + ppd2.colorBack = RGB(191,0,0); + ppd2.colorText = RGB(255,245,225); + ppd2.lchNotification = g_hntfError; + ppd2.lpzTitle = Translate("Error"); + break; + case SM_WARNING: + ppd2.lchIcon = IcoLib_GetIcon(ICO_MISC_WARNING,0); + ppd2.colorBack = RGB(210,210,150); + ppd2.colorText = RGB(0,0,0); + ppd2.lchNotification = g_hntfWarning; + ppd2.lpzTitle = Translate("Warning"); + break; + case SM_NOTIFY: + ppd2.lchIcon = IcoLib_GetIcon(ICO_MISC_NOTIFY,0); + ppd2.colorBack = RGB(230,230,230); + ppd2.colorText = RGB(0,0,0); + ppd2.lchNotification = g_hntfNotification; + ppd2.lpzTitle = Translate("Notify"); + break; + default: //No no no... you must give me a good value. + return -1; + } + return PopUp_AddPopUp2((WPARAM)&ppd2, (LPARAM)((lParam&0x80000000)?APF_NO_HISTORY:0)); +} + +INT_PTR PopUp_ShowMessageW(WPARAM wParam, LPARAM lParam) { + if(!gbPopupLoaded || !wParam || !lParam) return -1; + if(closing) return 0; + + POPUPDATA2 ppd2 = {0}; + ppd2.cbSize = sizeof(ppd2); + ppd2.flags = PU2_UNICODE; + ppd2.lpwzText = (WCHAR*)wParam; + switch (lParam&0x7fffffff) { + case SM_ERROR: + ppd2.lchIcon = IcoLib_GetIcon(ICO_MISC_ERROR,0); + ppd2.colorBack = RGB(191,0,0); + ppd2.colorText = RGB(255,245,225); + ppd2.lchNotification = g_hntfError; + ppd2.lpwzTitle = TranslateW(L"Error"); + break; + case SM_WARNING: + ppd2.lchIcon = IcoLib_GetIcon(ICO_MISC_WARNING,0); + ppd2.colorBack = RGB(210,210,150); + ppd2.colorText = RGB(0,0,0); + ppd2.lchNotification = g_hntfWarning; + ppd2.lpwzTitle = TranslateW(L"Warning"); + break; + case SM_NOTIFY: + ppd2.lchIcon = IcoLib_GetIcon(ICO_MISC_NOTIFY,0); + ppd2.colorBack = RGB(230,230,230); + ppd2.colorText = RGB(0,0,0); + ppd2.lchNotification = g_hntfNotification; + ppd2.lpwzTitle = TranslateW(L"Notify"); + break; + default: //No no no... you must give me a good value. + return -1; + } + return PopUp_AddPopUp2((WPARAM)&ppd2, (LPARAM)((lParam&0x80000000)?APF_NO_HISTORY:0)); +} + +//===== PopUp/Query +INT_PTR PopUp_Query(WPARAM wParam, LPARAM lParam) +{ + if (!gbPopupLoaded) return -1; + + if (closing) + return 0; + + switch (wParam) { + case PUQS_ENABLEPOPUPS: { + if (PopUpOptions.ModuleIsEnabled) return 1; //They're already ON!!! + else { //Module was disabled. + svcEnableDisableMenuCommand(0,0); + return 0; + } + } + case PUQS_DISABLEPOPUPS: { + if (!(PopUpOptions.ModuleIsEnabled)) return 1; //They're already OFF!!! + else { + svcEnableDisableMenuCommand(0,0); + return 0; + } + } + case PUQS_GETSTATUS: + return (PopUpOptions.ModuleIsEnabled); + default: + return -1; + } + return 0; +} + + +//===== PopUp/RegisterActions +INT_PTR PopUp_RegisterActions(WPARAM wParam, LPARAM lParam) +{ + LPPOPUPACTION actions = (LPPOPUPACTION)wParam; + for (int i = 0; i < lParam; ++i) + RegisterAction(&actions[i]); + return 0; +} + + +INT_PTR PopUp_RegisterNotification(WPARAM wParam, LPARAM lParam) +{ + return (INT_PTR)RegisterNotification((LPPOPUPNOTIFICATION)wParam); +} + + +//===== PopUp/UnhookEventAsync +struct SafeUnhookEventParam +{ + HWND hwndPopup; + HANDLE hEvent; +}; + +static void CALLBACK SafeUnhookEventFunc(ULONG_PTR dwParam) +{ + UnhookEvent(((SafeUnhookEventParam *)dwParam)->hEvent); + PostMessage(((SafeUnhookEventParam *)dwParam)->hwndPopup, UM_POPUPUNHOOKCOMPLETE, 0, + (LPARAM)((SafeUnhookEventParam *)dwParam)->hEvent); + delete (SafeUnhookEventParam *)dwParam; +} + +INT_PTR PopUp_UnhookEventAsync(WPARAM wParam, LPARAM lParam) +{ + SafeUnhookEventParam *param = new SafeUnhookEventParam; + param->hwndPopup = (HWND)wParam; + param->hEvent = (HANDLE)lParam; + QueueUserAPC(SafeUnhookEventFunc, hMainThread, (ULONG_PTR)param); + return 0; +} + +//===== PopUp/RegisterVfx (effekt name for drop down box) +INT_PTR PopUp_RegisterVfx(WPARAM wParam, LPARAM lParam) +{ + OptAdv_RegisterVfx((char *)lParam); + return 0; +} + +//===== PopUp/RegisterClass (for core class api support) +INT_PTR PopUp_RegisterPopupClass(WPARAM wParam, LPARAM lParam) { + char setting[256]; + POPUPCLASS *pc = (POPUPCLASS *)lParam; + POPUPTREEDATA *ptd = (POPUPTREEDATA *)mir_alloc(sizeof(POPUPTREEDATA)); + memset(ptd,0,sizeof(POPUPTREEDATA)); + ptd->cbSize = sizeof(POPUPTREEDATA); + ptd->signature = 0/*PopupNotificationData_SIGNATURE*/; + ptd->typ = 2; + memcpy(&ptd->pupClass, pc, sizeof(POPUPCLASS)); + ptd->pszTreeRoot = mir_a2t(pc->pszName); + ptd->pupClass.pszName = mir_strdup(pc->pszName); + if(pc->flags & PCF_UNICODE) { + ptd->pupClass.pwszDescription = mir_wstrdup(pc->pwszDescription); + ptd->pszDescription = mir_u2t(pc->pwszDescription); + } + else { + ptd->pupClass.pszDescription = mir_strdup (pc->pszDescription); + ptd->pszDescription = mir_a2t(pc->pszDescription); + } + LoadClassSettings(ptd, PU_MODULCLASS); + + //we ignore pc->colorText and use fonts.text as default (if no setting found in DB) + mir_snprintf(setting, 256, "%s/TextCol", ptd->pupClass.pszName); + ptd->pupClass.colorText = (COLORREF)DBGetContactSettingDword(NULL, PU_MODULCLASS, setting, fonts.clText/*pc->colorText*/); + FontID fid = {0}; + fid.cbSize = sizeof(FontID); + mir_snprintf(fid.group, sizeof(fid.group), "%s/%s", PU_FNT_AND_COLOR, ptd->pupClass.pszName); + strcpy(fid.dbSettingsGroup, PU_MODULCLASS); + fid.flags = FIDF_DEFAULTVALID; + fid.deffontsettings.charset = DEFAULT_CHARSET; + fid.deffontsettings.size = -11; + strcpy(fid.deffontsettings.szFace, "Tahoma"); + strcpy(fid.name, PU_FNT_NAME_TEXT); + strcpy(fid.prefix, setting); + mir_snprintf(fid.prefix, sizeof(fid.prefix), "%s/Text", ptd->pupClass.pszName); // result is "%s/TextCol" + fid.deffontsettings.style = 0; + fid.deffontsettings.colour = fonts.clText; + CallService(MS_FONT_REGISTER, (WPARAM)&fid, 0); + + //we ignore pc->colorBack and use fonts.clBack as default (if no setting found in DB) + mir_snprintf(setting, 256, "%s/BgCol", ptd->pupClass.pszName); + ptd->pupClass.colorBack = (COLORREF)DBGetContactSettingDword(NULL, PU_MODULCLASS, setting, (DWORD)fonts.clBack/*pc->colorBack*/); + ColourID cid = {0}; + cid.cbSize = sizeof(ColourID); + mir_snprintf(cid.group, sizeof(cid.group), "%s/%s", PU_FNT_AND_COLOR, ptd->pupClass.pszName); + strcpy(cid.dbSettingsGroup, PU_MODULCLASS); + strcpy(cid.name, PU_COL_BACK_NAME); + mir_snprintf(cid.setting, sizeof(cid.setting), "%s/BgCol", ptd->pupClass.pszName); + cid.defcolour = fonts.clBack; + CallService(MS_COLOUR_REGISTER, (WPARAM)&cid, 0); + + gTreeData.insert(ptd); + num_classes++; + + return 0; +} + +//===== PopUp/AddPopupClass (for core class api support) +INT_PTR PopUp_CreateClassPopup(WPARAM wParam, LPARAM lParam) { + int ret = 1; + POPUPDATACLASS *pdc = (POPUPDATACLASS *)lParam; + if(pdc->cbSize != sizeof(POPUPDATACLASS)) return ret; + + POPUPCLASS *pc = NULL; + POPUPTREEDATA *ptd = NULL; + + if(wParam) pc = (POPUPCLASS *)wParam; + else { + LPTSTR group = mir_a2t(pdc->pszClassName); + ptd = (POPUPTREEDATA *)FindTreeData(group, NULL, 2); + if(ptd) pc = &ptd->pupClass; + } + if(pc) { + POPUPDATA2 ppd2 = {0}; + ppd2.cbSize = sizeof(POPUPDATA2); + ppd2.colorBack = pc->colorBack; + ppd2.colorText = pc->colorText; + ppd2.lchIcon = pc->hIcon; + ppd2.iSeconds = pc->iSeconds; + ppd2.PluginWindowProc = pc->PluginWindowProc; + if(pc->flags & PCF_UNICODE) { + ppd2.flags = PU2_UNICODE; + ppd2.lpwzTitle = (WCHAR*)pdc->pwszTitle; + ppd2.lpwzText = (WCHAR*)pdc->pwszText; + } + else { + ppd2.flags = PU2_ANSI; + ppd2.lpzTitle = (char *)pdc->pszTitle; + ppd2.lpzText = (char *)pdc->pszText; + } + ppd2.lchContact = pdc->hContact; + ppd2.PluginData = pdc->PluginData; + + ret = PopUp_AddPopUp2((WPARAM)&ppd2, 0); + } + return ret!=0 ? 1 : 0; +} + -- cgit v1.2.3