Exemple #1
0
int ScreenSaver(int EnableExit)
{
	INPUT_RECORD rec;
	clock_t WaitTime;

	if (ScreenSaverActive)
		return 1;

	ChangePriority ChPriority(ChangePriority::IDLE);

	for (WaitTime=GetProcessUptimeMSec(); GetProcessUptimeMSec()-WaitTime<500;)
	{
		if (PeekInputRecord(&rec))
			return 1;

		WINPORT(Sleep)(100);
	}

	ScreenSaverActive=TRUE;
	CONSOLE_CURSOR_INFO CursorInfo;
	Console.GetCursorInfo(CursorInfo);
	{
		SaveScreen SaveScr;
		SetCursorType(0,10);
		randomize();
		SetScreen(0,0,ScrX,ScrY,L' ',F_LIGHTGRAY|B_BLACK);

		for (size_t I=0; I<ARRAYSIZE(Star); I++)
		{
			Star[I].Type=STAR_NONE;
			Star[I].Color=0;
		}

		int Step=0;

		while (!PeekInputRecord(&rec))
		{
			clock_t CurTime=GetProcessUptimeMSec();

			if (EnableExit && Opt.InactivityExit && Opt.InactivityExitTime>0 &&
			        CurTime-StartIdleTime>Opt.InactivityExitTime*60000 &&
			        FrameManager->GetFrameCount()==1)
			{
				FrameManager->ExitMainLoop(FALSE);
				return 0;
			}

			WINPORT(Sleep)(50);
			ShowSaver(Step++);
		}
	}
	SetCursorType(CursorInfo.bVisible!=FALSE, CursorInfo.dwSize);
	ScreenSaverActive=FALSE;
	FlushInputBuffer();
	StartIdleTime=GetProcessUptimeMSec();
	return 1;
}
Exemple #2
0
static int CASHook(const Manager::Key& key)
{
	if (key.IsEvent())
	{
		const KEY_EVENT_RECORD& rec=key.Event().Event.KeyEvent;
		if (rec.bKeyDown)
		{
			switch (rec.wVirtualKeyCode)
			{
				case VK_SHIFT:
				case VK_MENU:
				case VK_CONTROL:
				{
					const auto
						maskLeft=LEFT_CTRL_PRESSED|LEFT_ALT_PRESSED|SHIFT_PRESSED,
						maskRight=RIGHT_CTRL_PRESSED|RIGHT_ALT_PRESSED|SHIFT_PRESSED;
					auto state=rec.dwControlKeyState;
					auto wait=[](DWORD mask)
					{
						for (;;)
						{
							INPUT_RECORD rec;

							if (PeekInputRecord(&rec,true))
							{
								GetInputRecord(&rec,true,true);
								if ((rec.Event.KeyEvent.dwControlKeyState&mask) != mask)
									break;
							}

							Sleep(1);
						}
					};
					auto
						case1 = Global->Opt->CASRule&1 && (state&maskLeft) == maskLeft,
						case2 = Global->Opt->CASRule&2 && (state&maskRight) == maskRight;
					if (case1 || case2)
					{
						auto maskCurrent = case1?maskLeft:maskRight;
						const auto currentWindow = Global->WindowManager->GetCurrentWindow();
						if (currentWindow->CanFastHide())
						{
							int isPanelFocus=currentWindow->GetType() == windowtype_panels;

							if (isPanelFocus)
							{
								int LeftVisible=Global->CtrlObject->Cp()->LeftPanel->IsVisible();
								int RightVisible=Global->CtrlObject->Cp()->RightPanel->IsVisible();
								int CmdLineVisible=Global->CtrlObject->CmdLine()->IsVisible();
								int KeyBarVisible=Global->CtrlObject->Cp()->GetKeybar().IsVisible();
								Manager::ShowBackground();
								Global->CtrlObject->Cp()->LeftPanel->HideButKeepSaveScreen();
								Global->CtrlObject->Cp()->RightPanel->HideButKeepSaveScreen();

								switch (Global->Opt->PanelCtrlAltShiftRule)
								{
									case 0:
										if (CmdLineVisible)
											Global->CtrlObject->CmdLine()->Show();
										if (KeyBarVisible)
											Global->CtrlObject->Cp()->GetKeybar().Show();
										break;
									case 1:
										if (KeyBarVisible)
											Global->CtrlObject->Cp()->GetKeybar().Show();
										break;
								}

								wait(maskCurrent);

								if (LeftVisible)      Global->CtrlObject->Cp()->LeftPanel->Show();
								if (RightVisible)     Global->CtrlObject->Cp()->RightPanel->Show();
								if (CmdLineVisible)   Global->CtrlObject->CmdLine()->Show();
								if (KeyBarVisible)    Global->CtrlObject->Cp()->GetKeybar().Show();
							}
							else
							{
								Global->WindowManager->ImmediateHide();
								wait(maskCurrent);
							}

							Global->WindowManager->RefreshWindow();
						}

						return TRUE;
					}
					break;
				}
			}
		}
	}
	return FALSE;
}