summaryrefslogtreecommitdiff
path: root/yapp/services.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'yapp/services.cpp')
-rw-r--r--yapp/services.cpp81
1 files changed, 80 insertions, 1 deletions
diff --git a/yapp/services.cpp b/yapp/services.cpp
index 046a104..3708a35 100644
--- a/yapp/services.cpp
+++ b/yapp/services.cpp
@@ -7,7 +7,7 @@
#include <time.h>
#include "str_utils.h"
-#define NUM_SERVICES 13
+#define NUM_SERVICES 16
HANDLE hService[NUM_SERVICES];
HANDLE hMenuShowHistory, hMenuToggleOnOff;
@@ -322,6 +322,76 @@ int PopUp_ShowHistory(WPARAM wParam, LPARAM lParam)
return 0;
}
+int num_classes = 0;
+POPUPCLASS *classes = 0;
+
+int RegisterPopupClass(WPARAM wParam, LPARAM lParam) {
+ POPUPCLASS *pc = (POPUPCLASS *)lParam;
+ pc->pszName = strdup(pc->pszName);
+ if(pc->flags & PCF_UNICODE)
+ pc->pwszDescription = wcsdup(pc->pwszDescription);
+ else
+ pc->pszDescription = strdup(pc->pszDescription);
+
+ char setting[256];
+ mir_snprintf(setting, 256, "%s/Timeout", pc->pszName);
+ pc->iSeconds = DBGetContactSettingWord(0, MODULE, setting, pc->iSeconds);
+ if(pc->iSeconds == (WORD)-1) pc->iSeconds = -1;
+ mir_snprintf(setting, 256, "%s/TextCol", pc->pszName);
+ pc->colorText = (COLORREF)DBGetContactSettingDword(0, MODULE, setting, (DWORD)pc->colorText);
+ mir_snprintf(setting, 256, "%s/BgCol", pc->pszName);
+ pc->colorBack = (COLORREF)DBGetContactSettingDword(0, MODULE, setting, (DWORD)pc->colorBack);
+
+ classes = (POPUPCLASS *)realloc(classes, sizeof(POPUPCLASS) * (num_classes + 1));
+ memcpy(classes + num_classes, pc, sizeof(POPUPCLASS));
+ num_classes++;
+ return 0;
+}
+
+int CreateClassPopup(WPARAM wParam, LPARAM lParam) {
+ POPUPDATACLASS *pdc = (POPUPDATACLASS *)lParam;
+ POPUPCLASS *pc = 0;
+ if(wParam) pc = (POPUPCLASS *)wParam;
+ else {
+ for(int i = 0; i < num_classes; i++) {
+ if(strcmp(classes[i].pszName, pdc->pszClassName) == 0) {
+ pc = &classes[i];
+ break;
+ }
+ }
+ }
+ if(pc) {
+ if(pc->flags & PCF_UNICODE) {
+ POPUPDATAW pdw = {0};
+ pdw.colorBack = pc->colorBack;
+ pdw.colorText = pc->colorText;
+ pdw.lchIcon = pc->hIcon;
+ pdw.iSeconds = pc->iSeconds;
+ pdw.PluginWindowProc = pc->PluginWindowProc;
+
+ pdw.PluginData = pdc->PluginData;
+ wcsncpy(pdw.lpwzContactName, pdc->pwszTitle, MAX_CONTACTNAME);
+ wcsncpy(pdw.lpwzText, pdc->pwszText, MAX_SECONDLINE);
+
+ CallService(MS_POPUP_ADDPOPUPW, (WPARAM)&pdw, 0);
+ } else {
+ POPUPDATAEX pd = {0};
+ pd.colorBack = pc->colorBack;
+ pd.colorText = pc->colorText;
+ pd.lchIcon = pc->hIcon;
+ pd.iSeconds = pc->iSeconds;
+ pd.PluginWindowProc = pc->PluginWindowProc;
+
+ pd.PluginData = pdc->PluginData;
+ strncpy(pd.lpzContactName, pdc->pszTitle, MAX_CONTACTNAME);
+ strncpy(pd.lpzText, pdc->pszText, MAX_SECONDLINE);
+
+ CallService(MS_POPUP_ADDPOPUP, (WPARAM)&pd, 0);
+ }
+ }
+ return 0;
+}
+
int PrebuildMenu(WPARAM wParam, LPARAM lParam) {
return 0;
}
@@ -347,6 +417,9 @@ void InitServices() {
hService[i++] = CreateServiceFunction(MS_POPUP_SHOWHISTORY, PopUp_ShowHistory);
hService[i++] = CreateServiceFunction("PopUp/ToggleEnabled", TogglePopups);
+ hService[i++] = CreateServiceFunction(MS_POPUP_REGISTERCLASS, RegisterPopupClass);
+ hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUPCLASS, CreateClassPopup);
+
CLISTMENUITEM menu = {0};
menu.cbSize=sizeof(menu);
@@ -374,6 +447,12 @@ void InitServices() {
}
void DeinitServices() {
+ for(int i = 0; i < num_classes; i++) {
+ free(classes[i].pszName);
+ free(classes[i].pszDescription);
+ }
+ free(classes); num_classes = 0;
+
UnhookEvent(hEventBuildMenu);
for(int i = 0; i < NUM_SERVICES; i++)