diff --git a/checkin_notes b/checkin_notes index 6bc0f70b61..9ff2ecd133 100644 --- a/checkin_notes +++ b/checkin_notes @@ -2334,3 +2334,17 @@ David 26 Feb 2009 client/ boinc_cmd.cpp + +Charlie 27 Feb 2009 + - screensaver: remove from the coordinator error codes and messages + which will now be handled by default graphics app, add new error + codes for problems in default graphics app. + - Mac screensaver: improve logic to stop drawing BOINC logo when a + graphics app covers coordinator window. + + clientscr/ + mac_saver_module.cpp + Mac_Saver_Module.h + Mac_Saver_ModuleView.m, .h + screensaver.cpp, .h + screensaver_win.h diff --git a/clientscr/Mac_Saver_Module.h b/clientscr/Mac_Saver_Module.h index c6296ea9bd..8e91a9590c 100644 --- a/clientscr/Mac_Saver_Module.h +++ b/clientscr/Mac_Saver_Module.h @@ -34,6 +34,7 @@ extern "C" { int initBOINCSaver(void); int getSSMessage(char **theMessage, int* coveredFreq); +void windowIsCovered(); void drawPreview(CGContextRef myContext); void closeBOINCSaver(void); void print_to_log_file(const char *format, ...); @@ -68,23 +69,18 @@ protected: pid_t FindProcessPID(char* name, pid_t thePID); OSErr GetpathToBOINCManagerApp(char* path, int maxLen); bool SetError( bool bErrorMode, unsigned int hrError ); - void UpdateProgressText(unsigned int hrError); void setSSMessageText(const char *msg); void updateSSMessageText(char *msg); void strip_cr(char *buf); char m_gfx_Switcher_Path[MAXPATHLEN]; - bool m_bErrorMode; // Whether to display an error + bool m_bErrorMode; // Whether to draw moving logo and possibly display an error unsigned int m_hrError; // Error code to display bool m_wasAlreadyRunning; pid_t m_CoreClientPID; int m_dwBlankScreen; time_t m_dwBlankTime; - int m_iStatusUpdateCounter; int m_iGraphicsStartingMsgCounter; - int m_iLastResultShown; - int m_tLastResultChangeCounter; - bool m_StatusMessageUpdated; bool m_bDefault_ss_exists; double m_fGFXDefaultPeriod; double m_fGFxSciencePeriod; @@ -126,9 +122,7 @@ protected: RPC_CLIENT *rpc; CC_STATE state; RESULTS results; - RESULT m_running_result; - bool m_updating_results; - + bool m_bResetCoreState; bool m_QuitDataManagementProc; bool m_bV5_GFX_app_is_running; @@ -138,12 +132,12 @@ protected: // Presentation layer // protected: - char m_MsgBuf[2048]; char m_MessageText[2048]; char* m_CurrentBannerMessage; char* m_BrandText; public: int getSSMessage(char **theMessage, int* coveredFreq); + void windowIsCovered(void); void drawPreview(CGContextRef myContext); void ShutdownSaver(); diff --git a/clientscr/Mac_Saver_ModuleView.h b/clientscr/Mac_Saver_ModuleView.h index 6cc3058961..658de3fe34 100644 --- a/clientscr/Mac_Saver_ModuleView.h +++ b/clientscr/Mac_Saver_ModuleView.h @@ -39,6 +39,7 @@ int initBOINCSaver(void); int getSSMessage(char **theMessage, int* coveredFreq); +void windowIsCovered(); void drawPreview(CGContextRef myContext); void closeBOINCSaver(void); extern void print_to_log_file(const char *format, ...); diff --git a/clientscr/Mac_Saver_ModuleView.m b/clientscr/Mac_Saver_ModuleView.m index d22e7272e1..21a344f29a 100644 --- a/clientscr/Mac_Saver_ModuleView.m +++ b/clientscr/Mac_Saver_ModuleView.m @@ -284,18 +284,23 @@ int signof(float x) { } if (coveredFreq) { - myWindowNumber = [ myWindow windowNumber ]; + if ( (msg != NULL) && (msg[0] != '\0') ) { + myWindowNumber = [ myWindow windowNumber ]; - windowList[0] = 0; - NSWindowList(20, windowList); - NSCountWindows(&n); - if (gTopWindowListIndex < n) { - if (windowList[gTopWindowListIndex] != myWindowNumber) { - // Project graphics application has a window open above ours - // Don't waste CPU cycles since our window is obscured by application graphics - newFrequency = coveredFreq; - msg = NULL; + windowList[0] = 0; + NSWindowList(20, windowList); + NSCountWindows(&n); + if (gTopWindowListIndex < n) { + if (windowList[gTopWindowListIndex] != myWindowNumber) { + // Project graphics application has a window open above ours + // Don't waste CPU cycles since our window is obscured by application graphics + newFrequency = coveredFreq; + msg = NULL; + windowIsCovered(); + } } + } else { + newFrequency = coveredFreq; } } diff --git a/clientscr/mac_saver_module.cpp b/clientscr/mac_saver_module.cpp index c32b2a8d36..fb46f356e8 100644 --- a/clientscr/mac_saver_module.cpp +++ b/clientscr/mac_saver_module.cpp @@ -41,20 +41,13 @@ //#include -// It would be nice to always display the scrolled progress info in case the -// graphics application fails to show its window, but displaying the scrolled -// progress info takes up too much CPU time for this to be practical. -#define ALWAYS_DISPLAY_PROGRESS_TEXT 0 - // Flags for testing & debugging #define CREATE_LOG 1 +#define USE_SPECIAL_LOG_FILE 0 #define TEXTLOGOFREQUENCY 60 /* Number of times per second to update moving logo with text */ #define NOTEXTLOGOFREQUENCY 4 /* Times per second to call animateOneFrame if no moving logo with text */ -#define STATUSUPDATEINTERVAL 5 /* seconds between status display updates */ #define GFX_STARTING_MSG_DURATION 45 /* seconds to show ScreenSaverAppStartingMsg */ -#define STATUSRESULTCHANGETIME 10 /* seconds to show status display for each task */ -#define TASK_RUN_CHECK_PERIOD 5 /* Seconds between safety check that task is actually running */ enum SaverState { SaverState_Idle, @@ -84,14 +77,12 @@ const char * CantLaunchCCMsg = "Unable to launch BOINC application."; const char * LaunchingCCMsg = "Launching BOINC application."; const char * ConnectingCCMsg = "Connecting to BOINC application."; const char * ConnectedCCMsg = "Communicating with BOINC application."; -const char * BOINCSuspendedMsg = "BOINC is currently suspended."; -const char * BOINCNoAppsExecutingMsg = "BOINC is currently idle."; -const char * BOINCNoProjectsDetectedMsg = "BOINC is not attached to any projects. Please attach to projects using the BOINC Manager."; -const char * BOINCNoGraphicAppsExecutingMsg = "Project does not support graphics:"; const char * BOINCUnrecoverableErrorMsg = "Sorry, an unrecoverable error occurred"; -const char * BOINCTestmodeMsg = "BOINC screensaver test: success."; -const char * BOINCV5GFXDaemonMsg = "BOINC can't display graphics from older applications when running as a daemon."; +const char * BOINCTestModeMsg = "BOINC screensaver test: success."; const char * ScreenSaverAppStartingMsg = "Starting screensaver graphics.\nPlease wait ..."; +const char * CantLaunchDefaultGFXAppMsg = "Can't launch default screensaver module. Please reinstall BOINC"; +const char * DefaultGFXAppCantRPCMsg = "Default screensaver module couldn't connect to BOINC application"; +const char * DefaultGFXAppCrashedMsg = "Default screensaver module had an unrecoverable error"; //const char * BOINCExitedSaverMode = "BOINC is no longer in screensaver mode."; @@ -130,6 +121,13 @@ int getSSMessage(char **theMessage, int* coveredFreq) { }; +void windowIsCovered() { + if (gspScreensaver) { + gspScreensaver->windowIsCovered(); + } +} + + void drawPreview(CGContextRef myContext) { if (gspScreensaver) { gspScreensaver->drawPreview(myContext); @@ -155,21 +153,15 @@ CScreensaver::CScreensaver() { m_dwBlankTime = 0; m_bErrorMode = false; m_hrError = 0; - m_StatusMessageUpdated = false; // Display first status update after 5 seconds - m_iStatusUpdateCounter = ((STATUSUPDATEINTERVAL-5) * TEXTLOGOFREQUENCY); m_iGraphicsStartingMsgCounter = 0; - m_iLastResultShown = 0; - m_tLastResultChangeCounter = ((STATUSRESULTCHANGETIME-5) * TEXTLOGOFREQUENCY); saverState = SaverState_Idle; m_wasAlreadyRunning = false; m_CoreClientPID = nil; - m_MsgBuf[0] = 0; setSSMessageText(0); m_CurrentBannerMessage = 0; m_QuitDataManagementProc = false; m_BrandText = "BOINC"; - m_updating_results = false; m_hDataManagementThread = NULL; m_hGraphicsApplication = NULL; @@ -324,16 +316,6 @@ int CScreensaver::getSSMessage(char **theMessage, int* coveredFreq) { pid_t myPid; OSStatus err; - m_iStatusUpdateCounter++; - m_tLastResultChangeCounter++; - - // Tell the calling routine to set the frame rate to NOTEXTLOGOFREQUENCY if - // NSWindowList indicates that default app graphics window has covered our window. - // See comment below for more details. - if (m_bDefault_ss_exists) { - *coveredFreq = NOTEXTLOGOFREQUENCY; - } - switch (saverState) { case SaverState_RelaunchCoreClient: err = initBOINCApp(); @@ -379,58 +361,9 @@ int CScreensaver::getSSMessage(char **theMessage, int* coveredFreq) { setSSMessageText(ConnectedCCMsg); break; // No status response yet from DataManagementProc case SCRAPPERR_SCREENSAVERBLANKED: - default: setSSMessageText(0); // No text message break; - case SCRAPPERR_BOINCSUSPENDED: - setSSMessageText(BOINCSuspendedMsg); - break; - case SCRAPPERR_BOINCNOAPPSEXECUTING: - setSSMessageText(BOINCNoAppsExecutingMsg); - break; - case SCRAPPERR_BOINCNOPROJECTSDETECTED: - setSSMessageText(BOINCNoProjectsDetectedMsg); - break; - case SCRAPPERR_BOINCAPPFOUNDGRAPHICSLOADING: - case SCRAPPERR_SCREENSAVERRUNNING: -#if ! ALWAYS_DISPLAY_PROGRESS_TEXT - // NOTE: My tests seem to confirm that the top window is always the first - // window returned by NSWindowList under OS 10.5 and the second window - // returned by NSWindowList under OS 10.3.9 and OS 10.4. However, Apple's - // documentation is unclear whether we can depend on this. So I have - // added some safety by doing two things: - // [1] Only use the NSWindowList test when we have started project or default - // graphics. - // [2] Assume that our window is covered 45 seconds after starting project - // graphics even if the NSWindowList test did not indicate that is so. - // - // The -animateOneFrame method in Mac_SaverModuleView.m does the NSWindowList test - // only if we return a non-zero value for coveredFreq. - // - // Tell the calling routine to set the frame rate to NOTEXTLOGOFREQUENCY if - // NSWindowList indicates that science app graphics window has covered our window. - *coveredFreq = NOTEXTLOGOFREQUENCY; - - if (m_iGraphicsStartingMsgCounter > 0) { - // Show ScreenSaverAppStartingMsg for GFX_STARTING_MSG_DURATION seconds or until - // NSWindowList indicates that science app graphics window has covered our window - setSSMessageText(ScreenSaverAppStartingMsg); - m_iGraphicsStartingMsgCounter--; - } else { - // Don't waste CPU cycles when the science app is drawing over our window - setSSMessageText(0); // No text message - } - break; -#endif - case SCRAPPERR_BOINCNOGRAPHICSAPPSEXECUTING: - case SCRAPPERR_DAEMONALLOWSNOGRAPHICS: - if (m_StatusMessageUpdated) { - setSSMessageText(m_MsgBuf); - updateSSMessageText(m_MsgBuf); - m_StatusMessageUpdated = false; - } - break; -#if 0 +#if 0 // Not currently used case SCRAPPERR_QUITSCREENSAVERREQUESTED: // setSSMessageText(BOINCExitedSaverMode); // Wait 1 second to allow ScreenSaver engine to close us down @@ -440,11 +373,53 @@ int CScreensaver::getSSMessage(char **theMessage, int* coveredFreq) { } break; #endif + case SCRAPPERR_CANTLAUNCHDEFAULTGFXAPP: + setSSMessageText(CantLaunchDefaultGFXAppMsg); + break; + case SCRAPPERR_DEFAULTGFXAPPCANTCONNECT: + setSSMessageText(DefaultGFXAppCantRPCMsg); + break; + case SCRAPPERR_DEFAULTGFXAPPCRASHED: + setSSMessageText(DefaultGFXAppCrashedMsg); + break; + default: + // m_bErrorMode is TRUE if we should display moving logo (no graphics app is running) + // m_bErrorMode is FALSE if a graphics app was launched and has not exit + if (! m_bErrorMode) { + // NOTE: My tests seem to confirm that the top window is always the first + // window returned by NSWindowList under OS 10.5 and the second window + // returned by NSWindowList under OS 10.3.9 and OS 10.4. However, Apple's + // documentation is unclear whether we can depend on this. So I have + // added some safety by doing two things: + // [1] Only use the NSWindowList test when we have started project or default + // graphics. + // [2] Assume that our window is covered 45 seconds after starting project + // graphics even if the NSWindowList test did not indicate that is so. + // + // The -animateOneFrame method in Mac_SaverModuleView.m does the NSWindowList test + // only if we return a non-zero value for coveredFreq. + // + // Tell the calling routine to set the frame rate to NOTEXTLOGOFREQUENCY if + // NSWindowList indicates that science app graphics window has covered our window. + *coveredFreq = NOTEXTLOGOFREQUENCY; + + if (m_iGraphicsStartingMsgCounter > 0) { + // Show ScreenSaverAppStartingMsg for GFX_STARTING_MSG_DURATION seconds or until + // NSWindowList indicates that science app graphics window has covered our window + setSSMessageText(ScreenSaverAppStartingMsg); + m_iGraphicsStartingMsgCounter--; + } else { + // Don't waste CPU cycles when the science app is drawing over our window + setSSMessageText(0); // No text message + } + } // End if (! m_bErrorMode) + break; // End default case of switch (m_hrError) + } // end switch (m_hrError) - break; + break; // End case SaverState_ConnectedToCoreClient of switch (saverState) case SaverState_ControlPanelTestMode: - setSSMessageText(BOINCTestmodeMsg); + setSSMessageText(BOINCTestModeMsg); break; case SaverState_UnrecoverableError: @@ -462,6 +437,7 @@ int CScreensaver::getSSMessage(char **theMessage, int* coveredFreq) { break; // Should never get here; fixes compiler warning } // end switch (saverState) + if (m_MessageText[0]) { newFrequency = TEXTLOGOFREQUENCY; } else { @@ -473,6 +449,11 @@ int CScreensaver::getSSMessage(char **theMessage, int* coveredFreq) { } +void CScreensaver::windowIsCovered() { + m_iGraphicsStartingMsgCounter = 0; +} + + void CScreensaver::drawPreview(CGContextRef myContext) { // For possible future use } @@ -559,6 +540,7 @@ bool CScreensaver::CreateDataManagementThread() { } +// TODO: Fix this so it still works if DataManagementProc is hung waiting for RPC bool CScreensaver::DestroyDataManagementThread() { m_QuitDataManagementProc = true; // Tell DataManagementProc thread to exit if (m_hDataManagementThread) { // Wait for DataManagementProc thread to exit @@ -569,84 +551,21 @@ bool CScreensaver::DestroyDataManagementThread() { } +// bool CScreensaver::SetError(bool bErrorMode, unsigned int hrError) { + // bErrorMode is TRUE if we should display moving logo (no graphics app is running) + // bErrorMode is FALSE if a graphics app was launched and has not exit m_bErrorMode = bErrorMode; m_hrError = hrError; - if (hrError == SCRAPPERR_BOINCAPPFOUNDGRAPHICSLOADING) { - // Show ScreenSaverAppStartingMsg for GFX_STARTING_MSG_DURATION seconds + if (bErrorMode) { + // Reset our timer for showing ScreenSaverAppStartingMsg to + // GFX_STARTING_MSG_DURATION seconds m_iGraphicsStartingMsgCounter = GFX_STARTING_MSG_DURATION * TEXTLOGOFREQUENCY; } - - if ((hrError == SCRAPPERR_BOINCNOGRAPHICSAPPSEXECUTING) - || (hrError == SCRAPPERR_DAEMONALLOWSNOGRAPHICS) -#if ALWAYS_DISPLAY_PROGRESS_TEXT - || (hrError == SCRAPPERR_SCREENSAVERRUNNING) -#endif - ) - { - UpdateProgressText(hrError); - } return true; } -void CScreensaver::UpdateProgressText(unsigned int hrError) { - int iResultCount; - int iIndex; - int iModIndex; - unsigned int len; - RESULT* theResult; - PROJECT* pProject; - char statusBuf[2048]; - - if ( (m_iStatusUpdateCounter >= (STATUSUPDATEINTERVAL * TEXTLOGOFREQUENCY) ) && !m_updating_results ) { - if (! m_StatusMessageUpdated) { - m_iStatusUpdateCounter = 0; - strcpy(m_MsgBuf, hrError == SCRAPPERR_DAEMONALLOWSNOGRAPHICS ? - BOINCV5GFXDaemonMsg : BOINCNoGraphicAppsExecutingMsg - ); - - iResultCount = results.results.size(); - theResult = NULL; - for (iIndex = 0; iIndex < iResultCount; iIndex++) { - // cycle through the active results starting from the last one - iModIndex = (iIndex + m_iLastResultShown+1) % iResultCount; - theResult = results.results.at(iModIndex); - // The get_state rpc is time-consuming, so we assume the list of - // attached projects does not change while the screensaver is active. - pProject = state.lookup_project(theResult->project_url); - if (pProject != NULL) { - RESULT* pResult = state.lookup_result(pProject, results.results.at(iModIndex)->name); - if ( pResult != NULL ) { - len = snprintf(statusBuf, sizeof(statusBuf), - "\nComputing for %s\nApplication: %s\nTask: %s\n%.2f%% complete\n", - pProject->project_name.c_str(), - pResult->app->user_friendly_name.c_str(), - pResult->wu_name.c_str(), - results.results.at(iModIndex)->fraction_done*100 - ); - - strlcat(m_MsgBuf, statusBuf, sizeof(m_MsgBuf)); - if (m_tLastResultChangeCounter >= (STATUSRESULTCHANGETIME * TEXTLOGOFREQUENCY)) { - m_iLastResultShown = iModIndex; - m_tLastResultChangeCounter = 0; - } - break; - } else { - HandleRPCError(); - return; - } - } else { // (pProject == NULL): re-synch with client - HandleRPCError(); - return; - } - } // end for() loop - m_StatusMessageUpdated = true; - } // end if (! m_StatusMessageUpdated) - } // end if (m_iStatusUpdateCounter > time to update) -} - - void CScreensaver::setSSMessageText(const char * msg) { if (msg == 0) m_MessageText[0] = 0; @@ -791,18 +710,21 @@ OSErr CScreensaver::KillScreenSaver() { void print_to_log_file(const char *format, ...) { #if CREATE_LOG - FILE *f; va_list args; char buf[256]; time_t t; +#if USE_SPECIAL_LOG_FILE strcpy(buf, getenv("HOME")); strcat(buf, "/Documents/test_log.txt"); + FILE *f; f = fopen(buf, "a"); if (!f) return; -// freopen(buf, "a", stdout); -// freopen(buf, "a", stderr); - + freopen(buf, "a", stdout); + freopen(buf, "a", stderr); +#else + #define f stderr +#endif time(&t); strcpy(buf, asctime(localtime(&t))); strip_cr(buf); @@ -815,9 +737,11 @@ void print_to_log_file(const char *format, ...) { va_end(args); fputs("\n", f); +#if USE_SPECIAL_LOG_FILE fflush(f); fclose(f); #endif +#endif } #if CREATE_LOG @@ -835,6 +759,7 @@ void strip_cr(char *buf) #endif // CREATE_LOG void PrintBacktrace(void) { +// Dummy routine to satisfy linker } const char *BOINC_RCSID_7ce0778d35="$Id$"; diff --git a/clientscr/screensaver.cpp b/clientscr/screensaver.cpp index b16565fff3..1ca327f7a3 100644 --- a/clientscr/screensaver.cpp +++ b/clientscr/screensaver.cpp @@ -397,15 +397,16 @@ void *CScreensaver::DataManagementProc() SS_PHASE ss_phase = DEFAULT_SS_PHASE; bool switch_to_default_gfx = false; + bool killing_default_gfx = false; int exit_status = 0; char* default_ss_dir_path = NULL; char* default_data_dir_path = NULL; char full_path[1024]; -#ifdef _WIN32 BOINCTRACE(_T("CScreensaver::DataManagementProc - Display screen saver loading message\n")); - SetError(TRUE, SCRAPPERR_BOINCSCREENSAVERLOADING); + SetError(TRUE, SCRAPPERR_BOINCSCREENSAVERLOADING); // No GFX App is running: show moving BOINC logo +#ifdef _WIN32 m_tThreadCreateTime = time(0); // Set the starting point for iterating through the results @@ -442,6 +443,7 @@ void *CScreensaver::DataManagementProc() ss_phase = SCIENCE_SS_PHASE; default_phase_start_time = 0; science_phase_start_time = dtime(); + SetError(TRUE, SCRAPPERR_CANTLAUNCHDEFAULTGFXAPP); // No GFX App is running: show moving BOINC logo } GetDisplayPeriods(default_data_dir_path); @@ -475,7 +477,7 @@ void *CScreensaver::DataManagementProc() // Blank screen saver? if ((m_dwBlankScreen) && (time(0) > m_dwBlankTime)) { BOINCTRACE(_T("CScreensaver::DataManagementProc - Time to blank\n")); - SetError(FALSE, SCRAPPERR_SCREENSAVERBLANKED); + SetError(FALSE, SCRAPPERR_SCREENSAVERBLANKED); // Blanked - hide moving BOINC logo m_QuitDataManagementProc = true; continue; // Code above will exit the thread } @@ -500,9 +502,7 @@ void *CScreensaver::DataManagementProc() } // Update our task list - m_updating_results = true; retval = rpc->get_screensaver_tasks(suspend_reason, results); - m_updating_results = false; if (retval) { // rpc call returned error HandleRPCError(); @@ -550,7 +550,7 @@ void *CScreensaver::DataManagementProc() // Core client suspended? if (suspend_reason && !(suspend_reason & SUSPEND_REASON_CPU_USAGE_LIMIT)) { - SetError(TRUE, SCRAPPERR_BOINCSUSPENDED); + SetError(TRUE, m_hrError); // No GFX App is running: show moving BOINC logo if (m_bDefault_ss_exists && !m_bDefault_gfx_running) { switch_to_default_gfx = true; } @@ -565,7 +565,7 @@ void *CScreensaver::DataManagementProc() graphics_app_result_ptr = NULL; m_bScience_gfx_running = false; } else { - // process_exists() test will clear m_hGraphicsApplication and graphics_app_result_ptr + // HasProcessExited() test will clear m_hGraphicsApplication and graphics_app_result_ptr } previous_result_ptr = NULL; } @@ -578,11 +578,13 @@ void *CScreensaver::DataManagementProc() previous_result_ptr = NULL; graphics_app_result_ptr = NULL; m_bDefault_gfx_running = false; - } else { + SetError(TRUE, SCRAPPERR_CANTLAUNCHDEFAULTGFXAPP); // No GFX App is running: show moving BOINC logo + } else { m_bDefault_gfx_running = true; if (ss_phase == SCIENCE_SS_PHASE) { default_saver_start_time_in_science_phase = dtime(); } + SetError(FALSE, m_hrError); // A GFX App is running: hide moving BOINC logo } } } @@ -592,7 +594,7 @@ void *CScreensaver::DataManagementProc() #if SIMULATE_NO_GRAPHICS /* FOR TESTING */ - SetError(TRUE, SCRAPPERR_BOINCNOGRAPHICSAPPSEXECUTING); + SetError(TRUE, m_hrError); // No GFX App is running: show moving BOINC logo if (m_bDefault_ss_exists && !m_bDefault_gfx_running) { switch_to_default_gfx = true; } @@ -631,7 +633,7 @@ void *CScreensaver::DataManagementProc() m_bScience_gfx_running = false; // Save previous_result and previous_result_ptr for get_random_graphics_app() call } else { - // process_exists() test will clear m_hGraphicsApplication and graphics_app_result_ptr + // HasProcessExited() test will clear m_hGraphicsApplication and graphics_app_result_ptr } } @@ -647,7 +649,7 @@ void *CScreensaver::DataManagementProc() m_bScience_gfx_running = false; // Save previous_result and previous_result_ptr for get_random_graphics_app() call } else { - // process_exists() test will clear m_hGraphicsApplication and graphics_app_result_ptr + // HasProcessExited() test will clear m_hGraphicsApplication and graphics_app_result_ptr } } last_change_time = dtime(); @@ -663,6 +665,7 @@ void *CScreensaver::DataManagementProc() if (graphics_app_result_ptr) { if (m_bDefault_gfx_running) { kill_program(m_hGraphicsApplication); + killing_default_gfx = true; // Remember how long default graphics ran during science phase if (default_saver_start_time_in_science_phase) { default_saver_duration_in_science_phase += (dtime() - default_saver_start_time_in_science_phase); @@ -670,7 +673,7 @@ void *CScreensaver::DataManagementProc() // dtime(), default_saver_start_time_in_science_phase, default_saver_duration_in_science_phase); } default_saver_start_time_in_science_phase = 0; - // process_exists() test will clear m_hGraphicsApplication and graphics_app_result_ptr + // HasProcessExited() test will clear m_hGraphicsApplication and graphics_app_result_ptr } else { retval = launch_screensaver(graphics_app_result_ptr, m_hGraphicsApplication); if (retval) { @@ -679,11 +682,7 @@ void *CScreensaver::DataManagementProc() graphics_app_result_ptr = NULL; m_bScience_gfx_running = false; } else { -#ifdef __APPLE__ - // Show ScreenSaverAppStartingMsg for GFX_STARTING_MSG_DURATION seconds - SetError(FALSE, SCRAPPERR_BOINCAPPFOUNDGRAPHICSLOADING); -#endif - SetError(FALSE, SCRAPPERR_SCREENSAVERRUNNING); + SetError(FALSE, m_hrError); // A GFX App is running: hide moving BOINC logo last_change_time = dtime(); m_bScience_gfx_running = true; // Make a local copy of current result, since original pointer @@ -697,24 +696,7 @@ void *CScreensaver::DataManagementProc() } } } else { - if ((!suspend_reason) || (suspend_reason & SUSPEND_REASON_CPU_USAGE_LIMIT)) { - // No science graphics available - if (state.projects.size() == 0) { - // We are not attached to any projects - SetError(TRUE, SCRAPPERR_BOINCNOPROJECTSDETECTED); - } else if (results.results.size() == 0) { - // We currently do not have any applications to run - SetError(TRUE, SCRAPPERR_BOINCNOAPPSEXECUTING); - } else { - // We currently do not have any graphics capable application - if (m_bV5_GFX_app_is_running) { - SetError(TRUE, SCRAPPERR_DAEMONALLOWSNOGRAPHICS); - } else { - SetError(TRUE, SCRAPPERR_BOINCNOGRAPHICSAPPSEXECUTING); - } - } - } - + SetError(TRUE, m_hrError); // No GFX App is running: show moving BOINC logo // We can't run a science graphics app, so run the default graphics if available if (m_bDefault_ss_exists && !m_bDefault_gfx_running) { switch_to_default_gfx = true; @@ -734,9 +716,11 @@ void *CScreensaver::DataManagementProc() previous_result_ptr = NULL; graphics_app_result_ptr = NULL; m_bDefault_gfx_running = false; + SetError(TRUE, SCRAPPERR_CANTLAUNCHDEFAULTGFXAPP); // No GFX App is running: show BOINC logo } else { m_bDefault_gfx_running = true; default_saver_start_time_in_science_phase = dtime(); + SetError(FALSE, m_hrError); // A GFX App is running: hide moving BOINC logo } } } @@ -753,11 +737,18 @@ void *CScreensaver::DataManagementProc() if (m_bDefault_gfx_running) { // If we were able to connect to core client but gfx app can't, don't use it. BOINCTRACE(_T("CScreensaver::DataManagementProc - Default graphics application exited with code %d.\n"), exit_status); - if (exit_status == DEFAULT_GFX_CANT_CONNECT) { + if (!killing_default_gfx) { // If this is an unexpected exit + if (exit_status == DEFAULT_GFX_CANT_CONNECT) { + SetError(TRUE, SCRAPPERR_DEFAULTGFXAPPCANTCONNECT); // No GFX App is running: show moving BOINC logo + } else { + SetError(TRUE, SCRAPPERR_DEFAULTGFXAPPCRASHED); // No GFX App is running: show moving BOINC logo + } m_bDefault_ss_exists = false; ss_phase = SCIENCE_SS_PHASE; } + killing_default_gfx = false; } + SetError(TRUE, m_hrError); // No GFX App is running: show moving BOINC logo m_hGraphicsApplication = 0; graphics_app_result_ptr = NULL; m_bDefault_gfx_running = false; diff --git a/clientscr/screensaver.h b/clientscr/screensaver.h index a13aa1d902..0c043197d4 100644 --- a/clientscr/screensaver.h +++ b/clientscr/screensaver.h @@ -35,6 +35,7 @@ enum SS_PHASE { // Error / status codes //----------------------------------------------------------------------------- +// These codes are no longer used by the Mac: #define SCRAPPERR_BOINCNOTDETECTED 0x82000001 #define SCRAPPERR_BOINCNOTDETECTEDSTARTUP 0x82000002 #define SCRAPPERR_BOINCSUSPENDED 0x82000003 @@ -42,13 +43,20 @@ enum SS_PHASE { #define SCRAPPERR_BOINCNOAPPSEXECUTING 0x82000005 #define SCRAPPERR_BOINCNOPROJECTSDETECTED 0x82000006 #define SCRAPPERR_BOINCNOGRAPHICSAPPSEXECUTING 0x82000007 -#define SCRAPPERR_BOINCSCREENSAVERLOADING 0x82000008 #define SCRAPPERR_BOINCAPPFOUNDGRAPHICSLOADING 0x82000009 #define SCRAPPERR_BOINCSHUTDOWNEVENT 0x8200000a #define SCRAPPERR_NOPREVIEW 0x8200000f #define SCRAPPERR_DAEMONALLOWSNOGRAPHICS 0x82000010 #define SCRAPPERR_SCREENSAVERRUNNING 0x82000011 -#define SCRAPPERR_SCREENSAVERBLANKED 0x82000012 #define SCRAPPERR_QUITSCREENSAVERREQUESTED 0x82000013 +// The following are still used by the Mac: +#define SCRAPPERR_BOINCSCREENSAVERLOADING 0x82000008 +#define SCRAPPERR_SCREENSAVERBLANKED 0x82000012 +// The following are new codes used by the Mac: +#define SCRAPPERR_CANTLAUNCHDEFAULTGFXAPP 0x82000014 +#define SCRAPPERR_DEFAULTGFXAPPCANTCONNECT 0x82000015 +#define SCRAPPERR_DEFAULTGFXAPPCRASHED 0x82000016 + + #endif diff --git a/clientscr/screensaver_win.h b/clientscr/screensaver_win.h index 2fb9070a63..2cf1046853 100644 --- a/clientscr/screensaver_win.h +++ b/clientscr/screensaver_win.h @@ -203,7 +203,6 @@ protected: CC_STATE state; RESULTS results; RESULT m_running_result; - bool m_updating_results; HANDLE m_hDataManagementThread; HANDLE m_hGraphicsApplication;