diff options
-rw-r--r-- | include/m_clistint.h | 10 | ||||
-rw-r--r-- | plugins/Clist_nicer/src/clui.cpp | 2 | ||||
-rw-r--r-- | plugins/UserInfoEx/src/mir_menuitems.cpp | 15 | ||||
-rw-r--r-- | src/mir_app/src/clc.h | 1 | ||||
-rw-r--r-- | src/mir_app/src/clistcore.cpp | 3 | ||||
-rw-r--r-- | src/mir_app/src/cluiservices.cpp | 22 | ||||
-rw-r--r-- | src/mir_app/src/menu_clist.cpp | 77 |
7 files changed, 59 insertions, 71 deletions
diff --git a/include/m_clistint.h b/include/m_clistint.h index 72fc4ab601..c7edd1f3d5 100644 --- a/include/m_clistint.h +++ b/include/m_clistint.h @@ -189,9 +189,9 @@ struct trayIconInfo_t struct MenuProto
{
- char *szProto; //This is DLL-based unique name
+ ptrA szProto;
HGENMENU pMenu;
- HICON hIcon;
+ HICON hIcon;
};
/////////////////////////////////////////////////////////////////////////////////////////
@@ -434,11 +434,9 @@ struct CLIST_INTERFACE * version 4 additions (0.7.0.x) - genmenu
*************************************************************************************/
- MenuProto* menuProtos;
- int menuProtoCount;
+ OBJLIST<MenuProto> *menuProtos;
- HANDLE hPreBuildStatusMenuEvent;
- int currentStatusMenuItem, currentDesiredStatusMode;
+ int currentDesiredStatusMode;
BOOL bDisplayLocked, bAutoRebuild;
/*************************************************************************************
diff --git a/plugins/Clist_nicer/src/clui.cpp b/plugins/Clist_nicer/src/clui.cpp index 1eed90914d..b2014121ae 100644 --- a/plugins/Clist_nicer/src/clui.cpp +++ b/plugins/Clist_nicer/src/clui.cpp @@ -827,8 +827,6 @@ LRESULT CALLBACK ContactListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM l if (db_get_b(NULL, "CLUI", "useskin", 0)) IMG_LoadItems(); CreateButtonBar(hwnd); - //FYR: to be checked: otherwise it raises double xStatus items - //NotifyEventHooks(pcli->hPreBuildStatusMenuEvent, 0, 0); SendMessage(hwnd, WM_SETREDRAW, FALSE, FALSE); { LONG style; diff --git a/plugins/UserInfoEx/src/mir_menuitems.cpp b/plugins/UserInfoEx/src/mir_menuitems.cpp index 205261f0f0..d5966d1574 100644 --- a/plugins/UserInfoEx/src/mir_menuitems.cpp +++ b/plugins/UserInfoEx/src/mir_menuitems.cpp @@ -484,18 +484,16 @@ INT_PTR RebuildAccount(WPARAM, LPARAM lParam) const BYTE mItems = 3; // menuitems to create
BYTE item = 0;
- int mProtoCount = pcli->menuProtoCount;
-
// on call by hook or first start
if (!lParam || !hMenuItemAccount) {
- size_t sizeNew = mItems * mProtoCount * sizeof(HGENMENU);
+ size_t sizeNew = mItems * pcli->menuProtos->getCount() * sizeof(HGENMENU);
hMenuItemAccount = (HGENMENU*)mir_realloc(hMenuItemAccount, sizeNew);
// set all bytes 0 to avoid problems
memset(hMenuItemAccount, 0, sizeNew);
}
// on options change
else // delete all MenuItems backward (first item second group)
- RemoveMenuItems(hMenuItemAccount, mItems * mProtoCount);
+ RemoveMenuItems(hMenuItemAccount, mItems * pcli->menuProtos->getCount());
// load options
int flag = db_get_b(NULL, MODNAME, SET_MI_ACCOUNT, MCAS_NOTINITIATED);
@@ -505,19 +503,19 @@ INT_PTR RebuildAccount(WPARAM, LPARAM lParam) }
// loop for all account names
- for (int i = 0; i < mProtoCount; i++) {
+ for (auto &it : *pcli->menuProtos) {
// set all bytes 0 to avoid problems
item = 0;
- HGENMENU mhRoot = pcli->menuProtos[i].pMenu, mhExIm;
+ HGENMENU mhRoot = it->pMenu, mhExIm;
if (mhRoot == nullptr)
break;
- PROTOACCOUNT *pa = Proto_GetAccount(pcli->menuProtos[i].szProto);
+ PROTOACCOUNT *pa = Proto_GetAccount(it->szProto);
// create service name main (account module name) and set pointer to end it
char text[200];
- mir_strcpy(text, pcli->menuProtos[i].szProto);
+ mir_strcpy(text, it->szProto);
CMenuItem mi;
mi.pszService = text;
@@ -526,6 +524,7 @@ INT_PTR RebuildAccount(WPARAM, LPARAM lParam) // support new genmenu style
mi.root = mhRoot;
+ int i = pcli->menuProtos->indexOf(&it);
switch (flag) {
case 3:
// cascade off
diff --git a/src/mir_app/src/clc.h b/src/mir_app/src/clc.h index 188b50f8fe..7ebafd6aa4 100644 --- a/src/mir_app/src/clc.h +++ b/src/mir_app/src/clc.h @@ -40,6 +40,7 @@ struct ClcCacheEntry : public ClcCacheEntryBase extern int g_IconWidth, g_IconHeight;
extern HIMAGELIST hCListImages;
extern bool g_bReadyToInitClist;
+extern OBJLIST<MenuProto> g_menuProtos;
void fnClcOptionsChanged(void);
diff --git a/src/mir_app/src/clistcore.cpp b/src/mir_app/src/clistcore.cpp index 90f7830740..84322e7bd5 100644 --- a/src/mir_app/src/clistcore.cpp +++ b/src/mir_app/src/clistcore.cpp @@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. int LoadContactListModule2(void);
int LoadCLCModule(void);
-CLIST_INTERFACE cli = { 0 };
+CLIST_INTERFACE cli;
static wchar_t szTip[MAX_TIP_SIZE+1];
@@ -60,6 +60,7 @@ void InitClistCore() {
cli.version = 6;
cli.bDisplayLocked = true;
+ cli.menuProtos = &g_menuProtos;
cli.pfnClcOptionsChanged = fnClcOptionsChanged;
cli.pfnContactListControlWndProc = fnContactListControlWndProc;
diff --git a/src/mir_app/src/cluiservices.cpp b/src/mir_app/src/cluiservices.cpp index 955c92eb52..2d0f9a71f8 100644 --- a/src/mir_app/src/cluiservices.cpp +++ b/src/mir_app/src/cluiservices.cpp @@ -83,7 +83,7 @@ EXTERN_C MIR_APP_DLL(void) Clist_EndRebuild(void) void fnCluiProtocolStatusChanged(int, const char*)
{
- if (cli.menuProtoCount == 0) {
+ if (g_menuProtos.getCount() == 0) {
SendMessage(cli.hwndStatus, SB_SETPARTS, 0, 0);
SendMessage(cli.hwndStatus, SB_SETTEXT, SBT_OWNERDRAW, 0);
return;
@@ -92,13 +92,13 @@ void fnCluiProtocolStatusChanged(int, const char*) int borders[3];
SendMessage(cli.hwndStatus, SB_GETBORDERS, 0, (LPARAM)&borders);
- int *partWidths = (int*)alloca(cli.menuProtoCount * sizeof(int));
+ int *partWidths = (int*)alloca(g_menuProtos.getCount() * sizeof(int));
if (db_get_b(0, "CLUI", "EqualSections", 0)) {
RECT rc;
GetClientRect(cli.hwndStatus, &rc);
rc.right -= borders[0] * 2 + (db_get_b(0, "CLUI", "ShowGrip", 1) ? GetSystemMetrics(SM_CXVSCROLL) : 0);
- for (int i = 0; i < cli.menuProtoCount; i++)
- partWidths[i] = (i + 1) * rc.right / cli.menuProtoCount - (borders[2] >> 1);
+ for (int i = 0; i < g_menuProtos.getCount(); i++)
+ partWidths[i] = (i + 1) * rc.right / g_menuProtos.getCount() - (borders[2] >> 1);
}
else {
SIZE textSize;
@@ -106,13 +106,13 @@ void fnCluiProtocolStatusChanged(int, const char*) HDC hdc = GetDC(nullptr);
HFONT hFont = (HFONT)SelectObject(hdc, (HFONT)SendMessage(cli.hwndStatus, WM_GETFONT, 0, 0));
- for (int i = 0; i < cli.menuProtoCount; i++) { //count down since built in ones tend to go at the end
+ for (int i = 0; i < g_menuProtos.getCount(); i++) { //count down since built in ones tend to go at the end
int x = 2;
if (showOpts & 1)
x += g_IconWidth;
if (showOpts & 2) {
wchar_t tszName[64];
- PROTOACCOUNT *pa = Proto_GetAccount(cli.menuProtos[i].szProto);
+ PROTOACCOUNT *pa = Proto_GetAccount(g_menuProtos[i].szProto);
if (pa)
mir_snwprintf(tszName, L"%s ", pa->tszAccountName);
else
@@ -125,7 +125,7 @@ void fnCluiProtocolStatusChanged(int, const char*) x += GetSystemMetrics(SM_CXBORDER) * 4; // The SB panel doesnt allocate enough room
}
if (showOpts & 4) {
- wchar_t* modeDescr = cli.pfnGetStatusModeDescription(CallProtoServiceInt(0, cli.menuProtos[i].szProto, PS_GETSTATUS, 0, 0), 0);
+ wchar_t* modeDescr = cli.pfnGetStatusModeDescription(CallProtoServiceInt(0, g_menuProtos[i].szProto, PS_GETSTATUS, 0, 0), 0);
GetTextExtentPoint32(hdc, modeDescr, (int)mir_wstrlen(modeDescr), &textSize);
x += textSize.cx;
x += GetSystemMetrics(SM_CXBORDER) * 4; // The SB panel doesnt allocate enough room
@@ -136,14 +136,14 @@ void fnCluiProtocolStatusChanged(int, const char*) ReleaseDC(nullptr, hdc);
}
- partWidths[cli.menuProtoCount - 1] = -1;
+ partWidths[g_menuProtos.getCount()-1] = -1;
SendMessage(cli.hwndStatus, SB_SETMINHEIGHT, g_IconHeight, 0);
- SendMessage(cli.hwndStatus, SB_SETPARTS, cli.menuProtoCount, (LPARAM)partWidths);
+ SendMessage(cli.hwndStatus, SB_SETPARTS, g_menuProtos.getCount(), (LPARAM)partWidths);
int flags = SBT_OWNERDRAW;
if (db_get_b(0, "CLUI", "SBarBevel", 1) == 0)
flags |= SBT_NOBORDERS;
- for (int i = 0; i < cli.menuProtoCount; i++)
- SendMessage(cli.hwndStatus, SB_SETTEXT, i | flags, (LPARAM)cli.menuProtos[i].szProto);
+ for (int i = 0; i < g_menuProtos.getCount(); i++)
+ SendMessage(cli.hwndStatus, SB_SETTEXT, i | flags, (LPARAM)g_menuProtos[i].szProto);
}
diff --git a/src/mir_app/src/menu_clist.cpp b/src/mir_app/src/menu_clist.cpp index 25bb07c0f4..cc4fde0bad 100644 --- a/src/mir_app/src/menu_clist.cpp +++ b/src/mir_app/src/menu_clist.cpp @@ -38,17 +38,21 @@ void InitTrayMenus(void); #define MS_CLIST_HKSTATUS "Clist/HK/SetStatus"
#define FIRSTCUSTOMMENUITEMID 30000
-#define MENU_CUSTOMITEMMAIN 0x80000000
+
+#define MENU_CUSTOMITEMMAIN 0x80000000
// new menu sys
int hMainMenuObject = 0, hContactMenuObject = 0, hStatusMenuObject = 0;
+int currentStatusMenuItem;
int statustopos(int status);
void Proto_SetStatus(const char *szProto, unsigned status);
+OBJLIST<MenuProto> g_menuProtos(1);
+
bool prochotkey;
-HANDLE hPreBuildMainMenuEvent, hStatusModeChangeEvent, hPreBuildContactMenuEvent;
+HANDLE hPreBuildMainMenuEvent, hStatusModeChangeEvent, hPreBuildContactMenuEvent, hPreBuildStatusMenuEvent;
HMENU hMainMenu, hStatusMenu;
const int statusModeList[MAX_STATUS_COUNT] =
@@ -100,19 +104,6 @@ struct MenuItemData /////////////////////////////////////////////////////////////////////////////////////////
// service functions
-void FreeMenuProtos(void)
-{
- if (cli.menuProtos) {
- for (int i = 0; i < cli.menuProtoCount; i++)
- mir_free(cli.menuProtos[i].szProto);
- mir_free(cli.menuProtos);
- cli.menuProtos = nullptr;
- }
- cli.menuProtoCount = 0;
-}
-
-//////////////////////////////////////////////////////////////////////////
-
static int RecursiveDeleteMenu(HMENU hMenu)
{
int cnt = GetMenuItemCount(hMenu);
@@ -182,7 +173,7 @@ MIR_APP_DLL(HGENMENU) Menu_AddMainMenuItem(TMO_MenuItem *pmi) // called with:
// wparam - ownerdata
// lparam - lparam from winproc
-INT_PTR MainMenuExecService(WPARAM wParam, LPARAM lParam)
+static INT_PTR MainMenuExecService(WPARAM wParam, LPARAM lParam)
{
MainMenuExecParam *mmep = (MainMenuExecParam*)wParam;
if (mmep != nullptr) {
@@ -191,7 +182,7 @@ INT_PTR MainMenuExecService(WPARAM wParam, LPARAM lParam) return 1;
}
-INT_PTR FreeOwnerDataMainMenu(WPARAM, LPARAM lParam)
+static INT_PTR FreeOwnerDataMainMenu(WPARAM, LPARAM lParam)
{
MainMenuExecParam *mmep = (MainMenuExecParam*)lParam;
if (mmep != nullptr) {
@@ -378,7 +369,7 @@ MIR_APP_DLL(HMENU) Menu_GetStatusMenu() /////////////////////////////////////////////////////////////////////////////////////////
-BOOL FindMenuHandleByGlobalID(HMENU hMenu, TMO_IntMenuItem *id, MenuItemData* itdat)
+static BOOL FindMenuHandleByGlobalID(HMENU hMenu, TMO_IntMenuItem *id, MenuItemData* itdat)
{
if (!itdat)
return FALSE;
@@ -410,7 +401,7 @@ BOOL FindMenuHandleByGlobalID(HMENU hMenu, TMO_IntMenuItem *id, MenuItemData* it return FALSE;
}
-INT_PTR StatusMenuCheckService(WPARAM wParam, LPARAM)
+static INT_PTR StatusMenuCheckService(WPARAM wParam, LPARAM)
{
TCheckProcParam *pcpp = (TCheckProcParam*)wParam;
if (!pcpp)
@@ -527,7 +518,7 @@ INT_PTR StatusMenuCheckService(WPARAM wParam, LPARAM) return TRUE;
}
-INT_PTR StatusMenuExecService(WPARAM wParam, LPARAM)
+static INT_PTR StatusMenuExecService(WPARAM wParam, LPARAM)
{
StatusMenuExecParam *smep = (StatusMenuExecParam*)wParam;
if (smep == nullptr)
@@ -605,7 +596,7 @@ INT_PTR StatusMenuExecService(WPARAM wParam, LPARAM) return 1;
}
-INT_PTR FreeOwnerDataStatusMenu(WPARAM, LPARAM lParam)
+static INT_PTR FreeOwnerDataStatusMenu(WPARAM, LPARAM lParam)
{
StatusMenuExecParam *smep = (StatusMenuExecParam*)lParam;
if (smep != nullptr) {
@@ -657,7 +648,7 @@ MIR_APP_DLL(BOOL) Clist_MenuProcessHotkey(unsigned vKey) /////////////////////////////////////////////////////////////////////////////////////////
// Other menu functions
-BOOL FindMenuHanleByGlobalID(HMENU hMenu, TMO_IntMenuItem *id, MenuItemData* itdat)
+static BOOL FindMenuHanleByGlobalID(HMENU hMenu, TMO_IntMenuItem *id, MenuItemData* itdat)
{
if (!itdat)
return FALSE;
@@ -746,7 +737,7 @@ void RebuildMenuOrder(void) hStatusMenuHandles = (tStatusMenuHandles*)mir_calloc(sizeof(tStatusMenuHandles)*accounts.getCount());
hStatusMenuHandlesCnt = accounts.getCount();
- FreeMenuProtos();
+ g_menuProtos.destroy();
for (int s = 0; s < accounts.getCount(); s++) {
int i = Clist_GetAccountIndex(s);
@@ -802,11 +793,11 @@ void RebuildMenuOrder(void) smep->pimi = pimi;
Menu_ModifyItem(pimi, mi.name.w, mi.hIcon, mi.flags);
- cli.menuProtos = (MenuProto*)mir_realloc(cli.menuProtos, sizeof(MenuProto)*(cli.menuProtoCount + 1));
- memset(&(cli.menuProtos[cli.menuProtoCount]), 0, sizeof(MenuProto));
- cli.menuProtos[cli.menuProtoCount].pMenu = rootmenu;
- cli.menuProtos[cli.menuProtoCount].szProto = mir_strdup(pa->szModuleName);
- cli.menuProtoCount++;
+ MenuProto *pMenu = new MenuProto();
+ pMenu->hIcon = nullptr;
+ pMenu->pMenu = rootmenu;
+ pMenu->szProto = mir_strdup(pa->szModuleName);
+ g_menuProtos.insert(pMenu);
char buf[256];
mir_snprintf(buf, "RootProtocolIcon_%s", pa->szModuleName);
@@ -847,7 +838,7 @@ void RebuildMenuOrder(void) }
}
- NotifyEventHooks(cli.hPreBuildStatusMenuEvent, 0, 0);
+ NotifyEventHooks(hPreBuildStatusMenuEvent, 0, 0);
int pos = 200000;
// add to root menu
@@ -962,7 +953,7 @@ static int MenuProtoAck(WPARAM, LPARAM lParam) int overallStatus = Proto_GetAverageStatus();
if (overallStatus >= ID_STATUS_OFFLINE) {
- int pos = statustopos(cli.currentStatusMenuItem);
+ int pos = statustopos(currentStatusMenuItem);
if (pos == -1)
pos = 0;
@@ -971,20 +962,20 @@ static int MenuProtoAck(WPARAM, LPARAM lParam) if (pos2 >= 0 && pos2 < hStatusMainMenuHandlesCnt)
Menu_ModifyItem(hStatusMainMenuHandles[pos2], nullptr, INVALID_HANDLE_VALUE, 0);
- cli.currentStatusMenuItem = overallStatus;
- pos = statustopos(cli.currentStatusMenuItem);
+ currentStatusMenuItem = overallStatus;
+ pos = statustopos(currentStatusMenuItem);
if (pos >= 0 && pos < hStatusMainMenuHandlesCnt)
Menu_SetChecked(hStatusMainMenuHandles[pos], true);
}
else {
- int pos = statustopos(cli.currentStatusMenuItem);
+ int pos = statustopos(currentStatusMenuItem);
if (pos == -1)
pos = 0;
if (pos >= 0 && pos < hStatusMainMenuHandlesCnt)
Menu_ModifyItem(hStatusMainMenuHandles[pos], nullptr, INVALID_HANDLE_VALUE, 0);
- cli.currentStatusMenuItem = 0;
+ currentStatusMenuItem = 0;
}
for (int i = 0; i < accounts.getCount(); i++) {
@@ -1014,13 +1005,13 @@ static int MenuProtoAck(WPARAM, LPARAM lParam) static MenuProto* FindProtocolMenu(const char *proto)
{
- for (int i = 0; i < cli.menuProtoCount; i++)
- if (cli.menuProtos[i].pMenu && !mir_strcmpi(cli.menuProtos[i].szProto, proto))
- return &cli.menuProtos[i];
+ for (auto &it : g_menuProtos)
+ if (it->pMenu && !mir_strcmpi(it->szProto, proto))
+ return it;
- if (cli.menuProtoCount == 1)
- if (!mir_strcmpi(cli.menuProtos[0].szProto, proto))
- return &cli.menuProtos[0];
+ if (g_menuProtos.getCount() == 1)
+ if (!mir_strcmpi(g_menuProtos[0].szProto, proto))
+ return &g_menuProtos[0];
return nullptr;
}
@@ -1078,7 +1069,7 @@ void InitCustomMenus(void) hPreBuildContactMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDCONTACTMENU);
hPreBuildMainMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDMAINMENU);
- cli.hPreBuildStatusMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDSTATUSMENU);
+ hPreBuildStatusMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDSTATUSMENU);
hStatusModeChangeEvent = CreateHookableEvent(ME_CLIST_STATUSMODECHANGE);
HookEvent(ME_PROTO_ACK, MenuProtoAck);
@@ -1140,7 +1131,7 @@ void InitCustomMenus(void) mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_EXIT);
Menu_AddMainMenuItem(&mi);
- cli.currentStatusMenuItem = ID_STATUS_OFFLINE;
+ currentStatusMenuItem = ID_STATUS_OFFLINE;
cli.currentDesiredStatusMode = ID_STATUS_OFFLINE;
HookEvent(ME_SKIN_ICONSCHANGED, MenuIconsChanged);
@@ -1157,7 +1148,7 @@ void UninitCustomMenus(void) Menu_RemoveObject(hMainMenuObject);
Menu_RemoveObject(hStatusMenuObject);
- FreeMenuProtos();
+ g_menuProtos.destroy();
DestroyMenu(hMainMenu);
DestroyMenu(hStatusMenu);
|