From 48540940b6c28bb4378abfeb500ec45a625b37b6 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Tue, 15 May 2012 10:38:20 +0000 Subject: initial commit git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/mwclist/init.c | 266 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 plugins/mwclist/init.c (limited to 'plugins/mwclist/init.c') diff --git a/plugins/mwclist/init.c b/plugins/mwclist/init.c new file mode 100644 index 0000000000..6d5810c561 --- /dev/null +++ b/plugins/mwclist/init.c @@ -0,0 +1,266 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2004 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +HINSTANCE g_hInst = 0; +PLUGINLINK * pluginLink; +CLIST_INTERFACE* pcli = NULL; +int hLangpack; + +struct LIST_INTERFACE li; +struct MM_INTERFACE mmi; +static HANDLE hCListShutdown = 0; + +HMENU BuildGroupPopupMenu( struct ClcGroup* group ); + +void CalcEipPosition( struct ClcData *dat, struct ClcContact *contact, struct ClcGroup *group, POINT *result); +void CheckPDNCE(ClcCacheEntryBase*); +void CluiProtocolStatusChanged( int, const char* ); +int CompareContacts( const struct ClcContact *contact1, const struct ClcContact *contact2 ); +void FreeDisplayNameCacheItem(ClcCacheEntryBase*); +void GetDefaultFontSetting(int i,LOGFONT *lf,COLORREF *colour); +void RebuildEntireList(HWND hwnd,struct ClcData *dat); +void RecalcScrollBar(HWND hwnd,struct ClcData *dat); + +struct ClcGroup* ( *saveAddGroup )(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers); +struct ClcGroup* ( *saveRemoveItemFromGroup )(HWND hwnd,struct ClcGroup *group,struct ClcContact *contact,int updateTotalCount); + +void (*saveFreeContact)(struct ClcContact *p); +void (*saveFreeGroup)(struct ClcGroup *p); + +LRESULT ( CALLBACK *saveContactListControlWndProc )( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +LRESULT CALLBACK ContactListControlWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +LRESULT ( CALLBACK *saveContactListWndProc )(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK ContactListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +void ( *saveLoadClcOptions )(HWND hwnd,struct ClcData *dat); + +int ( *saveAddItemToGroup )( struct ClcGroup *group, int iAboveItem ); +int AddItemToGroup(struct ClcGroup *group, int iAboveItem); + +int ( *saveAddInfoItemToGroup)(struct ClcGroup *group,int flags,const TCHAR *pszText); +int AddInfoItemToGroup(struct ClcGroup *group,int flags,const TCHAR *pszText); + +void ( *saveSortCLC )(HWND hwnd,struct ClcData *dat,int useInsertionSort); +void SortCLC(HWND hwnd,struct ClcData *dat,int useInsertionSort); + +INT_PTR ( *saveTrayIconProcessMessage )(WPARAM wParam,LPARAM lParam); +INT_PTR TrayIconProcessMessage(WPARAM wParam,LPARAM lParam); + +int (*saveIconFromStatusMode)(const char *szProto,int nStatus, HANDLE hContact); +int cli_IconFromStatusMode(const char *szProto,int nStatus, HANDLE hContact); + + +//from bgrcfg +extern int BGModuleLoad(); +extern int BGModuleUnload(); + +PLUGININFOEX pluginInfo = { + sizeof(PLUGININFOEX), + #if defined( _UNICODE ) + "MultiWindow Contact List Unicode", + #else + "MultiWindow Contact List", + #endif + PLUGIN_MAKE_VERSION(0,9,0,0), + "Display contacts, event notifications, protocol status with MW modifications", + "", + "bethoven@mailgate.ru" , + "Copyright 2000-2010 Miranda-IM project ["__DATE__" "__TIME__"]", + "http://www.miranda-im.org", + UNICODE_AWARE, + DEFMOD_CLISTALL, + #if defined( _UNICODE ) + {0x2a417ab9, 0x16f2, 0x472d, { 0x9a, 0xe3, 0x41, 0x51, 0x3, 0xc7, 0x8a, 0x64 }} //{2A417AB9-16F2-472d-9AE3-415103C78A64} + #else + {0x7ab05d31, 0x9972, 0x4406, { 0x82, 0x3e, 0xe, 0xd7, 0x45, 0xef, 0x7c, 0x56 }} //{7AB05D31-9972-4406-823E-0ED745EF7C56} + #endif +}; + +BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD dwReason, LPVOID reserved) +{ + g_hInst = hInstDLL; + DisableThreadLibraryCalls(g_hInst); + return TRUE; +} + +__declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + if ( mirandaVersion < PLUGIN_MAKE_VERSION(0,8,0,9) ) + return NULL; + return &pluginInfo; +} + +static const MUUID interfaces[] = {MIID_CLIST, MIID_LAST}; +__declspec(dllexport) const MUUID * MirandaPluginInterfaces(void) +{ + return interfaces; +} + +int LoadContactListModule(void); +int LoadCLCModule(void); +int LoadCLUIModule(); +int InitSkinHotKeys(); + +static int systemModulesLoaded(WPARAM wParam, LPARAM lParam) +{ + __try { + int *disableDefaultModule = 0; + disableDefaultModule=(int*)CallService(MS_PLUGINS_GETDISABLEDEFAULTARRAY,0,0); + if(!disableDefaultModule[DEFMOD_UICLUI]) if( LoadCLUIModule()) return 1; + } + __except (exceptFunction(GetExceptionInformation()) ) + { + return 0; + } + + InitSkinHotKeys(); + + return 0; +} + +INT_PTR SetDrawer(WPARAM wParam,LPARAM lParam) +{ + pDrawerServiceStruct DSS=(pDrawerServiceStruct)wParam; + if (DSS->cbSize!=sizeof(*DSS)) return -1; + if (DSS->PluginName==NULL) return -1; + if (DSS->PluginName==NULL) return -1; + if (!ServiceExists(DSS->GetDrawFuncsServiceName)) return -1; + + + SED.cbSize=sizeof(SED); + SED.PaintClc=(void (__cdecl *)(HWND,struct ClcData *,HDC,RECT *,int ,ClcProtoStatus *,HIMAGELIST))CallService(DSS->GetDrawFuncsServiceName,CLUI_EXT_FUNC_PAINTCLC,0); + if (!SED.PaintClc) return -1; + return 0; +} + +static struct ClcContact* fnCreateClcContact( void ) +{ + return (struct ClcContact*)mir_calloc( sizeof( struct ClcContact )); +} + +static ClcCacheEntryBase* fnCreateCacheItem( HANDLE hContact ) +{ + pdisplayNameCacheEntry p = (pdisplayNameCacheEntry)mir_calloc( sizeof( displayNameCacheEntry )); + if ( p ) + p->hContact = hContact; + return (ClcCacheEntryBase*)p; +} + +int __declspec(dllexport) CListInitialise(PLUGINLINK * link) +{ + int rc=0; + pluginLink=link; + #ifdef _DEBUG + _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); + #endif + + // get the internal malloc/free() + __try { + + OutputDebugStringA("CListInitialise ClistMW\r\n"); + + mir_getMMI( &mmi ); + mir_getLP( &pluginInfo ); + mir_getLI( &li ); + + pcli = ( CLIST_INTERFACE* )CallService(MS_CLIST_RETRIEVE_INTERFACE, 0, (LPARAM)g_hInst); + if ( (INT_PTR)pcli == CALLSERVICE_NOTFOUND ) { +LBL_Error: + MessageBoxA( NULL, "This version of plugin requires Miranda IM 0.8.0.9 or later", "Fatal error", MB_OK ); + return 1; + } + if ( pcli->version < 6 ) + goto LBL_Error; + + pcli->pfnBuildGroupPopupMenu = BuildGroupPopupMenu; + pcli->pfnCalcEipPosition = CalcEipPosition; + pcli->pfnCheckCacheItem = CheckPDNCE; + pcli->pfnCluiProtocolStatusChanged = CluiProtocolStatusChanged; + pcli->pfnCompareContacts = CompareContacts; + pcli->pfnCreateClcContact = fnCreateClcContact; + pcli->pfnCreateCacheItem = fnCreateCacheItem; + pcli->pfnFindItem = FindItem; + pcli->pfnFreeCacheItem = FreeDisplayNameCacheItem; + pcli->pfnGetDefaultFontSetting = GetDefaultFontSetting; + pcli->pfnGetRowsPriorTo = GetRowsPriorTo; + pcli->pfnGetRowByIndex = GetRowByIndex; + pcli->pfnHitTest = HitTest; + pcli->pfnPaintClc = PaintClc; + pcli->pfnRebuildEntireList = RebuildEntireList; + pcli->pfnRecalcScrollBar = RecalcScrollBar; + pcli->pfnScrollTo = ScrollTo; + + saveIconFromStatusMode = pcli->pfnIconFromStatusMode; + pcli->pfnIconFromStatusMode = cli_IconFromStatusMode; + + saveAddGroup = pcli->pfnAddGroup; pcli->pfnAddGroup = AddGroup; + saveAddInfoItemToGroup = pcli->pfnAddInfoItemToGroup; pcli->pfnAddInfoItemToGroup = AddInfoItemToGroup; + saveAddItemToGroup = pcli->pfnAddItemToGroup; pcli->pfnAddItemToGroup = AddItemToGroup; + saveRemoveItemFromGroup = pcli->pfnRemoveItemFromGroup; pcli->pfnRemoveItemFromGroup = RemoveItemFromGroup; + saveFreeContact = pcli->pfnFreeContact; pcli->pfnFreeContact = FreeContact; + saveFreeGroup = pcli->pfnFreeGroup; pcli->pfnFreeGroup = FreeGroup; + saveContactListControlWndProc = pcli->pfnContactListControlWndProc; pcli->pfnContactListControlWndProc = ContactListControlWndProc; + saveTrayIconProcessMessage = pcli->pfnTrayIconProcessMessage; pcli->pfnTrayIconProcessMessage = TrayIconProcessMessage; + saveContactListWndProc = pcli->pfnContactListWndProc; pcli->pfnContactListWndProc = ContactListWndProc; + saveLoadClcOptions = pcli->pfnLoadClcOptions; pcli->pfnLoadClcOptions = LoadClcOptions; + saveSortCLC = pcli->pfnSortCLC; pcli->pfnSortCLC = SortCLC; + + memset(&SED,0,sizeof(SED)); + CreateServiceFunction(CLUI_SetDrawerService,SetDrawer); + + rc=LoadContactListModule(); + if (rc==0) rc=LoadCLCModule(); + + HookEvent(ME_SYSTEM_MODULESLOADED, systemModulesLoaded); + BGModuleLoad(); + + OutputDebugStringA("CListInitialise ClistMW...Done\r\n"); + } + __except (exceptFunction(GetExceptionInformation()) ) + { + return 0; + } + + return rc; +} + +// never called by a newer plugin loader. +int __declspec(dllexport) Load(PLUGINLINK * link) +{ + OutputDebugStringA("Load ClistMW\r\n"); + MessageBoxA(0,"You Running Old Miranda, use >30-10-2004 version!","MultiWindow Clist",0); + CListInitialise(link); + return 1; +} + +int __declspec(dllexport) Unload(void) +{ + OutputDebugStringA("Unloading ClistMW\r\n"); + if (IsWindow(pcli->hwndContactList)) DestroyWindow(pcli->hwndContactList); + BGModuleUnload(); + pcli->hwndContactList=0; + return 0; +} -- cgit v1.2.3