From d7f143dba9e53347a1d7897bcd3989751c7f45f8 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Wed, 4 Jul 2012 19:11:17 +0000 Subject: wiping objects during dynamic plugin unload git-svn-id: http://svn.miranda-ng.org/main/trunk@762 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- src/modules/clist/clistmenus.cpp | 11 ++++------ src/modules/clist/genmenu.cpp | 45 ++++++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 20 deletions(-) (limited to 'src/modules/clist') diff --git a/src/modules/clist/clistmenus.cpp b/src/modules/clist/clistmenus.cpp index dc9c4a69e2..677678d847 100644 --- a/src/modules/clist/clistmenus.cpp +++ b/src/modules/clist/clistmenus.cpp @@ -1193,7 +1193,7 @@ static INT_PTR AddStatusMenuItem(WPARAM wParam, LPARAM lParam) mir_free(ptszName); } if (pRoot == NULL) { - TMO_MenuItem tmi = { 0 }; + memset(&tmi, 0, sizeof(tmi)); tmi.cbSize = sizeof(tmi); tmi.flags = (mi->flags & CMIF_UNICODE) | CMIF_ROOTHANDLE; tmi.position = 1001; @@ -1233,12 +1233,9 @@ static INT_PTR AddStatusMenuItem(WPARAM wParam, LPARAM lParam) smep->hMenuItem = menuHandle; char buf[MAX_PATH+64]; - - { - char* p = (pRoot) ? mir_t2a(pRoot->mi.ptszName) : NULL; - mir_snprintf(buf, SIZEOF(buf), "%s/%s", (p) ? p : "", mi->pszService ? mi->pszService : ""); - mir_free(p); - } + char* p = (pRoot) ? mir_t2a(pRoot->mi.ptszName) : NULL; + mir_snprintf(buf, SIZEOF(buf), "%s/%s", (p) ? p : "", mi->pszService ? mi->pszService : ""); + mir_free(p); MO_SetOptionsMenuItem(menuHandle, OPT_MENUITEMSETUNIQNAME, (INT_PTR)buf); diff --git a/src/modules/clist/genmenu.cpp b/src/modules/clist/genmenu.cpp index 30f856b7ee..deb5de8227 100644 --- a/src/modules/clist/genmenu.cpp +++ b/src/modules/clist/genmenu.cpp @@ -80,6 +80,8 @@ LPTSTR GetMenuItemText(PMO_IntMenuItem pimi) return TranslateTH(pimi->mi.hLangpack, pimi->mi.ptszName); } +/////////////////////////////////////////////////////////////////////////////// + PMO_IntMenuItem MO_RecursiveWalkMenu(PMO_IntMenuItem parent, pfnWalkFunc func, void* param) { if (parent == NULL) @@ -102,6 +104,7 @@ PMO_IntMenuItem MO_RecursiveWalkMenu(PMO_IntMenuItem parent, pfnWalkFunc func, v return FALSE; } +/////////////////////////////////////////////////////////////////////////////// //wparam=0 //lparam=LPMEASUREITEMSTRUCT int MO_MeasureMenuItem(LPMEASUREITEMSTRUCT mis) @@ -128,6 +131,7 @@ int MO_MeasureMenuItem(LPMEASUREITEMSTRUCT mis) return TRUE; } +/////////////////////////////////////////////////////////////////////////////// //wparam=0 //lparam=LPDRAWITEMSTRUCT int MO_DrawMenuItem(LPDRAWITEMSTRUCT dis) @@ -453,16 +457,13 @@ int MO_SetOptionsMenuItem(PMO_IntMenuItem aHandle, int setting, INT_PTR value) int MO_SetOptionsMenuObject(HANDLE handle, int setting, INT_PTR value) { - int pimoidx; - int res = 0; - if ( !bIsGenMenuInited) return -1; mir_cslock lck(csMenuHook); - pimoidx = GetMenuObjbyId((int)handle); - res = pimoidx != -1; + int pimoidx = GetMenuObjbyId((int)handle); + int res = pimoidx != -1; if (res) { TIntMenuObject* pmo = g_menus[pimoidx]; @@ -552,6 +553,25 @@ INT_PTR MO_RemoveMenuItem(WPARAM wParam, LPARAM) return 0; } +/////////////////////////////////////////////////////////////////////////////// + +int KillMenuItems(PMO_IntMenuItem pimi, void* param) +{ + if (pimi->hLangpack == (int)param) + MO_RemoveMenuItem((WPARAM)pimi, 0); + return FALSE; +} + +void KillModuleMenus(int hLangpack) +{ + if (bIsGenMenuInited) { + mir_cslock lck(csMenuHook); + + for (int i=0; i < g_menus.getCount(); i++) + MO_RecursiveWalkMenu(g_menus[i]->m_items.first, KillMenuItems, (void*)hLangpack); + } +} + /////////////////////////////////////////////////////////////////////////////// // we presume that this function is being called inside csMenuHook only @@ -600,6 +620,7 @@ PMO_IntMenuItem MO_AddNewMenuItem(HANDLE menuobjecthandle, PMO_MenuItem pmi) p->iconId = -1; p->OverrideShow = TRUE; p->originalPosition = pmi->position; + p->hLangpack = pmi->hLangpack; if (pmi->flags & CMIF_UNICODE) p->mi.ptszName = mir_tstrdup(pmi->ptszName); @@ -1039,7 +1060,7 @@ static int MO_RegisterIcon(PMO_IntMenuItem pmi, void*) mir_snprintf(iconame, sizeof(iconame), "genmenu_%s_%s", pmi->parent->Name, uname && *uname ? uname : descr); - SKINICONDESC sid={0}; + SKINICONDESC sid = { 0 }; sid.cbSize = sizeof(sid); sid.cx = 16; sid.cy = 16; @@ -1054,14 +1075,12 @@ static int MO_RegisterIcon(PMO_IntMenuItem pmi, void*) if (hIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)iconame)) { ImageList_ReplaceIcon(pmi->parent->m_hMenuIcons, pmi->iconId, hIcon); IconLib_ReleaseIcon(hIcon, 0); - } } - - - if ( !pmi->UniqName) - mir_free(uname); - mir_free(descr); - + } + } + if ( !pmi->UniqName) + mir_free(uname); + mir_free(descr); return FALSE; } -- cgit v1.2.3