diff --git a/api/boinc_api.C b/api/boinc_api.C index 19fddc9897..46398f2343 100644 --- a/api/boinc_api.C +++ b/api/boinc_api.C @@ -308,7 +308,11 @@ int boinc_init_options_general(BOINC_OPTIONS& opt) { } else { retval = setup_shared_mem(); if (retval) { - fprintf(stderr, "Can't set up shared mem: %d\n", retval); + fprintf(stderr, + "Can't set up shared mem: %d\n" + "Will run in standalone mode.\n", + retval + ); standalone = true; } } @@ -1020,4 +1024,27 @@ void block_sigalrm() { } #endif +bool boinc_graphics_possible() { +#ifdef _WIN32 + // Attempt to load the dlls that are required to display graphics, if + // any of them fail do not start the application in graphics mode. + if (FAILED(__HrLoadAllImportsForDll("GDI32.dll"))) { + fprintf(stderr, "Failed to load GDI32.DLL\n" ); + return false; + } + if (FAILED(__HrLoadAllImportsForDll("OPENGL32.dll"))) { + fprintf( stderr, "Failed to load OPENGL32.DLL\n" ); + return false; + } + if (FAILED(__HrLoadAllImportsForDll("GLU32.dll"))) { + fprintf( stderr, "Failed to load GLU32.DLL\n" ); + return false; + } +#elif defined(__APPLE__) +#else + if (!getenv("DISPLAY")) return false; +#endif + return true; +} + const char *BOINC_RCSID_0fa0410386 = "$Id$"; diff --git a/api/graphics_api.h b/api/graphics_api.h index da5e06fe18..5814b50929 100755 --- a/api/graphics_api.h +++ b/api/graphics_api.h @@ -20,12 +20,9 @@ #ifndef BOINC_GRAPHICS_API_H #define BOINC_GRAPHICS_API_H -#ifdef __cplusplus -extern "C" { -#endif - typedef void (*WORKER_FUNC_PTR)(); +extern bool boinc_graphics_possible(); extern int boinc_init_graphics(WORKER_FUNC_PTR); // Functions that must be supplied by the app @@ -43,10 +40,6 @@ extern void boinc_app_mouse_move(int x, int y, int left, int middle, int right); extern void boinc_app_key_press(int, int); extern void boinc_app_key_release(int, int); -#ifdef __cplusplus -} // extern "C" -#endif - // C++ API follows here #if defined __cplusplus diff --git a/api/x_opengl.C b/api/x_opengl.C index 23dd0a8042..0019ed0426 100644 --- a/api/x_opengl.C +++ b/api/x_opengl.C @@ -143,7 +143,7 @@ int xwin_glut_is_initialized() { return glut_is_initialized; } -void app_debug_msg (const char *fmt, ...); +bool debug = true; // This callback is invoked when a user presses a key. // @@ -241,7 +241,7 @@ static void make_new_window(int mode) { boinc_glut_init(); } - app_debug_msg("make_new_window(): now calling glutCreateWindow(%s)...\n", aid.app_name); + if (debug) fprintf(stderr, "make_new_window(): now calling glutCreateWindow(%s)...\n", aid.app_name); char window_title[256]; get_window_title(aid, window_title, 256); @@ -269,7 +269,7 @@ static void make_new_window(int mode) { if (!have_window) { win = glutCreateWindow(window_title); - app_debug_msg("glutCreateWindow() succeeded. win = %d\n", win); + if (debug) fprintf(stderr, "glutCreateWindow() succeeded. win = %d\n", win); glutReshapeFunc(app_graphics_resize); glutKeyboardFunc(keyboardD); @@ -298,8 +298,9 @@ static void make_new_window(int mode) { return; } -// Initialize glut and screensaver-graphics. Using GLUT, -// this should only called once, even if restarted by user-exit. +// Initialize GLUT. +// Using GLUT, this should only called once, +// even if the window is closed and opened. // Using freeGLUT, its called to reinit freeglut and // the graphics window as freeglut 'deinitialized' itself // when the window is destroyed @@ -313,9 +314,9 @@ static void boinc_glut_init() { static bool first = true; win = 0; - app_debug_msg("Calling glutInit()... \n"); + if (debug) fprintf(stderr, "Calling glutInit()... \n"); glutInit (&one, (char**)args); - app_debug_msg("...survived glutInit(). \n"); + if (debug) fprintf(stderr, "survived glutInit(). \n"); // figure out whether we're running GLUT or freeglut. // @@ -335,7 +336,7 @@ static void boinc_glut_init() { int major = glut_version/10000; int minor = (glut_version -(major*10000))/100; int maint = glut_version - (major*10000) - (minor * 100); - app_debug_msg("Running freeGLUT %d.%d.%d.\n", major, minor, maint); + if (debug) fprintf(stderr, "Running freeGLUT %d.%d.%d.\n", major, minor, maint); } } } @@ -415,17 +416,17 @@ void set_mode(int mode) { return; } - app_debug_msg("set_mode(%d): current_mode = %d.\n", mode, current_graphics_mode); + if (debug) fprintf(stderr, "set_mode(%d): current_mode = %d.\n", mode, current_graphics_mode); if (glut_is_initialized) { - app_debug_msg("Calling KillWindow(): win = %d\n", win); + if (debug) fprintf(stderr, "Calling KillWindow(): win = %d\n", win); KillWindow(); - app_debug_msg("...KillWindow() survived.\n"); + if (debug) fprintf(stderr, "KillWindow() survived.\n"); } if (mode != MODE_HIDE_GRAPHICS) { - app_debug_msg("set_mode(): Calling make_new_window(%d)\n", mode); + if (debug) fprintf(stderr, "set_mode(): Calling make_new_window(%d)\n", mode); make_new_window(mode); - app_debug_msg("...make_new_window() survived.\n"); + if (debug) fprintf(stderr, "make_new_window() survived.\n"); } #ifdef __APPLE__ else @@ -499,10 +500,10 @@ static void timer_handler(int) { void restart() { // don't do anything except when exit is called from the graphics-thread if (!pthread_equal(pthread_self(), graphics_thread)) { - app_debug_msg ("exit() was called from worker-thread\n"); + if (debug) fprintf(stderr, "exit() was called from worker-thread\n"); return; } - app_debug_msg ("restart: exit() called from graphics-thread.\n"); + if (debug) fprintf(stderr, "restart: exit() called from graphics-thread.\n"); // if we are standalone and glut was initialized, // we assume user pressed 'close', and we exit the app @@ -510,7 +511,7 @@ void restart() { // if (glut_is_initialized ) { if (boinc_is_standalone()) { - app_debug_msg( + if (debug) fprintf(stderr, "Assuming user pressed 'close'... means we're exiting now.\n" ); if (boinc_delete_file(LOCKFILE) != 0) { @@ -526,7 +527,7 @@ void restart() { // jump back to entry-point in xwin_graphics_event_loop(); // - app_debug_msg( "restart: Jumping back to event_loop.\n"); + if (debug) fprintf(stderr, "restart: Jumping back to event_loop.\n"); longjmp(jbuf, JUMP_EXIT); } @@ -539,14 +540,14 @@ void restart_sig(int /*signal_number*/) { if (pthread_equal(pthread_self(), graphics_thread)) { // alternative approach is for the signal hander to call exit(). fprintf(stderr, "Caught SIGABRT in graphics thread\n"); - app_debug_msg ("Caught SIGABRT in graphics thread. Jumping back to xwin_graphics_event_loop()...\n"); + if (debug) fprintf(stderr, "Caught SIGABRT in graphics thread. Jumping back to xwin_graphics_event_loop()...\n"); // jump back to entry-point in xwin_graphics_event_loop() longjmp(jbuf, JUMP_ABORT); } else { // In non-graphics thread: use original signal handler // fprintf(stderr, "Caught SIGABRT in non-graphics thread\n"); - app_debug_msg("Caught SIGABRT in non-graphics thread. Trying to call previous ABRT-handler...\n"); + if (debug) fprintf(stderr, "Caught SIGABRT in non-graphics thread. Trying to call previous ABRT-handler...\n"); if (sigaction(SIGABRT, &original_signal_handler, NULL)) { perror("Unable to restore SIGABRT signal handler in non-graphics thread\n"); // what to do? call abort(3)?? call exit(nonzero)??? @@ -571,7 +572,7 @@ void restart_sig(int /*signal_number*/) { void xwin_graphics_event_loop() { int restarted = 0; - app_debug_msg ("Direct call to xwin_graphics_event_loop()\n"); + if (debug) fprintf(stderr, "Direct call to xwin_graphics_event_loop()\n"); struct sigaction sa; sa.sa_handler = restart_sig; @@ -630,11 +631,11 @@ void xwin_graphics_event_loop() { #endif set_mode(MODE_HIDE_GRAPHICS); while ( current_graphics_mode == MODE_HIDE_GRAPHICS ) { - app_debug_msg( + if (debug) fprintf(stderr, "Graphics-thread now waiting for client-message...\n" ); wait_for_initial_message(); - app_debug_msg ("got a graphics-message from client... \n"); + if (debug) fprintf(stderr, "got a graphics-message from client... \n"); timer_handler(0); } } else @@ -646,50 +647,10 @@ void xwin_graphics_event_loop() { // ok we should be ready & initialized by now to call glutMainLoop() // - app_debug_msg ("now calling glutMainLoop()...\n"); + if (debug) fprintf(stderr, "now calling glutMainLoop()...\n"); glutMainLoop(); - app_debug_msg("...glutMainLoop() returned!! This should never happen...\n"); + if (debug) fprintf(stderr, "glutMainLoop() returned!! This should never happen...\n"); } -#ifndef _DEBUG -void app_debug_msg (const char* /*fmt*/, ...) { - return; -} -#else -void app_debug_msg (const char* fmt, ...) { - va_list args; - char buffer[5000+1]; - static char *boinc_slotdir = NULL; - va_start (args, fmt); - - if (boinc_slotdir == NULL) { - char *tmp, *ptr; - if ((tmp = getcwd(NULL, 0)) == NULL) { - perror ("failed to get working directory using getcwd()"); - boinc_slotdir = (char*)calloc(1, 20); - strcpy( boinc_slotdir, "[unknown]"); - } else { - if ( (ptr = strrchr(tmp, '/')) == NULL) { - ptr = tmp; - } else { - ptr ++; - } - boinc_slotdir = (char*)calloc(1, strlen(ptr)+1); - strcpy(boinc_slotdir, ptr); - free(tmp); - } - } - - vsnprintf (buffer, 5000, fmt, args); - fprintf (stdout, "APP '%s' DEBUG: ", boinc_slotdir); - fprintf (stdout, buffer); - fflush (stdout); - - va_end (args); -} -#endif - - - const char *BOINC_RCSID_c457a14644 = "$Id$"; diff --git a/checkin_notes b/checkin_notes index f928ea9ece..be1e44837f 100755 --- a/checkin_notes +++ b/checkin_notes @@ -11794,3 +11794,25 @@ Rom 30 Oct 2006 clientgui/ AdvancedFrame.cpp, .h + +David 30 Oct 2006 + - API: moved the __HrLoadAllImportsForDll() calls out of + boinc_samples/uppercase/uppercase.C + (what were they doing there??) + and put them into a function boinc_graphics_possible(). + Applications that can potentially do graphics should call this, + and if it returns false don't try to do graphics + (this means the needed DLLs are not there (Win) + or the DISPLAY env var is not set (Unix)) + - API: make the graphics callbacks (e.g. mouse movement) + C++ rather than C functions. + This was breaking the example applications (upper_case). + Bruce et al: if this causes problems, let me know. + - API, X graphics: use fprintf(stderr) instead of app_debug_msg(0 + + api/ + boinc_api.C + graphics_api.h + x_opengl.C + html/inc/ + team.inc diff --git a/html/inc/team.inc b/html/inc/team.inc index 01a4e25331..fab4ffe6b4 100644 --- a/html/inc/team.inc +++ b/html/inc/team.inc @@ -16,7 +16,7 @@ function display_team_page($team, $offset, $sort_by) { $n = 20; // there aren't indices to support sorting by credit. -// set the following to turn off sorted output. +// set the following variable to disable sorted output. // (though since caching is generally used this shouldn't needed) // $nosort = false; @@ -43,7 +43,7 @@ function display_team_page($team, $offset, $sort_by) { } row2("Web site", "$x"); } - row2("Members (with AND without Credit)", $team->nusers); + row2("Members (with and without credit)", $team->nusers); $founder = lookup_user_id($team->userid); $user = get_logged_in_user(false); @@ -63,7 +63,7 @@ function display_team_page($team, $offset, $sort_by) { echo ""; echo "

"; start_table(); - row1("Active members (have gotten Credit)", 4); + row1("Active members (with nonzero total credit)", 4); echo " Name ";