From 1b88f240b94fc04aa11ef352b720fda741c0ebc6 Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Thu, 12 Jun 2014 12:08:36 +0000 Subject: merge m_popup and m_popup2 headers git-svn-id: http://svn.miranda-ng.org/main/trunk@9437 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- include/m_popup.h | 335 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 335 insertions(+) (limited to 'include/m_popup.h') diff --git a/include/m_popup.h b/include/m_popup.h index 9131a65058..4729af7833 100644 --- a/include/m_popup.h +++ b/include/m_popup.h @@ -28,6 +28,137 @@ mi.position = 0; //You don't need it and it's better if you put it to zero. #define MAX_CONTACTNAME 2048 #define MAX_SECONDLINE 2048 +#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 + MCONTACT 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 +// Unicode version of POPUPDATAEX_V2 +typedef struct +{ + MCONTACT 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; +#endif // Extended popup data typedef struct @@ -101,6 +232,9 @@ You may pass additional creation flags via lParam: */ #define APF_RETURN_HWND 0x1 #define APF_CUSTOM_POPUP 0x2 +#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 #define MS_POPUP_ADDPOPUP "Popup/AddPopupEx" static INT_PTR __inline PUAddPopup(POPUPDATA* ppdp) { @@ -112,6 +246,10 @@ static INT_PTR __inline PUAddPopupW(POPUPDATAW* ppdp) { return CallService(MS_POPUP_ADDPOPUPW, (WPARAM)ppdp, 0); } +static INT_PTR __inline PUAddPopupW(POPUPDATAW_V2* ppdp) { + return CallService(MS_POPUP_ADDPOPUPW, (WPARAM)ppdp, 0); +} + #if defined(_UNICODE) || defined(UNICODE) #define MS_POPUP_ADDPOPUPT MS_POPUP_ADDPOPUPW #define PUAddPopupT PUAddPopupW @@ -233,6 +371,10 @@ static int __inline PUChangeW(HWND hWndPopup, POPUPDATAW *newData) { return (int)CallService(MS_POPUP_CHANGEW, (WPARAM)hWndPopup, (LPARAM)newData); } +static int __inline PUChangeW(HWND hWndPopup, POPUPDATAW_V2 *newData) { + return (int)CallService(MS_POPUP_CHANGEW, (WPARAM)hWndPopup, (LPARAM)newData); +} + #if defined(_UNICODE) || defined(UNICODE) #define MS_POPUP_CHANGET MS_POPUP_CHANGEW #define PUChangeT PUChangeW @@ -248,6 +390,7 @@ lParam = value of type defined by wParam #define CPT_TEXTW 2 // lParam = (WCHAR *)text #define CPT_TITLEW 4 // lParam = (WCHAR *)title #define CPT_DATAW 7 // lParam = (POPUPDATAW *)data +#define CPT_DATA2 8 // lParam = (POPUPDATA2 *)data -- see m_popup2.h for details #define UM_CHANGEPOPUP (WM_USER + 0x0203) @@ -257,6 +400,197 @@ lParam = value of type defined by wParam #define CPT_DATAT CPT_DATAW #endif +/* 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 LPGEN("Do nothing") +#define POPUP_ACTION_DISMISS LPGEN("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, 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 @@ -269,6 +603,7 @@ Returns: 0 if the popup was shown, -1 in case of failure. */ #define SM_WARNING 0x01 //Triangle icon. #define SM_NOTIFY 0x02 //Exclamation mark icon. +#define SM_ERROR 0x03 //Cross icon. #define MS_POPUP_SHOWMESSAGE "Popup/ShowMessage" #define MS_POPUP_SHOWMESSAGEW "Popup/ShowMessageW" -- cgit v1.2.3