diff options
| -rw-r--r-- | src/mir_app/src/genmenu.h | 7 | ||||
| -rw-r--r-- | src/mir_app/src/menu_options.cpp | 10 | ||||
| -rw-r--r-- | src/mir_app/src/menu_utils.cpp | 31 |
3 files changed, 29 insertions, 19 deletions
diff --git a/src/mir_app/src/genmenu.h b/src/mir_app/src/genmenu.h index 8ed7a83359..7e10b359be 100644 --- a/src/mir_app/src/genmenu.h +++ b/src/mir_app/src/genmenu.h @@ -98,6 +98,7 @@ struct TIntMenuObject : public MZeroedObject bool m_bUseUserDefinedItems;
void freeItem(TMO_IntMenuItem*);
+ CMStringA getModule() const;
};
extern LIST<TIntMenuObject> g_menus;
@@ -113,7 +114,11 @@ int MO_ProcessCommandBySubMenuIdent(int menuID, int command, LPARAM lParam); typedef int (*pfnWalkFunc)(TMO_IntMenuItem*, void*);
// returns the item, on which pfnWalkFunc returned TRUE
-TMO_IntMenuItem *MO_RecursiveWalkMenu(TMO_IntMenuItem*, pfnWalkFunc, void*);
+TMO_IntMenuItem* MO_RecursiveWalkMenu(TMO_IntMenuItem*, pfnWalkFunc, void* = nullptr);
+
+__forceinline TMO_IntMenuItem* MO_RecursiveWalkMenu(TMO_IntMenuItem *pimi, pfnWalkFunc pFunc, const char *pszParam) {
+ return MO_RecursiveWalkMenu(pimi, pFunc, (void *)pszParam);
+}
//general stuff
int InitGenMenu();
diff --git a/src/mir_app/src/menu_options.cpp b/src/mir_app/src/menu_options.cpp index daa9a80e1d..cd16d4b373 100644 --- a/src/mir_app/src/menu_options.cpp +++ b/src/mir_app/src/menu_options.cpp @@ -37,8 +37,8 @@ MIR_APP_DLL(void) Menu_SetVisible(TMO_IntMenuItem *pimi, bool bVisible) if ((pimi = MO_GetIntMenuItem(pimi)) == nullptr)
return;
- char szModule[256], menuItemName[256];
- mir_snprintf(szModule, "%s_Items", pimi->parent->pszName);
+ char menuItemName[256];
+ auto szModule(pimi->parent->getModule());
bin2hex(&pimi->mi.uid, sizeof(pimi->mi.uid), menuItemName);
ptrW wszValue(db_get_wsa(0, szModule, menuItemName, L"1;;;"));
@@ -146,8 +146,7 @@ class CGenMenuOptionsPage : public CDlgBase if (pmo == nullptr)
return;
- char szModule[256];
- mir_snprintf(szModule, "%s_Items", pmo->pszName);
+ auto szModule(pmo->getModule());
db_delete_module(0, szModule);
SaveTreeInternal(nullptr, m_menuItems.GetRoot(), szModule);
db_set_b(0, szModule, "MenuFormat", 1);
@@ -250,8 +249,7 @@ class CGenMenuOptionsPage : public CDlgBase if (pmo == nullptr || pmo->m_items.first == nullptr)
return false;
- char szModule[256];
- mir_snprintf(szModule, "%s_Items", pmo->pszName);
+ auto szModule(pmo->getModule());
if (bReread) // no need to reread database on reset
MO_RecursiveWalkMenu(pmo->m_items.first, Menu_LoadFromDatabase, szModule);
diff --git a/src/mir_app/src/menu_utils.cpp b/src/mir_app/src/menu_utils.cpp index 03d18f508f..1548cbcc59 100644 --- a/src/mir_app/src/menu_utils.cpp +++ b/src/mir_app/src/menu_utils.cpp @@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "genmenu.h"
#include "plugins.h"
-static bool bIsGenMenuInited;
+static bool bIsGenMenuInited, bMenuLoaded = false;
bool bIconsDisabled;
static mir_cs csMenuHook;
@@ -340,7 +340,7 @@ MIR_APP_DLL(HGENMENU) Menu_GetDefaultItem(HGENMENU hMenu) TMO_IntMenuItem *pimi = MO_GetIntMenuItem(hMenu);
mir_cslock lck(csMenuHook);
- return (pimi) ? MO_RecursiveWalkMenu(pimi, FindDefaultItem, nullptr) : nullptr;
+ return (pimi) ? MO_RecursiveWalkMenu(pimi, FindDefaultItem) : nullptr;
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -647,7 +647,7 @@ MIR_APP_DLL(int) Menu_RemoveItem(HGENMENU hMenuItem) return -1;
if (pimi->submenu.first) {
- MO_RecursiveWalkMenu(pimi->submenu.first, FreeMenuItem, nullptr);
+ MO_RecursiveWalkMenu(pimi->submenu.first, FreeMenuItem);
pimi->submenu.first = nullptr;
}
@@ -708,7 +708,7 @@ static int GetNextObjectMenuItemId() if (NextObjectMenuItemId >= CLISTMENUIDMAX) {
NextObjectMenuItemId = CLISTMENUIDMIN;
for (auto &p : g_menus)
- MO_RecursiveWalkMenu(p->m_items.first, PackMenuItems, nullptr);
+ MO_RecursiveWalkMenu(p->m_items.first, PackMenuItems);
}
return NextObjectMenuItemId++;
@@ -807,6 +807,9 @@ MIR_APP_DLL(HGENMENU) Menu_AddItem(int hMenuObject, TMO_MenuItem *pmi, void *pUs }
else p->owner = &pmo->m_items;
+ if (bMenuLoaded)
+ Menu_LoadFromDatabase(p, (char*)pmo->getModule().c_str());
+
p->owner->insert(p);
return p;
}
@@ -974,10 +977,8 @@ static void CALLBACK sttUpdateMenuService() if (!pmo->m_bUseUserDefinedItems)
continue;
- char szModule[256];
- mir_snprintf(szModule, "%s_Items", pmo->pszName);
-
// was a menu converted?
+ auto szModule(pmo->getModule());
if (db_get_b(0, szModule, "MenuFormat", 0) == 0) { // no
// read old settings
MO_RecursiveWalkMenu(pmo->m_items.first, sttReadOldItem, szModule);
@@ -1011,6 +1012,8 @@ static void CALLBACK sttUpdateMenuService() MO_RecursiveWalkMenu(pmo->m_items.first, Menu_LoadFromDatabase, szModule);
}
}
+
+ bMenuLoaded = true;
}
void ScheduleMenuUpdate()
@@ -1118,9 +1121,8 @@ static HMENU BuildRecursiveMenu(HMENU hMenu, TMO_IntMenuItem *pRootMenu, WPARAM if (pRootMenu == nullptr)
return nullptr;
- char szModule[256];
TIntMenuObject *pmo = pRootMenu->parent;
- mir_snprintf(szModule, "%s_Items", pmo->pszName);
+ auto szModule(pmo->getModule());
if (pRootMenu->mi.root == nullptr)
while (GetMenuItemCount(hMenu) > 0)
@@ -1248,7 +1250,7 @@ int OnIconLibChanges(WPARAM, LPARAM) mir_cslock lck(csMenuHook);
for (auto &p : g_menus)
if (hStatusMenuObject != p->id) //skip status menu
- MO_RecursiveWalkMenu(p->m_items.first, MO_ReloadIcon, nullptr);
+ MO_RecursiveWalkMenu(p->m_items.first, MO_ReloadIcon);
}
Menu_ReloadProtoMenus();
@@ -1310,7 +1312,7 @@ static void CALLBACK RegisterAllIconsInIconLib() if (hStatusMenuObject == p->id) //skip status menu
continue;
- MO_RecursiveWalkMenu(p->m_items.first, MO_RegisterIcon, nullptr);
+ MO_RecursiveWalkMenu(p->m_items.first, MO_RegisterIcon);
}
}
@@ -1347,7 +1349,7 @@ TIntMenuObject::TIntMenuObject() TIntMenuObject::~TIntMenuObject()
{
- MO_RecursiveWalkMenu(m_items.first, FreeMenuItem, nullptr);
+ MO_RecursiveWalkMenu(m_items.first, FreeMenuItem);
mir_free(FreeService);
mir_free(onAddService);
@@ -1359,6 +1361,11 @@ TIntMenuObject::~TIntMenuObject() ImageList_Destroy(m_hMenuIcons);
}
+CMStringA TIntMenuObject::getModule() const
+{
+ return CMStringA(FORMAT, "%s_Items", pszName);
+}
+
void TIntMenuObject::freeItem(TMO_IntMenuItem *p)
{
if (FreeService)
|
