// On Dual-GPU Macbook Pros only: // switch to intrinsic GPU if running on battery // switch to discrete GPU if running on AC power // // Apple's Screensaver Engine will detect the GPU change and // call stopAnimation, then initWithFrame and startAnimation. void CScreensaver::CheckDualGPUStatus() { static double lastBatteryCheckTime = 0; double currentTime; bool nowOnBattery; if (!IsDualGPUMacbook) return; if (OKToRunOnBatteries) return; currentTime = dtime(); if (currentTime < lastBatteryCheckTime + BATTERY_CHECK_INTERVAL) return; lastBatteryCheckTime = currentTime; nowOnBattery = Host_is_running_on_batteries(); if (nowOnBattery == RunningOnBattery) return; RunningOnBattery = nowOnBattery; if (nowOnBattery) { if (GPUSelectConnect != IO_OBJECT_NULL) { IOServiceClose(GPUSelectConnect); GPUSelectConnect = IO_OBJECT_NULL; } // If an OpenGL screensaver app is running, we must shut it down // to release its claim on the discrete GPU to save battery power. DestroyDataManagementThread(); } else { SetDiscreteGPU(true); } }
void CScreensaver::ShutdownSaver() { DestroyDataManagementThread(); if (rpc) { #if 0 // OS X calls closeBOINCSaver() when energy saver puts display // to sleep, but we want to keep crunching. So don't kill it. // Code in core client now quits on user activity if screen // saver launched it (2/28/07). // Also, under sandbox security, screensaver doesn't have access // to rpc password in gui_rpc_auth.cfg file, so core client won't // accept rpc->quit from screensaver. if (m_CoreClientPID && (!m_wasAlreadyRunning)) { rpc->quit(); // Kill core client if we launched it } #endif delete rpc; rpc = NULL; } setSSMessageText(0); m_CoreClientPID = 0; // gQuitCounter = 0; m_wasAlreadyRunning = false; m_bQuitDataManagementProc = false; saverState = SaverState_Idle; retryCount = 0; }
// Handle window messages for main screensaver windows. // LRESULT CBOINCTray::TrayProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_CREATE: CreateDataManagementThread(); return 0; break; case WM_CLOSE: DestroyDataManagementThread(); return 0; break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }