From 285d0b93bc5f99c565dab66e86b8130f0b56d150 Mon Sep 17 00:00:00 2001 From: watcherhd Date: Tue, 26 Apr 2011 19:55:16 +0000 Subject: buddyexpectator: compilation fix, adding m_popup2.h to api folder git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@43 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- ExternalAPI/m_popup2.h | 457 ++++++++++++++++++++++++++++++++++++ buddyexpectator/BuddyExpectator.cpp | 18 +- buddyexpectator/common.h | 1 + 3 files changed, 467 insertions(+), 9 deletions(-) create mode 100644 ExternalAPI/m_popup2.h diff --git a/ExternalAPI/m_popup2.h b/ExternalAPI/m_popup2.h new file mode 100644 index 0000000..cec5abb --- /dev/null +++ b/ExternalAPI/m_popup2.h @@ -0,0 +1,457 @@ +/* +=============================================================================== + PopUp plugin +Plugin Name: PopUp +Plugin authors: Luca Santarelli aka hrk (hrk@users.sourceforge.net) + Victor Pavlychko (nullbie@gmail.com) +=============================================================================== +The purpose of this plugin is to give developers a common "platform/interface" +to show PopUps. It is born from the source code of NewStatusNotify, another +plugin I've made. + +Remember that users *must* have this plugin enabled, or they won't get any +popup. Write this in the requirements, do whatever you wish ;-)... but tell +them! +=============================================================================== +*/ + +#ifndef __m_popup2_h__ +#define __m_popup2_h__ + +#ifndef POPUP_VERSION +#define POPUP_VERSION 0x02010003 +#endif + +#define MAX_ACTIONTITLE 64 + +// Popup Action flags +#define PAF_ENABLED 0x01 // Actions is enabled. You may store one global + // action set and toggle some items depending on + // popup you are requesting + +// ANSI Popup Action +typedef struct +{ + int cbSize; // sizeof(POPUPACTION) + HICON lchIcon; // Action Icon + // Action title text. Please use module name as prefix + // (e.g. "Popup Plus/Dismiss Popup") and don't translate + // This is translates by popup. So no unicode. + char lpzTitle[MAX_ACTIONTITLE]; + DWORD flags; // set of PAF_* flags + WPARAM wParam; // wParam for UM_POPUPACTION message + LPARAM lParam; // lParam for UM_POPUPACTION message +} POPUPACTION, *LPPOPUPACTION; + +/////////////////////////////////////////////////////////////// +// Few notes about new popup api +// ------------------------------ +// When you call any ADD service, Popup Plus creates local +// copy of POPUPDATA2 to store the data. Each time you call +// CHANGE service this data is updated. You can use the +// MS_POPUP_GETDATA2 service to retrieve Popups's copy of +// this data, however you MUST NOT chahge that. + +// unicode or ansi mode +#define PU2_ANSI 0x00 +#define PU2_UNICODE 0x01 +#if defined(UNICODE) || defined(_UNICODE) + #define PU2_TCHAR PU2_UNICODE +#else + #define PU2_TCHAR PU2_ANSI +#endif + +#define PU2_CUSTOM_POPUP 0x02 + +typedef struct +{ + // general + int cbSize; + DWORD flags; + + // miranda bindings + HANDLE lchContact; + HANDLE lchEvent; + + // style + COLORREF colorBack; + COLORREF colorText; + HICON lchIcon; + HBITMAP hbmAvatar; + union + { + char *lpzTitle; + WCHAR *lpwzTitle; + TCHAR *lptzTitle; + }; + union + { + char *lpzText; + WCHAR *lpwzText; + TCHAR *lptzText; + }; + char *lpzSkin; + + // time and timeout + int iSeconds; + DWORD dwTimestamp; + + // plugin bindings + WNDPROC PluginWindowProc; + void *PluginData; + + // popup actions + int actionCount; + POPUPACTION *lpActions; + + HANDLE lchNotification; +} POPUPDATA2, *LPPOPUPDATA2; + +// Creates new popup +// wParam = (WPARAM)(LPPOPUPDATA2)&ppd2 +// lParam = (LPARAM)(combination of APF_* flags) +// returns: window handle (if requested) of NULL on success, -1 on failure. +#define MS_POPUP_ADDPOPUP2 "Popup/AddPopup2" + +// Update an popup +// wParam = (WPARAM)(HWND)hwndPopup +// lParam = (LPARAM)(LPPOPUPDATA2)&ppd2 +// returns: zero on success, -1 on failure. +#define MS_POPUP_CHANGEPOPUP2 "Popup/ChangePopup2" + +// deprecatet !!! (only for compatibility) use new POPUPDATA2 struct for extended popup +// Extended popup data V2 (ansi version) +typedef struct +{ + HANDLE lchContact; + HICON lchIcon; + union + { + char lptzContactName[MAX_CONTACTNAME]; + char lpzContactName[MAX_CONTACTNAME]; + }; + union + { + char lptzText[MAX_SECONDLINE]; + char lpzText[MAX_SECONDLINE]; + }; + COLORREF colorBack; + COLORREF colorText; + WNDPROC PluginWindowProc; + void * PluginData; + int iSeconds; // Custom delay time in seconds. -1 means "forever", 0 means "default time". + // +2.1.0.3 + // you *MUST* pass APF_NEWDATA flag for services to take care of this data + HANDLE hNotification; // Reserved. Must be NULL + int actionCount; // Amount of passed actions + LPPOPUPACTION lpActions; // Popup Actions + int cbSize; // struct size for future +} POPUPDATAEX_V2, *LPPOPUPDATAEX_V2; + +// deprecatet !!! (only for compatibility) use new POPUPDATA2 struct for extended popup +// Unicode version of POPUPDATAEX_V2 +typedef struct +{ + HANDLE lchContact; + HICON lchIcon; + union + { + WCHAR lptzContactName[MAX_CONTACTNAME]; + WCHAR lpwzContactName[MAX_CONTACTNAME]; + }; + union + { + WCHAR lptzText[MAX_SECONDLINE]; + WCHAR lpwzText[MAX_SECONDLINE]; + }; + COLORREF colorBack; + COLORREF colorText; + WNDPROC PluginWindowProc; + void * PluginData; + int iSeconds; + // +2.1.0.3 + // you *MUST* pass APF_NEWDATA flag for services to take care of this data + HANDLE hNotification; + int actionCount; + LPPOPUPACTION lpActions; + int cbSize; +} POPUPDATAW_V2, *LPPOPUPDATAW_V2; + +// deprecatet !!! (only for compatibility) use new POPUPDATA2 struct for extended popup +#if defined(_UNICODE) || defined(UNICODE) + typedef POPUPDATAW_V2 POPUPDATAT_V2; + typedef LPPOPUPDATAW_V2 LPPOPUPDATAT_V2; +#else + typedef POPUPDATAEX_V2 POPUPDATAT_V2; + typedef LPPOPUPDATAEX_V2 LPPOPUPDATAT_V2; +#endif + +/* PopUp/AddPopup +Creates, adds and shows a popup, given a (valid) POPUPDATA structure pointer. + +wParam = (WPARAM)(*POPUPDATA)PopUpDataAddress +lParam = 0 + +Returns: > 0 on success, 0 if creation went bad, -1 if the PopUpData contained unacceptable values. +NOTE: it returns -1 if the PopUpData was not valid, if there were already too many popups, if the module was disabled. +Otherwise, it can return anything else... + +Popup Plus 2.0.4.0+ +You may pass additional creation flags via lParam: +/* core define see miranda\include\m_popup.h + APF_RETURN_HWND ....... function returns handle to newly created popup window (however this calls are a bit slower) + APF_CUSTOM_POPUP ...... new popup is created in hidden state and doesn't obey to popup queue rules. + you may control it via UM_* messages and custom window procedure (not yet implemented) +additional APF_ flags */ +#define APF_NO_HISTORY 0x04 //do not log this popup in popup history (useful for previews) +#define APF_NO_POPUP 0x08 //do not show popup. this is useful if you want popup yo be stored in history only +#define APF_NEWDATA 0x10 //deprecatet!! only for use with old POPUPDATAEX_V2/POPUPDATAW_V2 structs + +//overload function for POPUPDATAEX_V2/POPUPDATAW_V2 +static INT_PTR __inline PUAddPopUpEx(POPUPDATAEX_V2* ppdp) { + return CallService(MS_POPUP_ADDPOPUPEX, (WPARAM)ppdp,0); +} + +static INT_PTR __inline PUAddPopUpW(POPUPDATAW_V2* ppdp) { + return CallService(MS_POPUP_ADDPOPUPW, (WPARAM)ppdp,0); +} + +static int __inline PUChange(HWND hWndPopUp, POPUPDATAEX_V2 *newData) { + return (int)CallService(MS_POPUP_CHANGE, (WPARAM)hWndPopUp, (LPARAM)newData); +} + +#define MS_POPUP_CHANGEW "PopUp/ChangeW" +static int __inline PUChangeW(HWND hWndPopUp, POPUPDATAW_V2 *newData) { + return (int)CallService(MS_POPUP_CHANGEW, (WPARAM)hWndPopUp, (LPARAM)newData); +} + +/* UM_CHANGEPOPUP +This message is triggered by Change/ChangeText services. You also may post it directly, but make +sure you allocate memory via miranda mmi, because popup will mir_free() them! + +wParam = Modification type +lParam = value of type defined by wParam + +/* core define see miranda\include\m_popup.h +#define CPT_TEXT 1 // lParam = (char *)text +#define CPT_TEXTW 2 // lParam = (WCHAR *)text +#define CPT_TITLE 3 // lParam = (char *)title +#define CPT_TITLEW 4 // lParam = (WCHAR *)title +#define CPT_DATA 5 // lParam = (POPUPDATA *)data +#define CPT_DATAEX 6 // lParam = (POPUPDATAEX *) or (POPUPDATAEX_V2 *)data see CPT_DATA2 +#define CPT_DATAW 7 // lParam = (POPUPDATAW *) or (POPUPDATAW_V2 *)data see CPT_DATA2 +additional CPT_ flag*/ +#define CPT_DATA2 8 // lParam = (POPUPDATA2 *)data -- see m_popup2.h for details + +/* UM_POPUPACTION +Popup Action notification + +wParam and lParam are specified bu plugin. +wParam = 0 is used buy popup plus internally! +*/ + +#define UM_POPUPACTION (WM_USER + 0x0204) + +/* UM_POPUPMODIFYACTIONICON +Modify Popup Action Icon + +wParam = (WPARAM)(LPPOPUPACTIONID)&actionId +lParam = (LPARAM)(HICON)hIcon +*/ + +typedef struct +{ + WPARAM wParam; + LPARAM lParam; +} POPUPACTIONID, *LPPOPUPACTIONID; + +#define UM_POPUPMODIFYACTIONICON (WM_USER + 0x0205) +static int __inline PUModifyActionIcon(HWND hWndPopUp, WPARAM wParam, LPARAM lParam, HICON hIcon) { + POPUPACTIONID actionId = { wParam, lParam }; + return (int)SendMessage(hWndPopUp, UM_POPUPMODIFYACTIONICON, (WPARAM)&actionId, (LPARAM)hIcon); +} + +/* UM_POPUPSHOW +Show popup at position + +wParam = x +lParam = y +*/ +#define UM_POPUPSHOW (WM_USER + 0x0206) + +/* PopUp/RegisterActions +Registers your action in popup action list + +wParam = (WPARAM)(LPPOPUPACTION)actions +lParam = (LPARAM)actionCount + +Returns: 0 if the popup was shown, -1 in case of failure. +*/ +#define MS_POPUP_REGISTERACTIONS "PopUp/RegisterActions" + +static int __inline PURegisterActions(LPPOPUPACTION actions, int count) { + return (int)CallService(MS_POPUP_REGISTERACTIONS, (WPARAM)actions,(LPARAM)count); +} + +/* PopUp/RegisterNotification +Registers your action in popup action list + +wParam = (WPARAM)(LPPOPUPNOTIFICATION)info +lParam = 0 + +Returns: handle of registered notification or sero on failure +*/ +#define MS_POPUP_REGISTERNOTIFICATION "PopUp/RegisterNotification" + +#define PNAF_CALLBACK 0x01 + +#define POPUP_ACTION_NOTHING "Do nothing" +#define POPUP_ACTION_DISMISS "Dismiss popup" + +typedef struct +{ + char lpzTitle[64]; + DWORD dwFlags; + union + { + struct + { + char lpzLModule[MAXMODULELABELLENGTH]; + char lpzLSetting[MAXMODULELABELLENGTH]; + DBVARIANT dbvLData; + char lpzRModule[MAXMODULELABELLENGTH]; + char lpzRSetting[MAXMODULELABELLENGTH]; + DBVARIANT dbvRData; + }; + struct + { + DWORD dwCookie; + void (*pfnCallback)(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, DWORD cookie); + }; + }; +} POPUPNOTIFYACTION, *LPPOPUPNOTIFYACTION; + +#define PNF_CONTACT 0x01 + +typedef struct +{ + int cbSize; + DWORD dwFlags; // set of PNF_* flags + char lpzGroup[MAXMODULELABELLENGTH]; + char lpzName[MAXMODULELABELLENGTH]; + HICON lchIcon; // this will be registered in icolib + COLORREF colorBack; // this will be registered in fontservice + COLORREF colorText; // this will be registered in fontservice + int iSeconds; // default timeout + int actionCount; // for unified action comboboxes + LPPOPUPNOTIFYACTION lpActions; + char *lpzLAction; + char *lpzRAction; + char *pszReserved1; // reserved for future use + DLGPROC pfnReserved2; // reserved for future use +} POPUPNOTIFICATION, *LPPOPUPNOTIFICATION; + +static HANDLE __inline PURegisterNotification(LPPOPUPNOTIFICATION notification) { + return (HANDLE)CallService(MS_POPUP_REGISTERNOTIFICATION, (WPARAM)notification, (LPARAM)0); +} + +/* PopUp/UnhookEventAsync +Using of "UnhookEvent" inside PluginWindowProc in conjunction with HookEventMessage +may cause deadlocks. Use this service instead. It will queue event unhook into main +thread and notify you when everything has finished. + +Deadlock scenario: + 1. Event is fired with NotifyEventHooks in the main thread + 2. Miranda core calls EnterCriticalSection(csHooks) and starts notifications + 3. You decide to unhook event, therefore call UnhookEvent + 4. Miranda core *INSIDE YOUR THREAD* calls EnterCriticalSection(csHooks) and + waits for main thread to finish processing + 5. Main thread calls SendMessage(hwnd, ...) to notify your window + 6. Your window's thread is busy waiting for main thread to leave critical section + 7. deadlock.... + +wParam = (WPARAM)(HWND)hwndPopup +lParam = (LPARAM)(HANDLE)hEvent + +Returns: 0 if everything gone ok. -1 if service was not found (and unsafe unhook was performed) +*/ + +#define MS_POPUP_UNHOOKEVENTASYNC "PopUp/UnhookEventAsync" + +/* UM_POPUPUNHOOKCOMPLETE +Modify Popup Action Icon + +wParam = 0 +lParam = (LPARAM)(HANDLE)hEventUnhooked +*/ +#define UM_POPUPUNHOOKCOMPLETE (WM_USER + 0x0206) + +static int __inline PUUnhookEventAsync(HWND hwndPopup, HANDLE hEvent) { + if (ServiceExists(MS_POPUP_UNHOOKEVENTASYNC)) + return (int)CallService(MS_POPUP_UNHOOKEVENTASYNC, (WPARAM)hwndPopup,(LPARAM)hEvent); + + // old popup plugins: unhook service not found + UnhookEvent(hEvent); + PostMessage(hwndPopup, UM_POPUPUNHOOKCOMPLETE, 0, (LPARAM)hEvent); + return 0; +} + +/* PopUp/GetStatus +Returns 1 when popups are showen and 0 when not +wParam = 0 +lParam = 0 +*/ +#define MS_POPUP_GETSTATUS "PopUp/GetStatus" + +#ifdef __cplusplus +/* PopUp/RegisterVfx +Register new animation (fade in/out) effect +wParam = 0 +lParam = (LPARAM)(char *)vfx_name +*/ + +#define MS_POPUP_REGISTERVFX "PopUp/RegisterVfx" + +/* PopUp/Vfx/ +Define this service to create vfx instance +wParam = 0 +lParam = 0 +return = (int)(IPopupPlusEffect *)vfx +*/ + +#define MS_POPUP_CREATEVFX "PopUp/Vfx/" + +class IPopupPlusEffect +{ +public: + virtual void beginEffect(int w, int h, int alpha0, int alpha1, int frameCount) = 0; + virtual void beginFrame(int frame) = 0; + virtual int getPixelAlpha(int x, int y) = 0; + virtual void endFrame() = 0; + virtual void endEffect() = 0; + virtual void destroy() = 0; +}; +#endif // __cplusplus + + +/* PopUp/ShowMessage +This is mainly for developers. +Shows a warning message in a PopUp. It's useful if you need a "MessageBox" like function, but you don't want a modal +window (which will interfere with a DialogProcedure. MessageBox steals focus and control, this one not. + +wParam = (char *)lpzMessage +lParam = 0; + +Returns: 0 if the popup was shown, -1 in case of failure. + +/* core define see miranda\include\m_popup.h +#define SM_WARNING 0x01 //Triangle icon. +#define SM_NOTIFY 0x02 //Exclamation mark icon. +additional SM_ flags */ +#define SM_ERROR 0x03 //Cross icon. +#ifndef MS_POPUP_SHOWMESSAGE +#define MS_POPUP_SHOWMESSAGE "PopUp/ShowMessage" +#define MS_POPUP_SHOWMESSAGEW "PopUp/ShowMessageW" +#endif + +#endif // __m_popup2_h__ diff --git a/buddyexpectator/BuddyExpectator.cpp b/buddyexpectator/BuddyExpectator.cpp index bd0a9c5..5ec0037 100644 --- a/buddyexpectator/BuddyExpectator.cpp +++ b/buddyexpectator/BuddyExpectator.cpp @@ -67,7 +67,7 @@ PLUGININFOEX pluginInfo = { "Reacts to the return of contacts, or the the extended absence of contacts, with notifications and other actions", "Anar Ibragimoff, sje, Thief", "thief@miranda.im", - "© 2005 Anar Ibragimoff, © 2006 Scott Ellis, © 2007-2009 Alexander Turyak", + "� 2005 Anar Ibragimoff, � 2006 Scott Ellis, � 2007-2009 Alexander Turyak", "http://thief.miranda.im", 0, 0, @@ -282,8 +282,8 @@ bool isContactGoneFor(HANDLE hContact, int days) { char szInfo[200]; - POPUPDATAEX ppd = {0}; - ppd.cbSize = sizeof(POPUPDATAEX); + POPUPDATAT_V2 ppd = {0}; + ppd.cbSize = sizeof(POPUPDATAT_V2); ppd.lchContact = hContact; ppd.lchIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)"enabled_icon"); @@ -324,8 +324,8 @@ void ReturnNotify(HANDLE hContact, char *message) if (options.iShowPopUp > 0) { // Display PopUp - POPUPDATAEX ppd = {0}; - ppd.cbSize = sizeof(POPUPDATAEX); + POPUPDATAT_V2 ppd = {0}; + ppd.cbSize = sizeof(POPUPDATAT_V2); ppd.lchContact = hContact; ppd.lchIcon = hIcon; @@ -370,8 +370,8 @@ void GoneNotify(HANDLE hContact, char *message) if (options.iShowPopUp2 > 0) { // Display PopUp - POPUPDATAEX ppd = {0}; - ppd.cbSize = sizeof(POPUPDATAEX); + POPUPDATAT_V2 ppd = {0}; + ppd.cbSize = sizeof(POPUPDATAT_V2); ppd.lchContact = hContact; ppd.lchIcon = hIcon; @@ -623,8 +623,8 @@ int SettingChanged(WPARAM wParam, LPARAM lParam) if (DBGetContactSettingByte(hContact, MODULE_NAME, "MissYou", 0)) { // Display PopUp - POPUPDATAEX ppd = {0}; - ppd.cbSize = sizeof(POPUPDATAEX); + POPUPDATAT_V2 ppd = {0}; + ppd.cbSize = sizeof(POPUPDATAT_V2); ppd.lchContact = hContact; ppd.lchIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)"enabled_icon"); diff --git a/buddyexpectator/common.h b/buddyexpectator/common.h index 6c9b635..6398727 100644 --- a/buddyexpectator/common.h +++ b/buddyexpectator/common.h @@ -49,6 +49,7 @@ #include #include #include "m_popup.h" +#include "m_popup2.h" #include "m_updater.h" #include "m_cluiframes.h" -- cgit v1.2.3