int fnShowHide(WPARAM, LPARAM) { BOOL bShow = FALSE; int iVisibleState = cli.pfnGetWindowVisibleState(cli.hwndContactList, 0, 0); //bShow is FALSE when we enter the switch. switch (iVisibleState) { case GWVS_PARTIALLY_COVERED: //If we don't want to bring it to top, we can use a simple break. This goes against readability ;-) but the comment explains it. if (!db_get_b(NULL, "CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT)) break; case GWVS_COVERED: //Fall through (and we're already falling) case GWVS_HIDDEN: bShow = TRUE; break; case GWVS_VISIBLE: //This is not needed, but goes for readability. bShow = FALSE; break; case -1: //We can't get here, both cli.hwndContactList and iStepX and iStepY are right. return 0; } if (bShow == TRUE) { RECT rcWindow; ShowWindow(cli.hwndContactList, SW_RESTORE); if (!db_get_b(NULL, "CList", "OnTop", SETTING_ONTOP_DEFAULT)) SetWindowPos(cli.hwndContactList, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); else SetWindowPos(cli.hwndContactList, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); SetForegroundWindow(cli.hwndContactList); db_set_b(NULL, "CList", "State", SETTING_STATE_NORMAL); //this forces the window onto the visible screen GetWindowRect(cli.hwndContactList, &rcWindow); if (Utils_AssertInsideScreen(&rcWindow) == 1) { MoveWindow(cli.hwndContactList, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE); } } else { //It needs to be hidden if (db_get_b(NULL, "CList", "ToolWindow", SETTING_TOOLWINDOW_DEFAULT) || db_get_b(NULL, "CList", "Min2Tray", SETTING_MIN2TRAY_DEFAULT)) { ShowWindow(cli.hwndContactList, SW_HIDE); db_set_b(NULL, "CList", "State", SETTING_STATE_HIDDEN); } else { ShowWindow(cli.hwndContactList, SW_MINIMIZE); db_set_b(NULL, "CList", "State", SETTING_STATE_MINIMIZED); } if (db_get_b(NULL, "CList", "DisableWorkingSet", 1)) SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1); } return 0; }
int ShowHide(WPARAM, LPARAM) { BOOL bShow = FALSE; int iVisibleState = pcli->pfnGetWindowVisibleState(pcli->hwndContactList, 0, 0); if (IsIconic(pcli->hwndContactList)) { SendMessage(pcli->hwndContactList, WM_SYSCOMMAND, SC_RESTORE, 0); bShow = TRUE; } else { switch (iVisibleState) { case GWVS_PARTIALLY_COVERED: //If we don't want to bring it to top, we can use a simple break. This goes against readability ;-) but the comment explains it. if (!db_get_b(NULL, "CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT)) break; case GWVS_COVERED: //Fall through (and we're already falling) case GWVS_HIDDEN: bShow = TRUE; break; case GWVS_VISIBLE: //This is not needed, but goes for readability. bShow = FALSE; break; case -1: //We can't get here, both cli.hwndContactList and iStepX and iStepY are right. return 0; } } if (bShow == TRUE) { RECT rcWindow; SetWindowPos(pcli->hwndContactList, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW | SWP_NOSENDCHANGING | SWP_NOCOPYBITS); if (!db_get_b(NULL, "CList", "OnTop", SETTING_ONTOP_DEFAULT)) SetWindowPos(pcli->hwndContactList, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSENDCHANGING | SWP_NOCOPYBITS); SetForegroundWindow(pcli->hwndContactList); //SetActiveWindow(pcli->hwndContactList); ShowWindow(pcli->hwndContactList, SW_SHOW); db_set_b(NULL, "CList", "State", SETTING_STATE_NORMAL); GetWindowRect(pcli->hwndContactList, &rcWindow); if (Utils_AssertInsideScreen(&rcWindow) == 1) { MoveWindow(pcli->hwndContactList, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE); } } else { //It needs to be hidden ShowWindow(pcli->hwndContactList, SW_HIDE); db_set_b(NULL, "CList", "State", SETTING_STATE_HIDDEN); if (db_get_b(NULL, "CList", "DisableWorkingSet", 1)) SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1); } return 0; }
EXTERN_C MIR_CORE_DLL(int) Utils_RestoreWindowPosition(HWND hwnd, MCONTACT hContact, const char *szModule, const char *szNamePrefix, int flags) { WINDOWPLACEMENT wp; wp.length = sizeof(wp); GetWindowPlacement(hwnd, &wp); char szSettingName[64]; mir_snprintf(szSettingName, _countof(szSettingName), "%sx", szNamePrefix); int x = db_get_dw(hContact, szModule, szSettingName, -1); if (x == -1) return 1; mir_snprintf(szSettingName, _countof(szSettingName), "%sy", szNamePrefix); int y = (int)db_get_dw(hContact, szModule, szSettingName, -1); if (flags & RWPF_NOSIZE) OffsetRect(&wp.rcNormalPosition, x-wp.rcNormalPosition.left, y-wp.rcNormalPosition.top); else { wp.rcNormalPosition.left = x; wp.rcNormalPosition.top = y; mir_snprintf(szSettingName, _countof(szSettingName), "%swidth", szNamePrefix); wp.rcNormalPosition.right = wp.rcNormalPosition.left+db_get_dw(hContact, szModule, szSettingName, -1); mir_snprintf(szSettingName, _countof(szSettingName), "%sheight", szNamePrefix); wp.rcNormalPosition.bottom = wp.rcNormalPosition.top+db_get_dw(hContact, szModule, szSettingName, -1); } wp.flags = 0; if (flags & RWPF_HIDDEN) wp.showCmd = SW_HIDE; if (flags & RWPF_NOACTIVATE) wp.showCmd = SW_SHOWNOACTIVATE; if (!(flags & RWPF_NOMOVE)) Utils_AssertInsideScreen(&wp.rcNormalPosition); SetWindowPlacement(hwnd, &wp); return 0; }
int cliShowHide(WPARAM wParam,LPARAM lParam) { BOOL bShow = FALSE; int iVisibleState = GetWindowVisibleState(pcli->hwndContactList,0,0); int method; method=ModernGetSettingByte(NULL, "ModernData", "HideBehind", SETTING_HIDEBEHIND_DEFAULT);; //(0-none, 1-leftedge, 2-rightedge); if (method) { if (ModernGetSettingByte(NULL, "ModernData", "BehindEdge", SETTING_BEHINDEDGE_DEFAULT)==0 && lParam!=1) { //hide CLUI_HideBehindEdge(); } else { CLUI_ShowFromBehindEdge(); } bShow=TRUE; iVisibleState=GWVS_HIDDEN; } if (!method && ModernGetSettingByte(NULL, "ModernData", "BehindEdge", SETTING_BEHINDEDGE_DEFAULT)>0) { g_CluiData.bBehindEdgeSettings=ModernGetSettingByte(NULL, "ModernData", "BehindEdge", SETTING_BEHINDEDGE_DEFAULT); CLUI_ShowFromBehindEdge(); g_CluiData.bBehindEdgeSettings=0; g_CluiData.nBehindEdgeState=0; ModernDeleteSetting(NULL, "ModernData", "BehindEdge"); } //bShow is FALSE when we enter the switch if no hide behind edge. switch (iVisibleState) { case GWVS_PARTIALLY_COVERED: bShow = TRUE; break; case GWVS_COVERED: //Fall through (and we're already falling) bShow = TRUE; break; case GWVS_HIDDEN: bShow = TRUE; break; case GWVS_VISIBLE: //This is not needed, but goes for readability. bShow = FALSE; break; case -1: //We can't get here, both pcli->hwndContactList and iStepX and iStepY are right. return 0; } if( (bShow == TRUE || lParam == 1) ) { Sync( CLUIFrames_ActivateSubContainers, TRUE ); CLUI_ShowWindowMod(pcli->hwndContactList, SW_RESTORE); if (!ModernGetSettingByte(NULL,"CList","OnDesktop",SETTING_ONDESKTOP_DEFAULT)) { Sync(CLUIFrames_OnShowHide, pcli->hwndContactList,1); //TO BE PROXIED SetWindowPos(pcli->hwndContactList, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE |SWP_NOACTIVATE); g_bCalledFromShowHide=1; if (!ModernGetSettingByte(NULL,"CList","OnTop",SETTING_ONTOP_DEFAULT)) SetWindowPos(pcli->hwndContactList, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); g_bCalledFromShowHide=0; } else { SetWindowPos(pcli->hwndContactList, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); Sync(CLUIFrames_OnShowHide, pcli->hwndContactList,1); SetForegroundWindow(pcli->hwndContactList); } ModernWriteSettingByte(NULL,"CList","State",SETTING_STATE_NORMAL); RECT rcWindow; GetWindowRect(pcli->hwndContactList,&rcWindow); if (Utils_AssertInsideScreen(&rcWindow) == 1) { MoveWindow(pcli->hwndContactList, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE); } //if (DBGetContactSettingByte(NULL,"CList","OnDesktop",SETTING_ONDESKTOP_DEFAULT)) // SetWindowPos(pcli->hwndContactList, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } else { //It needs to be hidden if (GetWindowLong(pcli->hwndContactList, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) { CListMod_HideWindow(pcli->hwndContactList, SW_HIDE); ModernWriteSettingByte(NULL,"CList","State",SETTING_STATE_HIDDEN); } else { if (ModernGetSettingByte(NULL,"CList","Min2Tray",SETTING_MIN2TRAY_DEFAULT)) { CLUI_ShowWindowMod(pcli->hwndContactList, SW_HIDE); ModernWriteSettingByte(NULL,"CList","State",SETTING_STATE_HIDDEN); } else { CLUI_ShowWindowMod(pcli->hwndContactList, SW_MINIMIZE); ModernWriteSettingByte(NULL,"CList","State",SETTING_STATE_MINIMIZED); } } if (MySetProcessWorkingSetSize != NULL) MySetProcessWorkingSetSize(GetCurrentProcess(),-1,-1); } return 0; }