From 725f68b6808a8a30778f58223fac75386f082785 Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Fri, 18 May 2012 22:10:43 +0000 Subject: plugins folders renaming git-svn-id: http://svn.miranda-ng.org/main/trunk@61 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Modernb/modern_cluiframes.cpp | 4242 +++++++++++++++++++++++++++++++++ 1 file changed, 4242 insertions(+) create mode 100644 plugins/Modernb/modern_cluiframes.cpp (limited to 'plugins/Modernb/modern_cluiframes.cpp') diff --git a/plugins/Modernb/modern_cluiframes.cpp b/plugins/Modernb/modern_cluiframes.cpp new file mode 100644 index 0000000000..4da12ab2f2 --- /dev/null +++ b/plugins/Modernb/modern_cluiframes.cpp @@ -0,0 +1,4242 @@ +/* +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2008 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 "hdr/modern_commonheaders.h" +#include "m_api/m_skin_eng.h" +#include "hdr/modern_cluiframes.h" +#include "hdr/modern_commonprototypes.h" +#include "hdr/modern_sync.h" + + +// ALL THIS MODULE FUNCTION SHOULD BE EXECUTED FROM MAIN THREAD + +#include "hdr/modern_static_cluiframes_service.h" // contain services initialization and proxiation + + +static const int UNCOLLAPSED_FRAME_SIZE = 0; +static const int DEFAULT_TITLEBAR_HEIGHT = 18; + +//GLOBALS +FRAMEWND * g_pfwFrames = NULL; +int g_nFramesCount = 0; +int g_nTitleBarHeight = DEFAULT_TITLEBAR_HEIGHT; + +// STATIC + +enum { + frame_menu_lock = 1, + frame_menu_visible, + frame_menu_showtitlebar, + frame_menu_floating +}; //legacy menu support + +enum { eUnknownId = -1 }; + +static int _us_DoSetFrameFloat( WPARAM wParam,LPARAM lParam ); +static int CLUIFrameResizeFloatingFrame( int framepos ); +static HWND CreateSubContainerWindow( HWND parent,int x,int y,int width,int height ); +static BOOL CLUIFramesFitInSize(); +static int RemoveItemFromList(int pos, FRAMEWND **lpFrames, int *FrameItemCount ); +static int _us_DoSetFramePaintProc(WPARAM wParam, LPARAM lParam); + + + +static CRITICAL_SECTION _cluiFramesModuleCS = {0}; +static BOOL _cluiFramesModuleCSInitialized = FALSE; +static BOOL _fCluiFramesModuleNotStarted = TRUE; +static XPTHANDLE _hFrameTitleTheme = NULL; +static int _nClientFrameId = eUnknownId; //for fast access to frame with alclient properties +static int _iNextFrameId = 100; +static HFONT _hTitleBarFont = NULL; + +// menus +static HGENMENU _hmiVisible = (HGENMENU)-1; +static HGENMENU _hmiTBVisible = (HGENMENU)-1; +static HGENMENU _hmiLock = (HGENMENU)-1; +static HGENMENU _hmiColl = (HGENMENU)-1; +static HGENMENU _hmiFloating = (HGENMENU)-1; +static HGENMENU _hmiAlignRoot = (HGENMENU)-1; +static HGENMENU _hmiAlignTop = (HGENMENU)-1; +static HGENMENU _hmiAlignClient = (HGENMENU)-1; +static HGENMENU _hmiAlignBottom = (HGENMENU)-1; +static HGENMENU _hmiPosRoot = (HGENMENU)-1; +static HGENMENU _hmiPosUp = (HGENMENU)-1; +static HGENMENU _hmiPosDown = (HGENMENU)-1; +static HGENMENU _hmiBorder = (HGENMENU)-1; +static HGENMENU _hmiRoot = (HGENMENU)-1; + +// others +static int _nContactListHeight = 0; +static DWORD _dwLastStoreTick = 0; + +HWND hWndExplorerToolBar; +static int GapBetweenFrames=1; + +BOOLEAN bMoveTogether; +int recurs_prevent=0; +static BOOL PreventSizeCalling=FALSE; + +static HBITMAP hBmpBackground; +static int backgroundBmpUse; +static COLORREF bkColour; +static COLORREF SelBkColour; +static BOOL bkUseWinColours; +boolean AlignCOLLIconToLeft; //will hide frame icon +COLORREF sttGetColor(char * module, char * color, COLORREF defColor); +//for old multiwindow +#define MPCF_CONTEXTFRAMEMENU 3 +POINT ptOld; +short nLeft = 0; +short nTop = 0; + +static int sortfunc(const void *a,const void *b) +{ + SortData *sd1,*sd2; + sd1=(SortData *)a; + sd2=(SortData *)b; + if (sd1->order > sd2->order){return(1);}; + if (sd1->order < sd2->order){return(-1);}; + return (0); +}; +int CLUIFrames_OnMoving( HWND hwnd, RECT * r) +{ + int i; + g_CluiData.mutexPreventDockMoving=0; + for(i=0;ileft-wr.left)+pt.x; + dy=(r->top-wr.top)+pt.y; + x=Frame->wndSize.left; + y=Frame->wndSize.top; + SetWindowPos(Frame->OwnerWindow,NULL,x+dx,y+dy,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSENDCHANGING|SWP_ASYNCWINDOWPOS|SWP_DEFERERASE|SWP_NOOWNERZORDER); + }; + + } + g_CluiData.mutexPreventDockMoving=1; + AniAva_RedrawAllAvatars(FALSE); + return 0; +} +int SetAlpha(BYTE Alpha) +{ + int i; + + for(i=0;ihwndContactList) + g_CluiData.fOnDesktop=1; + else + g_CluiData.fOnDesktop=0; + for(i=0;ihwndContactList); + AniAva_RedrawAllAvatars(TRUE); + return 0; +} +static int RemoveItemFromList(int pos,FRAMEWND **lpFrames,int *FrameItemCount) +{ + memmove(&((*lpFrames)[pos]),&((*lpFrames)[pos+1]),sizeof(FRAMEWND)*(*FrameItemCount-pos-1)); + (*FrameItemCount)--; + (*lpFrames)=(FRAMEWND*)realloc((*lpFrames),sizeof(FRAMEWND)*(*FrameItemCount)); + return 0; +} + +static int id2pos(int id) +{ + int i; + if (_fCluiFramesModuleNotStarted) return -1; + for (i=0;iid; + else return 0; +} +FRAMEWND * FindFrameByItsHWND(HWND FrameHwnd) +{ + int i; + if ( FrameHwnd == NULL ) return( NULL ); + for(i=0;idockOpt.hwndLeft == NULL ) && ( pThumbLeft->dockOpt.hwndRight == NULL ) ) + { + pThumbRight->dockOpt.hwndLeft = pThumbLeft->ContainerWnd; + pThumbLeft->dockOpt.hwndRight = pThumbRight->ContainerWnd; + } +} + + +static void UndockThumbs( FRAMEWND *pThumb1, FRAMEWND *pThumb2 ) +{ + if ( ( pThumb1 == NULL ) || ( pThumb2 == NULL ) ) + { + return; + } + + if ( pThumb1->dockOpt.hwndRight == pThumb2->ContainerWnd ) + { + pThumb1->dockOpt.hwndRight = NULL; + } + + if ( pThumb1->dockOpt.hwndLeft == pThumb2->ContainerWnd ) + { + pThumb1->dockOpt.hwndLeft = NULL; + } + + if ( pThumb2->dockOpt.hwndRight == pThumb1->ContainerWnd ) + { + pThumb2->dockOpt.hwndRight = NULL; + } + + if ( pThumb2->dockOpt.hwndLeft == pThumb1->ContainerWnd ) + { + pThumb2->dockOpt.hwndLeft = NULL; + } +} +static void PositionThumb( FRAMEWND *pThumb, short nX, short nY ) +{ + FRAMEWND *pCurThumb = &g_pfwFrames[0]; + FRAMEWND *pDockThumb = pThumb; + FRAMEWND fakeMainWindow; + FRAMEWND fakeTaskBarWindow; + RECT rc; + RECT rcThumb; + RECT rcOld; + SIZE sizeScreen; + int nNewX; + int nNewY; + int nOffs = 10; + int nWidth; + int nHeight; + POINT pt; + RECT rcLeft; + RECT rcTop; + RECT rcRight; + RECT rcBottom; + BOOL bDocked; + BOOL bDockedLeft; + BOOL bDockedRight; + BOOL bLeading; + int frmidx=0; + + if ( pThumb == NULL ) return; + + sizeScreen.cx = GetSystemMetrics( SM_CXSCREEN ); + sizeScreen.cy = GetSystemMetrics( SM_CYSCREEN ); + + // Get thumb dimnsions + GetWindowRect( pThumb->ContainerWnd, &rcThumb ); + nWidth = rcThumb.right - rcThumb.left; + nHeight = rcThumb.bottom - rcThumb.top; + + // Docking to the edges of the screen + nNewX = nX < nOffs ? 0 : nX; + nNewX = nNewX > ( sizeScreen.cx - nWidth - nOffs ) ? ( sizeScreen.cx - nWidth ) : nNewX; + nNewY = nY < nOffs ? 0 : nY; + nNewY = nNewY > ( sizeScreen.cy - nHeight - nOffs ) ? ( sizeScreen.cy - nHeight ) : nNewY; + + bLeading = pThumb->dockOpt.hwndRight != NULL; + + if ( bMoveTogether ) + { + UndockThumbs( pThumb, FindFrameByWnd( pThumb->dockOpt.hwndLeft ) ); + GetWindowRect( pThumb->ContainerWnd, &rcOld ); + } + + memset(&fakeMainWindow,0,sizeof(fakeMainWindow)); + fakeMainWindow.ContainerWnd=pcli->hwndContactList; + fakeMainWindow.floating=TRUE; + + memset(&fakeTaskBarWindow,0,sizeof(fakeTaskBarWindow)); + fakeTaskBarWindow.ContainerWnd=hWndExplorerToolBar; + fakeTaskBarWindow.floating=TRUE; + + + while( pCurThumb != NULL ) + { + if (pCurThumb->floating) { + + if ( pCurThumb != pThumb ) + { + GetWindowRect( pThumb->ContainerWnd, &rcThumb ); + OffsetRect( &rcThumb, nX - rcThumb.left, nY - rcThumb.top ); + + GetWindowRect( pCurThumb->ContainerWnd, &rc ); + + // These are rects we will dock into + + rcLeft.left = rc.left - nOffs; + rcLeft.top = rc.top - nOffs; + rcLeft.right = rc.left + nOffs; + rcLeft.bottom = rc.bottom + nOffs; + + rcTop.left = rc.left - nOffs; + rcTop.top = rc.top - nOffs; + rcTop.right = rc.right + nOffs; + rcTop.bottom = rc.top + nOffs; + + rcRight.left = rc.right - nOffs; + rcRight.top = rc.top - nOffs; + rcRight.right = rc.right + nOffs; + rcRight.bottom = rc.bottom + nOffs; + + rcBottom.left = rc.left - nOffs; + rcBottom.top = rc.bottom - nOffs; + rcBottom.right = rc.right + nOffs; + rcBottom.bottom = rc.bottom + nOffs; + + + bDockedLeft = FALSE; + bDockedRight = FALSE; + + // Upper-left + pt.x = rcThumb.left; + pt.y = rcThumb.top; + bDocked = FALSE; + + if ( PtInRect( &rcRight, pt ) ) + { + nNewX = rc.right; + bDocked = TRUE; + } + + if ( PtInRect( &rcBottom, pt ) ) + { + nNewY = rc.bottom; + + if ( PtInRect( &rcLeft, pt ) ) + { + nNewX = rc.left; + } + } + + if ( PtInRect( &rcTop, pt ) ) + { + nNewY = rc.top; + bDockedLeft = bDocked; + } + + // Upper-right + pt.x = rcThumb.right; + pt.y = rcThumb.top; + bDocked = FALSE; + + if ( !bLeading && PtInRect( &rcLeft, pt ) ) + { + if ( !bDockedLeft ) + { + nNewX = rc.left - nWidth; + bDocked = TRUE; + } + else if ( rc.right == rcThumb.left ) + { + bDocked = TRUE; + } + } + + + if ( PtInRect( &rcBottom, pt ) ) + { + nNewY = rc.bottom; + + if ( PtInRect( &rcRight, pt ) ) + { + nNewX = rc.right - nWidth; + } + } + + if ( !bLeading && PtInRect( &rcTop, pt ) ) + { + nNewY = rc.top; + bDockedRight = bDocked; + } + + if ( bMoveTogether ) + { + if ( bDockedRight ) + { + DockThumbs( pThumb, pCurThumb, TRUE ); + } + + if ( bDockedLeft ) + { + DockThumbs( pCurThumb, pThumb, FALSE ); + } + } + + // Lower-left + pt.x = rcThumb.left; + pt.y = rcThumb.bottom; + + if ( PtInRect( &rcRight, pt ) ) + { + nNewX = rc.right; + } + + if ( PtInRect( &rcTop, pt ) ) + { + nNewY = rc.top - nHeight; + + if ( PtInRect( &rcLeft, pt ) ) + { + nNewX = rc.left; + } + } + + + // Lower-right + pt.x = rcThumb.right; + pt.y = rcThumb.bottom; + + if ( !bLeading && PtInRect( &rcLeft, pt ) ) + { + nNewX = rc.left - nWidth; + } + + if ( !bLeading && PtInRect( &rcTop, pt ) ) + { + nNewY = rc.top - nHeight; + + if ( PtInRect( &rcRight, pt ) ) + { + nNewX = rc.right - nWidth; + } + } + } + + }; + frmidx++; + if (pCurThumb->ContainerWnd==fakeTaskBarWindow.ContainerWnd){break;}; + if (pCurThumb->ContainerWnd==fakeMainWindow.ContainerWnd){ + pCurThumb=&fakeTaskBarWindow;continue;}; + if (frmidx==g_nFramesCount){ + pCurThumb=&fakeMainWindow;continue; + } + + pCurThumb = &g_pfwFrames[frmidx]; + + + + } + + // Adjust coords once again + nNewX = nNewX < nOffs ? 0 : nNewX; + nNewX = nNewX > ( sizeScreen.cx - nWidth - nOffs ) ? ( sizeScreen.cx - nWidth ) : nNewX; + nNewY = nNewY < nOffs ? 0 : nNewY; + nNewY = nNewY > ( sizeScreen.cy - nHeight - nOffs ) ? ( sizeScreen.cy - nHeight ) : nNewY; + + + SetWindowPos( pThumb->ContainerWnd, + HWND_TOPMOST, + nNewX, + nNewY, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER|SWP_NOACTIVATE ); + + + // OK, move all g_CluiData.fDocked thumbs + if ( bMoveTogether ) + { + pDockThumb = FindFrameByWnd( pDockThumb->dockOpt.hwndRight ); + + PositionThumb( pDockThumb, (short)( nNewX + nWidth ), (short)nNewY ); + } +} + + + +static void GetBorderSize(HWND hwnd,RECT *rect) +{ + RECT wr,cr; + POINT pt1,pt2; + // RECT r={0}; + // *rect=r; + // return; + GetWindowRect(hwnd,&wr); + GetClientRect(hwnd,&cr); + pt1.y=cr.top;pt1.x=cr.left; + pt2.y=cr.bottom;pt2.x=cr.right; + + ClientToScreen(hwnd,&pt1); + ClientToScreen(hwnd,&pt2); + + cr.top=pt1.y;cr.left=pt1.x; + cr.bottom=pt2.y;cr.right=pt2.x; + + rect->top=cr.top-wr.top; + rect->left=cr.left-wr.left; + rect->right=wr.right-cr.right; + rect->bottom=wr.bottom-cr.bottom; + //if (rect->top+rect->bottom>10){rect->top=rect->bottom=2;}; + //if (rect->left+rect->right>10){rect->top=rect->bottom=2;}; + +}; + +static char __inline *AS(char *str,const char *setting,char *addstr) +{ + if(str!=NULL) { + strcpy(str,setting); + strcat(str,addstr); + } + return str; +} + +static int DBLoadFrameSettingsAtPos(int pos,int Frameid) +{ + char sadd[15]; + char buf[255]; + // char *oldtb; + + _itoa(pos,sadd,10); + + //DBWriteContactSettingString(0,CLUIFrameModule,strcat("Name",sadd),Frames[Frameid].name); + //boolean + g_pfwFrames[Frameid].collapsed=ModernGetSettingByte(0,CLUIFrameModule,AS(buf,"Collapse",sadd),g_pfwFrames[Frameid].collapsed); + + g_pfwFrames[Frameid].Locked =ModernGetSettingByte(0,CLUIFrameModule,AS(buf,"Locked",sadd),g_pfwFrames[Frameid].Locked); + g_pfwFrames[Frameid].visible =ModernGetSettingByte(0,CLUIFrameModule,AS(buf,"Visible",sadd),g_pfwFrames[Frameid].visible); + g_pfwFrames[Frameid].TitleBar.ShowTitleBar =ModernGetSettingByte(0,CLUIFrameModule,AS(buf,"TBVisile",sadd),g_pfwFrames[Frameid].TitleBar.ShowTitleBar); + + g_pfwFrames[Frameid].height =ModernGetSettingWord(0,CLUIFrameModule,AS(buf,"Height",sadd),g_pfwFrames[Frameid].height); + g_pfwFrames[Frameid].HeightWhenCollapsed =ModernGetSettingWord(0,CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),0); + g_pfwFrames[Frameid].align =ModernGetSettingWord(0,CLUIFrameModule,AS(buf,"Align",sadd),g_pfwFrames[Frameid].align); + + g_pfwFrames[Frameid].FloatingPos.x =ModernGetSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatX",sadd),100,0,2048); + g_pfwFrames[Frameid].FloatingPos.y =ModernGetSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatY",sadd),100,0,2048); + g_pfwFrames[Frameid].FloatingSize.x =ModernGetSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatW",sadd),100,0,2048); + g_pfwFrames[Frameid].FloatingSize.y =ModernGetSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatH",sadd),100,0,2048); + + g_pfwFrames[Frameid].floating =ModernGetSettingByte(0,CLUIFrameModule,AS(buf,"Floating",sadd),0); + g_pfwFrames[Frameid].order =ModernGetSettingWord(0,CLUIFrameModule,AS(buf,"Order",sadd),0); + + g_pfwFrames[Frameid].UseBorder =ModernGetSettingByte(0,CLUIFrameModule,AS(buf,"UseBorder",sadd),g_pfwFrames[Frameid].UseBorder); + + return 0; +} + +static int DBStoreFrameSettingsAtPos(int pos,int Frameid) +{ + char sadd[16]; + char buf[255]; + + _itoa(pos,sadd,10); + + ModernWriteSettingTString(0,CLUIFrameModule,AS(buf,"Name",sadd),g_pfwFrames[Frameid].Name); + //boolean + ModernWriteSettingByte(0,CLUIFrameModule,AS(buf,"Collapse",sadd),(BYTE)btoint(g_pfwFrames[Frameid].collapsed)); + ModernWriteSettingByte(0,CLUIFrameModule,AS(buf,"Locked",sadd),(BYTE)btoint(g_pfwFrames[Frameid].Locked)); + ModernWriteSettingByte(0,CLUIFrameModule,AS(buf,"Visible",sadd),(BYTE)btoint(g_pfwFrames[Frameid].visible)); + ModernWriteSettingByte(0,CLUIFrameModule,AS(buf,"TBVisile",sadd),(BYTE)btoint(g_pfwFrames[Frameid].TitleBar.ShowTitleBar)); + + ModernWriteSettingWord(0,CLUIFrameModule,AS(buf,"Height",sadd),(WORD)g_pfwFrames[Frameid].height); + ModernWriteSettingWord(0,CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),(WORD)g_pfwFrames[Frameid].HeightWhenCollapsed); + ModernWriteSettingWord(0,CLUIFrameModule,AS(buf,"Align",sadd),(WORD)g_pfwFrames[Frameid].align); + //FloatingPos + ModernWriteSettingWord(0,CLUIFrameModule,AS(buf,"FloatX",sadd),(WORD)g_pfwFrames[Frameid].FloatingPos.x); + ModernWriteSettingWord(0,CLUIFrameModule,AS(buf,"FloatY",sadd),(WORD)g_pfwFrames[Frameid].FloatingPos.y); + ModernWriteSettingWord(0,CLUIFrameModule,AS(buf,"FloatW",sadd),(WORD)g_pfwFrames[Frameid].FloatingSize.x); + ModernWriteSettingWord(0,CLUIFrameModule,AS(buf,"FloatH",sadd),(WORD)g_pfwFrames[Frameid].FloatingSize.y); + + ModernWriteSettingByte(0,CLUIFrameModule,AS(buf,"Floating",sadd),(BYTE)btoint(g_pfwFrames[Frameid].floating)); + ModernWriteSettingByte(0,CLUIFrameModule,AS(buf,"UseBorder",sadd),(BYTE)btoint(g_pfwFrames[Frameid].UseBorder)); + ModernWriteSettingWord(0,CLUIFrameModule,AS(buf,"Order",sadd),(WORD)g_pfwFrames[Frameid].order); + return 0; +} + +static int LocateStorePosition(int Frameid,int maxstored) +{ + + if(g_pfwFrames[Frameid].Name==NULL) + return -1; + char settingname[255]; + for( int i=0;i=g_nFramesCount) return -1; + + maxstored=ModernGetSettingWord(0,CLUIFrameModule,"StoredFrames",-1); + if(maxstored==-1) return 0; + + storpos=LocateStorePosition(Frameid,maxstored); + if(storpos==-1) return 0; + + DBLoadFrameSettingsAtPos(storpos,Frameid); + return 0; +} + +static int CLUIFramesStoreFrameSettings(int Frameid) +{ + int maxstored,storpos; + + if (_fCluiFramesModuleNotStarted) return -1; + + if(Frameid<0||Frameid>=g_nFramesCount) return -1; + + maxstored=ModernGetSettingWord(0,CLUIFrameModule,"StoredFrames",-1); + if(maxstored==-1) maxstored=0; + + storpos=LocateStorePosition(Frameid,maxstored); + if(storpos==-1) {storpos=maxstored; maxstored++;} + + DBStoreFrameSettingsAtPos(storpos,Frameid); + ModernWriteSettingWord(0,CLUIFrameModule,"StoredFrames",(WORD)maxstored); + + return 0; +} + +static int CLUIFramesStoreAllFrames() +{ + int i; + if (_fCluiFramesModuleNotStarted) return -1; + for(i=0;i=0&&pos=0&&pos=g_nFramesCount) { + + return -1; + } + + switch(LOWORD(wParam)) + { + case FO_FLAGS: + retval=0; + if(g_pfwFrames[pos].visible) retval|=F_VISIBLE; + if(!g_pfwFrames[pos].collapsed) retval|=F_UNCOLLAPSED; + if(g_pfwFrames[pos].Locked) retval|=F_LOCKED; + if(g_pfwFrames[pos].TitleBar.ShowTitleBar) retval|=F_SHOWTB; + if(g_pfwFrames[pos].TitleBar.ShowTitleBarTip) retval|=F_SHOWTBTIP; + if (!g_CluiData.fLayered) + { + if(!(GetWindowLong(g_pfwFrames[pos].hWnd,GWL_STYLE)&WS_BORDER)) retval|=F_NOBORDER; + } + else + if(!g_pfwFrames[pos].UseBorder) retval|=F_NOBORDER; + + + break; + + case FO_NAME: + if (bUnicodeText) + retval=(INT_PTR)g_pfwFrames[pos].Name; + else + retval=(INT_PTR)g_pfwFrames[pos].szName; + break; + + case FO_TBNAME: + if (bUnicodeText) + retval=(INT_PTR)g_pfwFrames[pos].TitleBar.tbname; + else + retval=(INT_PTR)g_pfwFrames[pos].TitleBar.sztbname; + break; + + case FO_TBTIPNAME: + if (bUnicodeText) + retval=(INT_PTR)g_pfwFrames[pos].TitleBar.tooltip; + else + retval=(INT_PTR)g_pfwFrames[pos].TitleBar.sztooltip; + break; + + case FO_TBSTYLE: + retval=GetWindowLong(g_pfwFrames[pos].TitleBar.hwnd,GWL_STYLE); + break; + + case FO_TBEXSTYLE: + retval=GetWindowLong(g_pfwFrames[pos].TitleBar.hwnd,GWL_EXSTYLE); + break; + + case FO_ICON: + retval=(INT_PTR)g_pfwFrames[pos].TitleBar.hicon; + break; + + case FO_HEIGHT: + retval=(INT_PTR)g_pfwFrames[pos].height; + break; + + case FO_ALIGN: + retval=(INT_PTR)g_pfwFrames[pos].align; + break; + case FO_FLOATING: + retval=(INT_PTR)g_pfwFrames[pos].floating; + break; + default: + retval=-1; + break; + } + + return retval; +} + +static int UpdateTBToolTip(int framepos) +{ + { + TOOLINFO ti; + + ZeroMemory(&ti,sizeof(ti)); + ti.cbSize=sizeof(ti); + ti.lpszText=g_pfwFrames[framepos].TitleBar.tooltip; + ti.hinst=g_hInst; + ti.uFlags=TTF_IDISHWND|TTF_SUBCLASS ; + ti.uId=(UINT_PTR)g_pfwFrames[framepos].TitleBar.hwnd; + + return(SendMessage(g_pfwFrames[framepos].TitleBar.hwndTip,TTM_UPDATETIPTEXT ,(WPARAM)0,(LPARAM)&ti)); + } + +}; +//hiword(wParam)=frameid,loword(wParam)=flag +static int _us_DoSetFrameOptions(WPARAM wParam,LPARAM lParam) +{ + int pos; + int retval; // value to be returned + BOOL bUnicodeText=(LOWORD(wParam) & FO_UNICODETEXT)!=0; + wParam=MAKEWPARAM((LOWORD(wParam))& ~FO_UNICODETEXT, HIWORD(wParam)); + if (_fCluiFramesModuleNotStarted) return -1; + + + pos=id2pos(HIWORD(wParam)); + if(pos<0||pos>=g_nFramesCount) { + + return -1; + } + + switch(LOWORD(wParam)) + { + case FO_FLAGS:{ + int flag=lParam; + int style; + + g_pfwFrames[pos].dwFlags=flag; + g_pfwFrames[pos].visible=FALSE; + if(flag&F_VISIBLE) g_pfwFrames[pos].visible=TRUE; + + g_pfwFrames[pos].collapsed=TRUE; + if(flag&F_UNCOLLAPSED) g_pfwFrames[pos].collapsed=FALSE; + + g_pfwFrames[pos].Locked=FALSE; + if(flag&F_LOCKED) g_pfwFrames[pos].Locked=TRUE; + + g_pfwFrames[pos].UseBorder=TRUE; + if(flag&F_NOBORDER) g_pfwFrames[pos].UseBorder=FALSE; + + g_pfwFrames[pos].TitleBar.ShowTitleBar=FALSE; + if(flag&F_SHOWTB) g_pfwFrames[pos].TitleBar.ShowTitleBar=TRUE; + + g_pfwFrames[pos].TitleBar.ShowTitleBarTip=FALSE; + if(flag&F_SHOWTBTIP) g_pfwFrames[pos].TitleBar.ShowTitleBarTip=TRUE; + + SendMessageA(g_pfwFrames[pos].TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)g_pfwFrames[pos].TitleBar.ShowTitleBarTip,0); + + style=(int)GetWindowLong(g_pfwFrames[pos].hWnd,GWL_STYLE); + style&=(~WS_BORDER); + + if( !(flag&F_NOBORDER ) && !g_CluiData.fLayered ) style|=WS_BORDER; + + SetWindowLong(g_pfwFrames[pos].hWnd,GWL_STYLE,(long)style); + SetWindowLong(g_pfwFrames[pos].TitleBar.hwnd,GWL_STYLE,(long)style& ~(WS_VSCROLL | WS_HSCROLL)); + + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); + SetWindowPos(g_pfwFrames[pos].TitleBar.hwnd,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED|SWP_NOACTIVATE); + return 0; + } + + case FO_NAME: + if(lParam==(LPARAM)NULL) { return -1;} + if(g_pfwFrames[pos].Name!=NULL) mir_free(g_pfwFrames[pos].Name); + if(g_pfwFrames[pos].szName!=NULL) mir_free(g_pfwFrames[pos].szName); + if (bUnicodeText) + { + g_pfwFrames[pos].Name=mir_tstrdup((LPTSTR)lParam); + g_pfwFrames[pos].szName=mir_t2a((LPTSTR)lParam); + } + else + { + g_pfwFrames[pos].szName=mir_strdup((char*)lParam); + g_pfwFrames[pos].Name=mir_a2t((char *)lParam); + } + return 0; + + case FO_TBNAME: + if(lParam==(LPARAM)NULL) { return(-1);} + + if(g_pfwFrames[pos].TitleBar.tbname!=NULL) mir_free(g_pfwFrames[pos].TitleBar.tbname); + if(g_pfwFrames[pos].TitleBar.sztbname!=NULL) mir_free(g_pfwFrames[pos].TitleBar.sztbname); + if (bUnicodeText) + { + g_pfwFrames[pos].TitleBar.tbname=mir_tstrdup((LPTSTR)lParam); + g_pfwFrames[pos].TitleBar.sztbname=mir_t2a((LPTSTR)lParam); + } + else + { + g_pfwFrames[pos].TitleBar.sztbname=mir_strdup((char*)lParam); + g_pfwFrames[pos].TitleBar.tbname=mir_a2t((char*)lParam); + } + + if (g_pfwFrames[pos].floating&&(g_pfwFrames[pos].TitleBar.tbname!=NULL)){SetWindowText(g_pfwFrames[pos].ContainerWnd,g_pfwFrames[pos].TitleBar.tbname);}; + return 0; + + case FO_TBTIPNAME: + if(lParam==(LPARAM)NULL) { return(-1);} + if(g_pfwFrames[pos].TitleBar.tooltip!=NULL) mir_free_and_nill(g_pfwFrames[pos].TitleBar.tooltip); + if(g_pfwFrames[pos].TitleBar.sztooltip!=NULL) mir_free_and_nill(g_pfwFrames[pos].TitleBar.sztooltip); + if (bUnicodeText) + { + g_pfwFrames[pos].TitleBar.tooltip=mir_tstrdup((LPTSTR)lParam); + g_pfwFrames[pos].TitleBar.sztooltip=mir_t2a((LPTSTR)lParam); + } + else + { + g_pfwFrames[pos].TitleBar.sztooltip=mir_strdup((char*)lParam); + g_pfwFrames[pos].TitleBar.tooltip=mir_a2t((char*)lParam); + } + UpdateTBToolTip(pos); + + return 0; + + case FO_TBSTYLE: + SetWindowLong(g_pfwFrames[pos].TitleBar.hwnd,GWL_STYLE,lParam& ~(WS_VSCROLL | WS_HSCROLL)); + + return 0; + + case FO_TBEXSTYLE: + SetWindowLong(g_pfwFrames[pos].TitleBar.hwnd,GWL_EXSTYLE,lParam); + + return 0; + + case FO_ICON: + g_pfwFrames[pos].TitleBar.hicon=(HICON)lParam; + + return 0; + + case FO_HEIGHT: + if(lParam<0) { return -1;} + + if (g_pfwFrames[pos].collapsed) + { + int oldHeight=g_pfwFrames[pos].height; + retval=g_pfwFrames[pos].height; + g_pfwFrames[pos].height=lParam; + if(!CLUIFramesFitInSize()) g_pfwFrames[pos].height=retval; + retval=g_pfwFrames[pos].height; + if (g_pfwFrames[pos].height != oldHeight) + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); + } + else + { + retval=g_pfwFrames[pos].HeightWhenCollapsed; + g_pfwFrames[pos].HeightWhenCollapsed=lParam; + if(!CLUIFramesFitInSize()) g_pfwFrames[pos].HeightWhenCollapsed=retval; + retval=g_pfwFrames[pos].HeightWhenCollapsed; + + } + return retval; + + case FO_FLOATING: + if(lParam<0) { return -1;} + + { + int id=g_pfwFrames[pos].id; + g_pfwFrames[pos].floating=!(lParam); + + + CLUIFrames_SetFrameFloat(id,1);//lparam=1 use stored width and height + return(wParam); + } + + case FO_ALIGN: + if (!(lParam&alTop||lParam&alBottom||lParam&alClient)) + { + TRACE("Wrong align option \r\n"); + return (-1); + }; + + if((lParam&alClient)&&(CLUIFramesGetalClientFrame()>=0)) { //only one alClient frame possible + _nClientFrameId = eUnknownId;//recalc it + + return -1; + } + g_pfwFrames[pos].align=lParam; + + + return(0); + } + + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); + return -1; +} + +//wparam=lparam=0 +static int _us_DoShowAllFrames(WPARAM wParam,LPARAM lParam) +{ + int i; + + if (_fCluiFramesModuleNotStarted) return -1; + + for(i=0;ihwndContactList,(LPARAM)0); + return 0; +} + +//wparam=lparam=0 +static int _us_DoShowTitles(WPARAM wParam,LPARAM lParam) +{ + int i; + + if (_fCluiFramesModuleNotStarted) return -1; + + for(i=0;ihwndContactList,(LPARAM)0); + return 0; +} + +//wparam=lparam=0 +static int _us_DoHideTitles(WPARAM wParam,LPARAM lParam) +{ + int i; + + if (_fCluiFramesModuleNotStarted) return -1; + + for(i=0;ihwndContactList,(LPARAM)0); + return 0; +} + +//wparam=frameid +static int _us_DoShowHideFrame(WPARAM wParam,LPARAM lParam) +{ + int pos; + + if (_fCluiFramesModuleNotStarted) return -1; + + if (wParam == 0) { + pos = lParam; + } else { + pos=id2pos(wParam); + } + if(pos>=0&&(int)poshwndContactList))?SW_SHOW/*NOACTIVATE*/:SW_HIDE); + else if (g_pfwFrames[pos].visible) + { + g_pfwFrames[pos].OwnerWindow=CreateSubContainerWindow(pcli->hwndContactList,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,10,10); + SetParent(g_pfwFrames[pos].hWnd,g_pfwFrames[pos].OwnerWindow); + CLUI_ShowWindowMod(g_pfwFrames[pos].OwnerWindow,(g_pfwFrames[pos].visible && g_pfwFrames[pos].collapsed && IsWindowVisible(pcli->hwndContactList))?SW_SHOW/*NOACTIVATE*/:SW_HIDE); + } + } + if (g_pfwFrames[pos].floating){CLUIFrameResizeFloatingFrame(pos);}; + + if (!g_pfwFrames[pos].floating) CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); + } + return 0; +} + +//wparam=frameid +static int _us_DoShowHideFrameTitle(WPARAM wParam,LPARAM lParam) +{ + int pos; + + if (_fCluiFramesModuleNotStarted) return -1; + + if (wParam == 0) { + pos = lParam; + } else { + pos=id2pos(wParam); + } + if(pos>=0&&(int)pos + + + + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); + + + return 0; +} + +//wparam=frameid +//lparam=-1 up ,1 down +static int _us_DoMoveFrame(WPARAM wParam,LPARAM lParam) +{ + int pos,i,curpos,curalign,v,tmpval; + + if (_fCluiFramesModuleNotStarted) return -1; + + pos=id2pos(wParam); + if(pos>=0&&(int)pos=v-1) break; + tmpval=g_pfwFrames[sd[i+1].realpos].order; + g_pfwFrames[sd[i+1].realpos].order=g_pfwFrames[pos].order; + g_pfwFrames[pos].order=tmpval; + break; + }; + if (lParam==+1) + { + if (i<1) break; + tmpval=g_pfwFrames[sd[i-1].realpos].order; + g_pfwFrames[sd[i-1].realpos].order=g_pfwFrames[pos].order; + g_pfwFrames[pos].order=tmpval; + break; + }; + + + }; + }; + + if (sd!=NULL){free(sd);}; + CLUIFramesStoreFrameSettings(pos); + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + + } + + return(0); +}; + + + +static int _us_DoMoveFrameUp(WPARAM wParam,LPARAM lParam) +{ + return CLUIFrames_MoveFrame(wParam,(LPARAM)+1); +} +static int _us_DoMoveFrameDown(WPARAM wParam,LPARAM lParam) +{ + return CLUIFrames_MoveFrame(wParam,(LPARAM)-1); +} +//wparam=frameid +//lparam=alignment +static int _us_DoSetFrameAlign(WPARAM wParam,LPARAM lParam) +{ + if (_fCluiFramesModuleNotStarted) return -1; + + CLUIFrames_SetFrameOptions(MAKEWPARAM(FO_ALIGN,wParam),lParam); + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + return(0); +} +static int _us_DoAlignFrameTop(WPARAM wParam,LPARAM lParam) +{ + if (_fCluiFramesModuleNotStarted) return -1; + + return CLUIFrames_SetFrameAlign(wParam,alTop); +} +static int _us_DoAlignFrameBottom(WPARAM wParam,LPARAM lParam) +{ + if (_fCluiFramesModuleNotStarted) return -1; + + return CLUIFrames_SetFrameAlign(wParam,alBottom); +} +static int _us_DoAlignFrameClient(WPARAM wParam,LPARAM lParam) +{ + if (_fCluiFramesModuleNotStarted) return -1; + + return CLUIFrames_SetFrameAlign(wParam,alClient); +} + + +//wparam=frameid +static int _us_DoLockFrame(WPARAM wParam,LPARAM lParam) +{ + int pos; + + if (_fCluiFramesModuleNotStarted) return -1; + + if (wParam == 0) { + pos = lParam; + } else { + pos=id2pos(wParam); + } + if(pos>=0&&(int)pos=0&&FrameIdhwndContactList,&rc); + + if(g_pfwFrames[FrameId].collapsed==TRUE) { + rc.bottom-=rc.top; + rc.bottom-=g_pfwFrames[FrameId].height; + g_pfwFrames[FrameId].HeightWhenCollapsed=g_pfwFrames[FrameId].height; + g_pfwFrames[FrameId].collapsed=FALSE; + } + else + { + rc.bottom-=rc.top; + rc.bottom+=g_pfwFrames[FrameId].HeightWhenCollapsed; + g_pfwFrames[FrameId].collapsed=TRUE; + } + + SetWindowPos(pcli->hwndContactList,NULL,0,0,rc.right-rc.left,rc.bottom,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE); + + CLUIFramesStoreAllFrames(); + + + return 0; + + } + if(g_pfwFrames[FrameId].Locked||(!g_pfwFrames[FrameId].visible)) return 0; + + oldHeight=g_pfwFrames[FrameId].height; + + // if collapsed, uncollapse + if(g_pfwFrames[FrameId].collapsed==TRUE) { + g_pfwFrames[FrameId].HeightWhenCollapsed=g_pfwFrames[FrameId].height; + g_pfwFrames[FrameId].height=UNCOLLAPSED_FRAME_SIZE; + g_pfwFrames[FrameId].collapsed=FALSE; + } + // if uncollapsed, collapse + else { + g_pfwFrames[FrameId].height=g_pfwFrames[FrameId].HeightWhenCollapsed; + g_pfwFrames[FrameId].collapsed=TRUE; + } + + if (!g_pfwFrames[FrameId].floating) + { + + if(!CLUIFramesFitInSize()) { + //cant collapse,we can resize only for height2*UNCOLLAPSED_FRAME_SIZE) { + oldHeight=g_pfwFrames[alfrm].height-UNCOLLAPSED_FRAME_SIZE; + g_pfwFrames[FrameId].collapsed=TRUE; + } + }else + { + int i,sumheight=0; + for(i=0;i_nContactListHeight-0-2) + { + g_pfwFrames[FrameId].height=(_nContactListHeight-0-2)-sumheight; + } + + } + } + + g_pfwFrames[FrameId].height=oldHeight; + + if(g_pfwFrames[FrameId].collapsed==FALSE) { + + if (!g_pfwFrames[FrameId].floating) + { + } + else + { + //SetWindowPos(Frames[FrameId].hWnd,HWND_TOP,0,0,Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left,Frames[FrameId].height,SWP_SHOWWINDOW|SWP_NOMOVE); + SetWindowPos(g_pfwFrames[FrameId].ContainerWnd,HWND_TOP,0,0,g_pfwFrames[FrameId].wndSize.right-g_pfwFrames[FrameId].wndSize.left+6,g_pfwFrames[FrameId].height+DEFAULT_TITLEBAR_HEIGHT+4,SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOMOVE); + }; + + + return -1;};//redraw not needed + } + };//floating test + + //CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + if (!g_pfwFrames[FrameId].floating) + { + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + } + else + { + //SetWindowPos(Frames[FrameId].hWnd,HWND_TOP,0,0,Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left,Frames[FrameId].height,SWP_SHOWWINDOW|SWP_NOMOVE); + RECT contwnd; + GetWindowRect(g_pfwFrames[FrameId].ContainerWnd,&contwnd); + contwnd.top=contwnd.bottom-contwnd.top;//height + contwnd.left=contwnd.right-contwnd.left;//width + + contwnd.top-=(oldHeight-g_pfwFrames[FrameId].height);//newheight + SetWindowPos(g_pfwFrames[FrameId].ContainerWnd,HWND_TOP,0,0,contwnd.left,contwnd.top,SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOMOVE); + }; + CLUIFramesStoreAllFrames(); + return(0); + } + else + return -1; +} + +static int CLUIFramesLoadMainMenu() +{ + if (_fCluiFramesModuleNotStarted) + return -1; + + if(_hmiRoot!=(HGENMENU)-1) { + CallService(MS_CLIST_REMOVEMAINMENUITEM,(WPARAM)_hmiRoot,0); + _hmiRoot=(HGENMENU)-1; + } + + CLISTMENUITEM mi = { 0 }; + mi.cbSize=sizeof(mi); + // create root menu + mi.flags = CMIF_ICONFROMICOLIB | CMIF_ROOTHANDLE; + mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_MIRANDA); + mi.position = 3000090000; + mi.pszName = LPGEN("Frames"); + _hmiRoot = (HGENMENU)CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi); + DestroyIcon_protect(mi.hIcon); + // create frames menu + int separator=3000200000; + for (int i=0; i < g_nFramesCount; i++) { + mi.hIcon = g_pfwFrames[i].TitleBar.hicon; + mi.flags = CMIF_ROOTHANDLE | CMIF_TCHAR; + mi.position = separator; + mi.hParentMenu = _hmiRoot; + mi.ptszName = g_pfwFrames[i].TitleBar.tbname ? g_pfwFrames[i].TitleBar.tbname : g_pfwFrames[i].Name; + mi.pszService = 0; + g_pfwFrames[i].MenuHandles.MainMenuItem = (HANDLE)CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi); + CLUIFramesCreateMenuForFrame(g_pfwFrames[i].id,(int)g_pfwFrames[i].MenuHandles.MainMenuItem,separator,MS_CLIST_ADDMAINMENUITEM); + CLUIFramesModifyMainMenuItems(g_pfwFrames[i].id,0); + CallService(MS_CLIST_FRAMEMENUNOTIFY,(WPARAM)g_pfwFrames[i].id,(LPARAM)g_pfwFrames[i].MenuHandles.MainMenuItem); + separator++; + } + + separator+=100000; + + // create "show all frames" menu + mi.hIcon = NULL; + mi.flags = CMIF_ROOTHANDLE; + mi.position = separator++; + mi.hParentMenu = _hmiRoot; + mi.pszName = LPGEN("Show All Frames"); + mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMES; + CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi); + + // create "show all titlebars" menu + mi.position = separator++; + mi.pszName = LPGEN("Show All Titlebars"); + mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMESTB; + CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi); + + // create "hide all titlebars" menu + mi.position = separator++; + mi.pszName = LPGEN("Hide All Titlebars"); + mi.pszService = MS_CLIST_FRAMES_HIDEALLFRAMESTB; + CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi); + + return 0; +} + +static HFONT CLUILoadTitleBarFont() +{ + char facename[]="MS Shell Dlg"; + HFONT hfont; + LOGFONTA logfont; + memset(&logfont,0,sizeof(logfont)); + memmove(logfont.lfFaceName,facename,sizeof(facename)); + logfont.lfWeight=FW_NORMAL; + logfont.lfHeight=-10; + logfont.lfCharSet=DEFAULT_CHARSET; + hfont=CreateFontIndirectA(&logfont); + return hfont; +} + + +//wparam=(CLISTFrame*)clfrm +static int _us_DoAddFrame(WPARAM wParam,LPARAM lParam) +{ + int style,retval; + //char * CustomName=NULL; + CLISTFrame *clfrm=(CLISTFrame *)wParam; + + if(pcli->hwndContactList==0) return -1; + if (_fCluiFramesModuleNotStarted) return -1; + if(clfrm->cbSize!=sizeof(CLISTFrame)) return -1; + if(!(_hTitleBarFont)) _hTitleBarFont = CLUILoadTitleBarFont(); + + g_pfwFrames=(FRAMEWND*)realloc(g_pfwFrames,sizeof(FRAMEWND)*(g_nFramesCount+1)); + + memset(&g_pfwFrames[g_nFramesCount],0,sizeof(FRAMEWND)); + /* //removed buggy code + if (clfrm->name && 0 ) + { + CustomName=ModernDBGetStringA(NULL,"CUSTOM_CLUI_FRAMES",AS(buff,"CustomName_",clfrm->name)); + Frames[nFramescount].TitleBar.BackColour=(COLORREF)DBGetContactSettingDword(NULL,"CUSTOM_CLUI_FRAMES",AS(buff,"CustomBackColor_",clfrm->name),GetSysColor(COLOR_3DFACE)); + Frames[nFramescount].TitleBar.TextColour=(COLORREF)DBGetContactSettingDword(NULL,"CUSTOM_CLUI_FRAMES",AS(buff,"CustomTextColor_",clfrm->name),GetSysColor(COLOR_WINDOWTEXT)); + if (CustomName) + { + if (clfrm->name) mir_free_and_nill(clfrm->name); + clfrm->name=mir_strdup(CustomName); + mir_free_and_nill(CustomName); + } + } + */ + g_pfwFrames[g_nFramesCount].id=_iNextFrameId++; + g_pfwFrames[g_nFramesCount].align=clfrm->align; + g_pfwFrames[g_nFramesCount].hWnd=clfrm->hWnd; + g_pfwFrames[g_nFramesCount].height=clfrm->height; + g_pfwFrames[g_nFramesCount].TitleBar.hicon=clfrm->hIcon; + //Frames[nFramescount].TitleBar.BackColour; + g_pfwFrames[g_nFramesCount].floating=FALSE; + if (clfrm->Flags&F_NO_SUBCONTAINER || !g_CluiData.fLayered) + g_pfwFrames[g_nFramesCount].OwnerWindow=(HWND)-2; + else g_pfwFrames[g_nFramesCount].OwnerWindow=0; + + //override tbbtip + //clfrm->Flags|=F_SHOWTBTIP; + // + if (ModernGetSettingByte(0,CLUIFrameModule,"RemoveAllBorders",0)==1) + { + clfrm->Flags|=F_NOBORDER; + }; + g_pfwFrames[g_nFramesCount].dwFlags=clfrm->Flags; + + if (clfrm->name==NULL||((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->wname) : lstrlenA(clfrm->name))==0) { + g_pfwFrames[g_nFramesCount].Name=(LPTSTR)mir_alloc(255 * sizeof(TCHAR)); + GetClassName(g_pfwFrames[g_nFramesCount].hWnd,g_pfwFrames[g_nFramesCount].Name,255); + } + else + { + g_pfwFrames[g_nFramesCount].Name=(clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->wname) : mir_a2t(clfrm->name); + } + g_pfwFrames[g_nFramesCount].szName=mir_t2a(g_pfwFrames[g_nFramesCount].Name); + if (IsBadCodePtr((FARPROC)clfrm->TBname) || clfrm->TBname==NULL + || ((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->TBwname) : lstrlenA(clfrm->TBname)) == 0) + g_pfwFrames[g_nFramesCount].TitleBar.tbname=mir_tstrdup(g_pfwFrames[g_nFramesCount].Name); + else + g_pfwFrames[g_nFramesCount].TitleBar.tbname=(clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->TBwname) : mir_a2t(clfrm->TBname); + g_pfwFrames[g_nFramesCount].TitleBar.sztbname=mir_t2a(g_pfwFrames[g_nFramesCount].TitleBar.tbname); + g_pfwFrames[g_nFramesCount].needhide=FALSE; + g_pfwFrames[g_nFramesCount].TitleBar.ShowTitleBar=(clfrm->Flags&F_SHOWTB?TRUE:FALSE); + g_pfwFrames[g_nFramesCount].TitleBar.ShowTitleBarTip=(clfrm->Flags&F_SHOWTBTIP?TRUE:FALSE); + + g_pfwFrames[g_nFramesCount].collapsed = (clfrm->Flags&F_UNCOLLAPSED)?FALSE:TRUE; + + + g_pfwFrames[g_nFramesCount].Locked = clfrm->Flags&F_LOCKED?TRUE:FALSE; + g_pfwFrames[g_nFramesCount].visible = clfrm->Flags&F_VISIBLE?TRUE:FALSE; + + g_pfwFrames[g_nFramesCount].UseBorder=((clfrm->Flags&F_NOBORDER)||g_CluiData.fLayered)?FALSE:TRUE; + + //Frames[nFramescount].OwnerWindow=0; + + + + g_pfwFrames[g_nFramesCount].TitleBar.hwnd + =CreateWindow(CLUIFrameTitleBarClassName,g_pfwFrames[g_nFramesCount].Name, + (ModernGetSettingByte(0,CLUIFrameModule,"RemoveAllTitleBarBorders",1)?0:WS_BORDER) + + |WS_CHILD|WS_CLIPCHILDREN| + (g_pfwFrames[g_nFramesCount].TitleBar.ShowTitleBar?WS_VISIBLE:0)| + WS_CLIPCHILDREN, + 0,0,0,0,pcli->hwndContactList,NULL,g_hInst,NULL); + SetWindowLongPtr(g_pfwFrames[g_nFramesCount].TitleBar.hwnd,GWLP_USERDATA,g_pfwFrames[g_nFramesCount].id); + + + g_pfwFrames[g_nFramesCount].TitleBar.hwndTip + =CreateWindowExA(0, TOOLTIPS_CLASSA, NULL, + WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + pcli->hwndContactList, NULL, g_hInst, + NULL); + + SetWindowPos(g_pfwFrames[g_nFramesCount].TitleBar.hwndTip, HWND_TOPMOST,0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + { + TOOLINFOA ti; + int res; + + ZeroMemory(&ti,sizeof(ti)); + ti.cbSize=sizeof(ti); + ti.lpszText=""; + ti.hinst=g_hInst; + ti.uFlags=TTF_IDISHWND|TTF_SUBCLASS ; + ti.uId=(UINT_PTR)g_pfwFrames[g_nFramesCount].TitleBar.hwnd; + res=SendMessageA(g_pfwFrames[g_nFramesCount].TitleBar.hwndTip,TTM_ADDTOOL,(WPARAM)0,(LPARAM)&ti); + } + + SendMessageA(g_pfwFrames[g_nFramesCount].TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)g_pfwFrames[g_nFramesCount].TitleBar.ShowTitleBarTip,0); + + g_pfwFrames[g_nFramesCount].oldstyles=GetWindowLong(g_pfwFrames[g_nFramesCount].hWnd,GWL_STYLE); + g_pfwFrames[g_nFramesCount].TitleBar.oldstyles=GetWindowLong(g_pfwFrames[g_nFramesCount].TitleBar.hwnd,GWL_STYLE); + //Frames[nFramescount].FloatingPos.x= + + retval=g_pfwFrames[g_nFramesCount].id; + g_pfwFrames[g_nFramesCount].order=g_nFramesCount+1; + g_nFramesCount++; + + + CLUIFramesLoadFrameSettings(id2pos(retval)); + if (g_pfwFrames[g_nFramesCount-1].collapsed==FALSE) + { + g_pfwFrames[g_nFramesCount-1].height=0; + } + + // create frame + + + // else Frames[nFramescount-1].height=Frames[nFramescount-1].HeightWhenCollapsed; + + style=GetWindowLong(g_pfwFrames[g_nFramesCount-1].hWnd,GWL_STYLE); + style&=(~WS_BORDER); + style|=(((g_pfwFrames[g_nFramesCount-1].UseBorder)&&!g_CluiData.fLayered)?WS_BORDER:0); + SetWindowLong(g_pfwFrames[g_nFramesCount-1].hWnd,GWL_STYLE,style); + SetWindowLong(g_pfwFrames[g_nFramesCount-1].TitleBar.hwnd,GWL_STYLE,style& ~(WS_VSCROLL | WS_HSCROLL)); + SetWindowLong(g_pfwFrames[g_nFramesCount-1].TitleBar.hwnd,GWL_STYLE,GetWindowLong(g_pfwFrames[g_nFramesCount-1].TitleBar.hwnd,GWL_STYLE)&~(WS_VSCROLL|WS_HSCROLL)); + + if (g_pfwFrames[g_nFramesCount-1].order==0){g_pfwFrames[g_nFramesCount-1].order=g_nFramesCount;}; + + + //need to enlarge parent + { + RECT mainRect; + int mainHeight, minHeight; + GetWindowRect(pcli->hwndContactList,&mainRect); + mainHeight=mainRect.bottom-mainRect.top; + minHeight=CLUIFrames_GetTotalHeight(); + if (mainHeighthwndContactList,NULL,mainRect.left,mainRect.top,mainRect.right-mainRect.left, mainRect.bottom-mainRect.top, SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOSENDCHANGING); + } + GetWindowRect(pcli->hwndContactList,&mainRect); + mainHeight=mainRect.bottom-mainRect.top; + //if (mainHeighthwndContactList,0); + + if (g_pfwFrames[g_nFramesCount-1].floating) + { + + g_pfwFrames[g_nFramesCount-1].floating=FALSE; + //SetWindowPos(Frames[nFramescount-1].hw + CLUIFrames_SetFrameFloat(retval,1);//lparam=1 use stored width and height + } + else + CLUIFrames_SetFrameFloat(retval,2); + + /** Remove */ + //_ExtFramesSrv_AddFrame( wParam, lParam); + + return retval; +} + +static int _us_DoRemoveFrame(WPARAM wParam,LPARAM lParam) +{ + int pos; + if (_fCluiFramesModuleNotStarted) return -1; + + pos=id2pos(wParam); + + if (pos<0||pos>g_nFramesCount){return(-1);}; + + if (g_pfwFrames[pos].Name!=NULL) mir_free_and_nill(g_pfwFrames[pos].Name); + if (g_pfwFrames[pos].szName!=NULL) mir_free_and_nill(g_pfwFrames[pos].szName); + if (g_pfwFrames[pos].TitleBar.tbname!=NULL) mir_free_and_nill(g_pfwFrames[pos].TitleBar.tbname); + if (g_pfwFrames[pos].TitleBar.sztbname!=NULL) mir_free_and_nill(g_pfwFrames[pos].TitleBar.sztbname); + if (g_pfwFrames[pos].TitleBar.tooltip!=NULL) mir_free_and_nill(g_pfwFrames[pos].TitleBar.tooltip); + if (g_pfwFrames[pos].TitleBar.sztooltip!=NULL) mir_free_and_nill(g_pfwFrames[pos].TitleBar.sztooltip); + DestroyWindow(g_pfwFrames[pos].hWnd); + g_pfwFrames[pos].hWnd=(HWND)-1; + DestroyWindow(g_pfwFrames[pos].TitleBar.hwnd); + if(g_pfwFrames[pos].TitleBar.hwndTip) + DestroyWindow(g_pfwFrames[pos].TitleBar.hwndTip); + g_pfwFrames[pos].TitleBar.hwnd=(HWND)-1; + if(g_pfwFrames[pos].ContainerWnd && g_pfwFrames[pos].ContainerWnd!=(HWND)-1) DestroyWindow(g_pfwFrames[pos].ContainerWnd); + g_pfwFrames[pos].ContainerWnd=(HWND)-1; + if (g_pfwFrames[pos].TitleBar.hmenu) DestroyMenu(g_pfwFrames[pos].TitleBar.hmenu); + g_pfwFrames[pos].PaintCallbackProc = NULL; + if (g_pfwFrames[pos].UpdateRgn) DeleteObject(g_pfwFrames[pos].UpdateRgn); + + if (g_pfwFrames[pos].OwnerWindow!=(HWND)-1 + && g_pfwFrames[pos].OwnerWindow!=(HWND)-2 + && g_pfwFrames[pos].OwnerWindow!=(HWND)0) + DestroyWindow(g_pfwFrames[pos].OwnerWindow); + + g_pfwFrames[pos].OwnerWindow=NULL; + RemoveItemFromList(pos,&g_pfwFrames,&g_nFramesCount); + + CLUI__cliInvalidateRect(pcli->hwndContactList,NULL,TRUE); + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + CLUI__cliInvalidateRect(pcli->hwndContactList,NULL,TRUE); + + return(0); +}; + + +static int CLUIFramesForceUpdateTB(const FRAMEWND *Frame) +{ + if (Frame->TitleBar.hwnd!=0) RedrawWindow(Frame->TitleBar.hwnd,NULL,NULL,RDW_ALLCHILDREN|RDW_UPDATENOW|RDW_ERASE|RDW_INVALIDATE|RDW_FRAME); + //UpdateWindow(Frame->TitleBar.hwnd); + return 0; +} + +static int CLUIFramesForceUpdateFrame(const FRAMEWND *Frame) +{ + if (Frame->hWnd!=0) + { + RedrawWindow(Frame->hWnd,NULL,NULL,RDW_UPDATENOW|RDW_FRAME|RDW_ERASE|RDW_INVALIDATE); + UpdateWindow(Frame->hWnd); + }; + if(Frame->floating) + { + if (Frame->ContainerWnd!=0) RedrawWindow(Frame->ContainerWnd,NULL,NULL,RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_ERASE|RDW_INVALIDATE|RDW_FRAME); + //UpdateWindow(Frame->ContainerWnd); + }; + return 0; +} + +static int CLUIFrameMoveResize(const FRAMEWND *Frame) +{ + // we need to show or hide the frame? + if(Frame->visible&&(!Frame->needhide)) { + if (Frame->OwnerWindow!=(HWND)-2 &&Frame->OwnerWindow) + { + // CLUI_ShowWindowMod(Frame->OwnerWindow,SW_SHOW); + } + CLUI_ShowWindowMod(Frame->hWnd,SW_SHOW/*NOACTIVATE*/); + CLUI_ShowWindowMod(Frame->TitleBar.hwnd,Frame->TitleBar.ShowTitleBar==TRUE?SW_SHOW/*NOACTIVATE*/:SW_HIDE); + } + else { + if (Frame->OwnerWindow && Frame->OwnerWindow!=(HWND)(-1)&& Frame->OwnerWindow!=(HWND)(-2)) + { + CLUI_ShowWindowMod(Frame->OwnerWindow,SW_HIDE); + } + CLUI_ShowWindowMod(Frame->hWnd,SW_HIDE); + CLUI_ShowWindowMod(Frame->TitleBar.hwnd,SW_HIDE); + return(0); + } + + if (Frame->OwnerWindow&&Frame->OwnerWindow!=(HWND)-2 ) + { + RECT pr; + POINT Off={0}; + + ClientToScreen(pcli->hwndContactList,&Off); + GetWindowRect(pcli->hwndContactList,&pr); + + if ( Frame->visible && (!Frame->collapsed || Frame->wndSize.bottom-Frame->wndSize.top == 0) ) + { + ShowWindowAsync( Frame->OwnerWindow, SW_HIDE ); + ShowWindowAsync( Frame->hWnd, SW_HIDE ); + } + + { + SetWindowPos(Frame->OwnerWindow,NULL,Frame->wndSize.left+Off.x,Frame->wndSize.top+Off.y, + Frame->wndSize.right-Frame->wndSize.left, + Frame->wndSize.bottom-Frame->wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE ); //--=-= + + SetWindowPos(Frame->hWnd,NULL,0,0, + Frame->wndSize.right-Frame->wndSize.left, + Frame->wndSize.bottom-Frame->wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE); + } + // set titlebar position + if(Frame->TitleBar.ShowTitleBar) { + SetWindowPos(Frame->TitleBar.hwnd,NULL,Frame->wndSize.left,Frame->wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar, + Frame->wndSize.right-Frame->wndSize.left, + g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE ); + } + if ( Frame->visible && IsWindowVisible( pcli->hwndContactList ) && Frame->collapsed && Frame->wndSize.bottom-Frame->wndSize.top != 0 ) + { + ShowWindow( Frame->OwnerWindow, SW_SHOW ); + ShowWindow( Frame->hWnd, SW_SHOW ); + } + + } + else + { + // set frame position + SetWindowPos(Frame->hWnd,NULL,Frame->wndSize.left,Frame->wndSize.top, + Frame->wndSize.right-Frame->wndSize.left, + Frame->wndSize.bottom-Frame->wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE); + // set titlebar position + if(Frame->TitleBar.ShowTitleBar) { + SetWindowPos(Frame->TitleBar.hwnd,NULL,Frame->wndSize.left,Frame->wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar, + Frame->wndSize.right-Frame->wndSize.left, + g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE); + + } + } + // Sleep(0); + return 0; +} + +static BOOL CLUIFramesFitInSize(void) +{ + int i; + int sumheight=0; + int tbh=0; // title bar height + int clientfrm; + clientfrm=CLUIFramesGetalClientFrame(); + if(clientfrm!=-1) + tbh=g_nTitleBarHeight*btoint(g_pfwFrames[clientfrm].TitleBar.ShowTitleBar); + + for(i=0;i_nContactListHeight-tbh-2) + { + if (!g_CluiData.fDocked && g_CluiData.fAutoSize) + { + return TRUE; //Can be required to enlarge + } + return FALSE; + } + } + } + return TRUE; +} +int CLUIFrames_GetTotalHeight() +{ + int i; + int sumheight=0; + RECT border; + if(pcli->hwndContactList==NULL) return 0; + + for(i=0;ihwndContactTree)&& (g_pfwFrames[i].hWnd!=pcli->hwndContactTree)) + sumheight+=(g_pfwFrames[i].height)+(g_nTitleBarHeight*btoint(g_pfwFrames[i].TitleBar.ShowTitleBar)); + }; + + GetBorderSize(pcli->hwndContactList,&border); + + //GetWindowRect(pcli->hwndContactList,&winrect); + //GetClientRect(pcli->hwndContactList,&clirect); + // clirect.bottom-=clirect.top; + // clirect.bottom+=border.top+border.bottom; + //allbord=(winrect.bottom-winrect.top)-(clirect.bottom-clirect.top); + + //TODO minsize + sumheight+=g_CluiData.TopClientMargin; + sumheight+=g_CluiData.BottomClientMargin; + return max(ModernGetSettingWord(NULL,"CLUI","MinHeight",SETTING_MINHEIGTH_DEFAULT), + (sumheight+border.top+border.bottom) ); +} + +int CLUIFramesGetMinHeight() +{ + int i,tbh,clientfrm,sumheight=0; + RECT border; + int allbord=0; + if(pcli->hwndContactList==NULL) return 0; + + + // search for alClient frame and get the titlebar's height + tbh=0; + clientfrm=CLUIFramesGetalClientFrame(); + if(clientfrm!=-1) + tbh=g_nTitleBarHeight*btoint(g_pfwFrames[clientfrm].TitleBar.ShowTitleBar); + + for(i=0;ihwndContactList,&border); + + //GetWindowRect(pcli->hwndContactList,&winrect); + //GetClientRect(pcli->hwndContactList,&clirect); + // clirect.bottom-=clirect.top; + // clirect.bottom+=border.top+border.bottom; + //allbord=(winrect.bottom-winrect.top)-(clirect.bottom-clirect.top); + + //TODO minsize + sumheight+=g_CluiData.TopClientMargin; + sumheight+=g_CluiData.BottomClientMargin; + return max(ModernGetSettingWord(NULL,"CLUI","MinHeight",SETTING_MINHEIGTH_DEFAULT), + (sumheight+border.top+border.bottom+allbord+tbh) ); +} + + + + +static int CLUIFramesResizeFrames(const RECT newsize) +{ + int sumheight=9999999,newheight; + int prevframe,prevframebottomline; + int tbh,curfrmtbh; + int drawitems; + int clientfrm; + int i,j; + int sepw=GapBetweenFrames; + int topBorder=newsize.top; + int minHeight=CLUIFrames_GetTotalHeight(); + SortData *sdarray; + + + g_CluiData.nGapBetweenTitlebar=(int)ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT); + GapBetweenFrames=ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT); + sepw=GapBetweenFrames; + + if(g_nFramesCount<1) return 0; + newheight=newsize.bottom-newsize.top; + + // search for alClient frame and get the titlebar's height + tbh=0; + clientfrm=CLUIFramesGetalClientFrame(); + if(clientfrm!=-1) + tbh=(g_nTitleBarHeight+g_CluiData.nGapBetweenTitlebar)*btoint(g_pfwFrames[clientfrm].TitleBar.ShowTitleBar); + + for(i=0;i(newheight-tbh)&&drawitems>0) { + sumheight=0; + drawitems=0; + for(i=0;i 0 ? sepw : 0)+( (g_pfwFrames[i].UseBorder &&!g_CluiData.fLayered)?2:0); + if(sumheight>newheight-tbh) { + sumheight-=(g_pfwFrames[i].height)+curfrmtbh + (i > 0 ? sepw : 0); + g_pfwFrames[i].needhide=!g_CluiData.fDocked && g_CluiData.fAutoSize?FALSE:TRUE; + drawitems--; + break; + } + } + } + } + + prevframe=-1; + prevframebottomline=topBorder; + for(j=0;j 0 ? sepw : 0)+(curfrmtbh); + g_pfwFrames[i].wndSize.bottom=g_pfwFrames[i].height+g_pfwFrames[i].wndSize.top+((g_pfwFrames[i].UseBorder &&!g_CluiData.fLayered)?2:0); + g_pfwFrames[i].prevvisframe=prevframe; + prevframe=i; + prevframebottomline=g_pfwFrames[i].wndSize.bottom; + if(prevframebottomline>newheight){ + //prevframebottomline-=Frames[i].height+(curfrmtbh+1); + //Frames[i].needhide=TRUE; + } + } + } + + if(sumheight 0 ? sepw : 0)+(tbh); + g_pfwFrames[i].wndSize.bottom=g_pfwFrames[i].wndSize.top+newheight-sumheight-tbh-(j > 0 ? sepw : 0); + + oldh=g_pfwFrames[i].height; + g_pfwFrames[i].height=g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].wndSize.top; + g_pfwFrames[i].prevvisframe=prevframe; + prevframe=i; + prevframebottomline=g_pfwFrames[i].wndSize.bottom; + if(prevframebottomline>newheight) { + //prevframebottomline-=Frames[i].height+(tbh+1); + //Frames[i].needhide=TRUE; + } + break; + } + } + } + + //newheight + prevframebottomline=newheight+sepw+topBorder; + //prevframe=-1; + for(j=g_nFramesCount-1;j>=0;j--) { + //move all alBottom frames + i=sdarray[j].realpos; + if((g_pfwFrames[i].visible)&&(!g_pfwFrames[i].floating)&&(!g_pfwFrames[i].needhide)&&(g_pfwFrames[i].align==alBottom)) { + curfrmtbh=(g_nTitleBarHeight+g_CluiData.nGapBetweenTitlebar)*btoint(g_pfwFrames[i].TitleBar.ShowTitleBar); + + g_pfwFrames[i].wndSize.bottom=prevframebottomline-(j > 0 ? sepw : 0); + g_pfwFrames[i].wndSize.top=g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].height-((g_pfwFrames[i].UseBorder &&!g_CluiData.fLayered)?2:0); + g_pfwFrames[i].prevvisframe=prevframe; + prevframe=i; + prevframebottomline=g_pfwFrames[i].wndSize.top/*-1*/-curfrmtbh; + if(prevframebottomline>newheight) { + + } + } + } + for(i=0;ihwndContactList)) + { + ske_DrawNonFramedObjects(1,0); + CallService(MS_SKINENG_INVALIDATEFRAMEIMAGE,0,0); + } + g_CluiData.mutexPreventDockMoving=1; + return 0; +} + +static int _us_DoUpdateFrame(WPARAM wParam,LPARAM lParam) +{ + if (_fCluiFramesModuleNotStarted) return -1; + if(wParam==-1) { CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); return 0;} + if(lParam&FU_FMPOS) CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,1); + + int pos = id2pos( wParam ); + if( pos < 0 || pos >= g_nFramesCount ) { return -1; } + if( lParam&FU_TBREDRAW ) CLUIFramesForceUpdateTB( &g_pfwFrames[pos] ); + if( lParam&FU_FMREDRAW ) CLUIFramesForceUpdateFrame( &g_pfwFrames[pos] ); + return 0; +} + +int CLUIFrames_OnClistResize_mod(WPARAM wParam,LPARAM mode) +{ + RECT nRect; + int tick; + GapBetweenFrames=ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT); + g_CluiData.nGapBetweenTitlebar=ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT); + if (_fCluiFramesModuleNotStarted) return -1; + + GetClientRect(pcli->hwndContactList,&nRect); + + nRect.left+=g_CluiData.LeftClientMargin; + nRect.right-=g_CluiData.RightClientMargin; + nRect.top+=g_CluiData.TopClientMargin; + nRect.bottom-=g_CluiData.BottomClientMargin; + // g_CluiData.mutexPreventDockMoving=0; + tick=GetTickCount(); + CLUIFramesResize(nRect); + if (mode==0) CLUIFrames_ApplyNewSizes(3); + + tick=GetTickCount()-tick; + + Sleep(0); + + //dont save to database too many times + if(GetTickCount()-_dwLastStoreTick>1000){ CLUIFramesStoreAllFrames();_dwLastStoreTick=GetTickCount();}; + + return 0; +} + +int SizeFramesByWindowRect(RECT *r, HDWP * PosBatch, int mode) +{ + RECT nRect; + if (_fCluiFramesModuleNotStarted) return -1; + + g_CluiData.nGapBetweenTitlebar=(int)ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT); + GapBetweenFrames=ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT); + nRect.left=0; + nRect.top=0; + nRect.right=r->right-r->left; + nRect.bottom=r->bottom-r->top; + nRect.left+=g_CluiData.LeftClientMargin; + nRect.right-=g_CluiData.RightClientMargin; + nRect.top+=g_CluiData.TopClientMargin; + nRect.bottom-=g_CluiData.BottomClientMargin; + CLUIFramesResizeFrames(nRect); + { + int i; + for(i=0;ileft,g_pfwFrames[i].wndSize.top+r->top, + g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left, g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE); + SetWindowPos(g_pfwFrames[i].hWnd,NULL,0,0, + g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left, g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE/*|SWP_NOSENDCHANGING*/); + } + //Frame + if(g_pfwFrames[i].TitleBar.ShowTitleBar) + { + SetWindowPos(g_pfwFrames[i].TitleBar.hwnd,NULL,g_pfwFrames[i].wndSize.left+dx,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar+dy, + g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left,g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE ); + SetRect(&g_pfwFrames[i].TitleBar.wndSize,g_pfwFrames[i].wndSize.left,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar,g_pfwFrames[i].wndSize.right,g_pfwFrames[i].wndSize.top-g_CluiData.nGapBetweenTitlebar); + UpdateWindow(g_pfwFrames[i].TitleBar.hwnd); + } + } + else + { + if(1) + { + int res=0; + // set frame position + res=SetWindowPos(g_pfwFrames[i].hWnd,NULL,g_pfwFrames[i].wndSize.left+dx,g_pfwFrames[i].wndSize.top+dy, + g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left, + g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSENDCHANGING); + } + if(1) + { + // set titlebar position + if(g_pfwFrames[i].TitleBar.ShowTitleBar) + { + SetWindowPos(g_pfwFrames[i].TitleBar.hwnd,NULL,g_pfwFrames[i].wndSize.left+dx,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar+dy, + g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left,g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSENDCHANGING ); + SetRect(&g_pfwFrames[i].TitleBar.wndSize,g_pfwFrames[i].wndSize.left,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar,g_pfwFrames[i].wndSize.right,g_pfwFrames[i].wndSize.top-g_CluiData.nGapBetweenTitlebar); + + } + } + UpdateWindow(g_pfwFrames[i].hWnd); + if(g_pfwFrames[i].TitleBar.ShowTitleBar) UpdateWindow(g_pfwFrames[i].TitleBar.hwnd); + }; + } + + } + if(GetTickCount()-_dwLastStoreTick>1000) + { + CLUIFramesStoreAllFrames(); + _dwLastStoreTick=GetTickCount(); + }; + } + return 0; +} + +int CheckFramesPos(RECT *wr) +{ + //CALLED only FROM MainWindow procedure at CLUI.c + int i; + if (_fCluiFramesModuleNotStarted) return -1; + g_CluiData.nGapBetweenTitlebar=(int)ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT); + GapBetweenFrames=ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT); + + for(i=0;itop!=g_pfwFrames[i].wndSize.top ||r.left-wr->left!=g_pfwFrames[i].wndSize.left) + SetWindowPos(g_pfwFrames[i].hWnd,NULL,g_pfwFrames[i].wndSize.left, g_pfwFrames[i].wndSize.top,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE); + } + if (g_pfwFrames[i].TitleBar.ShowTitleBar) + { + RECT r; + GetWindowRect(g_pfwFrames[i].TitleBar.hwnd,&r); + if (r.top-wr->top!=g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar || r.left-wr->left!=g_pfwFrames[i].wndSize.left) + { + SetWindowPos(g_pfwFrames[i].TitleBar.hwnd,NULL,g_pfwFrames[i].wndSize.left+dx,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar+dy, + g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left,g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE); + SetRect(&g_pfwFrames[i].TitleBar.wndSize,g_pfwFrames[i].wndSize.left,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar,g_pfwFrames[i].wndSize.right,g_pfwFrames[i].wndSize.top-g_CluiData.nGapBetweenTitlebar); + } + } + } + } + + return 0; +} + +int CLUIFramesOnClistResize(WPARAM wParam,LPARAM lParam) +{ + RECT nRect; + int tick; + GapBetweenFrames=ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT); + g_CluiData.nGapBetweenTitlebar=ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT); + + if (_fCluiFramesModuleNotStarted) return -1; + + //need to enlarge parent + { + RECT mainRect; + int mainHeight, minHeight; + GetWindowRect(pcli->hwndContactList,&mainRect); + mainHeight=mainRect.bottom-mainRect.top; + minHeight=CLUIFrames_GetTotalHeight(); + if (mainHeighthwndContactList,NULL,mainRect.left,mainRect.top,mainRect.right-mainRect.left, mainRect.bottom-mainRect.top, SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOSENDCHANGING); + } + GetWindowRect(pcli->hwndContactList,&mainRect); + mainHeight=mainRect.bottom-mainRect.top; + //if (mainHeighthwndContactList,&nRect); + //$$$ Fixed borders + if (lParam && lParam!=1 && lParam!=2) + { + RECT oldRect; + POINT pt; + RECT * newRect=(RECT *)lParam; + int dl,dt,dr,db; + GetWindowRect((HWND)wParam,&oldRect); + pt.x=nRect.left; + pt.y=nRect.top; + ClientToScreen(pcli->hwndContactList,&pt); + dl=pt.x-oldRect.left; + dt=pt.y-oldRect.top; + dr=(oldRect.right-oldRect.left)-(nRect.right-nRect.left)-dl; + db=(oldRect.bottom-oldRect.top)-(nRect.bottom-nRect.top)-dt; + nRect.left=newRect->left+dl; + nRect.top=newRect->top+dt; + nRect.bottom=newRect->bottom-db; + nRect.right=newRect->right-dr; + } + + + //if(DBGetContactSettingByte(NULL,"CLUI","ShowSBar",SETTING_SHOWSBAR_DEFAULT))GetWindowRect(pcli->hwndStatus,&rcStatus); + //else rcStatus.top=rcStatus.bottom=0; + // nRect.top--; + /* $$$ rcStatus.top=rcStatus.bottom=0; + + + nRect.bottom-=nRect.top; + nRect.bottom-=(rcStatus.bottom-rcStatus.top); + nRect.right-=nRect.left; + nRect.left=0; + nRect.top=0; + ContactListHeight=nRect.bottom; $$$*/ + + nRect.left+=g_CluiData.LeftClientMargin; + nRect.right-=g_CluiData.RightClientMargin; + nRect.top+=g_CluiData.TopClientMargin; + nRect.bottom-=g_CluiData.BottomClientMargin; + + if (nRect.bottomhwndContactList!=0) CLUI__cliInvalidateRect(pcli->hwndContactList,NULL,TRUE); + if (pcli->hwndContactList!=0) UpdateWindow(pcli->hwndContactList); + + if(lParam==2) RedrawWindow(pcli->hwndContactList,NULL,NULL,RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_ERASE|RDW_INVALIDATE); + + + Sleep(0); + + //dont save to database too many times + if(GetTickCount()-_dwLastStoreTick>1000){ CLUIFramesStoreAllFrames();_dwLastStoreTick=GetTickCount();}; + + return 0; +} + +int OnFrameTitleBarBackgroundChange(WPARAM wParam,LPARAM lParam) +{ + if (MirandaExiting()) return 0; + { + DBVARIANT dbv={0}; + + AlignCOLLIconToLeft=ModernGetSettingByte(NULL,"FrameTitleBar","AlignCOLLIconToLeft",CLCDEFAULT_COLLICONTOLEFT); + + bkColour=sttGetColor("FrameTitleBar","BkColour",CLCDEFAULT_BKCOLOUR); + bkUseWinColours=ModernGetSettingByte(NULL,"FrameTitleBar","UseWinColours",CLCDEFAULT_USEWINDOWSCOLOURS); + SelBkColour=sttGetColor("FrameTitleBar","TextColour",CLCDEFAULT_TEXTCOLOUR); + if(hBmpBackground) {DeleteObject(hBmpBackground); hBmpBackground=NULL;} + if (g_CluiData.fDisableSkinEngine) + { + if(ModernGetSettingByte(NULL,"FrameTitleBar","UseBitmap",CLCDEFAULT_USEBITMAP)) { + if(!ModernGetSettingString(NULL,"FrameTitleBar","BkBitmap",&dbv)) { + hBmpBackground=(HBITMAP)CallService(MS_UTILS_LOADBITMAP,0,(LPARAM)dbv.pszVal); + //mir_free_and_nill(dbv.pszVal); + ModernDBFreeVariant(&dbv); + } + } + backgroundBmpUse=ModernGetSettingWord(NULL,"FrameTitleBar","BkBmpUse",CLCDEFAULT_BKBMPUSE); + } + }; + + CLUI__cliInvalidateRect( pcli->hwndContactList, 0, 0 ); + + RedrawWindow(pcli->hwndContactList,NULL,NULL,RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_ERASE|RDW_INVALIDATE); + + return 0; +} + +void DrawBackGround(HWND hwnd,HDC mhdc, HBITMAP hBmpBackground, COLORREF bkColour, DWORD backgroundBmpUse ) +{ + HDC hdcMem,hdc; + RECT clRect,*rcPaint; + + int yScroll=0; + int y; + PAINTSTRUCT paintst={0}; + HBITMAP hBmpOsb,hOldBmp; + DWORD style=GetWindowLong(hwnd,GWL_STYLE); + int grey=0; + HFONT oFont; + HBRUSH hBrushAlternateGrey=NULL; + + HFONT hFont; + + //InvalidateRect(hwnd,0,FALSE); + + hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0); + + if (mhdc) + { + hdc=mhdc; + rcPaint=NULL; + } + else + { + hdc=BeginPaint(hwnd,&paintst); + rcPaint=&(paintst.rcPaint); + } + + GetClientRect(hwnd,&clRect); + if(rcPaint==NULL) rcPaint=&clRect; + if (rcPaint->right-rcPaint->left==0||rcPaint->top-rcPaint->bottom==0) rcPaint=&clRect; + y=-yScroll; + hdcMem=CreateCompatibleDC(hdc); + hBmpOsb=CreateBitmap(clRect.right,clRect.bottom,1,GetDeviceCaps(hdc,BITSPIXEL),NULL); + hOldBmp=(HBITMAP)SelectObject(hdcMem,hBmpOsb); + oFont=(HFONT)SelectObject(hdcMem,hFont); + SetBkMode(hdcMem,TRANSPARENT); + SetStretchBltMode(hdcMem,HALFTONE); + { HBRUSH hBrush; + + hBrush=CreateSolidBrush(bkColour); + FillRect(hdcMem,rcPaint,hBrush); + DeleteObject(hBrush); + if(hBmpBackground) { + BITMAP bmp; + HDC hdcBmp; + int x,y; + int maxx,maxy; + int destw,desth; + + GetObject(hBmpBackground,sizeof(bmp),&bmp); + hdcBmp=CreateCompatibleDC(hdcMem); + SelectObject(hdcBmp,hBmpBackground); + y=backgroundBmpUse&CLBF_SCROLL?-yScroll:0; + maxx=backgroundBmpUse&CLBF_TILEH?clRect.right:1; + maxy=backgroundBmpUse&CLBF_TILEV?maxy=rcPaint->bottom:y+1; + switch(backgroundBmpUse&CLBM_TYPE) { + case CLB_STRETCH: + if(backgroundBmpUse&CLBF_PROPORTIONAL) { + if(clRect.right*bmp.bmHeighttop-desth) continue; + for(x=0;xleft,rcPaint->top,rcPaint->right-rcPaint->left,rcPaint->bottom-rcPaint->top,hdcMem,rcPaint->left,rcPaint->top,SRCCOPY); + + SelectObject(hdcMem,hOldBmp); + SelectObject(hdcMem,oFont); + DeleteObject(hBmpOsb); + DeleteDC(hdcMem); + paintst.fErase=FALSE; + //DeleteObject(hFont); + if (!mhdc) + { + EndPaint(hwnd,&paintst); + } + } +} + + +int DrawTitleBar(HDC hdcMem2,RECT * rect,int Frameid) +{ + int pos; + BOOL bThemed=FALSE; + HDC hdcMem; + HFONT hoTTBFont; + RECT rc=*rect; + HBRUSH hBack,hoBrush; + HBITMAP b1=NULL,b2=NULL; + hdcMem=CreateCompatibleDC(hdcMem2); + + SetBkMode(hdcMem,TRANSPARENT); + hoTTBFont=(HFONT)SelectObject(hdcMem,_hTitleBarFont); + ske_ResetTextEffect(hdcMem); + ske_ResetTextEffect(hdcMem2); + hBack=GetSysColorBrush(COLOR_3DFACE); + hoBrush=(HBRUSH)SelectObject(hdcMem,hBack); + + pos=id2pos(Frameid); + + if (pos>=0&&poshwndContactList) state=CS_INACTIVE; + xpt_DrawThemeBackground(_hFrameTitleTheme,hdcMem, WP_SMALLCAPTION, state, &rc,&rc); + bThemed=TRUE; + } + else + DrawBackGround(g_pfwFrames[pos].TitleBar.hwnd,hdcMem, hBmpBackground, bkColour, backgroundBmpUse); + } + else if (!g_CluiData.fLayered) + { + ske_BltBackImage(g_pfwFrames[pos].TitleBar.hwnd,hdcMem,&rc); + } + else BitBlt(hdcMem,0,0,rc.right-rc.left,rc.bottom-rc.top,hdcMem2,rect->left,rect->top,SRCCOPY); + SkinDrawGlyph(hdcMem,&rc,&rc,"Main,ID=FrameCaption"); + } + if (bThemed) + SetTextColor(hdcMem,GetSysColor(COLOR_CAPTIONTEXT )); + else + SetTextColor(hdcMem,SelBkColour); + { + RECT textrc=rc; + if (!AlignCOLLIconToLeft) + { + + if(g_pfwFrames[pos].TitleBar.hicon!=NULL) + { + mod_DrawIconEx_helper(hdcMem,rc.left +2,rc.top+((g_nTitleBarHeight>>1)-(GetSystemMetrics(SM_CYSMICON)>>1)),g_pfwFrames[pos].TitleBar.hicon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); + textrc.left+=GetSystemMetrics(SM_CXSMICON)+4; + textrc.top+=2; + } + else + { + textrc.left+=2; + textrc.top+=2; + } + + } + else + { + textrc.left+=GetSystemMetrics(SM_CXSMICON)+2; + textrc.top+=2; + } + ske_TextOut(hdcMem,textrc.left,textrc.top,g_pfwFrames[pos].TitleBar.tbname,lstrlen(g_pfwFrames[pos].TitleBar.tbname)); + + } + if (!AlignCOLLIconToLeft) + { + mod_DrawIconEx_helper(hdcMem,g_pfwFrames[pos].TitleBar.wndSize.right-GetSystemMetrics(SM_CXSMICON)-2,rc.top+((g_nTitleBarHeight>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),g_pfwFrames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); + } + else + { + mod_DrawIconEx_helper(hdcMem,rc.left,rc.top+((g_nTitleBarHeight>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),g_pfwFrames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); + } + + + } + { + BLENDFUNCTION bf={AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; + if (g_pfwFrames[pos].floating || (!g_CluiData.fLayered)) + { + HRGN rgn=CreateRectRgn(rect->left,rect->top,rect->right,rect->bottom); + SelectClipRgn(hdcMem2,rgn); + BitBlt(hdcMem2,rect->left,rect->top,rc.right-rc.left,rc.bottom-rc.top,hdcMem,0,0,SRCCOPY); + DeleteObject(rgn); + } + else + BitBlt(hdcMem2,rect->left,rect->top,rc.right-rc.left,rc.bottom-rc.top,hdcMem,0,0,SRCCOPY); + //MyAlphaBlend(hdcMem2,rect.left,rect.top,rc.right-rc.left,rc.bottom-rc.top,hdcMem,0,0,rc.right-rc.left,rc.bottom-rc.top,bf); + } + + SelectObject(hdcMem,b2); + DeleteObject(b1); + SelectObject(hdcMem,hoTTBFont); + SelectObject(hdcMem,hoBrush); + mod_DeleteDC(hdcMem); + return 0; +} +static LRESULT CALLBACK CLUIFrameTitleBarProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static int s_nLastByPos = -1; + static int s_nOldFrameHeight = -1; + static int s_nCurDragBar = -1; + + RECT rect; + int Frameid,Framemod,direction; + int xpos,ypos; + + Frameid=(GetWindowLongPtr(hwnd,GWLP_USERDATA)); + memset(&rect,0,sizeof(rect)); + + + switch(msg) + { + case WM_CREATE: + if (!_hFrameTitleTheme) + _hFrameTitleTheme=xpt_AddThemeHandle(hwnd,L"WINDOW"); + SendMessage(hwnd,WM_SETFONT,(WPARAM)_hTitleBarFont,0); + return FALSE; + case WM_MEASUREITEM: + return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam); + case WM_DRAWITEM: + return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam); + case WM_USER+100: + return 1; + case WM_ENABLE: + if (hwnd!=0) CLUI__cliInvalidateRect(hwnd,NULL,FALSE); + return 0; + case WM_ERASEBKGND: + { + return 1; + } + case WM_COMMAND: + + + if (ServiceExists(MO_CREATENEWMENUOBJECT)) + { + //if ( CallService(MS_CLIST_MENUPROCESSCOMMAND,MAKEWPARAM(LOWORD(wParam),0),(LPARAM)Frameid) ){break;}; + if (ProcessCommandProxy(MAKEWPARAM(LOWORD(wParam),0),(LPARAM)Frameid) ) break; + }else + { + if ( CallService(MS_CLIST_MENUPROCESSCOMMAND,MAKEWPARAM(LOWORD(wParam),MPCF_CONTEXTFRAMEMENU),(LPARAM)Frameid) ){break;}; + + }; + + + if(HIWORD(wParam)==0) {//mouse events for self created menu + int framepos=id2pos(Frameid); + if (framepos==-1){break;}; + + switch(LOWORD(wParam)) + { + case frame_menu_lock: + g_pfwFrames[framepos].Locked=!g_pfwFrames[framepos].Locked; + break; + case frame_menu_visible: + g_pfwFrames[framepos].visible=!g_pfwFrames[framepos].visible; + break; + case frame_menu_showtitlebar: + g_pfwFrames[framepos].TitleBar.ShowTitleBar=!g_pfwFrames[framepos].TitleBar.ShowTitleBar; + break; + case frame_menu_floating: + CLUIFrames_SetFrameFloat(Frameid,0); + break; + } + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); + } + + break; + case WM_RBUTTONDOWN: + { + HMENU hmenu; + POINT pt; + GetCursorPos(&pt); + + if (ServiceExists(MS_CLIST_MENUBUILDFRAMECONTEXT)) + { + hmenu=(HMENU)CallService(MS_CLIST_MENUBUILDFRAMECONTEXT,Frameid,0); + } + else + {//legacy menu support + int framepos=id2pos(Frameid); + + if (framepos==-1){break;}; + hmenu=CreatePopupMenu(); + // Frames[Frameid].TitleBar.hmenu=hmenu; + AppendMenu(hmenu,MF_STRING|MF_DISABLED|MF_GRAYED,15,g_pfwFrames[framepos].Name); + AppendMenu(hmenu,MF_SEPARATOR,16,_T("")); + + if (g_pfwFrames[framepos].Locked) + {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_lock,TranslateT("Lock Frame"));} + else{AppendMenu(hmenu,MF_STRING,frame_menu_lock,TranslateT("Lock Frame"));}; + + if (g_pfwFrames[framepos].visible) + {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_visible,TranslateT("Visible"));} + else{AppendMenu(hmenu,MF_STRING,frame_menu_visible,TranslateT("Visible") );}; + + if (g_pfwFrames[framepos].TitleBar.ShowTitleBar) + {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_showtitlebar,TranslateT("Show TitleBar") );} + else{AppendMenu(hmenu,MF_STRING,frame_menu_showtitlebar,TranslateT("Show TitleBar") );}; + + if (g_pfwFrames[framepos].floating) + {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_floating,TranslateT("Floating") );} + else{AppendMenu(hmenu,MF_STRING,frame_menu_floating,TranslateT("Floating") );}; + + //err=GetMenuItemCount(hmenu) + + }; + + TrackPopupMenu(hmenu,TPM_LEFTALIGN,pt.x,pt.y,0,hwnd,0); + DestroyMenu(hmenu); + } + break; + case WM_LBUTTONDBLCLK: + { + Framemod=-1; + s_nLastByPos=-1;s_nOldFrameHeight=-1;ReleaseCapture(); + CallService(MS_CLIST_FRAMES_UCOLLFRAME,Frameid,0); + s_nLastByPos=-1;s_nOldFrameHeight=-1;ReleaseCapture(); + } + break; + + case WM_LBUTTONUP: + { + if(GetCapture()!=hwnd){break;}; + s_nCurDragBar=-1;s_nLastByPos=-1;s_nOldFrameHeight=-1;ReleaseCapture(); + break; + }; + case WM_LBUTTONDOWN: + { + + int framepos=id2pos(Frameid); + + if (framepos==-1){break;}; + { + if (g_pfwFrames[framepos].floating) + { + + POINT pt; + GetCursorPos(&pt); + g_pfwFrames[framepos].TitleBar.oldpos=pt; + }; + }; + + //ScreenToClient(Frames[framepos].ContainerWnd,&Frames[framepos].TitleBar.oldpos); + + if ((!(wParam&MK_CONTROL))&&g_pfwFrames[framepos].Locked&&(!(g_pfwFrames[framepos].floating))) + { + if (ModernGetSettingByte(NULL,"CLUI","ClientAreaDrag",SETTING_CLIENTDRAG_DEFAULT)) { + POINT pt; + int res; + //pt=nm->pt; + GetCursorPos(&pt); + res=SendMessage(GetParent(hwnd), WM_SYSCOMMAND, SC_MOVE|HTCAPTION,MAKELPARAM(pt.x,pt.y)); + return res; + } + }; + + if (g_pfwFrames[framepos].floating) + { + RECT rc; + GetCursorPos(&ptOld); + //ClientToScreen(hwnd,&ptOld); + GetWindowRect( hwnd, &rc ); + + nLeft = (short)rc.left; + nTop = (short)rc.top; + }; + + SetCapture(hwnd); + + + break; + }; + case WM_MOUSEMOVE: + { + POINT pt,pt2; + RECT wndr; + int pos; + //tbinfo + { + char TBcapt[255]; + + + pos=id2pos(Frameid); + + if (pos!=-1) + { + int oldflags; + + + sprintf(TBcapt,"%s - h:%d, vis:%d, fl:%d, fl:(%d,%d,%d,%d),or: %d", + g_pfwFrames[pos].szName,g_pfwFrames[pos].height,g_pfwFrames[pos].visible,g_pfwFrames[pos].floating, + g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y, + g_pfwFrames[pos].FloatingSize.x,g_pfwFrames[pos].FloatingSize.y, + g_pfwFrames[pos].order + ); + + oldflags=CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,g_pfwFrames[pos].id),(LPARAM)0); + if (!(oldflags&F_SHOWTBTIP)) + { + oldflags|=F_SHOWTBTIP; + //CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,Frames[pos].id),(LPARAM)oldflags); + }; + //CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_TBTIPNAME,Frames[pos].id),(LPARAM)TBcapt); + }; + + + + } + // + if ((wParam&MK_LBUTTON)/*&&(wParam&MK_CONTROL)*/) + { + RECT rcMiranda; + RECT rcwnd,rcOverlap; + POINT newpt,ofspt,curpt,newpos; + //if(GetCapture()!=hwnd){break;}; + //curdragbar=-1;lbypos=-1;oldframeheight=-1;ReleaseCapture(); + + pos=id2pos(Frameid); + if (g_pfwFrames[pos].floating) + { + + GetCursorPos(&curpt); + rcwnd.bottom=curpt.y+5; + rcwnd.top=curpt.y; + rcwnd.left=curpt.x; + rcwnd.right=curpt.x+5; + + GetWindowRect(pcli->hwndContactList, &rcMiranda ); + //GetWindowRect( Frames[pos].ContainerWnd, &rcwnd ); + //IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ) + if (IsWindowVisible(pcli->hwndContactList) &&IntersectRect( &rcOverlap, &rcwnd, &rcMiranda )) + { + int id=g_pfwFrames[pos].id; + + + + + ofspt.x=0;ofspt.y=0; + ClientToScreen(g_pfwFrames[pos].TitleBar.hwnd,&ofspt); + ofspt.x=curpt.x-ofspt.x;ofspt.y=curpt.y-ofspt.y; + + CLUIFrames_SetFrameFloat(id,0); + newpt.x=0;newpt.y=0; + ClientToScreen(g_pfwFrames[pos].TitleBar.hwnd,&newpt); + SetCursorPos(newpt.x+ofspt.x,newpt.y+ofspt.y); + GetCursorPos(&curpt); + + g_pfwFrames[pos].TitleBar.oldpos=curpt; + + return(0); + }; + + } + else + { + int id=g_pfwFrames[pos].id; + + GetCursorPos(&curpt); + rcwnd.bottom=curpt.y+5; + rcwnd.top=curpt.y; + rcwnd.left=curpt.x; + rcwnd.right=curpt.x+5; + + GetWindowRect(pcli->hwndContactList, &rcMiranda ); + //GetWindowRect( Frames[pos].ContainerWnd, &rcwnd ); + //IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ) + + + if (!IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ) ) + { + GetCursorPos(&curpt); + GetWindowRect( g_pfwFrames[pos].hWnd, &rcwnd ); + rcwnd.left=rcwnd.right-rcwnd.left; + rcwnd.top=rcwnd.bottom-rcwnd.top; + newpos.x=curpt.x;newpos.y=curpt.y; + if (curpt.x>=(rcMiranda.right-1)){newpos.x=curpt.x+5;}; + if (curpt.x<=(rcMiranda.left+1)){newpos.x=curpt.x-(rcwnd.left)-5;}; + if (curpt.y>=(rcMiranda.bottom-1)){newpos.y=curpt.y+5;}; + if (curpt.y<=(rcMiranda.top+1)){newpos.y=curpt.y-(rcwnd.top)-5;}; + ofspt.x=0;ofspt.y=0; + //ClientToScreen(Frames[pos].TitleBar.hwnd,&ofspt); + GetWindowRect(g_pfwFrames[pos].TitleBar.hwnd,&rcwnd); + ofspt.x=curpt.x-ofspt.x;ofspt.y=curpt.y-ofspt.y; + + g_pfwFrames[pos].FloatingPos.x=newpos.x; + g_pfwFrames[pos].FloatingPos.y=newpos.y; + CLUIFrames_SetFrameFloat(id,0); + //SetWindowPos(Frames[pos].ContainerWnd,0,newpos.x,newpos.y,0,0,SWP_NOSIZE); + + + newpt.x=0;newpt.y=0; + ClientToScreen(g_pfwFrames[pos].TitleBar.hwnd,&newpt); + + GetWindowRect( g_pfwFrames[pos].hWnd, &rcwnd ); + SetCursorPos(newpt.x+(rcwnd.right-rcwnd.left)/2,newpt.y+(rcwnd.bottom-rcwnd.top)/2); + GetCursorPos(&curpt); + + g_pfwFrames[pos].TitleBar.oldpos=curpt; + + + return(0); + }; + + }; + + //return(0); + }; + + if(wParam&MK_LBUTTON) { + int newh=-1,prevold; + + if(GetCapture()!=hwnd){break;}; + + + pos=id2pos(Frameid); + + if (g_pfwFrames[pos].floating) + { + GetCursorPos(&pt); + if ((g_pfwFrames[pos].TitleBar.oldpos.x!=pt.x)||(g_pfwFrames[pos].TitleBar.oldpos.y!=pt.y)) + { + + pt2=pt; + ScreenToClient(hwnd,&pt2); + GetWindowRect(g_pfwFrames[pos].ContainerWnd,&wndr); + { + int dX,dY; + POINT ptNew; + + ptNew.x = pt.x; + ptNew.y = pt.y; + //ClientToScreen( hwnd, &ptNew ); + + dX = ptNew.x - ptOld.x; + dY = ptNew.y - ptOld.y; + + nLeft += (short)dX; + nTop += (short)dY; + + if (!(wParam&MK_CONTROL)) + { + PositionThumb( &g_pfwFrames[pos], nLeft, nTop ); + }else + { + + SetWindowPos( g_pfwFrames[pos].ContainerWnd, + HWND_TOPMOST, + nLeft, + nTop, + 0, + 0, + SWP_NOSIZE |SWP_NOACTIVATE| SWP_NOZORDER ); + }; + + ptOld = ptNew; + + + + } + + pt.x=nLeft; + pt.y=nTop; + g_pfwFrames[pos].TitleBar.oldpos=pt; + }; + + //break; + return(0); + }; + + + if(g_pfwFrames[pos].prevvisframe!=-1) { + GetCursorPos(&pt); + + if ((g_pfwFrames[pos].TitleBar.oldpos.x==pt.x)&&(g_pfwFrames[pos].TitleBar.oldpos.y==pt.y)) + {break;}; + + ypos=rect.top+pt.y;xpos=rect.left+pt.x; + Framemod=-1; + + if(g_pfwFrames[pos].align==alBottom) { + direction=-1; + Framemod=pos; + } + else { + direction=1; + Framemod=g_pfwFrames[pos].prevvisframe; + } + if(g_pfwFrames[Framemod].Locked) {break;}; + if(s_nCurDragBar!=-1&&s_nCurDragBar!=pos) {break;}; + + if(s_nLastByPos==-1) { + s_nCurDragBar=pos; + s_nLastByPos=ypos; + s_nOldFrameHeight=g_pfwFrames[Framemod].height; + SetCapture(hwnd); + {break;}; + } + else + { + // if(GetCapture()!=hwnd){break;}; + }; + + newh=s_nOldFrameHeight+direction*(ypos-s_nLastByPos); + if(newh>0) { + prevold=g_pfwFrames[Framemod].height; + g_pfwFrames[Framemod].height=newh; + if(!CLUIFramesFitInSize()) { g_pfwFrames[Framemod].height=prevold; return TRUE;} + g_pfwFrames[Framemod].height=newh; + if(newh>3) g_pfwFrames[Framemod].collapsed=TRUE; + + } + g_pfwFrames[pos].TitleBar.oldpos=pt; + } + + if (newh>0) + { + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); + }; + break; + } + s_nCurDragBar=-1;s_nLastByPos=-1;s_nOldFrameHeight=-1;ReleaseCapture(); + } + break; + case WM_PRINT: + case WM_PRINTCLIENT: + { + //if (lParam&PRF_CLIENT) + { + GetClientRect(hwnd,&rect); + if (!g_CluiData.fLayered) + { + ske_BltBackImage(hwnd,(HDC)wParam,&rect); + } + DrawTitleBar((HDC)wParam,&rect,Frameid); + } + break; + } + case WM_SIZE: + { + InvalidateRect(hwnd,NULL,FALSE); + return DefWindowProc(hwnd, msg, wParam, lParam); + } + case WM_PAINT: + { + HDC paintDC; + if (g_pfwFrames[id2pos(Frameid)].floating || (!g_CluiData.fLayered)) + { + GetClientRect(hwnd,&rect); + paintDC = GetDC(hwnd); + DrawTitleBar(paintDC,&rect,Frameid); + ReleaseDC(hwnd,paintDC); + ValidateRect(hwnd,NULL); + + } + return DefWindowProc(hwnd, msg, wParam, lParam); + } + default:return DefWindowProc(hwnd, msg, wParam, lParam); + } + return TRUE; +} +static int CLUIFrameResizeFloatingFrame(int framepos) +{ + + int width,height; + RECT rect; + + if (!g_pfwFrames[framepos].floating){return(0);}; + if (g_pfwFrames[framepos].ContainerWnd==0){return(0);}; + GetClientRect(g_pfwFrames[framepos].ContainerWnd,&rect); + + width=rect.right-rect.left; + height=rect.bottom-rect.top; + + g_pfwFrames[framepos].visible?CLUI_ShowWindowMod(g_pfwFrames[framepos].ContainerWnd,SW_SHOW/*NOACTIVATE*/):CLUI_ShowWindowMod(g_pfwFrames[framepos].ContainerWnd,SW_HIDE); + + + + if (g_pfwFrames[framepos].TitleBar.ShowTitleBar) + { + CLUI_ShowWindowMod(g_pfwFrames[framepos].TitleBar.hwnd,SW_SHOW/*NOACTIVATE*/); + //if (Frames[framepos].Locked){return(0);}; + g_pfwFrames[framepos].height=height-DEFAULT_TITLEBAR_HEIGHT; + + SetWindowPos(g_pfwFrames[framepos].TitleBar.hwnd,HWND_TOP,0,0,width,DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_DRAWFRAME); + SetWindowPos(g_pfwFrames[framepos].hWnd,HWND_TOP,0,DEFAULT_TITLEBAR_HEIGHT,width,height-DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW); + + } + else + { + //SetWindowPos(Frames[framepos].TitleBar.hwnd,HWND_TOP,0,0,width,DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW|SWP_NOMOVE); + //if (Frames[framepos].Locked){return(0);}; + g_pfwFrames[framepos].height=height; + CLUI_ShowWindowMod(g_pfwFrames[framepos].TitleBar.hwnd,SW_HIDE); + SetWindowPos(g_pfwFrames[framepos].hWnd,HWND_TOP,0,0,width,height,SWP_SHOWWINDOW|SWP_NOACTIVATE); + + }; + // CLUIFramesForceUpdateFrame(&Frames[framepos]); + if (g_pfwFrames[framepos].ContainerWnd!=0) UpdateWindow(g_pfwFrames[framepos].ContainerWnd); + //GetClientRect(Frames[framepos].TitleBar.hwnd,&Frames[framepos].TitleBar.wndSize); + GetWindowRect(g_pfwFrames[framepos].hWnd,&g_pfwFrames[framepos].wndSize); + //Frames[framepos].height=Frames[framepos].wndSize.bottom-Frames[framepos].wndSize.top; + //GetClientRect(Frames[framepos].hWnd,&Frames[framepos].wndSize); + //Frames[framepos].height=Frames[framepos].wndSize.bottom-Frames[framepos].wndSize.top; + return(0); +}; + +static int CLUIFrameOnMainMenuBuild(WPARAM wParam,LPARAM lParam) +{ + if (MirandaExiting()) return 0; + CLUIFramesLoadMainMenu(); + + return 0; +} + +static LRESULT CALLBACK CLUIFrameSubContainerProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + + RECT rect; + int Frameid; + + Frameid=(GetWindowLongPtr(hwnd,GWLP_USERDATA)); + memset(&rect,0,sizeof(rect)); + + /* + if ((msg == WM_MOVE) || (msg == WM_MOVING) || (msg == WM_NCLBUTTONDOWN) || (msg == WM_SYSCOMMAND) ) + { + if (ServiceExists("Utils/SnapWindowProc")) + { + SnapWindowProc_t SnapInfo; + memset(&SnapInfo,0,sizeof(SnapInfo)); + + SnapInfo.hWnd = hwnd; + SnapInfo.wParam = wParam; + SnapInfo.lParam = lParam; + if (CallService("Utils/SnapWindowProc",(WPARAM)&SnapInfo,msg)!=0){return(TRUE);}; + }; + }; + */ + switch(msg) { + case WM_ACTIVATE: + { + if(g_bTransparentFlag) + { + BYTE alpha; + if ((wParam!=WA_INACTIVE || ((HWND)lParam==hwnd) || GetParent((HWND)lParam)==hwnd)) + { + HWND hw=lParam?GetParent((HWND)lParam):0; + alpha=ModernGetSettingByte(NULL,"CList","Alpha",SETTING_ALPHA_DEFAULT); + if (hw) SetWindowPos(hw,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE); + CLUI_SmoothAlphaTransition(hwnd, alpha, 1); + } + } + } + return DefWindowProc(hwnd, msg, wParam, lParam); + + case WM_NOTIFY: + case WM_PARENTNOTIFY: + case WM_SYSCOMMAND: + return SendMessage(pcli->hwndContactList,msg,wParam,lParam); + + case WM_MOVE: + if (g_CluiData.fDocked) return 1; + break; + + case WM_WINDOWPOSCHANGING: + { + if (g_CluiData.mutexPreventDockMoving) + { + WINDOWPOS *wp; + wp=(WINDOWPOS*)lParam; + wp->flags|=SWP_NOMOVE/*|SWP_NOSIZE*/; + wp->flags&=(wp->flags&~SWP_NOACTIVATE); + return DefWindowProc(hwnd, msg, wParam, lParam); + } + break; + } + case WM_WINDOWPOSCHANGED: + { + if (g_CluiData.fDocked && g_CluiData.mutexPreventDockMoving) + return 0; + } + break; + case WM_NCPAINT: + case WM_PAINT: + { + //ValidateRect(hwnd,NULL); + return DefWindowProc(hwnd, msg, wParam, lParam); + } + case WM_ERASEBKGND: + { + return 1; + } + }; + return DefWindowProc(hwnd, msg, wParam, lParam); +}; + +static HWND CreateSubContainerWindow(HWND parent,int x,int y,int width,int height) +{ + HWND hwnd; + hwnd=CreateWindowEx(g_proc_SetLayeredWindowAttributesNew ? WS_EX_LAYERED:0,CLUIFrameSubContainerClassName,TEXT("SubContainerWindow"),WS_POPUP|(!g_CluiData.fLayered ? WS_BORDER : 0),x,y,width,height,parent,0,g_hInst,0); + SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE)&~(WS_CAPTION|WS_BORDER)); + if (g_CluiData.fOnDesktop) + { + HWND hProgMan=FindWindow(TEXT("Progman"),NULL); + if (IsWindow(hProgMan)) + SetParent(hwnd,hProgMan); + } + + + return hwnd; +}; + + + +static LRESULT CALLBACK CLUIFrameContainerWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + + RECT rect; + int Frameid; + + Frameid=(GetWindowLongPtr(hwnd,GWLP_USERDATA)); + memset(&rect,0,sizeof(rect)); + /* + if ((msg == WM_MOVE) || (msg == WM_MOVING) || (msg == WM_NCLBUTTONDOWN) || (msg == WM_SYSCOMMAND) ) + { + if (ServiceExists("Utils/SnapWindowProc")) + { + SnapWindowProc_t SnapInfo; + memset(&SnapInfo,0,sizeof(SnapInfo)); + + SnapInfo.hWnd = hwnd; + SnapInfo.wParam = wParam; + SnapInfo.lParam = lParam; + if (CallService("Utils/SnapWindowProc",(WPARAM)&SnapInfo,msg)!=0){return(TRUE);}; + }; + }; + */ + switch(msg) + { + + case WM_CREATE: + { + int framepos; + + framepos=id2pos(Frameid); + //SetWindowPos(Frames[framepos].TitleBar.hwndTip, HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE ); + + return(0); + }; + case WM_GETMINMAXINFO: + //DefWindowProc(hwnd,msg,wParam,lParam); + { + int framepos; + MINMAXINFO minmax; + + + framepos=id2pos(Frameid); + if(framepos<0||framepos>=g_nFramesCount){break;}; + if (!g_pfwFrames[framepos].minmaxenabled){break;}; + if (g_pfwFrames[framepos].ContainerWnd==0){break;}; + + if (g_pfwFrames[framepos].Locked) + { + RECT rct; + + GetWindowRect(hwnd,&rct); + ((LPMINMAXINFO)lParam)->ptMinTrackSize.x=rct.right-rct.left; + ((LPMINMAXINFO)lParam)->ptMinTrackSize.y=rct.bottom-rct.top; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x=rct.right-rct.left; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y=rct.bottom-rct.top; + // + //return(0); + }; + + + memset(&minmax,0,sizeof(minmax)); + if (SendMessage(g_pfwFrames[framepos].hWnd,WM_GETMINMAXINFO,(WPARAM)0,(LPARAM)&minmax)==0) + { + RECT border; + int tbh=g_nTitleBarHeight*btoint(g_pfwFrames[framepos].TitleBar.ShowTitleBar); + GetBorderSize(hwnd,&border); + if (minmax.ptMaxTrackSize.x!=0&&minmax.ptMaxTrackSize.y!=0){ + + ((LPMINMAXINFO)lParam)->ptMinTrackSize.x=minmax.ptMinTrackSize.x; + ((LPMINMAXINFO)lParam)->ptMinTrackSize.y=minmax.ptMinTrackSize.y; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x=minmax.ptMaxTrackSize.x+border.left+border.right; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y=minmax.ptMaxTrackSize.y+tbh+border.top+border.bottom; + }; + + } + else + { + + + return(DefWindowProc(hwnd, msg, wParam, lParam)); + }; + + + + } + //return 0; + + case WM_MOVE: + { + int framepos; + RECT rect; + + framepos=id2pos(Frameid); + + if(framepos<0||framepos>=g_nFramesCount){break;}; + if (g_pfwFrames[framepos].ContainerWnd==0){return(0);}; + + GetWindowRect(g_pfwFrames[framepos].ContainerWnd,&rect); + g_pfwFrames[framepos].FloatingPos.x=rect.left; + g_pfwFrames[framepos].FloatingPos.y=rect.top; + g_pfwFrames[framepos].FloatingSize.x=rect.right-rect.left; + g_pfwFrames[framepos].FloatingSize.y=rect.bottom-rect.top; + + CLUIFramesStoreFrameSettings(framepos); + + if ( g_pfwFrames[framepos].floating ) + { + POINT curpt,ofspt, newpt, newpos; + RECT rcwnd, rcOverlap, rcMiranda; + + GetCursorPos(&curpt); + rcwnd.bottom=curpt.y+5; + rcwnd.top=curpt.y; + rcwnd.left=curpt.x; + rcwnd.right=curpt.x+5; + + GetWindowRect(pcli->hwndContactList, &rcMiranda ); + //GetWindowRect( Frames[pos].ContainerWnd, &rcwnd ); + //IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ) + + + if (IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ) ) + { + GetCursorPos(&curpt); + GetWindowRect( g_pfwFrames[framepos].hWnd, &rcwnd ); + rcwnd.left=rcwnd.right-rcwnd.left; + rcwnd.top=rcwnd.bottom-rcwnd.top; + newpos.x=curpt.x;newpos.y=curpt.y; + if (curpt.x>=(rcMiranda.right-1)){newpos.x=curpt.x+5;}; + if (curpt.x<=(rcMiranda.left+1)){newpos.x=curpt.x-(rcwnd.left)-5;}; + if (curpt.y>=(rcMiranda.bottom-1)){newpos.y=curpt.y+5;}; + if (curpt.y<=(rcMiranda.top+1)){newpos.y=curpt.y-(rcwnd.top)-5;}; + ofspt.x=0;ofspt.y=0; + //ClientToScreen(Frames[pos].TitleBar.hwnd,&ofspt); + GetWindowRect(g_pfwFrames[framepos].TitleBar.hwnd,&rcwnd); + ofspt.x=curpt.x-ofspt.x;ofspt.y=curpt.y-ofspt.y; + + g_pfwFrames[framepos].FloatingPos.x=newpos.x; + g_pfwFrames[framepos].FloatingPos.y=newpos.y; + CLUIFrames_SetFrameFloat(Frameid,0); + //SetWindowPos(Frames[pos].ContainerWnd,0,newpos.x,newpos.y,0,0,SWP_NOSIZE); + + + newpt.x=0;newpt.y=0; + ClientToScreen(g_pfwFrames[framepos].TitleBar.hwnd,&newpt); + + GetWindowRect( g_pfwFrames[framepos].hWnd, &rcwnd ); + SetCursorPos(newpt.x+(rcwnd.right-rcwnd.left)/2,newpt.y+(rcwnd.bottom-rcwnd.top)/2); + GetCursorPos(&curpt); + + g_pfwFrames[framepos].TitleBar.oldpos=curpt; + + + return(0); + }; + + }; + + + return(0); + }; + + case WM_SIZE: + { + int framepos; + RECT rect; + + CallWindowProc(DefWindowProc, hwnd, msg, wParam, lParam); + + framepos=id2pos(Frameid); + + if(framepos<0||framepos>=g_nFramesCount){break;}; + if (g_pfwFrames[framepos].ContainerWnd==0){return(0);}; + CLUIFrameResizeFloatingFrame(framepos); + + GetWindowRect(g_pfwFrames[framepos].ContainerWnd,&rect); + g_pfwFrames[framepos].FloatingPos.x=rect.left; + g_pfwFrames[framepos].FloatingPos.y=rect.top; + g_pfwFrames[framepos].FloatingSize.x=rect.right-rect.left; + g_pfwFrames[framepos].FloatingSize.y=rect.bottom-rect.top; + + CLUIFramesStoreFrameSettings(framepos); + + + return(0); + }; + case WM_LBUTTONDOWN: + { + if (ModernGetSettingByte(NULL,"CLUI","ClientAreaDrag",SETTING_CLIENTDRAG_DEFAULT)) { + POINT pt; + GetCursorPos(&pt); + return SendMessage( hwnd, WM_SYSCOMMAND, SC_MOVE|HTCAPTION,MAKELPARAM(pt.x,pt.y)); + } + break; + } + case WM_CLOSE: + { + DestroyWindow(hwnd); + break; + }; + + case WM_DESTROY: + { + //{ CLUIFramesStoreAllFrames();}; + return(0); + }; + /* + case WM_COMMAND: + case WM_NOTIFY: + return(SendMessage(pcli->hwndContactList,msg,wParam,lParam)); + */ + + + }; + return DefWindowProc(hwnd, msg, wParam, lParam); +}; +static HWND CreateContainerWindow(HWND parent,int x,int y,int width,int height) +{ + return(CreateWindow(TEXT("FramesContainer"),TEXT("FramesContainer"),WS_POPUP|WS_THICKFRAME,x,y,width,height,parent,0,g_hInst,0)); +}; + + +static int _us_DoSetFrameFloat(WPARAM wParam,LPARAM lParam) +{ + HWND hwndtmp,hwndtooltiptmp; + + + int pos = id2pos( wParam ); + if( pos >= 0&& pos < g_nFramesCount ) + + if (g_pfwFrames[pos].floating || (lParam&2)) + { + if (g_pfwFrames[pos].OwnerWindow!=(HWND)-2 &&g_pfwFrames[pos].visible) + { + if (g_pfwFrames[pos].OwnerWindow==0) g_pfwFrames[pos].OwnerWindow=CreateSubContainerWindow(pcli->hwndContactList,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,10,10); + CLUI_ShowWindowMod(g_pfwFrames[pos].OwnerWindow,(g_pfwFrames[pos].visible && g_pfwFrames[pos].collapsed && IsWindowVisible(pcli->hwndContactList))?SW_SHOW/*NOACTIVATE*/:SW_HIDE); + SetParent(g_pfwFrames[pos].hWnd,g_pfwFrames[pos].OwnerWindow); + SetParent(g_pfwFrames[pos].TitleBar.hwnd,pcli->hwndContactList); + SetWindowLongPtr(g_pfwFrames[pos].OwnerWindow,GWLP_USERDATA,g_pfwFrames[pos].id); + g_pfwFrames[pos].floating=FALSE; + if (!(lParam&2)) + { + DestroyWindow(g_pfwFrames[pos].ContainerWnd); + g_pfwFrames[pos].ContainerWnd=0; + } + } + else + { + SetParent(g_pfwFrames[pos].hWnd,pcli->hwndContactList); + SetParent(g_pfwFrames[pos].TitleBar.hwnd,pcli->hwndContactList); + g_pfwFrames[pos].floating=FALSE; + if (g_pfwFrames[pos].ContainerWnd) DestroyWindow(g_pfwFrames[pos].ContainerWnd); + g_pfwFrames[pos].ContainerWnd=0; + } + } + else + { + RECT recttb,rectw,border; + int temp; + int neww,newh; + BOOLEAN locked; + + g_pfwFrames[pos].oldstyles=GetWindowLong(g_pfwFrames[pos].hWnd,GWL_STYLE); + g_pfwFrames[pos].TitleBar.oldstyles=GetWindowLong(g_pfwFrames[pos].TitleBar.hwnd,GWL_STYLE); + locked=g_pfwFrames[pos].Locked; + g_pfwFrames[pos].Locked=FALSE; + g_pfwFrames[pos].minmaxenabled=FALSE; + + GetWindowRect(g_pfwFrames[pos].hWnd,&rectw); + GetWindowRect(g_pfwFrames[pos].TitleBar.hwnd,&recttb); + if (!g_pfwFrames[pos].TitleBar.ShowTitleBar){ + recttb.top=recttb.bottom=recttb.left=recttb.right=0; + }; + + g_pfwFrames[pos].ContainerWnd=CreateContainerWindow(pcli->hwndContactList,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,10,10); + + + + + SetParent(g_pfwFrames[pos].hWnd,g_pfwFrames[pos].ContainerWnd); + SetParent(g_pfwFrames[pos].TitleBar.hwnd,g_pfwFrames[pos].ContainerWnd); + if (g_pfwFrames[pos].OwnerWindow!=(HWND)-2 && g_pfwFrames[pos].OwnerWindow!=0) + { + DestroyWindow(g_pfwFrames[pos].OwnerWindow); + g_pfwFrames[pos].OwnerWindow=0; + } + + GetBorderSize(g_pfwFrames[pos].ContainerWnd,&border); + + + SetWindowLongPtr(g_pfwFrames[pos].ContainerWnd,GWLP_USERDATA,g_pfwFrames[pos].id); + if ((lParam==1)) + { + //if ((Frames[pos].FloatingPos.x!=0)&&(Frames[pos].FloatingPos.y!=0)) + { + if (g_pfwFrames[pos].FloatingPos.x<0){g_pfwFrames[pos].FloatingPos.x=0;}; + if (g_pfwFrames[pos].FloatingPos.y<0){g_pfwFrames[pos].FloatingPos.y=0;}; + + SetWindowPos(g_pfwFrames[pos].ContainerWnd,HWND_TOPMOST,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,g_pfwFrames[pos].FloatingSize.x,g_pfwFrames[pos].FloatingSize.y,SWP_HIDEWINDOW|SWP_NOACTIVATE); + } + } + else if (lParam==0) + { + neww=rectw.right-rectw.left+border.left+border.right; + newh=(rectw.bottom-rectw.top)+(recttb.bottom-recttb.top)+border.top+border.bottom; + if (neww<20){neww=40;}; + if (newh<20){newh=40;}; + if (g_pfwFrames[pos].FloatingPos.x<20){g_pfwFrames[pos].FloatingPos.x=40;}; + if (g_pfwFrames[pos].FloatingPos.y<20){g_pfwFrames[pos].FloatingPos.y=40;}; + + SetWindowPos(g_pfwFrames[pos].ContainerWnd,HWND_TOPMOST,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,neww,newh,SWP_HIDEWINDOW|SWP_NOACTIVATE); + }; + + + SetWindowText(g_pfwFrames[pos].ContainerWnd,g_pfwFrames[pos].TitleBar.tbname); + + temp=GetWindowLong(g_pfwFrames[pos].ContainerWnd,GWL_EXSTYLE); + temp|=WS_EX_TOOLWINDOW|WS_EX_TOPMOST ; + SetWindowLong(g_pfwFrames[pos].ContainerWnd,GWL_EXSTYLE,temp); + + g_pfwFrames[pos].floating=TRUE; + g_pfwFrames[pos].Locked=locked; + + } + CLUIFramesStoreFrameSettings(pos); + g_pfwFrames[pos].minmaxenabled=TRUE; + hwndtooltiptmp=g_pfwFrames[pos].TitleBar.hwndTip; + + hwndtmp=g_pfwFrames[pos].ContainerWnd; + + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); + if (hwndtmp) SendMessage(hwndtmp,WM_SIZE,0,0); + + + SetWindowPos(hwndtooltiptmp, HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE|SWP_NOACTIVATE ); + + return 0; +} + + +int CLUIFrameOnModulesLoad(WPARAM wParam,LPARAM lParam) +{ + /* HOOK */ + CLUIFramesLoadMainMenu(); + CLUIFramesCreateMenuForFrame(-1,-1,000010000,MS_CLIST_ADDCONTEXTFRAMEMENUITEM); + return 0; +} +int CLUIFrameOnModulesUnload(WPARAM wParam,LPARAM lParam) +{ + // + //if (MirandaExiting()) return 0; + if (!_hmiVisible) return 0; + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiVisible, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiTBVisible, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiLock, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiColl, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiFloating, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiAlignTop, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiAlignClient, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiAlignBottom, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiBorder, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiAlignRoot, 1 ); + + + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiPosUp, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiPosDown, 1 ); + CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )_hmiPosRoot, 1 ); + + + CallService( MO_REMOVEMENUITEM, ( LPARAM )_hmiVisible, 1 ); + CallService( MO_REMOVEMENUITEM, ( LPARAM )_hmiTBVisible, 1 ); + CallService( MO_REMOVEMENUITEM, ( LPARAM )_hmiLock, 1 ); + CallService( MO_REMOVEMENUITEM, ( LPARAM )_hmiColl, 1 ); + CallService( MO_REMOVEMENUITEM, ( LPARAM )_hmiFloating, 1 ); + CallService( MO_REMOVEMENUITEM, ( LPARAM )_hmiBorder, 1 ); + CallService( MO_REMOVEMENUITEM, ( LPARAM )_hmiAlignRoot, 1 ); + CallService( MO_REMOVEMENUITEM, ( LPARAM )_hmiPosRoot, 1 ); + + _hmiVisible=0; + return 0; +} + +int LoadCLUIFramesModule(void) +{ + WNDCLASS wndclass; + WNDCLASS cntclass; + WNDCLASS subconclass; + InitializeCriticalSection(&_cluiFramesModuleCS); + _cluiFramesModuleCSInitialized=TRUE; + + wndclass.style = CS_DBLCLKS;//|CS_HREDRAW|CS_VREDRAW ; + wndclass.lpfnWndProc = CLUIFrameTitleBarProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = g_hInst; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); + wndclass.hbrBackground = GetSysColorBrush(COLOR_3DFACE); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = CLUIFrameTitleBarClassName; + RegisterClass(&wndclass); + + subconclass.style = CS_DBLCLKS;//|CS_HREDRAW|CS_VREDRAW ; + subconclass.lpfnWndProc = CLUIFrameSubContainerProc; + subconclass.cbClsExtra = 0; + subconclass.cbWndExtra = 0; + subconclass.hInstance = g_hInst; + subconclass.hIcon = NULL; + subconclass.hCursor = LoadCursor(NULL, IDC_ARROW); + subconclass.hbrBackground = NULL; + subconclass.lpszMenuName = NULL; + subconclass.lpszClassName = CLUIFrameSubContainerClassName; + RegisterClass(&subconclass); + + //container helper + + cntclass.style = CS_DBLCLKS/*|CS_HREDRAW|CS_VREDRAW*/|( IsWinVerXPPlus() ? CS_DROPSHADOW : 0); + cntclass.lpfnWndProc = CLUIFrameContainerWndProc; + cntclass.cbClsExtra = 0; + cntclass.cbWndExtra = 0; + cntclass.hInstance = g_hInst; + cntclass.hIcon = NULL; + cntclass.hCursor = LoadCursor(NULL, IDC_ARROW); + cntclass.hbrBackground = NULL; + cntclass.lpszMenuName = NULL; + cntclass.lpszClassName = TEXT("FramesContainer"); + RegisterClass(&cntclass); + //end container helper + + GapBetweenFrames=ModernGetSettingDword(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT); + + g_nFramesCount=0; + + InitFramesMenus(); + + ModernHookEvent(ME_SYSTEM_MODULESLOADED,CLUIFrameOnModulesLoad); + ModernHookEvent(ME_CLIST_PREBUILDFRAMEMENU,CLUIFramesModifyContextMenuForFrame); + ModernHookEvent(ME_CLIST_PREBUILDMAINMENU,CLUIFrameOnMainMenuBuild); + ModernHookEvent(ME_SYSTEM_PRESHUTDOWN, CLUIFrameOnModulesUnload); + + CreateCluiFramesServices(); + + + hWndExplorerToolBar =FindWindowEx(0,0,TEXT("Shell_TrayWnd"),NULL); + OnFrameTitleBarBackgroundChange(0,0); + _fCluiFramesModuleNotStarted=FALSE; + return 0; +} + +static INT_PTR UnloadMainMenu() +{ + CLUIFrameOnModulesUnload(0,0); + if(_hmiRoot!=(HANDLE)-1) + { + CallService(MS_CLIST_REMOVEMAINMENUITEM,(WPARAM)_hmiRoot,0); + _hmiRoot=(HGENMENU)-1; + } + + return (INT_PTR) _hmiRoot; +} + +int UnLoadCLUIFramesModule(void) +{ + int i; + + _fCluiFramesModuleNotStarted=TRUE; + if(hBmpBackground) {DeleteObject(hBmpBackground); hBmpBackground=NULL;} + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + CLUIFramesStoreAllFrames(); + + + UnitFramesMenu(); + UnloadMainMenu(); + for (i=0;ihwndContactTree) + DestroyWindow(g_pfwFrames[i].hWnd); + + g_pfwFrames[i].hWnd=(HWND)-1; + DestroyWindow(g_pfwFrames[i].TitleBar.hwnd); + g_pfwFrames[i].TitleBar.hwnd=(HWND)-1; + if (g_pfwFrames[i].ContainerWnd && g_pfwFrames[i].ContainerWnd!=(HWND)(-2)&& g_pfwFrames[i].ContainerWnd!=(HWND)(-1)) DestroyWindow(g_pfwFrames[i].ContainerWnd); + g_pfwFrames[i].ContainerWnd=(HWND)-1; + if (g_pfwFrames[i].TitleBar.hmenu) DestroyMenu(g_pfwFrames[i].TitleBar.hmenu); + if (g_pfwFrames[i].OwnerWindow && g_pfwFrames[i].OwnerWindow!=(HWND)(-2)&& g_pfwFrames[i].OwnerWindow!=(HWND)(-1)) + DestroyWindow(g_pfwFrames[i].OwnerWindow ); + g_pfwFrames[i].OwnerWindow=(HWND)-2; + if (g_pfwFrames[i].UpdateRgn) DeleteObject(g_pfwFrames[i].UpdateRgn); + + if (g_pfwFrames[i].Name!=NULL) mir_free_and_nill(g_pfwFrames[i].Name); + if (g_pfwFrames[i].szName!=NULL) mir_free_and_nill(g_pfwFrames[i].szName); + if (g_pfwFrames[i].TitleBar.tbname!=NULL) mir_free_and_nill(g_pfwFrames[i].TitleBar.tbname); + if (g_pfwFrames[i].TitleBar.sztbname!=NULL) mir_free_and_nill(g_pfwFrames[i].TitleBar.sztbname); + if (g_pfwFrames[i].TitleBar.tooltip!=NULL) mir_free_and_nill(g_pfwFrames[i].TitleBar.tooltip); + if (g_pfwFrames[i].TitleBar.sztooltip!=NULL) mir_free_and_nill(g_pfwFrames[i].TitleBar.sztooltip); + + } + if(g_pfwFrames) free(g_pfwFrames); + g_pfwFrames=NULL; + g_nFramesCount=0; + UnregisterClass(CLUIFrameTitleBarClassName,g_hInst); + DeleteObject(_hTitleBarFont); + + _cluiFramesModuleCSInitialized=FALSE; + DeleteCriticalSection(&_cluiFramesModuleCS); + return 0; +} + +static int _us_DoSetFramePaintProc(WPARAM wParam, LPARAM lParam) +{ + if (!wParam) return 0; + { + // LOOK REQUIRED OR SYNC CALL NEEDED + FRAMEWND *frm=FindFrameByItsHWND((HWND)wParam); + if (!frm) return 0; + if (lParam) + frm->PaintCallbackProc=(tPaintCallbackProc)lParam; + else + frm->PaintCallbackProc=NULL; + return 1; + } +} +int CLUIFrames_SetLayeredMode( BOOL fLayeredMode, HWND hwnd ) +{ + int i; + for(i=0;ihwndContactList && g_pfwFrames[i].PaintCallbackProc==NULL) + { + //create owner window + g_pfwFrames[i].OwnerWindow=CreateSubContainerWindow(pcli->hwndContactList,g_pfwFrames[i].FloatingPos.x,g_pfwFrames[i].FloatingPos.y,10,10); + SetParent(g_pfwFrames[i].hWnd,g_pfwFrames[i].OwnerWindow); + } + } + else + { + if (GetParent(g_pfwFrames[i].hWnd)==g_pfwFrames[i].OwnerWindow) + { + SetParent(g_pfwFrames[i].hWnd,hwnd); + if ((INT_PTR)g_pfwFrames[i].OwnerWindow>0) + { + DestroyWindow(g_pfwFrames[i].OwnerWindow); + g_pfwFrames[i].OwnerWindow=(HWND)-2; + } + } + } + } + + CLUIFrames_UpdateFrame((WPARAM)-1,0); //update all frames + return 0; +} + +int CLUIFrames_UpdateBorders() +{ + for( int i = 0; i < g_nFramesCount; i++ ) + { + if ( !g_pfwFrames[i].floating ) + { + DWORD style = (int)GetWindowLong( g_pfwFrames[i].hWnd, GWL_STYLE ) & ( ~WS_BORDER ); + if ( !g_CluiData.fLayered && g_pfwFrames[i].UseBorder ) style|=WS_BORDER; + SetWindowLong( g_pfwFrames[i].hWnd, GWL_STYLE, style ); + CLUIFramesModifyMainMenuItems( g_pfwFrames[i].id, 0 ); + RedrawWindow( g_pfwFrames[i].hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE ); + }; + } + + return 0; +} \ No newline at end of file -- cgit v1.2.3