diff options
| -rw-r--r-- | ExternalAPI/m_popup2.h | 457 | ||||
| -rw-r--r-- | buddyexpectator/BuddyExpectator.cpp | 18 | ||||
| -rw-r--r-- | buddyexpectator/common.h | 1 | 
3 files changed, 467 insertions, 9 deletions
| 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/<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
 +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 <m_userinfo.h>
  #include <m_icolib.h>
  #include "m_popup.h"
 +#include "m_popup2.h"
  #include "m_updater.h"
  #include "m_cluiframes.h"
 | 
