diff options
Diffstat (limited to 'message_notify/popups.cpp')
-rw-r--r-- | message_notify/popups.cpp | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/message_notify/popups.cpp b/message_notify/popups.cpp new file mode 100644 index 0000000..1a40583 --- /dev/null +++ b/message_notify/popups.cpp @@ -0,0 +1,271 @@ +#include "common.h"
+#include "popups.h"
+#include "options.h"
+
+#include <tchar.h>
+
+HICON hPopupIcon;
+bool unicode_enabled;
+
+void __stdcall sttOpenSRMMWindowProc( ULONG dwParam )
+{
+ //CallService(MS_MSG_SENDMESSAGE, (WPARAM)dwParam, 0);
+
+ // simulate double-click on contact
+ CallService(MS_CLIST_CONTACTDOUBLECLICKED, (WPARAM)dwParam, 0);
+}
+
+void __stdcall sttCloseSRMMWindowProc( ULONG dwParam )
+{
+ HANDLE hContact = (HANDLE)dwParam;
+ MessageWindowInputData mwid = {0};
+ MessageWindowData mwd = {0};
+
+ mwid.cbSize = sizeof(mwid);
+ mwid.hContact = hContact;
+ mwid.uFlags = MSG_WINDOW_UFLAG_MSG_BOTH;
+
+ mwd.cbSize = sizeof(mwd);
+
+ if(!CallService(MS_MSG_GETWINDOWDATA, (WPARAM)&mwid, (LPARAM)&mwd)) {
+ HWND hwnd = mwd.hwndWindow;//, parent;
+ //while((parent = GetParent(hwnd)) != 0) hwnd = parent; // ensure we have the top level window (need parent window for scriver & tabsrmm)
+
+ //PostMessage(hwnd, WM_COMMAND, 1023, 0); // chat close tab? (unfortunately, chat doesn't implement the messaging API to notify us of window open/close events
+ PostMessage(hwnd, WM_COMMAND, IDCANCEL, 0); // srmm/scriver close session button
+ PostMessage(hwnd, WM_COMMAND, 1025, 0); // tabsrmm close session button
+
+ PostMessageWindowList(WMU_CLOSEPOPUP, (WPARAM)hContact, 0); // close popups
+ }
+}
+
+LRESULT CALLBACK NullWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
+{
+ switch( message ) {
+ case WM_COMMAND: {
+ HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact);
+ QueueUserAPC( sttOpenSRMMWindowProc , mainThread, ( ULONG )hContact );
+ PUDeletePopUp( hWnd );
+ return TRUE;
+ }
+
+ case WMU_CLOSEPOPUP: {
+ HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact);
+ if((HANDLE)wParam == hContact)
+ PUDeletePopUp( hWnd );
+ return TRUE;
+ }
+
+ case WM_CONTEXTMENU: {
+ // mark most recent event read...FIXME (may not be correct event)
+ HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact);
+ HANDLE lastDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDLAST, (WPARAM)hContact, 0);
+ int count = 0;
+ while(lastDbEvent && count++ < 10) {
+ CallService(MS_DB_EVENT_MARKREAD, (WPARAM)hContact, (LPARAM)lastDbEvent);
+ CallService(MS_CLIST_REMOVEEVENT, (WPARAM)hContact, (LPARAM)lastDbEvent);
+ lastDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDPREV, (WPARAM)lastDbEvent, 0);
+ }
+ if(options.close_win)
+ QueueUserAPC( sttCloseSRMMWindowProc , mainThread, ( ULONG )hContact );
+ PUDeletePopUp( hWnd );
+ return TRUE;
+ }
+
+ case UM_FREEPLUGINDATA: {
+ HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact);
+ RemoveFromWindowList(hContact, hWnd);
+ return TRUE;
+ }
+
+ case UM_INITPOPUP:
+ HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact);
+ if(!InList(hContact, hWnd)) AddToWindowList(hContact, hWnd);
+ return TRUE;
+ }
+
+ return DefWindowProc(hWnd, message, wParam, lParam);
+}
+
+void __stdcall sttPopupProc( ULONG param ){
+//DWORD sttPopupProc(LPVOID param) {
+ POPUPDATAEX* ppd = ( POPUPDATAEX* )param;
+
+ if ( ServiceExists(MS_POPUP_ADDPOPUPEX) )
+ CallService( MS_POPUP_ADDPOPUPEX, ( WPARAM )ppd, 0 );
+ else
+ if ( ServiceExists(MS_POPUP_ADDPOPUP) )
+ CallService( MS_POPUP_ADDPOPUP, ( WPARAM )ppd, 0 );
+
+ free( ppd );
+
+ //return 0;
+}
+
+void __stdcall sttPopupProcW( ULONG param ) {
+//DWORD sttPopupProcW(LPVOID param) {
+ POPUPDATAW* ppd = ( POPUPDATAW* )param;
+
+ if ( ServiceExists(MS_POPUP_ADDPOPUPW) )
+ CallService( MS_POPUP_ADDPOPUPW, ( WPARAM )ppd, 0 );
+
+ free( ppd );
+
+ //return 0;
+}
+
+void ShowPopup( HANDLE hContact, const char* line1, const char* line2, int flags )
+{
+ if(CallService(MS_SYSTEM_TERMINATED, 0, 0)) return;
+
+ if ( !ServiceExists( MS_POPUP_ADDPOPUP )) {
+ char title[256];
+ sprintf(title, "%s Message", MODULE);
+
+ if(line1 && line2) {
+ char *message = new char[strlen(line1) + strlen(line2) + 2]; // newline and null terminator
+ sprintf(message, "%s\n%s", line1, line2);
+ MessageBoxA( NULL, message, title, MB_OK | MB_ICONINFORMATION );
+ delete message;
+ } else if(line1) {
+ MessageBoxA( NULL, line1, title, MB_OK | MB_ICONINFORMATION );
+ } else if(line2) {
+ MessageBoxA( NULL, line2, title, MB_OK | MB_ICONINFORMATION );
+ }
+ return;
+ }
+
+ POPUPDATAEX* ppd = ( POPUPDATAEX* )malloc( sizeof( POPUPDATAEX ));
+ memset((void *)ppd, 0, sizeof(POPUPDATAEX));
+
+ ppd->lchContact = hContact;
+
+ HANDLE hMeta = 0;
+ if((hMeta = (HANDLE)CallService(MS_MC_GETMETACONTACT, (WPARAM)hContact, 0)) != 0)
+ ppd->lchContact = hMeta;
+
+ ppd->lchIcon = hPopupIcon;
+
+ if(line1 && line2) {
+ strncpy( ppd->lpzContactName, line1, MAX_CONTACTNAME );
+ strncpy( ppd->lpzText, line2, MAX_SECONDLINE );
+ } else {
+ if(line1) {
+ strncpy( ppd->lpzText, line1, MAX_SECONDLINE );
+ } else {
+ if(line2)
+ strncpy( ppd->lpzText, line2, MAX_SECONDLINE );
+ }
+ }
+
+ if(options.set_colours) {
+ ppd->colorBack = options.bkCol;
+ ppd->colorText = options.textCol;
+ }
+ ppd->iSeconds = options.timeout;
+
+ ppd->PluginWindowProc = ( WNDPROC )NullWindowProc;
+ ppd->PluginData = NULL;
+
+ ppd->PluginData = (void *)hContact;
+
+ QueueUserAPC( sttPopupProc , mainThread, ( ULONG )ppd );
+ //CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sttPopupProc, (LPVOID)ppd, 0, 0));
+}
+
+void ShowPopupW( HANDLE hContact, const wchar_t* line1, const wchar_t* line2, int flags )
+{
+ if(CallService(MS_SYSTEM_TERMINATED, 0, 0)) return;
+
+ if ( !ServiceExists( MS_POPUP_ADDPOPUPW )) {
+ wchar_t title[256];
+ _stprintf(title, _T("%s Message"), _T(MODULE));
+
+ if(line1 && line2) {
+ wchar_t *message = new wchar_t[_tcslen(line1) + _tcslen(line2) + 2]; // newline and null terminator
+ _stprintf(message, _T("%s\n%s"), line1, line2);
+ MessageBoxW( NULL, message, title, MB_OK | MB_ICONINFORMATION );
+ delete message;
+ } else if(line1) {
+ MessageBoxW( NULL, line1, title, MB_OK | MB_ICONINFORMATION );
+ } else if(line2) {
+ MessageBoxW( NULL, line2, title, MB_OK | MB_ICONINFORMATION );
+ }
+ return;
+ }
+
+ POPUPDATAW* ppd = ( POPUPDATAW* )malloc( sizeof( POPUPDATAW ));
+ memset((void *)ppd, 0, sizeof(POPUPDATAW));
+
+ ppd->lchContact = hContact;
+
+ HANDLE hMeta = 0;
+ if((hMeta = (HANDLE)CallService(MS_MC_GETMETACONTACT, (WPARAM)hContact, 0)) != 0)
+ ppd->lchContact = hMeta;
+
+ ppd->lchIcon = hPopupIcon;
+
+ if(line1 && line2) {
+ _tcsncpy( ppd->lpwzContactName, line1, MAX_CONTACTNAME );
+ _tcsncpy( ppd->lpwzText, line2, MAX_SECONDLINE );
+ } else {
+ if(line1) {
+ _tcsncpy( ppd->lpwzText, line1, MAX_SECONDLINE );
+ } else {
+ if(line2)
+ _tcsncpy( ppd->lpwzText, line2, MAX_SECONDLINE );
+ }
+ }
+
+ if(options.set_colours) {
+ ppd->colorBack = options.bkCol;
+ ppd->colorText = options.textCol;
+ }
+ ppd->iSeconds = options.timeout;
+
+ ppd->PluginWindowProc = ( WNDPROC )NullWindowProc;
+ ppd->PluginData = NULL;
+
+ ppd->PluginData = (void *)hContact;
+
+ QueueUserAPC( sttPopupProcW , mainThread, ( ULONG )ppd );
+ //CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sttPopupProcW, (LPVOID)ppd, 0, 0));
+}
+
+void ShowWarning(char *msg) {
+ if(ServiceExists(MS_POPUP_SHOWMESSAGE)) {
+ char message[1024];
+ sprintf(message, "%s: %s", MODULE, msg);
+ PUShowMessage(message, SM_WARNING);
+ } else {
+ char title[512];
+ sprintf(title, "%s Warning", MODULE);
+ MessageBoxA(0, msg, title, MB_OK | MB_ICONWARNING);
+ }
+}
+
+void ShowError(char *msg) {
+ if(ServiceExists(MS_POPUP_SHOWMESSAGE)) {
+ char message[1024];
+ sprintf(message, "%s: %s", MODULE, msg);
+ PUShowMessage(message, SM_WARNING);
+ } else {
+ char title[512];
+ sprintf(title, "%s Error", MODULE);
+ MessageBoxA(0, msg, title, MB_OK | MB_ICONERROR);
+ }
+}
+
+bool IsUnicodePopupsEnabled() {
+ return unicode_enabled;
+}
+
+void InitUtils() {
+ hPopupIcon = LoadSkinnedIcon(SKINICON_EVENT_MESSAGE);
+ unicode_enabled = ServiceExists(MS_POPUP_ADDPOPUPW) ? true : false;
+}
+
+void DeinitUtils() {
+ DestroyIcon(hPopupIcon);
+}
+
|