diff options
Diffstat (limited to 'yapp/services.cpp')
-rw-r--r-- | yapp/services.cpp | 81 |
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++) |