void CSmileyString::DestroySmileyList() { //ASSERT( plText == NULL ); if (plText == NULL) return; if (IsBadReadPtr(plText, sizeof(SortedList))) { plText = NULL; return; } if (plText->realCount != 0) { for (int i = 0; i < plText->realCount; i++) { if (plText->items[i] != NULL) { ClcContactTextPiece *piece = (ClcContactTextPiece *)plText->items[i]; if (!IsBadWritePtr(piece, sizeof(ClcContactTextPiece))) { if (piece->type == TEXT_PIECE_TYPE_SMILEY && piece->smiley != g_hListeningToIcon) DestroyIcon_protect(piece->smiley); mir_free(piece); } } } List_Destroy(plText); } mir_free(plText); plText = NULL; }
//returns normal icon or combined with status overlay. Needs to be destroyed. HICON cliGetIconFromStatusMode(HANDLE hContact, const char *szProto,int status) { HICON hIcon=NULL; HICON hXIcon=NULL; // check if options is turned on BYTE trayOption=ModernGetSettingByte(NULL,"CLUI","XStatusTray",SETTING_TRAYOPTION_DEFAULT); if (trayOption&3 && szProto!=NULL) { // check service exists char str[MAXMODULELABELLENGTH]; strcpy(str,szProto); strcat(str,"/GetXStatusIcon"); if (ServiceExists(str)) { // check status is online if (status>ID_STATUS_OFFLINE) { // get xicon hXIcon=(HICON)CallService(str,0,0); if (hXIcon) { // check overlay mode if (trayOption&2) { // get overlay HICON MainOverlay=(HICON)GetMainStatusOverlay(status); hIcon=ske_CreateJoinedIcon(hXIcon,MainOverlay,(trayOption&4)?192:0); DestroyIcon_protect(hXIcon); DestroyIcon_protect(MainOverlay); } else { // paint it hIcon=hXIcon; } } } } } if (!hIcon) { hIcon=ske_ImageList_GetIcon(g_himlCListClc,ExtIconFromStatusMode(hContact,szProto,status),ILD_NORMAL); } // if not ready take normal icon return hIcon; }
int static OnIconLibIconChanged(WPARAM wParam,LPARAM lParam) { HICON hicon; CLISTMENUITEM clmi={0}; BOOL needFree; if (MirandaExiting()) return 0; hicon=CLUI_LoadIconFromExternalFile("clisticons.dll",2,TRUE,FALSE,"NewGroup","Contact List","New Group",-IDI_NEWGROUP2,&needFree); NewGroupIconidx=ImageList_ReplaceIcon(hCListImages,NewGroupIconidx,hicon); if (needFree) DestroyIcon_protect(hicon); clmi.cbSize=sizeof(clmi); clmi.flags=CMIM_ICON; clmi.hIcon=ske_ImageList_GetIcon(hCListImages,NewGroupIconidx,0); CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hNewSubGroupMenuItem,(LPARAM)&clmi); CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hNewGroupMenuItem,(LPARAM)&clmi); // return 0; };
void InitSubGroupMenus(void) { CreateServiceFunction("CLISTMENUSSubGroup/ExecService", SubGroupMenuExecService); CreateServiceFunction("CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu", FreeOwnerDataSubGroupMenu); CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuonAddService", SubGroupMenuonAddService); CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuCheckService", SubGroupMenuCheckService); CreateServiceFunction("CLISTMENUSSubGroup/GroupMenuExecProxy", GroupMenuExecProxy); CreateServiceFunction("CList/AddSubGroupMenuItem", AddSubGroupMenuItem); CreateServiceFunction(MS_CLIST_MENUBUILDSUBGROUP, BuildSubGroupMenu); HookEvent(ME_CLIST_PREBUILDSUBGROUPMENU, OnBuildSubGroupMenu); // SubGroup menu hSubGroupMenuObject = MO_CreateMenuObject("SubGroupMenu", LPGEN("Subgroup menu"), 0, "CLISTMENUSSubGroup/ExecService"); MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_USERDEFINEDITEMS, TRUE); MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, "CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu"); MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_MENUOBJECT_SET_ONADD_SERVICE, "CLISTMENUSSubGroup/SubGroupMenuonAddService"); MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_MENUOBJECT_SET_CHECK_SERVICE, "CLISTMENUSSubGroup/SubGroupMenuCheckService"); // add exit command to menu GroupMenuParam gmp; CLISTMENUITEM mi = { sizeof(mi) }; mi.position = 1000; mi.icolibItem = iconItem.hIcolib; mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName = LPGEN("&New subgroup"); gmp.lParam = 0; gmp.wParam = POPUP_NEWSUBGROUP; hNewSubGroupMenuItem = (HGENMENU)AddSubGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); DestroyIcon_protect(mi.hIcon); mi.position = 1001; mi.hIcon = NULL; mi.icolibItem = NULL; mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName = LPGEN("&Hide offline users in here"); gmp.lParam = 0; gmp.wParam = POPUP_GROUPHIDEOFFLINE; hHideOfflineUsersHereMenuItem = (HGENMENU)AddSubGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); mi.position = 1002; mi.hIcon = NULL; mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName = LPGEN("&Show offline users in here"); gmp.lParam = 0; gmp.wParam = POPUP_GROUPSHOWOFFLINE; hShowOfflineUsersHereMenuItem = (HGENMENU)AddSubGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); memset(&mi, 0, sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 900001; mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_RENAME); mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName = LPGEN("&Rename group"); gmp.lParam = 0; gmp.wParam = POPUP_RENAMEGROUP; AddSubGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); mi.position = 900002; mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_DELETE); mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName = LPGEN("&Delete group"); gmp.lParam = 0; gmp.wParam = POPUP_DELETEGROUP; AddSubGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); }
void GroupMenus_Init(void) { Icon_RegisterT(g_hInst, LPGENT("Contact list"), &iconItem, 1); CreateServiceFunction("CLISTMENUSGroup/ExecService", GroupMenuExecService); CreateServiceFunction("CLISTMENUSGroup/FreeOwnerDataGroupMenu", FreeOwnerDataGroupMenu); CreateServiceFunction("CLISTMENUSGroup/GroupMenuonAddService", GroupMenuonAddService); CreateServiceFunction("CLISTMENUSGroup/HideGroupsHelper", HideGroupsHelper); CreateServiceFunction("CLISTMENUSGroup/UseGroupsHelper", UseGroupsHelper); CreateServiceFunction("CLISTMENUSGroup/HideOfflineRootHelper", HideOfflineRootHelper); CreateServiceFunction("CLISTMENUSGroup/CreateGroupHelper", CreateGroupHelper); CreateServiceFunction("CList/AddGroupMenuItem", AddGroupMenuItem); CreateServiceFunction(MS_CLIST_MENUBUILDGROUP, BuildGroupMenu); HookEvent(ME_CLIST_PREBUILDGROUPMENU, OnBuildGroupMenu); InitSubGroupMenus(); // Group menu hGroupMenuObject = MO_CreateMenuObject("GroupMenu", LPGEN("Group menu"), 0, "CLISTMENUSGroup/ExecService"); MO_SetMenuObjectParam(hGroupMenuObject, OPT_USERDEFINEDITEMS, TRUE); MO_SetMenuObjectParam(hGroupMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, "CLISTMENUSGroup/FreeOwnerDataGroupMenu"); MO_SetMenuObjectParam(hGroupMenuObject, OPT_MENUOBJECT_SET_ONADD_SERVICE, "CLISTMENUSGroup/GroupMenuonAddService"); //add exit command to menu GroupMenuParam gmp; CLISTMENUITEM mi = { sizeof(mi) }; mi.position = 1900000; mi.pszService = "CloseAction"; mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_EXIT); mi.pszName = LPGEN("E&xit"); AddGroupMenuItem(0, (LPARAM)&mi); mi.position = 500; mi.pszService = MS_CLIST_SHOWHIDE; mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_SHOWHIDE); mi.pszName = LPGEN("&Hide/show"); hHideShowMainMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); mi.position = 200000; mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_FINDUSER); mi.pszService = "FindAdd/FindAddCommand"; mi.pszName = LPGEN("&Find/add contacts..."); AddGroupMenuItem(0, (LPARAM)&mi); mi.position = 300000; mi.pszService = ""; mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_MAINMENU); // eternity #004 mi.pszName = LPGEN("&Main menu"); hGroupMainMenuItemProxy = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); mi.position = 300100; mi.pszService = ""; mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_STATUS); // eternity #004 mi.pszName = LPGEN("&Status"); hGroupStatusMenuItemProxy = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); mi.position = 400000; mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_OPTIONS); mi.pszService = "Options/OptionsCommand"; mi.pszName = LPGEN("&Options..."); AddGroupMenuItem(0, (LPARAM)&mi); mi.position = 500000; mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_MIRANDA); mi.pszService = "Help/AboutCommand"; mi.pszName = LPGEN("&About"); AddGroupMenuItem(0, (LPARAM)&mi); mi.flags = 0; mi.position = 100000; mi.icolibItem = iconItem.hIcolib; mi.pszService = "CLISTMENUSGroup/CreateGroupHelper"; mi.pszName = LPGEN("&New group"); hNewGroupMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); DestroyIcon_protect(mi.hIcon); mi.position = 100001; mi.hIcon = NULL; mi.icolibItem = NULL; mi.pszService = MS_CLIST_SETHIDEOFFLINE; mi.pszName = LPGEN("&Hide offline users"); gmp.lParam = 0; gmp.wParam = -1; hHideOfflineUsersMenuItem = (HGENMENU)AddGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); mi.position = 100002; mi.pszService = "CLISTMENUSGroup/HideOfflineRootHelper"; mi.pszName = LPGEN("Hide &offline users out here"); hHideOfflineUsersOutHereMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); mi.position = 100003; mi.pszService = "CLISTMENUSGroup/HideGroupsHelper"; mi.pszName = LPGEN("Hide &empty groups"); hHideEmptyGroupsMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); mi.position = 100004; mi.pszService = "CLISTMENUSGroup/UseGroupsHelper"; mi.pszName = LPGEN("Disable &groups"); hDisableGroupsMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); }
void InitSubGroupMenus(void) { TMenuParam tmp; OptParam op; CreateServiceFunction("CLISTMENUSSubGroup/ExecService",SubGroupMenuExecService); CreateServiceFunction("CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu",FreeOwnerDataSubGroupMenu); CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuonAddService",SubGroupMenuonAddService); CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuCheckService",SubGroupMenuCheckService); CreateServiceFunction("CLISTMENUSSubGroup/GroupMenuExecProxy",GroupMenuExecProxy); //CreateServiceFunction("CLISTMENUSSubGroup/HideSubGroupsHelper",HideSubGroupsHelper); //CreateServiceFunction("CLISTMENUSSubGroup/UseSubGroupsHelper",UseSubGroupsHelper); //CreateServiceFunction("CLISTMENUSSubGroup/HideOfflineRootHelper",HideOfflineRootHelper); CreateServiceFunction(MS_CLIST_ADDSUBGROUPMENUITEM,AddSubGroupMenuItem); CreateServiceFunction(MS_CLIST_REMOVESUBGROUPMENUITEM,RemoveSubGroupMenuItem); CreateServiceFunction(MS_CLIST_MENUBUILDSUBGROUP,BuildSubGroupMenu); ModernHookEvent(ME_CLIST_PREBUILDSUBGROUPMENU,OnBuildSubGroupMenu); //SubGroup menu memset(&tmp,0,sizeof(tmp)); tmp.cbSize=sizeof(tmp); tmp.CheckService=NULL; tmp.ExecService="CLISTMENUSSubGroup/ExecService"; tmp.name=LPGEN("SubGroupMenu"); hSubGroupMenuObject=(HANDLE)CallService(MO_CREATENEWMENUOBJECT,(WPARAM)0,(LPARAM)&tmp); op.Handle=hSubGroupMenuObject; op.Setting=OPT_USERDEFINEDITEMS; op.Value=TRUE; CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op); op.Handle=hSubGroupMenuObject; op.Setting=OPT_MENUOBJECT_SET_FREE_SERVICE; op.Value=(INT_PTR)"CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu"; CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op); op.Handle=hSubGroupMenuObject; op.Setting=OPT_MENUOBJECT_SET_ONADD_SERVICE; op.Value=(INT_PTR)"CLISTMENUSSubGroup/SubGroupMenuonAddService"; CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op); op.Handle=hSubGroupMenuObject; op.Setting=OPT_MENUOBJECT_SET_CHECK_SERVICE; op.Value=(INT_PTR)"CLISTMENUSSubGroup/SubGroupMenuCheckService"; CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op); { //add exit command to menu CLISTMENUITEM mi; GroupMenuParam gmp; memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=1000; mi.hIcon=ske_ImageList_GetIcon(hCListImages,NewGroupIconidx,0); mi.pszService="CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName=LPGEN("&New SubGroup"); gmp.lParam=0;gmp.wParam=POPUP_NEWSUBGROUP; hNewSubGroupMenuItem=(HANDLE)AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=1001; mi.hIcon=NULL; mi.pszService="CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName=LPGEN("&Hide Offline Users in here"); gmp.lParam=0; gmp.wParam=POPUP_GROUPHIDEOFFLINE; hHideOfflineUsersHereMenuItem=(HANDLE)AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=1002; mi.hIcon=NULL; mi.pszService="CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName=LPGEN("&Show Offline Users in here"); gmp.lParam=0; gmp.wParam=POPUP_GROUPSHOWOFFLINE; hShowOfflineUsersHereMenuItem=(HANDLE)AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=900001; mi.flags=CMIF_ICONFROMICOLIB; mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_RENAME); mi.pszService="CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName=LPGEN("&Rename Group"); gmp.lParam=0;gmp.wParam=POPUP_RENAMEGROUP; AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=900002; mi.flags=CMIF_ICONFROMICOLIB; mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_DELETE); mi.pszService="CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.pszName=LPGEN("&Delete Group"); gmp.lParam=0;gmp.wParam=POPUP_DELETEGROUP; AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); //MS_CLIST_SubGroupCREATE }; }
void GroupMenus_Init(void) { TMenuParam tmp; OptParam op; HICON hicon; BOOL needFree; hicon=CLUI_LoadIconFromExternalFile("clisticons.dll",2,TRUE,TRUE,"NewGroup","Contact List","New Group",-IDI_NEWGROUP2,&needFree); NewGroupIconidx=hicon?ImageList_AddIcon(hCListImages,hicon ):-1; if (needFree) DestroyIcon_protect(hicon); CreateServiceFunction("CLISTMENUSGroup/ExecService",GroupMenuExecService); CreateServiceFunction("CLISTMENUSGroup/FreeOwnerDataGroupMenu",FreeOwnerDataGroupMenu); CreateServiceFunction("CLISTMENUSGroup/GroupMenuonAddService",GroupMenuonAddService); CreateServiceFunction("CLISTMENUSGroup/HideGroupsHelper",HideGroupsHelper); CreateServiceFunction("CLISTMENUSGroup/UseGroupsHelper",UseGroupsHelper); CreateServiceFunction("CLISTMENUSGroup/HideOfflineRootHelper",HideOfflineRootHelper); CreateServiceFunction(MS_CLIST_ADDGROUPMENUITEM,AddGroupMenuItem); CreateServiceFunction(MS_CLIST_REMOVEGROUPMENUITEM,RemoveGroupMenuItem); CreateServiceFunction(MS_CLIST_MENUBUILDGROUP,BuildGroupMenu); ModernHookEvent(ME_CLIST_PREBUILDGROUPMENU,OnBuildGroupMenu); InitSubGroupMenus(); //Group menu memset(&tmp,0,sizeof(tmp)); tmp.cbSize=sizeof(tmp); tmp.CheckService=NULL; tmp.ExecService="CLISTMENUSGroup/ExecService"; tmp.name=LPGEN("GroupMenu"); hGroupMenuObject=(HANDLE)CallService(MO_CREATENEWMENUOBJECT,(WPARAM)0,(LPARAM)&tmp); op.Handle=hGroupMenuObject; op.Setting=OPT_USERDEFINEDITEMS; op.Value=TRUE; CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op); op.Handle=hGroupMenuObject; op.Setting=OPT_MENUOBJECT_SET_FREE_SERVICE; op.Value=(INT_PTR)"CLISTMENUSGroup/FreeOwnerDataGroupMenu"; CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op); op.Handle=hGroupMenuObject; op.Setting=OPT_MENUOBJECT_SET_ONADD_SERVICE; op.Value=(INT_PTR)"CLISTMENUSGroup/GroupMenuonAddService"; CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op); { //add exit command to menu CLISTMENUITEM mi; GroupMenuParam gmp; memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=1900000; mi.pszService="CloseAction"; mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_EXIT); mi.pszName=LPGEN("E&xit"); mi.flags=CMIF_ICONFROMICOLIB; AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=500; mi.pszService=MS_CLIST_SHOWHIDE; mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_SHOWHIDE); mi.pszName=LPGEN("&Hide/Show"); mi.flags=CMIF_ICONFROMICOLIB; hHideShowMainMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=200000; mi.flags=CMIF_ICONFROMICOLIB; mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_FINDUSER); mi.pszService="FindAdd/FindAddCommand"; mi.pszName=LPGEN("&Find/Add Contacts..."); AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=300000; mi.pszService=""; mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_MAINMENU); // eternity #004 mi.pszName=LPGEN("&Main Menu"); mi.flags=CMIF_ICONFROMICOLIB; // eternity #004 hGroupMainMenuItemProxy=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); // eternity #004 memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=300100; mi.pszService=""; mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_STATUS); // eternity #004 mi.pszName=LPGEN("&Status"); mi.flags=CMIF_ICONFROMICOLIB; // eternity #004 hGroupStatusMenuItemProxy=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); // eternity #004 memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=400000; mi.flags=CMIF_ICONFROMICOLIB; mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_OPTIONS); mi.pszService="Options/OptionsCommand"; mi.pszName=LPGEN("&Options..."); AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=500000; mi.flags=CMIF_ICONFROMICOLIB; mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_MIRANDA); mi.pszService="Help/AboutCommand"; mi.pszName=LPGEN("&About"); AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=100000; mi.hIcon=ske_ImageList_GetIcon(hCListImages,NewGroupIconidx,0); mi.pszService=MS_CLIST_GROUPCREATE; mi.pszName=LPGEN("&New Group"); hNewGroupMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); DestroyIcon_protect(mi.hIcon); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=100001; mi.hIcon=NULL; mi.pszService=MS_CLIST_SETHIDEOFFLINE; mi.pszName=LPGEN("&Hide Offline Users"); gmp.lParam=0;gmp.wParam=-1; hHideOfflineUsersMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=100002; mi.hIcon=NULL; mi.pszService="CLISTMENUSGroup/HideOfflineRootHelper"; mi.pszName=LPGEN("Hide &Offline Users out here"); hHideOfflineUsersOutHereMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=100003; mi.hIcon=NULL; mi.pszService="CLISTMENUSGroup/HideGroupsHelper"; mi.pszName=LPGEN("Hide &Empty Groups"); hHideEmptyGroupsMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize=sizeof(mi); mi.position=100004; mi.hIcon=NULL; mi.pszService="CLISTMENUSGroup/UseGroupsHelper"; mi.pszName=LPGEN("Disable &Groups"); hDisableGroupsMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi); ModernHookEvent(ME_SKIN2_ICONSCHANGED,OnIconLibIconChanged); //MS_CLIST_GROUPCREATE }; }
int ModernDrawStatusBarWorker(HWND hWnd, HDC hDC) { int iconHeight = GetSystemMetrics(SM_CYSMICON)+2; int i; // Count visible protos RECT rc; GetClientRect(hWnd, &rc); if (g_CluiData.fDisableSkinEngine) { if (g_StatusBarData.bkUseWinColors && xpt_IsThemed(g_StatusBarData.hTheme)) xpt_DrawTheme(g_StatusBarData.hTheme, hWnd, hDC, 0, 0, &rc, &rc); else DrawBackGround(hWnd, hDC, g_StatusBarData.hBmpBackground, g_StatusBarData.bkColour, g_StatusBarData.backgroundBmpUse); } else SkinDrawGlyph(hDC, &rc, &rc, "Main,ID=StatusBar"); //TBD g_StatusBarData.nProtosPerLine = db_get_b(NULL, "CLUI", "StatusBarProtosPerLine", SETTING_PROTOSPERLINE_DEFAULT); HFONT hOldFont = g_clcPainter.ChangeToFont(hDC, NULL, FONTID_STATUSBAR_PROTONAME, NULL); SIZE textSize = { 0 }; GetTextExtentPoint32A(hDC, " ", 1, &textSize); int spaceWidth = textSize.cx; int textY = rc.top + ((rc.bottom - rc.top - textSize.cy) >> 1); int iconY = rc.top + ((rc.bottom - rc.top - GetSystemMetrics(SM_CXSMICON)) >> 1); ProtosData.destroy(); int protoCount; PROTOACCOUNT **accs; ProtoEnumAccounts(&protoCount, &accs); if (protoCount == 0) return 0; int iProtoInStatusMenu = 0; for (int j = 0; j < protoCount; j++) { int i = pcli->pfnGetAccountIndexByPos(j); if (i == -1) continue; char *szProto = accs[i]->szModuleName; if (!pcli->pfnGetProtocolVisibility(szProto)) continue; char buf[256]; mir_snprintf(buf, SIZEOF(buf), "SBarAccountIsCustom_%s", szProto); ProtoItemData *p = NULL; if (g_StatusBarData.perProtoConfig && db_get_b(NULL, "CLUI", buf, SETTING_SBARACCOUNTISCUSTOM_DEFAULT)) { mir_snprintf(buf, SIZEOF(buf), "HideAccount_%s", szProto); if (db_get_b(NULL, "CLUI", buf, SETTING_SBARHIDEACCOUNT_DEFAULT)) { iProtoInStatusMenu++; continue; } mir_snprintf(buf, SIZEOF(buf), "SBarShow_%s", szProto); BYTE showOps = db_get_b(NULL, "CLUI", buf, SETTING_SBARSHOW_DEFAULT); p = new ProtoItemData; p->bShowProtoIcon = (showOps & 1) != 0; p->bShowProtoName = (showOps & 2) != 0; p->bShowStatusName = (showOps & 4) != 0; mir_snprintf(buf, SIZEOF(buf), "ShowXStatus_%s", szProto); p->xStatusMode = db_get_b(NULL, "CLUI", buf, SETTING_SBARSHOW_DEFAULT); mir_snprintf(buf, SIZEOF(buf), "UseConnectingIcon_%s", szProto); p->bConnectingIcon = db_get_b(NULL, "CLUI", buf, SETTING_USECONNECTINGICON_DEFAULT) != 0; mir_snprintf(buf, SIZEOF(buf), "ShowUnreadEmails_%s", szProto); p->bShowProtoEmails = db_get_b(NULL, "CLUI", buf, SETTING_SHOWUNREADEMAILS_DEFAULT) != 0; mir_snprintf(buf, SIZEOF(buf), "SBarRightClk_%s", szProto); p->SBarRightClk = db_get_b(NULL, "CLUI", buf, SETTING_SBARRIGHTCLK_DEFAULT) != 0; mir_snprintf(buf, SIZEOF(buf), "PaddingLeft_%s", szProto); p->PaddingLeft = db_get_dw(NULL, "CLUI", buf, SETTING_PADDINGLEFT_DEFAULT); mir_snprintf(buf, SIZEOF(buf), "PaddingRight_%s", szProto); p->PaddingRight = db_get_dw(NULL, "CLUI", buf, SETTING_PADDINGRIGHT_DEFAULT); } else { p = new ProtoItemData; p->bShowProtoIcon = g_StatusBarData.bShowProtoIcon; p->bShowProtoName = g_StatusBarData.bShowProtoName; p->bShowStatusName = g_StatusBarData.bShowStatusName; p->xStatusMode = g_StatusBarData.xStatusMode; p->bConnectingIcon = g_StatusBarData.bConnectingIcon; p->bShowProtoEmails = g_StatusBarData.bShowProtoEmails; p->SBarRightClk = 0; p->PaddingLeft = 0; p->PaddingRight = 0; } p->iProtoStatus = CallProtoService(szProto, PS_GETSTATUS, 0, 0); if (p->iProtoStatus > ID_STATUS_OFFLINE) if (p->bShowProtoEmails == 1 && ProtoServiceExists(szProto, PS_GETUNREADEMAILCOUNT)) { int nEmails = (int)ProtoCallService(szProto, PS_GETUNREADEMAILCOUNT, 0, 0); if (nEmails > 0) { char buf[40]; mir_snprintf(buf, SIZEOF(buf), "[%d]", nEmails); p->szProtoEMailCount = mir_strdup(buf); } } p->tszProtoHumanName = mir_tstrdup(accs[i]->tszAccountName); p->szAccountName = mir_strdup(szProto); p->szProtoName = mir_strdup(accs[i]->szProtoName); p->tszProtoStatusText = mir_tstrdup(pcli->pfnGetStatusModeDescription(p->iProtoStatus, 0)); p->iProtoPos = iProtoInStatusMenu++; p->bIsDimmed = 0; if (g_CluiData.bFilterEffective & CLVM_FILTER_PROTOS) { char szTemp[2048]; mir_snprintf(szTemp, SIZEOF(szTemp), "%s|", p->szAccountName); p->bIsDimmed = strstr(g_CluiData.protoFilter, szTemp) ? 0 : 1; } ProtosData.insert(p); } if (ProtosData.getCount() == 0) return 0; //START MULTILINE HERE int orig_protoCount = protoCount; int orig_visProtoCount = ProtosData.getCount(); int protosperline = 0; if (g_StatusBarData.nProtosPerLine) protosperline = g_StatusBarData.nProtosPerLine; else if (orig_visProtoCount) protosperline = orig_visProtoCount; else if (protoCount) { protosperline = protoCount; orig_visProtoCount = protoCount; } else { protosperline = 1; orig_visProtoCount = 1; } protosperline = min(protosperline, orig_visProtoCount); int linecount = protosperline ? (orig_visProtoCount + (protosperline - 1)) / protosperline : 1; //divide with rounding to up for (int line = 0; line < linecount; line++) { int rowheight = max(textSize.cy + 2, iconHeight); protoCount = min(protosperline, (orig_protoCount - line*protosperline)); int visProtoCount = min(protosperline, (orig_visProtoCount - line*protosperline)); GetClientRect(hWnd, &rc); rc.top += g_StatusBarData.rectBorders.top; rc.bottom -= g_StatusBarData.rectBorders.bottom; int aligndx = 0, maxwidth = 0, xstatus = 0, SumWidth = 0; int height = (rowheight*linecount); if (height > (rc.bottom - rc.top)) { rowheight = (rc.bottom - rc.top) / linecount; height = (rowheight*linecount); } int rowsdy = ((rc.bottom - rc.top) - height) / 2; if (rowheight*(line)+rowsdy < rc.top - rowheight) continue; if (rowheight*(line + 1) + rowsdy>rc.bottom + rowheight) break; if (g_StatusBarData.VAlign == 0) { //top rc.bottom = rc.top + rowheight*(line + 1); rc.top = rc.top + rowheight*line + 1; } else if (g_StatusBarData.VAlign == 1) { //center rc.bottom = rc.top + rowsdy + rowheight*(line + 1); rc.top = rc.top + rowsdy + rowheight*line + 1; } else if (g_StatusBarData.VAlign == 2) { //bottom rc.top = rc.bottom - (rowheight*(linecount - line)); rc.bottom = rc.bottom - (rowheight*(linecount - line - 1) + 1); } textY = rc.top + (((rc.bottom - rc.top) - textSize.cy) / 2); iconY = rc.top + (((rc.bottom - rc.top) - iconHeight) / 2); //Code for each line DWORD sw; int rectwidth = rc.right - rc.left - g_StatusBarData.rectBorders.left - g_StatusBarData.rectBorders.right; if (visProtoCount > 1) sw = (rectwidth - (g_StatusBarData.extraspace*(visProtoCount - 1))) / visProtoCount; else sw = rectwidth; int *ProtoWidth = (int*)mir_alloc(sizeof(int)*visProtoCount); for (i = 0; i < visProtoCount; i++) { ProtoItemData &p = ProtosData[line*protosperline + i]; DWORD w = p.PaddingLeft; w += p.PaddingRight; if (p.bShowProtoIcon) { w += GetSystemMetrics(SM_CXSMICON) + 1; p.extraIcon = NULL; if ((p.xStatusMode & 8) && p.iProtoStatus > ID_STATUS_OFFLINE) { TCHAR str[512]; CUSTOM_STATUS cs = { sizeof(cs) }; cs.flags = CSSF_MASK_NAME | CSSF_TCHAR; cs.ptszName = str; if (CallProtoService(p.szAccountName, PS_GETCUSTOMSTATUSEX, 0, (LPARAM)&cs) == 0) p.tszProtoXStatus = mir_tstrdup(str); } if ((p.xStatusMode & 3)) { if (p.iProtoStatus > ID_STATUS_OFFLINE) { if (ProtoServiceExists(p.szAccountName, PS_GETCUSTOMSTATUSICON)) p.extraIcon = (HICON)ProtoCallService(p.szAccountName, PS_GETCUSTOMSTATUSICON, 0, 0); if (p.extraIcon && (p.xStatusMode & 3) == 3) w += GetSystemMetrics(SM_CXSMICON) + 1; } } } SIZE textSize; if (p.bShowProtoName) { GetTextExtentPoint32(hDC, p.tszProtoHumanName, lstrlen(p.tszProtoHumanName), &textSize); w += textSize.cx + 3 + spaceWidth; } if (p.bShowProtoEmails && p.szProtoEMailCount) { GetTextExtentPoint32A(hDC, p.szProtoEMailCount, lstrlenA(p.szProtoEMailCount), &textSize); w += textSize.cx + 3 + spaceWidth; } if (p.bShowStatusName) { GetTextExtentPoint32(hDC, p.tszProtoStatusText, lstrlen(p.tszProtoStatusText), &textSize); w += textSize.cx + 3 + spaceWidth; } if ((p.xStatusMode & 8) && p.tszProtoXStatus) { GetTextExtentPoint32(hDC, p.tszProtoXStatus, lstrlen(p.tszProtoXStatus), &textSize); w += textSize.cx + 3 + spaceWidth; } if (p.bShowProtoName || (p.bShowProtoEmails && p.szProtoEMailCount) || p.bShowStatusName || ((p.xStatusMode & 8) && p.tszProtoXStatus)) w -= spaceWidth; p.fullWidth = w; if (g_StatusBarData.sameWidth) { ProtoWidth[i] = sw; SumWidth += w; } else { ProtoWidth[i] = w; SumWidth += w; } } // Reposition rects for (i = 0; i < visProtoCount; i++) if (ProtoWidth[i] > maxwidth) maxwidth = ProtoWidth[i]; if (g_StatusBarData.sameWidth) { for (i = 0; i < visProtoCount; i++) ProtoWidth[i] = maxwidth; SumWidth = maxwidth * visProtoCount; } SumWidth += (visProtoCount - 1) * (g_StatusBarData.extraspace + 1); if (SumWidth > rectwidth) { float f = (float)rectwidth / SumWidth; SumWidth = 0; for (i = 0; i < visProtoCount; i++) { ProtoWidth[i] = (int)((float)ProtoWidth[i] * f); SumWidth += ProtoWidth[i]; } SumWidth += (visProtoCount - 1)*(g_StatusBarData.extraspace + 1); } if (g_StatusBarData.Align == 1) //center aligndx = (rectwidth - SumWidth) >> 1; else if (g_StatusBarData.Align == 2) //right aligndx = (rectwidth - SumWidth); // Draw in rects RECT r = rc; r.left += g_StatusBarData.rectBorders.left + aligndx; for (i = 0; i < visProtoCount; i++) { ProtoItemData& p = ProtosData[line*protosperline + i]; HRGN rgn; HICON hIcon = NULL; HICON hxIcon = NULL; BOOL NeedDestroy = FALSE; int x = r.left; x += p.PaddingLeft; r.right = r.left + ProtoWidth[i]; if (p.bShowProtoIcon) { if (p.iProtoStatus > ID_STATUS_OFFLINE && (p.xStatusMode & 3) > 0) { if (ProtoServiceExists(p.szAccountName, PS_GETCUSTOMSTATUSICON)) { hxIcon = p.extraIcon; if (hxIcon) { if ((p.xStatusMode & 3) == 2) { hIcon = GetMainStatusOverlay(p.iProtoStatus); NeedDestroy = TRUE; } else if ((p.xStatusMode & 3) == 1) { hIcon = hxIcon; NeedDestroy = TRUE; hxIcon = NULL; } } } } if (hIcon == NULL && (hxIcon == NULL || ((p.xStatusMode & 3) == 3))) { if ((p.bConnectingIcon == 1) && p.iProtoStatus >= ID_STATUS_CONNECTING && p.iProtoStatus <= ID_STATUS_CONNECTING + MAX_CONNECT_RETRIES) { hIcon = (HICON)CLUI_GetConnectingIconService((WPARAM)p.szAccountName, 0); if (hIcon) NeedDestroy = TRUE; else hIcon = LoadSkinnedProtoIcon(p.szAccountName, p.iProtoStatus); } else hIcon = LoadSkinnedProtoIcon(p.szAccountName, p.iProtoStatus); } rgn = CreateRectRgn(r.left, r.top, r.right, r.bottom); if (g_StatusBarData.sameWidth) { int fw = p.fullWidth; int rw = r.right - r.left; if (g_StatusBarData.Align == 1) x = r.left + ((rw - fw) / 2); else if (g_StatusBarData.Align == 2) x = r.left + ((rw - fw)); else x = r.left; } SelectClipRgn(hDC, rgn); p.bDoubleIcons = false; DWORD dim = p.bIsDimmed ? ((64 << 24) | 0x80) : 0; if ((p.xStatusMode & 3) == 3) { if (hIcon) mod_DrawIconEx_helper(hDC, x, iconY, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL | dim); if (hxIcon) { mod_DrawIconEx_helper(hDC, x + GetSystemMetrics(SM_CXSMICON) + 1, iconY, hxIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL | dim); x += GetSystemMetrics(SM_CXSMICON) + 1; } p.bDoubleIcons = hIcon && hxIcon; } else { if (hxIcon) mod_DrawIconEx_helper(hDC, x, iconY, hxIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL | dim); if (hIcon) mod_DrawIconEx_helper(hDC, x, iconY, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL | ((hxIcon && (p.xStatusMode & 4)) ? (192 << 24) : 0) | dim); } if (hxIcon || hIcon) { /* TODO g_StatusBarData.bDrawLockOverlay options to draw locked proto*/ if (db_get_b(NULL, p.szAccountName, "LockMainStatus", 0)) { HICON hLockOverlay = LoadSkinnedIcon(SKINICON_OTHER_STATUS_LOCKED); if (hLockOverlay != NULL) { mod_DrawIconEx_helper(hDC, x, iconY, hLockOverlay, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL | dim); Skin_ReleaseIcon(hLockOverlay); } } } if (hxIcon) DestroyIcon_protect(hxIcon); if (NeedDestroy) DestroyIcon_protect(hIcon); else Skin_ReleaseIcon(hIcon); x += GetSystemMetrics(SM_CXSMICON) + 1; } if (p.bShowProtoName) { SIZE textSize; RECT rt = r; rt.left = x + (spaceWidth >> 1); rt.top = textY; ske_DrawText(hDC, p.tszProtoHumanName, lstrlen(p.tszProtoHumanName), &rt, 0); if ((p.bShowProtoEmails && p.szProtoEMailCount != NULL) || p.bShowStatusName || ((p.xStatusMode & 8) && p.tszProtoXStatus)) { GetTextExtentPoint32(hDC, p.tszProtoHumanName, lstrlen(p.tszProtoHumanName), &textSize); x += textSize.cx + 3; } } if (p.bShowProtoEmails && p.szProtoEMailCount != NULL) { SIZE textSize; RECT rt = r; rt.left = x + (spaceWidth >> 1); rt.top = textY; ske_DrawTextA(hDC, p.szProtoEMailCount, lstrlenA(p.szProtoEMailCount), &rt, 0); if (p.bShowStatusName || ((p.xStatusMode & 8) && p.tszProtoXStatus)) { GetTextExtentPoint32A(hDC, p.szProtoEMailCount, lstrlenA(p.szProtoEMailCount), &textSize); x += textSize.cx + 3; } }
void ExtraImage_ReloadExtraIcons() { int count,i; PROTOACCOUNT **accs; HICON hicon; BOOL needFree; SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNSSPACE,ModernGetSettingByte(NULL,"CLUI","ExtraColumnSpace",18),0); SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGELIST,0,(LPARAM)NULL); if (hExtraImageList){ImageList_Destroy(hExtraImageList);}; if (hWideExtraImageList){ImageList_Destroy(hWideExtraImageList);}; hExtraImageList=ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR32|ILC_MASK,1,256); hWideExtraImageList=ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR32|ILC_MASK,1,256); if (!HasExtraIconsService()) { HICON hIcon; //loading icons hIcon = LoadSkinnedIcon(SKINICON_OTHER_SENDEMAIL); ExtraImageIconsIndex[0]=ImageList_AddIcon(hExtraImageList, hIcon); CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); hIcon = LoadSkinnedIcon(SKINICON_OTHER_SMS); ExtraImageIconsIndex[1]=ImageList_AddIcon(hExtraImageList, hIcon); CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); hIcon = LoadSkinnedIcon(SKINICON_EVENT_URL); ExtraImageIconsIndex[2]=ImageList_AddIcon(hExtraImageList, hIcon); CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); //calc only needed protocols //adding protocol icons ProtoEnumAccounts( &count, &accs ); for(i=0;i<count;i++) { if (!IsAccountEnabled(accs[i]) || CallProtoService(accs[i]->szModuleName, PS_GETCAPS,PFLAGNUM_2, 0 )== 0) continue; hIcon = LoadSkinnedProtoIcon(accs[i]->szModuleName,ID_STATUS_ONLINE); ImageList_AddIcon(hExtraImageList, hIcon); CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); } hicon=CLUI_LoadIconFromExternalFile("clisticons.dll",5,TRUE,TRUE,"AlwaysVis","Contact List",Translate("Always Visible"),-IDI_ALWAYSVIS,&needFree); if (!hicon) {hicon=LoadSmallIcon(g_hInst, MAKEINTRESOURCE(IDI_ALWAYSVIS));needFree=TRUE;} ExtraImageIconsIndex[3]=ImageList_AddIcon(hExtraImageList,hicon ); if (needFree) DestroyIcon_protect(hicon); hicon=CLUI_LoadIconFromExternalFile("clisticons.dll",6,TRUE,TRUE,"NeverVis","Contact List",Translate("Never Visible"),-IDI_NEVERVIS,&needFree); if (!hicon) {hicon=LoadSmallIcon(g_hInst, MAKEINTRESOURCE(IDI_NEVERVIS));needFree=TRUE;} ExtraImageIconsIndex[4]=ImageList_AddIcon(hExtraImageList,hicon ); if (needFree) DestroyIcon_protect(hicon); hicon=CLUI_LoadIconFromExternalFile("clisticons.dll",7,TRUE,TRUE,"ChatActivity","Contact List",Translate("Chat Activity"),-IDI_CHAT,&needFree); if (!hicon) {hicon=LoadSmallIcon(g_hInst, MAKEINTRESOURCE(IDI_CHAT));needFree=TRUE;} ExtraImageIconsIndex[5]=ImageList_AddIcon(hExtraImageList,hicon ); if (needFree) DestroyIcon_protect(hicon); } SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGELIST,(WPARAM)hWideExtraImageList,(LPARAM)hExtraImageList); //ExtraImage_SetAllExtraIcons(hImgList); SetNewExtraColumnCount(); NotifyEventHooks(g_CluiData.hEventExtraImageListRebuilding,0,0); ImageCreated=TRUE; }