diff options
Diffstat (limited to 'include/m_popup.h')
-rw-r--r-- | include/m_popup.h | 335 |
1 files changed, 335 insertions, 0 deletions
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/<vfx_name>
+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"
|