diff options
Diffstat (limited to 'plugins/MsgPopup/src')
-rw-r--r-- | plugins/MsgPopup/src/common.h | 52 | ||||
-rw-r--r-- | plugins/MsgPopup/src/main.cpp | 258 | ||||
-rw-r--r-- | plugins/MsgPopup/src/options.cpp | 131 | ||||
-rw-r--r-- | plugins/MsgPopup/src/options.h | 22 | ||||
-rw-r--r-- | plugins/MsgPopup/src/resource.h | 34 |
5 files changed, 497 insertions, 0 deletions
diff --git a/plugins/MsgPopup/src/common.h b/plugins/MsgPopup/src/common.h new file mode 100644 index 0000000000..fbff74293b --- /dev/null +++ b/plugins/MsgPopup/src/common.h @@ -0,0 +1,52 @@ +/*
+
+MessagePopup - replacer of MessageBox'es
+
+Copyright 2004 Denis Stanishevskiy
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#include <windows.h>
+#include <tlhelp32.h>
+#include <dbghelp.h>
+
+#include "newpluginapi.h"
+#include "m_system.h"
+#include "m_database.h"
+#include "m_langpack.h"
+#include "m_clist.h"
+#include "m_options.h"
+#include "m_utils.h"
+#include "m_popup.h"
+
+#include "options.h"
+#include "resource.h"
+
+#define SERVICENAME "MessagePopup"
+
+struct MSGBOXOPTIONS
+{
+ COLORREF FG[4];
+ COLORREF BG[4];
+ int Timeout[4];
+ BOOL Sound;
+};
+
+extern MSGBOXOPTIONS options;
+extern MSGBOXOPTIONS optionsDefault;
+
+void LoadConfig();
diff --git a/plugins/MsgPopup/src/main.cpp b/plugins/MsgPopup/src/main.cpp new file mode 100644 index 0000000000..bed3764b52 --- /dev/null +++ b/plugins/MsgPopup/src/main.cpp @@ -0,0 +1,258 @@ +/*
+
+MessagePopup - replacer of MessageBox'es
+
+Copyright 2004 Denis Stanishevskiy
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+#include "common.h"
+
+HINSTANCE hInst;
+int hLangpack;
+
+MSGBOXOPTIONS optionsDefault =
+{
+ {0, 0xFFFFFF, 0, 0},
+ {0xBFFFFF, 0x0000FF, 0xB0B0FF, 0xECFF93},
+ {-1,-1,-1,-1},
+ TRUE
+};
+MSGBOXOPTIONS options;
+
+PLUGININFOEX pluginInfo={
+ sizeof(PLUGININFOEX),
+ SERVICENAME,
+ PLUGIN_MAKE_VERSION( 0,0,0,1 ),
+ "This stuff will replace MessageBox'es [whose have only OK button] into Popups",
+ "Denis Stanishevskiy // StDenis",
+ "stdenformiranda(at)fromru(dot)com",
+ "Copyright (c) 2004, Denis Stanishevskiy",
+ "",
+ 0, 0
+};
+
+typedef int (WINAPI *MSGBOXPROC)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
+
+MSGBOXPROC prevMessageBoxA;
+
+#define OIC_HAND 32513
+#define OIC_QUES 32514
+#define OIC_BANG 32515
+#define OIC_NOTE 32516
+
+void popupMessage(LPCSTR lpText, LPCSTR lpCaption, UINT uType)
+{
+ POPUPDATAT ppd = {0};
+ int iIcon;
+ int indx;
+
+ switch(uType & 0xF0)
+ {
+ case MB_ICONHAND:
+ indx = 1;
+ iIcon = OIC_HAND;
+ break;
+ case MB_ICONEXCLAMATION:
+ indx = 2;
+ iIcon = OIC_BANG;
+ break;
+ case MB_ICONQUESTION:
+ indx = 3;
+ iIcon = OIC_QUES;
+ break;
+ default:
+ indx = 0;
+ iIcon = OIC_NOTE;
+ break;
+
+ }
+ ppd.colorBack = options.BG[indx];
+ ppd.colorText = options.FG[indx];
+ ppd.iSeconds = options.Timeout[indx];
+
+ ppd.lchIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(iIcon), IMAGE_ICON, SM_CXSMICON, SM_CYSMICON, LR_SHARED);
+ lstrcpy(ppd.lpzContactName, lpCaption);
+ lstrcpy(ppd.lpzText, lpText);
+ PUAddPopUpT(&ppd);
+ if(options.Sound)
+ MessageBeep(uType);
+}
+
+int WINAPI newMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
+{
+ if(CallService(MS_POPUP_QUERY, PUQS_GETSTATUS, 0) == CALLSERVICE_NOTFOUND || (uType & 0x0F))
+ return prevMessageBoxA(hWnd, lpText, lpCaption, uType);
+
+ popupMessage(lpText, lpCaption,uType);
+ return IDOK;
+}
+
+BOOL g_HookError = FALSE;
+BOOL g_HookError2 = FALSE;
+int g_mod = 0;
+
+void HookOnImport(HMODULE hModule, char *lpszImpModName, DWORD lpOrigFunc, DWORD lpNewFunc)
+{
+ ULONG ulSize;
+ PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(
+ hModule,
+ TRUE,
+ IMAGE_DIRECTORY_ENTRY_IMPORT,
+ &ulSize);
+ if(pImportDesc == NULL) return;
+
+ for(; pImportDesc->Name; pImportDesc++)
+ {
+ char *pszModName = (char *)((PBYTE)hModule + pImportDesc->Name);
+
+ if (lstrcmpiA(lpszImpModName, pszModName) == 0)
+ {
+ PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)((PBYTE)hModule + pImportDesc->FirstThunk);
+
+ for (; pThunk->u1.Function; pThunk++)
+ {
+ DWORD* ppfn = (DWORD*) &pThunk->u1.Function;
+
+ if(*ppfn == lpOrigFunc)
+ {
+ DWORD oldProtect;
+
+ g_mod++;
+
+ if(!VirtualProtect((LPVOID)ppfn, 4, PAGE_EXECUTE_READWRITE, &oldProtect))
+ {
+ if(!g_HookError)
+ {
+ char buf[200];
+
+ g_HookError = TRUE;
+ wsprintf(buf, "VirtualProtect failed. Code %d\n"
+ "Try to call the author", GetLastError());
+ prevMessageBoxA(0, buf, "MsgBox", MB_OK);
+ }
+ }
+ *(DWORD*)ppfn = lpNewFunc;
+ if(*(DWORD*)ppfn != lpNewFunc)
+ {
+ if(!g_HookError2)
+ {
+ g_HookError2 = TRUE;
+ prevMessageBoxA(0, "Hmm. Something goes wrong. I can't write into the memory.\n"
+ "And as u can c, there are no any exception raised..\n"
+ "Try to call the author", "MsgBox", MB_OK);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void HookAPI()
+{
+ DWORD lpMessageBox = (DWORD)GetProcAddress(GetModuleHandle("USER32.DLL"), "MessageBoxA");
+ DWORD lpPopupMsgBox = (DWORD)newMessageBoxA;
+
+ prevMessageBoxA = (MSGBOXPROC)lpMessageBox;
+
+ BOOL bFound = FALSE;
+ HANDLE hModuleSnap = NULL;
+ MODULEENTRY32 me32 = {0};
+
+ hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
+ if(hModuleSnap == INVALID_HANDLE_VALUE)
+ return;
+
+ me32.dwSize = sizeof(MODULEENTRY32);
+ if(Module32First(hModuleSnap, &me32))
+ {
+ do
+ {
+ HookOnImport(me32.hModule, "USER32.DLL", lpMessageBox, lpPopupMsgBox);
+ }
+ while (!bFound && Module32Next(hModuleSnap, &me32));
+ }
+ CloseHandle (hModuleSnap);
+
+ return;
+}
+
+int HookedInit(WPARAM wParam, LPARAM lParam)
+{
+ HookAPI();
+
+ return 0;
+}
+
+int HookedOptions(WPARAM wParam, LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp = {0};
+ odp.cbSize = sizeof(odp);
+ odp.hInstance = hInst;
+ odp.pszTemplate = MAKEINTRESOURCE(IDD_OPTIONS);
+ odp.ptszTitle = LPGENT("MessagePopup");
+ odp.ptszGroup = LPGENT("Popups");
+ odp.flags = ODPF_BOLDGROUPS | ODPF_TCHAR;
+ odp.pfnDlgProc = OptionsDlgProc;
+ Options_AddPage(wParam, &odp);
+
+ return 0;
+}
+
+void LoadConfig()
+{
+ char *szNameFG = "FGx";
+ char *szNameBG = "BGx";
+ char *szNameTO = "TOx";
+ int indx;
+
+ for(indx = 0; indx < 4; indx++)
+ {
+ szNameFG[2] = szNameBG[2] = szNameTO[2] = (char)(indx + '0');
+ options.FG[indx] = DBGetContactSettingDword(NULL, SERVICENAME, szNameFG, optionsDefault.FG[indx]);
+ options.BG[indx] = DBGetContactSettingDword(NULL, SERVICENAME, szNameBG, optionsDefault.BG[indx]);
+ options.Timeout[indx] = DBGetContactSettingDword(NULL, SERVICENAME, szNameTO, (DWORD)optionsDefault.Timeout[indx]);
+ }
+ options.Sound = DBGetContactSettingByte(NULL, SERVICENAME, "Sound", (DWORD)optionsDefault.Sound);
+
+}
+extern "C" __declspec(dllexport) int Load(void)
+{
+ mir_getLP(&pluginInfo);
+ HookEvent(ME_SYSTEM_MODULESLOADED, HookedInit);
+ HookEvent(ME_OPT_INITIALISE, HookedOptions);
+
+ LoadConfig();
+
+ return 0;
+}
+
+extern "C" __declspec(dllexport) int Unload(void)
+{
+ return 0;
+}
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ return &pluginInfo;
+}
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+ hInst = hinstDLL;
+ return TRUE;
+}
diff --git a/plugins/MsgPopup/src/options.cpp b/plugins/MsgPopup/src/options.cpp new file mode 100644 index 0000000000..b5467dcbe5 --- /dev/null +++ b/plugins/MsgPopup/src/options.cpp @@ -0,0 +1,131 @@ +/*
+
+MessagePopup - replacer of MessageBox'es
+
+Copyright 2004 Denis Stanishevskiy
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+#include "common.h"
+
+int idOptionControls[4][3] = {
+ IDC_ASTERISK_FG,IDC_ASTERISK_BG,IDC_TIMEOUT1,
+ IDC_ERROR_FG,IDC_ERROR_BG,IDC_TIMEOUT2,
+ IDC_EXCLAMATION_FG,IDC_EXCLAMATION_BG,IDC_TIMEOUT3,
+ IDC_QUESTION_FG,IDC_QUESTION_BG,IDC_TIMEOUT4
+};
+
+static int __inline DBWriteContactSettingDwordDef(HANDLE hContact,const char *szModule,const char *szSetting,DWORD val, DWORD defValue)
+{
+ if(val == DBGetContactSettingDword(hContact, szModule, szSetting, defValue))
+ return 0;
+ else
+ return DBWriteContactSettingDword(hContact, szModule, szSetting, val);
+}
+
+INT_PTR CALLBACK OptionsDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ {
+ int indx;
+
+ TranslateDialogDefault(hWnd);
+ for(indx = 0; indx < 4; indx++)
+ {
+ SendDlgItemMessage(hWnd, idOptionControls[indx][0], CPM_SETCOLOUR, 0, options.FG[indx]);
+ SendDlgItemMessage(hWnd, idOptionControls[indx][1], CPM_SETCOLOUR, 0, options.BG[indx]);
+ SetDlgItemInt(hWnd, idOptionControls[indx][2], options.Timeout[indx], TRUE);
+ }
+ CheckDlgButton(hWnd, IDC_MESSAGEBEEP, options.Sound?BST_CHECKED:BST_UNCHECKED);
+ return TRUE;
+ }
+ case WM_COMMAND:
+ {
+ int indx, value;
+ BOOL Translated;
+ if(LOWORD(wParam) == IDC_PREVIEW)
+ {
+ MessageBoxA(0, Translate("Message with question"), Translate(SERVICENAME " - demo"), MB_ICONQUESTION);
+ MessageBoxA(0, Translate("Message with exclamation"), Translate(SERVICENAME " - demo"), MB_ICONEXCLAMATION);
+ MessageBoxA(0, Translate("Message with error"), Translate(SERVICENAME " - demo"), MB_ICONSTOP);
+ MessageBoxA(0, Translate("Message with asterisk"), Translate(SERVICENAME " - demo"), MB_ICONASTERISK);
+
+ return FALSE;
+ }
+ if(LOWORD(wParam) == IDC_MESSAGEBEEP)
+ {
+ options.Sound = IsDlgButtonChecked(hWnd, IDC_MESSAGEBEEP) == BST_CHECKED;
+ }
+ else
+ for(indx = 0; indx < 4; indx++)
+ {
+ if(LOWORD(wParam) == idOptionControls[indx][0])
+ {
+ if(HIWORD(wParam) != CPN_COLOURCHANGED) return FALSE;
+ options.FG[indx] = SendDlgItemMessage(hWnd, LOWORD(wParam), CPM_GETCOLOUR, 0, 0);
+ }
+ else
+ if(LOWORD(wParam) == idOptionControls[indx][1])
+ {
+ if(HIWORD(wParam) != CPN_COLOURCHANGED) return FALSE;
+ options.BG[indx] = SendDlgItemMessage(hWnd, LOWORD(wParam), CPM_GETCOLOUR, 0, 0);
+ }
+ else
+ if(LOWORD(wParam) == idOptionControls[indx][2])
+ {
+ if(HIWORD(wParam) != EN_CHANGE) return FALSE;
+ if((HWND)lParam != GetFocus()) return FALSE;
+
+ value = (DWORD)GetDlgItemInt(hWnd, LOWORD(wParam), &Translated, TRUE);
+ if(Translated) options.Timeout[indx] = value;
+ }
+ }
+ SendMessage(GetParent(hWnd), PSM_CHANGED, 0,0);
+ break;
+ }
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_RESET:
+ LoadConfig();
+ return FALSE;
+
+ case PSN_APPLY:
+ {
+ char *szNameFG = "FGx";
+ char *szNameBG = "BGx";
+ char *szNameTO = "TOx";
+ int indx;
+
+ for(indx = 0; indx < 4; indx++)
+ {
+ szNameFG[2] = szNameBG[2] = szNameTO[2] = (char)(indx + '0');
+
+ DBWriteContactSettingDwordDef(NULL, SERVICENAME, szNameFG, options.FG[indx], optionsDefault.FG[indx]);
+ DBWriteContactSettingDwordDef(NULL, SERVICENAME, szNameBG, options.BG[indx], optionsDefault.BG[indx]);
+ DBWriteContactSettingDwordDef(NULL, SERVICENAME, szNameTO, options.Timeout[indx], (DWORD)optionsDefault.Timeout[indx]);
+ }
+ DBWriteContactSettingDwordDef(NULL,SERVICENAME,"Sound",options.Sound,optionsDefault.Sound);
+
+ break;
+ }
+ }
+ break;
+ }
+ return FALSE;
+}
diff --git a/plugins/MsgPopup/src/options.h b/plugins/MsgPopup/src/options.h new file mode 100644 index 0000000000..07f81f28d9 --- /dev/null +++ b/plugins/MsgPopup/src/options.h @@ -0,0 +1,22 @@ +/*
+
+MessagePopup - replacer of MessageBox'es
+
+Copyright 2004 Denis Stanishevskiy
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+INT_PTR CALLBACK OptionsDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
diff --git a/plugins/MsgPopup/src/resource.h b/plugins/MsgPopup/src/resource.h new file mode 100644 index 0000000000..27e128723b --- /dev/null +++ b/plugins/MsgPopup/src/resource.h @@ -0,0 +1,34 @@ +//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by MsgBox.rc
+//
+#define IDD_OPTIONS 101
+
+#define IDC_ASTERISK_BG 101
+#define IDC_ERROR_FG 102
+#define IDC_ERROR_BG 103
+#define IDC_EXCLAMATION_FG 104
+#define IDC_EXCLAMATION_BG 105
+#define IDC_QUESTION_FG 106
+#define IDC_QUESTION_BG 107
+#define IDC_ASTERISK_FG 108
+#define IDC_PREVIEW 109
+
+#define IDC_TIMEOUT1 1000
+#define IDC_TIMEOUT2 1001
+#define IDC_TIMEOUT3 1002
+#define IDC_TIMEOUT4 1003
+
+#define IDC_MESSAGEBEEP 1004
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NO_MFC 1
+#define _APS_NEXT_RESOURCE_VALUE 135
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1004
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
|