From 144d05b638162094aabb5153483439589e103ed4 Mon Sep 17 00:00:00 2001 From: kreol13 Date: Thu, 21 Apr 2011 12:56:41 +0000 Subject: initial commit git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@3 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- SDK/m_popup2.h | 457 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 457 insertions(+) create mode 100644 SDK/m_popup2.h (limited to 'SDK/m_popup2.h') diff --git a/SDK/m_popup2.h b/SDK/m_popup2.h new file mode 100644 index 0000000..cec5abb --- /dev/null +++ b/SDK/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__ -- cgit v1.2.3