summaryrefslogtreecommitdiff
path: root/plugins/Clist_modern/src/modern_clistmod.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Clist_modern/src/modern_clistmod.cpp')
-rw-r--r--plugins/Clist_modern/src/modern_clistmod.cpp396
1 files changed, 179 insertions, 217 deletions
diff --git a/plugins/Clist_modern/src/modern_clistmod.cpp b/plugins/Clist_modern/src/modern_clistmod.cpp
index de45d9a20e..1d1973a8af 100644
--- a/plugins/Clist_modern/src/modern_clistmod.cpp
+++ b/plugins/Clist_modern/src/modern_clistmod.cpp
@@ -91,7 +91,7 @@ HICON cliGetIconFromStatusMode(HANDLE hContact, const char *szProto,int status)
HICON MainOverlay = (HICON)GetMainStatusOverlay(status);
hIcon = ske_CreateJoinedIcon(hXIcon,MainOverlay,(trayOption&4)?192:0);
DestroyIcon_protect(hXIcon);
- DestroyIcon_protect(MainOverlay);
+ DestroyIcon_protect(MainOverlay);
}
else
{
@@ -109,73 +109,51 @@ HICON cliGetIconFromStatusMode(HANDLE hContact, const char *szProto,int status)
// if not ready take normal icon
return hIcon;
}
-////////// By FYR/////////////
+
int ExtIconFromStatusMode(HANDLE hContact, const char *szProto,int status)
{
- /*pdisplayNameCacheEntry cacheEntry;
- if ((DBGetContactSettingByte(NULL,"CLC","Meta",0) != 1) && szProto != NULL)
- {
- if (meta_module && mir_strcmp(szProto,meta_module) == 0)
- {
- hContact = (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT,(UINT)hContact,0);
- if (hContact != 0)
- {
- szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(UINT)hContact,0);
- status = DBGetContactSettingWord(hContact,szProto,"Status",ID_STATUS_OFFLINE);
- }
- }
- }
- cacheEntry = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hContact);
- if (cacheEntry->isTransport>0) return GetTrasportStatusIconIndex(cacheEntry->isTransport-1,status);
- */
- return pcli->pfnIconFromStatusMode(szProto,status,hContact);
+ return pcli->pfnIconFromStatusMode(szProto,status,hContact);
}
-/////////// End by FYR ////////
+
int cli_IconFromStatusMode(const char *szProto,int nStatus, HANDLE hContact)
{
- int result = -1;
- if (hContact && szProto)
- {
- char * szActProto = (char*)szProto;
- char AdvancedService[255] = {0};
- int nActStatus = nStatus;
- HANDLE hActContact = hContact;
- if ( !db_get_b(NULL,"CLC","Meta",SETTING_USEMETAICON_DEFAULT) && g_szMetaModuleName && !mir_strcmp(szActProto,g_szMetaModuleName))
- {
- // substitute params by mostonline contact datas
- HANDLE hMostOnlineContact = (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT,(WPARAM)hActContact,0);
- if (hMostOnlineContact)
- {
- pdisplayNameCacheEntry cacheEntry;
- cacheEntry = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hMostOnlineContact);
- if (cacheEntry && cacheEntry->m_cache_cszProto)
- {
- szActProto = cacheEntry->m_cache_cszProto;
- nActStatus = pdnce___GetStatus( cacheEntry );
- hActContact = hMostOnlineContact;
- }
- }
- }
- mir_snprintf(AdvancedService,SIZEOF(AdvancedService),"%s%s",szActProto,"/GetAdvancedStatusIcon");
-
- if (ServiceExists(AdvancedService))
- result = CallService(AdvancedService,(WPARAM)hActContact, (LPARAM)0);
-
- if (result == -1 || !(LOWORD(result)))
- {
- //Get normal Icon
- int basicIcon = corecli.pfnIconFromStatusMode(szActProto,nActStatus,NULL);
- if (result != -1 && basicIcon != 1) result |= basicIcon;
- else result = basicIcon;
- }
- }
- else
- {
- result = corecli.pfnIconFromStatusMode(szProto,nStatus,NULL);
- }
- return result;
-}
+ if (hContact && szProto) {
+ char *szActProto = (char*)szProto;
+ char AdvancedService[255] = {0};
+ int nActStatus = nStatus;
+ HANDLE hActContact = hContact;
+ if ( !db_get_b(NULL,"CLC","Meta",SETTING_USEMETAICON_DEFAULT) && g_szMetaModuleName && !mir_strcmp(szActProto,g_szMetaModuleName)) {
+ // substitute params by mostonline contact datas
+ HANDLE hMostOnlineContact = (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT,(WPARAM)hActContact,0);
+ if (hMostOnlineContact) {
+ pdisplayNameCacheEntry cacheEntry;
+ cacheEntry = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hMostOnlineContact);
+ if (cacheEntry && cacheEntry->m_cache_cszProto) {
+ szActProto = cacheEntry->m_cache_cszProto;
+ nActStatus = pdnce___GetStatus( cacheEntry );
+ hActContact = hMostOnlineContact;
+ }
+ }
+ }
+ mir_snprintf(AdvancedService,SIZEOF(AdvancedService),"%s%s",szActProto,"/GetAdvancedStatusIcon");
+
+ int result = -1;
+ if (ServiceExists(AdvancedService))
+ result = CallService(AdvancedService,(WPARAM)hActContact, 0);
+ if (result == -1 || !(LOWORD(result))) {
+ //Get normal Icon
+ int basicIcon = corecli.pfnIconFromStatusMode(szActProto,nActStatus,NULL);
+ if (result != -1 && basicIcon != 1)
+ result |= basicIcon;
+ else
+ result = basicIcon;
+ }
+ return result;
+ }
+
+ return corecli.pfnIconFromStatusMode(szProto,nStatus,NULL);
+}
int GetContactIconC(pdisplayNameCacheEntry cacheEntry)
{
@@ -188,16 +166,15 @@ int GetContactIconC(pdisplayNameCacheEntry cacheEntry)
INT_PTR GetContactIcon(WPARAM wParam,LPARAM lParam)
{
- char *szProto;
int status;
- int res;
- szProto = (char *) CallService(MS_PROTO_GETCONTACTBASEPROTO, wParam, 0);
+ char *szProto = (char *) CallService(MS_PROTO_GETCONTACTBASEPROTO, wParam, 0);
if (szProto == NULL)
status = ID_STATUS_OFFLINE;
else
status = db_get_w((HANDLE) wParam, szProto, "Status", ID_STATUS_OFFLINE);
- res = ExtIconFromStatusMode((HANDLE)wParam,szProto,szProto == NULL?ID_STATUS_OFFLINE:status); //by FYR
- if (lParam == 0 && res != -1) res &= 0xFFFF;
+ int res = ExtIconFromStatusMode((HANDLE)wParam,szProto,szProto == NULL?ID_STATUS_OFFLINE:status); //by FYR
+ if (lParam == 0 && res != -1)
+ res &= 0xFFFF;
return res;
}
@@ -279,21 +256,19 @@ HRESULT CluiLoadModule()
CreateServiceFunction(MS_CLIST_TOGGLESOUNDS,ToggleSounds);
CreateServiceFunction(MS_CLIST_SETUSEGROUPS,SetUseGroups);
-
CreateServiceFunction(MS_CLIST_GETCONTACTICON,GetContactIcon);
MySetProcessWorkingSetSize = (BOOL (WINAPI*)(HANDLE,SIZE_T,SIZE_T))GetProcAddress(GetModuleHandle(_T("kernel32")),"SetProcessWorkingSetSize");
hCListImages = ImageList_Create(16, 16, ILC_MASK|ILC_COLOR32, 32, 0);
InitCustomMenus();
InitTray();
- {
- HINSTANCE hUser = GetModuleHandleA("USER32");
- MyMonitorFromPoint = ( pfnMyMonitorFromPoint )GetProcAddress( hUser,"MonitorFromPoint" );
- MyMonitorFromWindow = ( pfnMyMonitorFromWindow )GetProcAddress( hUser, "MonitorFromWindow" );
- MyGetMonitorInfo = ( pfnMyGetMonitorInfo )GetProcAddress( hUser, "GetMonitorInfoW");
- }
- CLUI::InitClui();
+ HINSTANCE hUser = GetModuleHandleA("USER32");
+ MyMonitorFromPoint = ( pfnMyMonitorFromPoint )GetProcAddress( hUser,"MonitorFromPoint" );
+ MyMonitorFromWindow = ( pfnMyMonitorFromWindow )GetProcAddress( hUser, "MonitorFromWindow" );
+ MyGetMonitorInfo = ( pfnMyGetMonitorInfo )GetProcAddress( hUser, "GetMonitorInfoW");
+
+ CLUI::InitClui();
return S_OK;
}
@@ -314,7 +289,13 @@ __inline DWORD GetDIBPixelColor(int X, int Y, int Width, int Height, int ByteWid
return res;
}
-int GetWindowVisibleState(HWND hWnd, int iStepX, int iStepY) {
+int GetWindowVisibleState(HWND hWnd, int iStepX, int iStepY)
+{
+ if (hWnd == NULL) {
+ SetLastError(0x00000006); //Wrong handle
+ return -1;
+ }
+
RECT rc = { 0 };
POINT pt = { 0 };
register int i=0,
@@ -325,153 +306,146 @@ int GetWindowVisibleState(HWND hWnd, int iStepX, int iStepY) {
iNotCoveredDots = 0;
HWND hAux = 0;
- if (hWnd == NULL) {
- SetLastError(0x00000006); //Wrong handle
- return -1;
- }
//Some defaults now. The routine is designed for thin and tall windows.
if (iStepX <= 0) iStepX = 8;
if (iStepY <= 0) iStepY = 16;
HWND hwndFocused = GetFocus();
- if (IsIconic(hWnd) || !IsWindowVisible(hWnd))
+ if ( IsIconic(hWnd) || !IsWindowVisible(hWnd))
return GWVS_HIDDEN;
- else if ( db_get_b(NULL,"CList","OnDesktop",SETTING_ONDESKTOP_DEFAULT) || !db_get_b(NULL, "CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT))
+
+ if ( db_get_b(NULL,"CList","OnDesktop",SETTING_ONDESKTOP_DEFAULT) || !db_get_b(NULL, "CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT))
return GWVS_VISIBLE;
- else if ( hwndFocused == pcli->hwndContactList || GetParent(hwndFocused) == pcli->hwndContactList )
+
+ if ( hwndFocused == pcli->hwndContactList || GetParent(hwndFocused) == pcli->hwndContactList )
return GWVS_VISIBLE;
+
+ int hstep,vstep;
+ BITMAP bmp;
+ HBITMAP WindowImage;
+ int maxx = 0;
+ int maxy = 0;
+ int wx = 0;
+ int dx,dy;
+ BYTE *ptr = NULL;
+ HRGN rgn = NULL;
+ WindowImage = g_CluiData.fLayered?ske_GetCurrentWindowImage():0;
+ if (WindowImage && g_CluiData.fLayered)
+ {
+ GetObject(WindowImage,sizeof(BITMAP),&bmp);
+ ptr = (BYTE*)bmp.bmBits;
+ maxx = bmp.bmWidth;
+ maxy = bmp.bmHeight;
+ wx = bmp.bmWidthBytes;
+ }
else
{
- int hstep,vstep;
- BITMAP bmp;
- HBITMAP WindowImage;
- int maxx = 0;
- int maxy = 0;
- int wx = 0;
- int dx,dy;
- BYTE *ptr = NULL;
- HRGN rgn = NULL;
- WindowImage = g_CluiData.fLayered?ske_GetCurrentWindowImage():0;
- if (WindowImage && g_CluiData.fLayered)
- {
- GetObject(WindowImage,sizeof(BITMAP),&bmp);
- ptr = (BYTE*)bmp.bmBits;
- maxx = bmp.bmWidth;
- maxy = bmp.bmHeight;
- wx = bmp.bmWidthBytes;
- }
- else
- {
- RECT rc;
- int i=0;
- rgn = CreateRectRgn(0,0,1,1);
- GetWindowRect(hWnd,&rc);
- GetWindowRgn(hWnd,rgn);
- OffsetRgn(rgn,rc.left,rc.top);
- GetRgnBox(rgn,&rc);
- i = i;
- //maxx = rc.right;
- //maxy = rc.bottom;
- }
- GetWindowRect(hWnd, &rc);
- {
- RECT rcMonitor = {0};
- Docking_GetMonitorRectFromWindow(hWnd,&rcMonitor);
- rc.top = rc.top < rcMonitor.top?rcMonitor.top:rc.top;
- rc.left = rc.left < rcMonitor.left?rcMonitor.left:rc.left;
- rc.bottom = rc.bottom>rcMonitor.bottom?rcMonitor.bottom:rc.bottom;
- rc.right = rc.right>rcMonitor.right?rcMonitor.right:rc.right;
- }
- width = rc.right - rc.left;
- height = rc.bottom- rc.top;
- dx = -rc.left;
- dy = -rc.top;
- hstep = width/iStepX;
- vstep = height/iStepY;
- hstep = hstep>0?hstep:1;
- vstep = vstep>0?vstep:1;
-
- for (i = rc.top; i < rc.bottom; i += vstep) {
- pt.y = i;
- for (j = rc.left; j < rc.right; j += hstep) {
- BOOL po = FALSE;
- pt.x = j;
- if (rgn)
- po = PtInRegion(rgn,j,i);
- else
- {
- DWORD a = (GetDIBPixelColor(j+dx,i+dy,maxx,maxy,wx,ptr)&0xFF000000)>>24;
- a = ((a*g_CluiData.bCurrentAlpha)>>8);
- po = (a>16);
- }
- if (po || (!rgn && ptr == 0))
- {
- BOOL hWndFound = FALSE;
- HWND hAuxOld = NULL;
- hAux = WindowFromPoint(pt);
- do
+ RECT rc;
+ int i=0;
+ rgn = CreateRectRgn(0,0,1,1);
+ GetWindowRect(hWnd,&rc);
+ GetWindowRgn(hWnd,rgn);
+ OffsetRgn(rgn,rc.left,rc.top);
+ GetRgnBox(rgn,&rc);
+ i = i;
+ //maxx = rc.right;
+ //maxy = rc.bottom;
+ }
+ GetWindowRect(hWnd, &rc);
+ {
+ RECT rcMonitor = {0};
+ Docking_GetMonitorRectFromWindow(hWnd,&rcMonitor);
+ rc.top = rc.top < rcMonitor.top?rcMonitor.top:rc.top;
+ rc.left = rc.left < rcMonitor.left?rcMonitor.left:rc.left;
+ rc.bottom = rc.bottom>rcMonitor.bottom?rcMonitor.bottom:rc.bottom;
+ rc.right = rc.right>rcMonitor.right?rcMonitor.right:rc.right;
+ }
+ width = rc.right - rc.left;
+ height = rc.bottom- rc.top;
+ dx = -rc.left;
+ dy = -rc.top;
+ hstep = width/iStepX;
+ vstep = height/iStepY;
+ hstep = hstep>0?hstep:1;
+ vstep = vstep>0?vstep:1;
+
+ for (i = rc.top; i < rc.bottom; i += vstep) {
+ pt.y = i;
+ for (j = rc.left; j < rc.right; j += hstep) {
+ BOOL po = FALSE;
+ pt.x = j;
+ if (rgn)
+ po = PtInRegion(rgn,j,i);
+ else
+ {
+ DWORD a = (GetDIBPixelColor(j+dx,i+dy,maxx,maxy,wx,ptr)&0xFF000000)>>24;
+ a = ((a*g_CluiData.bCurrentAlpha)>>8);
+ po = (a>16);
+ }
+
+ if (po || (!rgn && ptr == 0)) {
+ BOOL hWndFound = FALSE;
+ HWND hAuxOld = NULL;
+ hAux = WindowFromPoint(pt);
+ do {
+ if (hAux == hWnd) {
+ hWndFound = TRUE;
+ break;
+ }
+ //hAux = GetParent(hAux);
+ hAuxOld = hAux;
+ hAux = fnGetAncestor(hAux,GA_ROOTOWNER);
+ if (hAuxOld == hAux)
{
- if (hAux == hWnd)
+ TCHAR buf[255];
+ GetClassName(hAux,buf,SIZEOF(buf));
+ if ( !lstrcmp(buf,CLUIFrameSubContainerClassName))
{
hWndFound = TRUE;
break;
}
- //hAux = GetParent(hAux);
- hAuxOld = hAux;
- hAux = fnGetAncestor(hAux,GA_ROOTOWNER);
- if (hAuxOld == hAux)
- {
- TCHAR buf[255];
- GetClassName(hAux,buf,SIZEOF(buf));
- if ( !lstrcmp(buf,CLUIFrameSubContainerClassName))
- {
- hWndFound = TRUE;
- break;
- }
- }
- }while(hAux != NULL && hAuxOld != hAux);
-
- if (hWndFound) //There's window!
- iNotCoveredDots++; //Let's count the not covered dots.
- iCountedDots++; //Let's keep track of how many dots we checked.
+ }
}
+ while(hAux != NULL && hAuxOld != hAux);
+
+ if (hWndFound) //There's window!
+ iNotCoveredDots++; //Let's count the not covered dots.
+ iCountedDots++; //Let's keep track of how many dots we checked.
}
}
- if (rgn) DeleteObject(rgn);
- if ( iCountedDots - iNotCoveredDots < 2) //Every dot was not covered: the window is visible.
- return GWVS_VISIBLE;
- else if (iNotCoveredDots == 0) //They're all covered!
- return GWVS_COVERED;
- else //There are dots which are visible, but they are not as many as the ones we counted: it's partially covered.
- return GWVS_PARTIALLY_COVERED;
}
+ if (rgn) DeleteObject(rgn);
+
+ if ( iCountedDots - iNotCoveredDots < 2) //Every dot was not covered: the window is visible.
+ return GWVS_VISIBLE;
+
+ if (iNotCoveredDots == 0) //They're all covered!
+ return GWVS_COVERED;
+
+ //There are dots which are visible, but they are not as many as the ones we counted: it's partially covered.
+ return GWVS_PARTIALLY_COVERED;
}
+
BYTE g_bCalledFromShowHide = 0;
+
int cliShowHide(WPARAM wParam,LPARAM lParam)
{
BOOL bShow = FALSE;
int iVisibleState = GetWindowVisibleState(pcli->hwndContactList,0,0);
- int method;
- method = db_get_b(NULL, "ModernData", "HideBehind", SETTING_HIDEBEHIND_DEFAULT);; //(0-none, 1-leftedge, 2-rightedge);
- if (method)
- {
+ int method = db_get_b(NULL, "ModernData", "HideBehind", SETTING_HIDEBEHIND_DEFAULT);; //(0-none, 1-leftedge, 2-rightedge);
+ if (method) {
if (db_get_b(NULL, "ModernData", "BehindEdge", SETTING_BEHINDEDGE_DEFAULT) == 0 && lParam != 1)
- {
- //hide
- CLUI_HideBehindEdge();
- }
+ CLUI_HideBehindEdge(); //hide
else
- {
CLUI_ShowFromBehindEdge();
- }
+
bShow = TRUE;
iVisibleState = GWVS_HIDDEN;
}
- if ( !method && db_get_b(NULL, "ModernData", "BehindEdge", SETTING_BEHINDEDGE_DEFAULT)>0)
- {
+ if ( !method && db_get_b(NULL, "ModernData", "BehindEdge", SETTING_BEHINDEDGE_DEFAULT) > 0) {
g_CluiData.bBehindEdgeSettings = db_get_b(NULL, "ModernData", "BehindEdge", SETTING_BEHINDEDGE_DEFAULT);
CLUI_ShowFromBehindEdge();
g_CluiData.bBehindEdgeSettings = 0;
@@ -481,25 +455,23 @@ int cliShowHide(WPARAM wParam,LPARAM lParam)
//bShow is FALSE when we enter the switch if no hide behind edge.
switch (iVisibleState) {
- case GWVS_PARTIALLY_COVERED:
- bShow = TRUE; break;
- case GWVS_COVERED: //Fall through (and we're already falling)
- bShow = TRUE; break;
- case GWVS_HIDDEN:
- bShow = TRUE; break;
- case GWVS_VISIBLE: //This is not needed, but goes for readability.
- bShow = FALSE; break;
- case -1: //We can't get here, both pcli->hwndContactList and iStepX and iStepY are right.
- return 0;
+ case GWVS_PARTIALLY_COVERED:
+ bShow = TRUE; break;
+ case GWVS_COVERED: //Fall through (and we're already falling)
+ bShow = TRUE; break;
+ case GWVS_HIDDEN:
+ bShow = TRUE; break;
+ case GWVS_VISIBLE: //This is not needed, but goes for readability.
+ bShow = FALSE; break;
+ case -1: //We can't get here, both pcli->hwndContactList and iStepX and iStepY are right.
+ return 0;
}
- if ((bShow == TRUE || lParam == 1))
- {
+ if ((bShow == TRUE || lParam == 1)) {
Sync( CLUIFrames_ActivateSubContainers, TRUE );
CLUI_ShowWindowMod(pcli->hwndContactList, SW_RESTORE);
- if ( !db_get_b(NULL,"CList","OnDesktop",SETTING_ONDESKTOP_DEFAULT))
- {
+ if ( !db_get_b(NULL,"CList","OnDesktop",SETTING_ONDESKTOP_DEFAULT)) {
Sync(CLUIFrames_OnShowHide, pcli->hwndContactList,1); //TO BE PROXIED
SetWindowPos(pcli->hwndContactList, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE |SWP_NOACTIVATE);
g_bCalledFromShowHide = 1;
@@ -507,8 +479,7 @@ int cliShowHide(WPARAM wParam,LPARAM lParam)
SetWindowPos(pcli->hwndContactList, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
g_bCalledFromShowHide = 0;
}
- else
- {
+ else {
SetWindowPos(pcli->hwndContactList, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
Sync(CLUIFrames_OnShowHide, pcli->hwndContactList,1);
SetForegroundWindow(pcli->hwndContactList);
@@ -518,29 +489,20 @@ int cliShowHide(WPARAM wParam,LPARAM lParam)
RECT rcWindow;
GetWindowRect(pcli->hwndContactList,&rcWindow);
if (Utils_AssertInsideScreen(&rcWindow) == 1)
- {
MoveWindow(pcli->hwndContactList, rcWindow.left, rcWindow.top,
rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
- }
-
- //if (DBGetContactSettingByte(NULL,"CList","OnDesktop",SETTING_ONDESKTOP_DEFAULT))
- // SetWindowPos(pcli->hwndContactList, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
-
}
else { //It needs to be hidden
- if (GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)
- {
+ if (GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) {
CListMod_HideWindow(pcli->hwndContactList, SW_HIDE);
db_set_b(NULL,"CList","State",SETTING_STATE_HIDDEN);
}
- else
- {
+ else {
if (db_get_b(NULL,"CList","Min2Tray",SETTING_MIN2TRAY_DEFAULT)) {
CLUI_ShowWindowMod(pcli->hwndContactList, SW_HIDE);
db_set_b(NULL,"CList","State",SETTING_STATE_HIDDEN);
}
- else
- {
+ else {
CLUI_ShowWindowMod(pcli->hwndContactList, SW_MINIMIZE);
db_set_b(NULL,"CList","State",SETTING_STATE_MINIMIZED);
}