From 36c243b73639013321e4a405b99736f7c7f9ba08 Mon Sep 17 00:00:00 2001 From: Charlie Fenton Date: Sat, 23 Apr 2005 15:14:52 +0000 Subject: [PATCH] *** empty log message *** svn path=/trunk/boinc/; revision=5924 --- checkin_notes | 19 + clientgui/BOINCGUIApp.cpp | 2 +- clientgui/mac/Mac_Saver_ModuleView.h | 52 +++ clientgui/mac/Mac_Saver_ModuleView.m | 213 +++++++++ clientgui/mac/mac_saver_module.cpp | 573 +++++++++++++++++++++++++ mac_build/Info.plist | 4 +- mac_build/ScreenSaver-Info.plist | 24 ++ mac_build/boinc.pbproj/project.pbxproj | 237 +++++++--- 8 files changed, 1053 insertions(+), 71 deletions(-) create mode 100755 clientgui/mac/Mac_Saver_ModuleView.h create mode 100755 clientgui/mac/Mac_Saver_ModuleView.m create mode 100755 clientgui/mac/mac_saver_module.cpp create mode 100644 mac_build/ScreenSaver-Info.plist diff --git a/checkin_notes b/checkin_notes index d6a301d553..7956add4f8 100755 --- a/checkin_notes +++ b/checkin_notes @@ -27590,3 +27590,22 @@ Rom 22 April 2005 clientgui/ MainFrame.cpp + +Charlie 23 April 2005 + Mac: Rename "BOINC.app" to "BoincManager.app", rename "boinc_client" + to "boinc". + Create screen saver, add it to BOINC XCode project. + + clientgui/ + BOINCGUIApp.cpp + mac/ + mac_saver_module.cpp (new) + mac_saver_module.tiff (new) + Mac_Saver_ModuleView.h (new) + Mac_Saver_ModuleView.m (new) + BOINCSaver.nib (new) + mac_build/ + Info.plist + ScreenSaver-Info.plist (new) + boinc.pbproj/ + project.pbxproj diff --git a/clientgui/BOINCGUIApp.cpp b/clientgui/BOINCGUIApp.cpp index 60cdc56aaf..174f184daa 100644 --- a/clientgui/BOINCGUIApp.cpp +++ b/clientgui/BOINCGUIApp.cpp @@ -365,7 +365,7 @@ void CBOINCGUIApp::StartupBOINCCore() { if (err == noErr) { strExecute = wxT("\""); strExecute += wxT(buf); - strExecute += wxT("/Contents/Resources/boinc_client\" -redirectio"); + strExecute += wxT("/Contents/Resources/boinc\" -redirectio"); } else { buf[0] = '\0'; } diff --git a/clientgui/mac/Mac_Saver_ModuleView.h b/clientgui/mac/Mac_Saver_ModuleView.h new file mode 100755 index 0000000000..3b3a5e4289 --- /dev/null +++ b/clientgui/mac/Mac_Saver_ModuleView.h @@ -0,0 +1,52 @@ +// Berkeley Open Infrastructure for Network Computing +// http://boinc.berkeley.edu +// Copyright (C) 2005 University of California +// +// This is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; +// either version 2.1 of the License, or (at your option) any later version. +// +// This software is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Lesser General Public License for more details. +// +// To view the GNU Lesser General Public License visit +// http://www.gnu.org/copyleft/lesser.html +// or write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +// Mac_Saver_ModuleView.h +// BOINC_Saver_Module +// + +#import + + +@interface BOINC_Saver_ModuleView : ScreenSaverView +{ + NSQuickDrawView * mainQDView; + NSQuickDrawView * previewQDView; + NSString *mBundleID; // our bundle ID + + IBOutlet id mConfigureSheet; // our configuration sheet + IBOutlet NSButton *mGoToBlankCheckbox; + IBOutlet NSTextField *mBlankingTimeTextField; + + int mVersion; // the version of our prefs + NSString *mBlankingTimeString; +} + +- (IBAction)closeSheetSave:(id) sender; +- (IBAction)closeSheetCancel:(id) sender; + +@end + +void setFrame(Rect *frame); +int initBOINCSaver(Boolean ispreview); +int drawGraphics(GrafPtr aPort); +void drawPreview(GrafPtr aPort); +void closeBOINCSaver(void); +void displayText(const unsigned char *s, GrafPtr aPort); +extern void print_to_log_file(const char *format, ...); diff --git a/clientgui/mac/Mac_Saver_ModuleView.m b/clientgui/mac/Mac_Saver_ModuleView.m new file mode 100755 index 0000000000..baa3f0a457 --- /dev/null +++ b/clientgui/mac/Mac_Saver_ModuleView.m @@ -0,0 +1,213 @@ +// Berkeley Open Infrastructure for Network Computing +// http://boinc.berkeley.edu +// Copyright (C) 2005 University of California +// +// This is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; +// either version 2.1 of the License, or (at your option) any later version. +// +// This software is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Lesser General Public License for more details. +// +// To view the GNU Lesser General Public License visit +// http://www.gnu.org/copyleft/lesser.html +// or write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +// +// Mac_Saver_ModuleView.m +// BOINC_Saver_Module +// + +#import "Mac_Saver_ModuleView.h" + +int gGoToBlank; // True if we are to blank the screen +int gBlankingTime; // Delay in minutes before blanking the screen + +@implementation BOINC_Saver_ModuleView + +- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview { + NSQuickDrawView * myQDView; + + self = [ super initWithFrame:frame isPreview:isPreview ]; + if (self) { + // grab the screensaver defaults + mBundleID = [[ NSBundle bundleForClass:[self class]] bundleIdentifier ]; + ScreenSaverDefaults *defaults = [ ScreenSaverDefaults defaultsForModuleWithName:mBundleID ]; + + // try to load the version key, used to see if we have any saved settings + mVersion = [defaults floatForKey:@"version"]; + if (!mVersion) { + // no previous settings so define our defaults + mVersion = 1; + gGoToBlank = NO; + gBlankingTime = 1; + + // write out the defaults + [ defaults setInteger:mVersion forKey:@"version" ]; + [ defaults setInteger:gGoToBlank forKey:@"GoToBlank" ]; + [ defaults setInteger:gBlankingTime forKey:@"BlankingTime" ]; + + // synchronize + [defaults synchronize]; + } + + // set defaults... + gGoToBlank = [ defaults integerForKey:@"GoToBlank" ]; + gBlankingTime = [ defaults integerForKey:@"BlankingTime" ]; + + myQDView = [[ NSQuickDrawView alloc ] initWithFrame:frame ]; + if (!myQDView) { + [ self autorelease ]; + return nil; + } + + [ self setAutoresizesSubviews:YES ]; // make sure the subview resizes. + [ self addSubview:myQDView ]; + [ myQDView release ]; + if (isPreview) + previewQDView = myQDView; + else + mainQDView = myQDView; + + [ self setAnimationTimeInterval:1/8.0 ]; + } + + return self; +} + +- (void)startAnimation { + int newFrequency; + + [ super startAnimation ]; + + if ( [ self isPreview ] ) + return; + + newFrequency = initBOINCSaver([ self isPreview ]); + if (newFrequency) + [ self setAnimationTimeInterval:1.0/newFrequency ]; +} + +- (void)stopAnimation { + [ super stopAnimation ]; + + if ( [ self isPreview ] ) + return; + + closeBOINCSaver(); +} + +- (void)drawRect:(NSRect)rect { + NSView* myView = nil; + NSWindow* myWindow = nil; + + [ super drawRect:rect ]; + + // Set our blanking window slightly below screen saver window level + // so that our application's graphics can draw over it. + if (! [ self isPreview ] ) { + myView = [ NSView focusView ]; + if (myView) + myWindow = [ myView window ]; + if (myWindow) + [ myWindow setLevel:kCGStatusWindowLevel ]; + } +// optionally draw here +} + +- (void)animateOneFrame { + int newFrequency; + NSRect theFrame = [ self frame ]; + Point p = { 0, 0 }; + + if ([ self isPreview ]) { +#if 1 // Currently drawRect just draws our logo in the preview window + NSString *fileName = [[ NSBundle bundleForClass:[ self class ]] pathForImageResource:@"boinc" ]; + if (fileName) { + NSImage *myImage = [[ NSImage alloc ] initWithContentsOfFile:fileName ]; + [ myImage setScalesWhenResized:YES ]; + [ myImage setSize:theFrame.size ]; + [ myImage compositeToPoint:NSZeroPoint operation:NSCompositeSourceOver ]; + [ myImage release ]; + } + [ self setAnimationTimeInterval:1/1.0 ]; +#else // Code for possible future use if we want to draw more in preview + [ previewQDView lockFocus ]; + drawPreview([ previewQDView qdPort ]); + [ previewQDView unlockFocus ]; + QDFlushPortBuffer([ previewQDView qdPort ], nil); + [ self setAnimationTimeInterval:1/30.0 ]; +#endif + return; + } + + [ mainQDView lockFocus ]; + LocalToGlobal(&p); + if ((p.h != 0) || (p.v != 0)) { + [ mainQDView unlockFocus ]; + + // Hide window on second display to aid in debugging +// [[[ NSView focusView] window ] setLevel:kCGMinimumWindowLevel ]; + return; // We draw only to main screen + } + + newFrequency = drawGraphics([ mainQDView qdPort ]); + [ mainQDView unlockFocus ]; + QDFlushPortBuffer([ mainQDView qdPort ], nil); + if (newFrequency) + [ self setAnimationTimeInterval:(1.0/newFrequency) ]; +} + +- (BOOL)hasConfigureSheet { + return YES; +} + +// Display the configuration sheet for the user to choose their settings +- (NSWindow*)configureSheet +{ + // if we haven't loaded our configure sheet, load the nib named MyScreenSaver.nib + if (!mConfigureSheet) + [ NSBundle loadNibNamed:@"BOINCSaver" owner:self ]; + // set the UI state + [ mGoToBlankCheckbox setState:gGoToBlank ]; + mBlankingTimeString = [[ NSString alloc ] initWithFormat:@"%d", gBlankingTime ]; + [ mBlankingTimeTextField setStringValue:mBlankingTimeString ]; + + return mConfigureSheet; +} + +// Called when the user clicked the SAVE button +- (IBAction) closeSheetSave:(id) sender +{ + // get the defaults + ScreenSaverDefaults *defaults = [ ScreenSaverDefaults defaultsForModuleWithName:mBundleID ]; + + // save the UI state + gGoToBlank = [ mGoToBlankCheckbox state ]; + mBlankingTimeString = [ mBlankingTimeTextField stringValue ]; + gBlankingTime = [ mBlankingTimeString intValue ]; + + // write the defaults + [ defaults setInteger:gGoToBlank forKey:@"GoToBlank" ]; + [ defaults setInteger:gBlankingTime forKey:@"BlankingTime" ]; + + // synchronize + [ defaults synchronize ]; + + // end the sheet + [ NSApp endSheet:mConfigureSheet ]; +} + +// Called when the user clicked the CANCEL button +- (IBAction) closeSheetCancel:(id) sender +{ + // nothing to configure + [ NSApp endSheet:mConfigureSheet ]; +} + + +@end diff --git a/clientgui/mac/mac_saver_module.cpp b/clientgui/mac/mac_saver_module.cpp new file mode 100755 index 0000000000..06c5d3bc76 --- /dev/null +++ b/clientgui/mac/mac_saver_module.cpp @@ -0,0 +1,573 @@ +// Berkeley Open Infrastructure for Network Computing +// http://boinc.berkeley.edu +// Copyright (C) 2005 University of California +// +// This is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; +// either version 2.1 of the License, or (at your option) any later version. +// +// This software is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Lesser General Public License for more details. +// +// To view the GNU Lesser General Public License visit +// http://www.gnu.org/copyleft/lesser.html +// or write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +// +// mac_saver_module.cpp +// BOINC_Saver_Module +// + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gui_rpc_client.h" + +//#include +#ifdef __cplusplus +extern "C" { +#endif + +void setFrame(Rect *frame); +int initBOINCSaver(Boolean ispreview); +OSStatus initBOINCApp(void); +int drawGraphics(GrafPtr aPort); +void drawPreview(GrafPtr aPort); +void closeBOINCSaver(void); +void setBannerText(ConstStringPtr msg, GrafPtr aPort); +void drawBanner(GrafPtr aPort); +void FlashIcon(void); +OSErr FindBOINCApplication(FSSpecPtr applicationFSSpecPtr); +pid_t FindProcessPID(char* name, pid_t thePID); +OSErr GetpathToBOINCManagerApp(char* path, int maxLen); +OSStatus RPCThread(void* param); + +#ifdef __cplusplus +} // extern "C" +#endif + +#define CREATE_LOG 1 + +#ifdef __cplusplus +extern "C" { +#endif +void print_to_log_file(const char *format, ...); +#ifdef __cplusplus +} + +void strip_cr(char *buf); +#endif + +#define BANNER_GAP 30 /* Space between repeats of banner text */ + +enum SaverState { + SaverState_Idle, + SaverState_LaunchingCoreClient, + SaverState_CoreClientRunning, + SaverState_CoreClientSetToSaverMode, + + SaverState_CantLaunchCoreClient, + SaverState_UnrecoverableError +}; + + +extern int gGoToBlank; // True if we are to blank the screen +extern int gBlankingTime; // Delay in minutes before blanking the screen + + +static Boolean wasAlreadyRunning; +static pid_t CoreClientPID = nil; +static Str255 bannerText; +static int bannerWidth; +static SaverState saverState = SaverState_Idle; +static StringPtr CurrentBannerMessage = 0; +static DISPLAY_INFO di; // Contains all NULLs for the Macintosh +static RPC_CLIENT *rpc; +MPQueueID gTerminationQueue; // This queue will report the completion of our threads +MPTaskID gRPC_thread_id; // IDs of the thread we create +int gClientSaverStatus = 0; // status returned by get_screensaver_mode RPC +Boolean gQuitRPCThread = false; // Flag to tell RPC thread to exit gracefully + +const ConstStringPtr CantLaunchCCMsg = "\pUnable to launch BOINC application."; +const ConstStringPtr LaunchingCCMsg = "\pLaunching BOINC application."; +const ConstStringPtr BOINCSuspendedMsg = "\pBOINC is currently suspended."; +const ConstStringPtr BOINCNoAppsExecutingMsg = "\pBOINC is currently idle."; +const ConstStringPtr BOINCNoProjectsDetectedMsg = "\pBOINC is not attached to any projects. Please attach to projects using the BOINC Manager."; +const ConstStringPtr BOINCNoGraphicAppsExecutingMsg = "\pBOINC is currently not executing any applications with graphics"; +const ConstStringPtr BOINCUnrecoverableErrorMsg = "\pSorry, an unrecoverable error occurred"; + + + +// Returns desired Animation Frequency (per second) or 0 for no change +int initBOINCSaver(Boolean ispreview) { + int newFrequency = 15; + OSStatus err; + + if (ispreview) + return 8; + + setBannerText(0, NULL); + + if (ispreview) + return 0; + + // If there are multiple displays, initBOINCSaver may get called + // multiple times (once for each display), so we need to guard + // against launching multiple instances of the core client + if (saverState == SaverState_Idle) { + err = initBOINCApp(); + + if (saverState == SaverState_LaunchingCoreClient) + { + gClientSaverStatus = 0; + gQuitRPCThread = false; + if (rpc == NULL) + rpc = new RPC_CLIENT; + newFrequency = 4; + } + } + return newFrequency; +} + + +OSStatus initBOINCApp() { + char boincPath[2048], buf[256]; + pid_t myPid; + int status; + OSStatus err; + + saverState = SaverState_CantLaunchCoreClient; + + CoreClientPID = FindProcessPID("boinc", 0); + if (CoreClientPID) { + wasAlreadyRunning = true; + saverState = SaverState_LaunchingCoreClient; + return noErr; + } + + err = GetpathToBOINCManagerApp(boincPath, sizeof(boincPath)); + if (err) // If we couldn't find BOINCManager.app, try default path + strcpy(boincPath, "/Applications/BOINCManager.app"); // + + strcat(boincPath, "/Contents/Resources/boinc"); + + if ( (myPid = fork()) < 0) + return -1; + else if (myPid == 0) // child + { + strcpy(buf, getenv("HOME")); + strcat(buf, "/Library/Application Support/BOINC Data"); + status = chdir(buf); + if (status) { + perror("chdir"); + _exit(status); + } + + status = execl(boincPath, " -redirectio", (char *) 0); + _exit(127); // execl error (execl should never return) + } else { + CoreClientPID = myPid; // make this available globally + saverState = SaverState_LaunchingCoreClient; + } + + return noErr; +} + + +// Returns new desired Animation Frequency (per second) or 0 for no change +int drawGraphics(GrafPtr aPort) { + + CGrafPtr savePort; + GDHandle saveGDH; + int newFrequency = 15; + pid_t myPid; + OSStatus err; + + ObscureCursor(); + + switch (saverState) { + case SaverState_LaunchingCoreClient: + setBannerText(LaunchingCCMsg, aPort); + + myPid = FindProcessPID(NULL, CoreClientPID); + if (myPid) { + saverState = SaverState_CoreClientRunning; + rpc->init(NULL); // Initialize communications with Core Client + + // Set up a separate thread for communicating with Core Client + if (!MPLibraryIsLoaded()) { + saverState = SaverState_UnrecoverableError; + break; + } + + if (gTerminationQueue == NULL) { + err = MPCreateQueue(&gTerminationQueue); /* Create the queue which will report the completion of the task. */ + if (err) { + saverState = SaverState_UnrecoverableError; + break; + } + } + err = MPCreateTask(RPCThread, /* This is the task function. */ + 0, /* This is the parameter to the task function. */ + (50*1024), /* Stack size for thread. */ + gTerminationQueue, /* We'll use this to sense task completion. */ + 0, /* We won't use the first part of the termination message. */ + 0, /* We won't use the second part of the termination message. */ + 0, /* Use the normal task options. (Currently this *must* be zero!) */ + &gRPC_thread_id); /* Here's where the ID of the new task will go. */ + + if (err) { + MPDeleteQueue(gTerminationQueue); + saverState = SaverState_UnrecoverableError; + break; + } + } + // ToDo: Add a timeout after which we display error message + break; + + case SaverState_CoreClientRunning: + // set_screensaver_mode RPC called in RPCThread() + break; + + case SaverState_CoreClientSetToSaverMode: + switch (gClientSaverStatus) { + case 0: + break; // No status response yet from get_screensaver_mode RPC + case SS_STATUS_ENABLED: + default: + setBannerText(0, aPort); // No text message + // Let the science app draw over our window + break; + case SS_STATUS_BLANKED: + setBannerText(0, aPort); // No text message + break; + case SS_STATUS_BOINCSUSPENDED: + setBannerText(BOINCSuspendedMsg, aPort); + break; + case SS_STATUS_NOAPPSEXECUTING: + setBannerText(BOINCNoAppsExecutingMsg, aPort); + break; + case SS_STATUS_NOPROJECTSDETECTED: + setBannerText(BOINCNoProjectsDetectedMsg, aPort); + break; + case SS_STATUS_NOGRAPHICSAPPSEXECUTING: + setBannerText(BOINCNoGraphicAppsExecutingMsg, aPort); + break; + case SS_STATUS_QUIT: + // Handled in RPCThread() + break; + } // end switch (gClientSaverStatus) + break; + + case SaverState_UnrecoverableError: + setBannerText(BOINCUnrecoverableErrorMsg, aPort); + break; + + case SaverState_CantLaunchCoreClient: + setBannerText(CantLaunchCCMsg, aPort); + break; + + case SaverState_Idle: + break; // Should never get here; fixes compiler warning + } // end switch (saverState) + + if (bannerText[0]) { + GetGWorld(&savePort, &saveGDH); + SetPort(aPort); + drawBanner(aPort); + SetGWorld(savePort, saveGDH); + newFrequency = 45; + } else + newFrequency = 4; + + return newFrequency; +} + + +void drawPreview(GrafPtr aPort) { + SetPort(aPort); + setBannerText("\p BOINC", aPort); + drawBanner(aPort); +} + + +// If there are multiple displays, closeBOINCSaver may get called +// multiple times (once for each display), so we need to guard +// against any problems that may cause. +void closeBOINCSaver() { + gQuitRPCThread = true; // Tell RPC Thread to exit + if (gTerminationQueue) { // Wait up to 10 seconds for RPC thread to exit + MPWaitOnQueue(gTerminationQueue, NULL, NULL, NULL, kDurationMillisecond*10000); + MPDeleteQueue(gTerminationQueue); + gTerminationQueue = NULL; + } + + if (rpc) + { + rpc->set_screensaver_mode(false, 0, di); + delete rpc; + } + rpc = NULL; + + setBannerText(0, NULL); + + // Kill core client if we launched it + if (!wasAlreadyRunning) + if (CoreClientPID) + { + kill(CoreClientPID, SIGTERM); + } + CoreClientPID = NULL; + wasAlreadyRunning = false; + gQuitRPCThread = false; + saverState = SaverState_Idle; +} + + +OSStatus RPCThread(void* param) { + int val = 0; +// CC_STATE state; + AbsoluteTime timeToUnblock; + long time_to_blank; + + while (true) { + if (gQuitRPCThread) // If main thread has requested we exit + MPExit(noErr); // Exit the thread + + timeToUnblock = AddDurationToAbsolute(durationSecond/4, UpTime()); + MPDelayUntil(&timeToUnblock); + + // Calculate the estimated blank time by adding the current time + // and and the user specified time which is in minutes + if (gGoToBlank) + time_to_blank = time(0) + (gBlankingTime * 60); + else + time_to_blank = 0; + val = rpc->set_screensaver_mode(true, time_to_blank, di); + if (val == noErr) + break; + + // Attempt to reinitialize the RPC client and state + rpc->close(); + rpc->init(NULL); + // Error message after timeout? + } + + saverState = SaverState_CoreClientSetToSaverMode; + + while (true) { + if (gQuitRPCThread) // If main thread has requested we exit +{ + MPExit(noErr); // Exit the thread +} + + timeToUnblock = AddDurationToAbsolute(durationSecond/4, UpTime()); + MPDelayUntil(&timeToUnblock); + +#if 0 + val = rpc->get_state(state); + if (val) { + } +#endif + val = rpc->get_screensaver_mode(gClientSaverStatus); + if (val) { + // Attempt to reinitialize the RPC client and state + rpc->close(); + rpc->init(NULL); + // Error message after timeout? + } + + if (gClientSaverStatus == SS_STATUS_QUIT) { + rpc->set_screensaver_mode(false, 0, di); + MPExit(noErr); // Exit the thread + } + } +} + + + +void setBannerText(ConstStringPtr msg, GrafPtr aPort) { + CGrafPtr savePort; + RGBColor saveBackColor; + Rect wRect; + + if ((ConstStringPtr)CurrentBannerMessage == msg) + return; + + CurrentBannerMessage = (StringPtr)msg; + + if (msg == 0) { + bannerText[0] = 0; + if (aPort != NULL) + drawBanner(aPort); + return; + } + + GetPort(&savePort); + SetPort(aPort); + + GetPortBounds(aPort, &wRect); + + GetBackColor(&saveBackColor); + BackColor ( blackColor ); + EraseRect(&wRect); + RGBBackColor(&saveBackColor); + + BlockMove(msg, bannerText, msg[0]+1); + TextSize(24); + TextFace(bold); + bannerWidth = StringWidth(bannerText) + BANNER_GAP; + SetPort(savePort); +} + + +void drawBanner(GrafPtr aPort) { + CGrafPtr savePort; + GDHandle saveGDH; + RGBColor saveForeColor, saveBackColor; + short x, y; + Rect wRect; + FontInfo fInfo; + + static short bannerPos; + + GetGWorld(&savePort, &saveGDH); + SetPort(aPort); + + GetForeColor(&saveForeColor); + GetBackColor(&saveBackColor); + ForeColor(whiteColor); + BackColor(blackColor); + GetPortBounds(aPort, &wRect); + if ( (bannerPos + bannerWidth) < wRect.left) + bannerPos = wRect.left; + else + bannerPos -= 1; + + x = bannerPos; + y = (wRect.bottom - wRect.top) / 3 + wRect.top; + + GetFontInfo(&fInfo); + wRect.top = y - fInfo.ascent; + wRect.bottom = y + fInfo.descent; + EraseRect(&wRect); + + do { + MoveTo(x, y); + DrawString(bannerText); + x+= bannerWidth; + } while (x < wRect.right); + + RGBForeColor(&saveForeColor); + RGBBackColor(&saveBackColor); + + SetGWorld(savePort, saveGDH); +} + + +pid_t FindProcessPID(char* name, pid_t thePID) +{ + FILE *f; + char buf[1024]; + size_t n; + pid_t aPID; + + if (name != NULL) // Search ny name + n = strlen(name); + + f = popen("ps -a -x -c -o command,pid", "r"); + if (f == NULL) + return 0; + + while (fgets(buf, sizeof(buf), f)) + { + if (name != NULL) { // Search ny name + if (strncmp(buf, name, n) == 0) + { + aPID = atol(buf+16); + pclose(f); + return aPID; + } + } else { // Search by PID + aPID = atol(buf+16); + if (aPID == thePID) { + pclose(f); + return aPID; + } + } + } + pclose(f); + return 0; +} + + +OSErr GetpathToBOINCManagerApp(char* path, int maxLen) +{ + CFStringRef bundleID = CFSTR("edu.berkeley.boinc"); + OSType creator = 'BNC!'; + FSRef theFSRef; + OSStatus status = noErr; + + status = LSFindApplicationForInfo(creator, bundleID, NULL, &theFSRef, NULL); + if (status == noErr) + status = FSRefMakePath(&theFSRef, (unsigned char *)path, maxLen); + return status; +} + + +void print_to_log_file(const char *format, ...) { +#if CREATE_LOG + FILE *f; + va_list args; + char buf[256]; + time_t t; + strcpy(buf, getenv("HOME")); + strcat(buf, "/Documents/test_log.txt"); + f = fopen(buf, "a"); + if (!f) return; + +// freopen(buf, "a", stdout); +// freopen(buf, "a", stderr); + + time(&t); + strcpy(buf, asctime(localtime(&t))); + strip_cr(buf); + + fputs(buf, f); + fputs(" ", f); + + va_start(args, format); + vfprintf(f, format, args); + va_end(args); + + fputs("\n", f); + + fclose(f); +#endif +} + +#if CREATE_LOG +void strip_cr(char *buf) +{ + char *theCR; + + theCR = strrchr(buf, '\n'); + if (theCR) + *theCR = '\0'; + theCR = strrchr(buf, '\r'); + if (theCR) + *theCR = '\0'; +} +#endif // CREATE_LOG diff --git a/mac_build/Info.plist b/mac_build/Info.plist index 379c68719e..0c77f978d7 100644 --- a/mac_build/Info.plist +++ b/mac_build/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion English CFBundleExecutable - BOINC + BOINCManager CFBundleIconFile BOINCMgr.icns CFBundleIdentifier @@ -17,6 +17,6 @@ CFBundleSignature BNC! CFBundleVersion - 1.0 + 3.40 diff --git a/mac_build/ScreenSaver-Info.plist b/mac_build/ScreenSaver-Info.plist new file mode 100644 index 0000000000..2a3a04a32d --- /dev/null +++ b/mac_build/ScreenSaver-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + BOINCSaver + CFBundleIdentifier + edu.berkeley.boincsaver + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + BOINCSaver + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSPrincipalClass + BOINC_Saver_ModuleView + + diff --git a/mac_build/boinc.pbproj/project.pbxproj b/mac_build/boinc.pbproj/project.pbxproj index 1cd9effab8..d0d98d25a9 100755 --- a/mac_build/boinc.pbproj/project.pbxproj +++ b/mac_build/boinc.pbproj/project.pbxproj @@ -131,6 +131,8 @@ }; 20286C2CFDCF999611CA2CEA = { children = ( + DD0C5A8A0816711400CEC5D7, + DD48091E081A66F100A174AA, DD64E7D507D89DB800B176C8, DDF3028907CCCE2C00701169, F51BDF4903086C46012012A7, @@ -295,7 +297,6 @@ DD095EF407D87B1600362260, DD095F5A07D883E500362260, DD095F5B07D883E600362260, - DD64E7D607D89DB800B176C8, ); isa = PBXResourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -387,7 +388,7 @@ OTHER_CPLUSPLUSFLAGS = "-DHAVE_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -DWX_PRECOMP -DNO_GCC_PRAGMA -DNOCLIPBOARD -DwxHAS_TASK_BAR_ICON -D_THREAD_SAFE -D__WXMAC__ -include../config.h"; OTHER_LDFLAGS = "-D_THREAD_SAFE -lz -lpthread -liconv -ldl -lz -lm"; OTHER_REZFLAGS = ""; - PRODUCT_NAME = BOINC; + PRODUCT_NAME = BOINCManager; SECTORDER_FLAGS = ""; SKIP_INSTALL = NO; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; @@ -428,7 +429,7 @@ explicitFileType = wrapper.application; includeInIndex = 0; isa = PBXFileReference; - path = BOINC.app; + path = BOINCManager.app; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -702,6 +703,59 @@ settings = { }; }; + DD0C59580816573E00CEC5D7 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = mac_saver_module.cpp; + path = ../clientgui/mac/mac_saver_module.cpp; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + DD0C59590816573E00CEC5D7 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = Mac_Saver_ModuleView.h; + path = ../clientgui/mac/Mac_Saver_ModuleView.h; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + DD0C595A0816573E00CEC5D7 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + name = Mac_Saver_ModuleView.m; + path = ../clientgui/mac/Mac_Saver_ModuleView.m; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + DD0C595B0816573E00CEC5D7 = { + fileRef = DD0C59580816573E00CEC5D7; + isa = PBXBuildFile; + settings = { + }; + }; + DD0C595D0816573E00CEC5D7 = { + fileRef = DD0C595A0816573E00CEC5D7; + isa = PBXBuildFile; + settings = { + }; + }; + DD0C5A8A0816711400CEC5D7 = { + isa = PBXFileReference; + lastKnownFileType = image.tiff; + name = boinc.tiff; + path = ../clientgui/mac/boinc.tiff; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + DD0C5A8B0816711400CEC5D7 = { + fileRef = DD0C5A8A0816711400CEC5D7; + isa = PBXBuildFile; + settings = { + }; + }; DD2D25CB07FAB41700151141 = { fileEncoding = 30; isa = PBXFileReference; @@ -2048,6 +2102,20 @@ target = DD40CDF807F0386A0096C645; targetProxy = DD40D36007F03B600096C645; }; + DD48091E081A66F100A174AA = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = BOINCSaver.nib; + path = /Volumes/Moon/BOINC_Mac/boinc/clientgui/mac/BOINCSaver.nib; + refType = 0; + sourceTree = ""; + }; + DD48091F081A66F100A174AA = { + fileRef = DD48091E081A66F100A174AA; + isa = PBXBuildFile; + settings = { + }; + }; DD4DD0A207EAA648008A6468 = { fileRef = DD81C40307C5D1020098A04D; isa = PBXBuildFile; @@ -2078,6 +2146,12 @@ refType = 2; sourceTree = SOURCE_ROOT; }; + DD616A3008150050006981C1 = { + fileRef = F51BDF4903086C46012012A7; + isa = PBXBuildFile; + settings = { + }; + }; DD64E7D507D89DB800B176C8 = { fileEncoding = 30; isa = PBXFileReference; @@ -2086,12 +2160,6 @@ refType = 2; sourceTree = SOURCE_ROOT; }; - DD64E7D607D89DB800B176C8 = { - fileRef = DD64E7D507D89DB800B176C8; - isa = PBXBuildFile; - settings = { - }; - }; DD6D07B307E99881007F882B = { fileEncoding = 30; isa = PBXFileReference; @@ -2178,6 +2246,18 @@ settings = { }; }; + DD791FF00819063C00BE2906 = { + containerPortal = 20286C28FDCF999611CA2CEA; + isa = PBXContainerItemProxy; + proxyType = 1; + remoteGlobalIDString = DD96AFF80811075000A06F22; + remoteInfo = ScreenSaver; + }; + DD791FF10819063C00BE2906 = { + isa = PBXTargetDependency; + target = DD96AFF80811075000A06F22; + targetProxy = DD791FF00819063C00BE2906; + }; DD7C5D1F08110A60002FCE1E = { fileRef = DD40CE0807F039350096C645; isa = PBXBuildFile; @@ -2232,56 +2312,6 @@ settings = { }; }; - DD7C5E9508110D0B002FCE1E = { - children = ( - DD7C5EA008110D69002FCE1E, - DD7C5EA108110D69002FCE1E, - DD7C5EAD08110DD1002FCE1E, - ); - isa = PBXGroup; - name = mac; - refType = 4; - sourceTree = ""; - }; - DD7C5EA008110D69002FCE1E = { - fileEncoding = 30; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - name = Mac_Saver_ModuleView.h; - path = ../client/mac/Mac_Saver_ModuleView.h; - refType = 2; - sourceTree = SOURCE_ROOT; - }; - DD7C5EA108110D69002FCE1E = { - fileEncoding = 30; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.objc; - name = Mac_Saver_ModuleView.m; - path = ../client/mac/Mac_Saver_ModuleView.m; - refType = 2; - sourceTree = SOURCE_ROOT; - }; - DD7C5EA308110D69002FCE1E = { - fileRef = DD7C5EA108110D69002FCE1E; - isa = PBXBuildFile; - settings = { - }; - }; - DD7C5EAD08110DD1002FCE1E = { - fileEncoding = 30; - isa = PBXFileReference; - lastKnownFileType = sourcecode.cpp.cpp; - name = mac_saver_module.cpp; - path = ../client/mac/mac_saver_module.cpp; - refType = 2; - sourceTree = SOURCE_ROOT; - }; - DD7C5EAE08110DD1002FCE1E = { - fileRef = DD7C5EAD08110DD1002FCE1E; - isa = PBXBuildFile; - settings = { - }; - }; DD7E49CD080F9B09002716F9 = { fileRef = DD6D0A8507E9A61B007F882B; isa = PBXBuildFile; @@ -2361,7 +2391,7 @@ ); isa = PBXGroup; name = clientgui; - path = ../../boinc_public_021005/lib; + path = ../clientgui; refType = 2; sourceTree = SOURCE_ROOT; }; @@ -2782,6 +2812,9 @@ DD96AFF50811075000A06F22 = { buildActionMask = 2147483647; files = ( + DD616A3008150050006981C1, + DD0C5A8B0816711400CEC5D7, + DD48091F081A66F100A174AA, ); isa = PBXResourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -2789,8 +2822,17 @@ DD96AFF60811075000A06F22 = { buildActionMask = 2147483647; files = ( - DD7C5EA308110D69002FCE1E, - DD7C5EAE08110DD1002FCE1E, + DD0C595B0816573E00CEC5D7, + DD0C595D0816573E00CEC5D7, + DDFD5F0F0818F2EE002B23D4, + DDFD5F270818F329002B23D4, + DDFD5F280818F33C002B23D4, + DDFD5F290818F346002B23D4, + DDFD5F2A0818F34F002B23D4, + DDFD5F2B0818F359002B23D4, + DDFD5F2C0818F368002B23D4, + DDFD5F2D0818F372002B23D4, + DDFD5F2E0818F3A1002B23D4, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -2820,12 +2862,14 @@ GCC_PREFIX_HEADER = ""; INFOPLIST_FILE = "ScreenSaver-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; - OTHER_CFLAGS = ""; + OTHER_CFLAGS = " -include ../config.h"; + OTHER_CPLUSPLUSFLAGS = " -include ../config.h"; OTHER_LDFLAGS = "-framework Foundation -framework AppKit"; OTHER_REZFLAGS = ""; - PRODUCT_NAME = BOINC.saver; + PRODUCT_NAME = BOINCSaver; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + WRAPPER_EXTENSION = saver; }; dependencies = ( ); @@ -2860,7 +2904,7 @@ explicitFileType = wrapper.cfbundle; includeInIndex = 0; isa = PBXFileReference; - path = BOINC.saver.bundle; + path = BOINCSaver.saver; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -2990,6 +3034,7 @@ DDBD681107FA830E0082C20D, DDBD681307FA830E0082C20D, DDBD681507FA830E0082C20D, + DD791FF10819063C00BE2906, DDBD681707FA830E0082C20D, ); isa = PBXAggregateTarget; @@ -3177,7 +3222,7 @@ OTHER_CFLAGS = "-D_THREAD_SAFE -D__WXMAC -include ../config.h"; OTHER_LDFLAGS = "-framework Carbon"; OTHER_REZFLAGS = ""; - PRODUCT_NAME = boinc_client; + PRODUCT_NAME = boinc; SECTORDER_FLAGS = ""; SKIP_INSTALL = YES; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; @@ -3195,7 +3240,7 @@ explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; isa = PBXFileReference; - path = boinc_client; + path = boinc; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -3756,6 +3801,60 @@ refType = 2; sourceTree = SOURCE_ROOT; }; + DDFD5F0F0818F2EE002B23D4 = { + fileRef = DD81C5CC07C5D7D90098A04D; + isa = PBXBuildFile; + settings = { + }; + }; + DDFD5F270818F329002B23D4 = { + fileRef = F5EAD475031AEFF8018E201A; + isa = PBXBuildFile; + settings = { + }; + }; + DDFD5F280818F33C002B23D4 = { + fileRef = F5159562029EB02001F5651B; + isa = PBXBuildFile; + settings = { + }; + }; + DDFD5F290818F346002B23D4 = { + fileRef = F5159564029EB02001F5651B; + isa = PBXBuildFile; + settings = { + }; + }; + DDFD5F2A0818F34F002B23D4 = { + fileRef = DD344BD207C5B1150043025C; + isa = PBXBuildFile; + settings = { + }; + }; + DDFD5F2B0818F359002B23D4 = { + fileRef = DD344BD507C5B1150043025C; + isa = PBXBuildFile; + settings = { + }; + }; + DDFD5F2C0818F368002B23D4 = { + fileRef = DD6D0A8507E9A61B007F882B; + isa = PBXBuildFile; + settings = { + }; + }; + DDFD5F2D0818F372002B23D4 = { + fileRef = F54B901602AC0A2201FB7237; + isa = PBXBuildFile; + settings = { + }; + }; + DDFD5F2E0818F3A1002B23D4 = { + fileRef = F5EAD479031AF001018E201A; + isa = PBXBuildFile; + settings = { + }; + }; //DD0 //DD1 //DD2 @@ -4258,7 +4357,6 @@ F54B8FD502AC0A0C01FB7237, F54B8FD602AC0A0C01FB7237, F54B8FD702AC0A0C01FB7237, - DD7C5E9508110D0B002FCE1E, DD344BCE07C5B0B80043025C, DD344BCF07C5B0B80043025C, F54B8FDA02AC0A0C01FB7237, @@ -4584,6 +4682,9 @@ DD2F32F707F2A88B00645DDC, DD2F32EF07F2A83E00645DDC, DD40CDFE07F038990096C645, + DD0C59580816573E00CEC5D7, + DD0C59590816573E00CEC5D7, + DD0C595A0816573E00CEC5D7, ); isa = PBXGroup; name = mac;