This is MoveBlackView.m in view mode; [Download] [Up]
/* This file is part of MoveBlackView, a Screensaverbundle. Copyright (C) 1996-1998 Jens Heise Version 1.0 MoveBlackView 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 General Public License for more details. You should have received a copy of the GNU General Public License, version 1, along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ // The source for this screensaver is due to Eric P. Scott. It was originated // as screensaver for loginwindow and only ported to BackSpace by myself. Its // original name was "TimeToBlack.tar.gz" and can be found on // "peanuts.leo.org". // A very small number of modifications were made by David Bau to add // blacking behavior and also the TimeToMove and TimeToBlack defaults. // Works like a charm under NS 3.1, but since it uses an unreleased API, // there is no guarantee of anything in future versions. // // Some modifications were made by myself to support BackSpace-inspectors and // user defined images. - Jens Heise. #import "MoveBlackView.h" #import "Thinker.h" #define str_copy(str) ((str == NULL) ? NULL : NXCopyStringBuffer(str)) #define str_free(str) {if (str) free(str);} @implementation MoveBlackView - (float)frandom { return (random()&0x7fffffff)/(float)2147483648.0; } - (float)randBetween:(float)low :(float)high { if (low>high) { register float temp; temp=low; low=high; high=temp; } high-=low; high*=[self frandom]; return low+high; } - moveImage { imageFrame.origin.x=(float)floor((double)[self randBetween:0.0 :bounds.size.width-imageFrame.size.width]); imageFrame.origin.y=(float)floor((double)[self randBetween:0.0 :bounds.size.height-imageFrame.size.height]); return self; } - moveText { register int i, j, k, l; i=0; do { textFrame.origin.x=floor((double)[self randBetween:0.0 :bounds.size.width-textFrame.size.width]); textFrame.origin.y=floor((double)[self randBetween:0.0 :bounds.size.height-textFrame.size.height]); if (!NXIntersectsRect(&textFrame, &imageFrame)) break; } while (++i<50); if (i>49) { register double w; if (imageFrame.size.width/2+imageFrame.origin.x< bounds.size.width/2) { k=imageFrame.origin.x+imageFrame.size.width; w=bounds.size.width; } else { k=0; w=imageFrame.origin.x; } l=w; if (imageFrame.size.height/2+imageFrame.origin.y< bounds.size.height/2) { i=imageFrame.origin.y+imageFrame.size.height; w=bounds.size.height; } else { i=0; w=imageFrame.origin.y; } j=w; if (textFrame.size.width<l-k&&textFrame.size.height<j-i) { textFrame.origin.x=k; textFrame.origin.y=i; } } return self; } - drawSelf:(const NXRect *)rects :(int)rectCount { PSsetgray(NX_BLACK); NXRectFill(rects); if (!blackened) { [image composite:NX_SOVER toPoint:&imageFrame.origin]; [hostname drawInside:&textFrame inView:self]; } return self; } - oneStep { struct timeval tv; struct timezone tz; int oldBlack=blackened; if (blackened) { usleep(500000); return self; } /* if */ /* check if TimeToBlack has elapsed */ if (timeToBlack > 0.0) { gettimeofday(&tv,&tz); if (tv.tv_sec-startTime >= timeToBlack) blackened=YES; } gettimeofday(&tv,&tz); if (!blackened && (tv.tv_sec >= lastMove+timeToMove)) { lastMove = tv.tv_sec; [self moveImage]; [self moveText]; [self display]; } /* if */ if (oldBlack != blackened) [self display]; usleep(5000); return self; } - initFrame:(NXRect *)frameRect { char h[100]; char hn2[512]; struct timeval tv; struct timezone tz; [super initFrame:frameRect]; imageFile = NULL; image = nil; /* pick up image */ [self getImageFile]; /* pick up host name */ if (gethostname(h, 100) == 0) { int i; for (i=0;i<strlen(h);i++) { hn2[i*2]=h[i]; hn2[i*2+1]=' '; } hn2[strlen(h)*2]='\0'; hostname=[[TextFieldCell alloc] initTextCell:hn2]; [hostname setEditable:NO]; [hostname setTextGray:0.333]; [hostname setBackgroundGray:NX_BLACK]; [hostname setFont:[Font newFont:"Times-Italic" size:36.0]]; [hostname calcCellSize:&textFrame.size]; } /* don't blacken at the start */ blackened=NO; /* pick up defaults */ [self getTimeToMove]; if (timeToMove > 1800.0) timeToMove=1800.0; if (timeToMove < 1.0) timeToMove=1.0; [self getTimeToBlack]; if (timeToBlack < 0.0) timeToBlack= -1.0; /* pick up starting time */ gettimeofday(&tv,&tz); lastMove = startTime=tv.tv_sec; return self; } - sizeTo:(NXCoord)width :(NXCoord)height { struct timeval tv; struct timezone tz; [super sizeTo:width :height]; gettimeofday(&tv,&tz); lastMove = startTime = tv.tv_sec; blackened = NO; [self moveImage]; [self moveText]; [self display]; return self; } - setImageFile:sender { char str[MAXPATHLEN+1]; const char *const fileTypes[5]={ "ps ", "eps", "tiff", "tif", NULL }; OpenPanel *openpanel=[[OpenPanel new] allowMultipleFiles:NO]; if (sender != imageFileField) { [openpanel chooseDirectories:NO]; if ([openpanel runModalForTypes:fileTypes]) strcpy(str, [openpanel filename]); else strcpy(str, (imageFile ? imageFile : "")); } /* if */ else strcpy(str, [sender stringValue]); [imageFileField setStringValue:imageFile]; NXWriteDefault("BackSpace", "MoveImageFile", str); [self getImageFile]; return self; } /* setImageFile: */ - (const char*)getImageFile { const char *ptr; ptr = NXGetDefaultValue("BackSpace", "MoveImageFile"); if (image) image = [image free]; if (ptr && (strcmp(ptr, "") != 0)) { str_free(imageFile); imageFile = str_copy(ptr); image=[[NXImage alloc] initFromFile:imageFile]; [image getSize:&imageFrame.size]; if (image && [image lockFocus]) { [image unlockFocus]; [imageFileField setStringValue:imageFile]; return imageFile; } /* if */ else image = [image free]; } if ((imageFile == NULL) || !image) { char path[MAXPATHLEN+1]; sprintf(path,"%s/NextImage.tiff", [(BSThinker()) moduleDirectory:"MoveBlack"]); image=[[NXImage alloc] initFromFile:path]; [image getSize:&imageFrame.size]; [imageFileField setStringValue:path]; return path; } return NULL; } /* ()getImageFile */ - setTimeToMove:sender { char str[100]; timeToMove = [sender floatValue]; [moveTimeSlider setIntValue:timeToMove]; [moveTimeCell setIntValue:timeToMove]; sprintf(str,"%d", (int)timeToMove); NXWriteDefault("BackSpace", "MoveImageTime", str); return self; } /* setTimeToMove: */ - (double)getTimeToMove { const char *ptr; float val; [moveTimeSlider setMinValue: 1]; [moveTimeSlider setMaxValue: 300]; ptr = NXGetDefaultValue("BackSpace", "MoveImageTime"); if (ptr) { sscanf(ptr,"%f",&val); if (val >= 1 && val <= 300) timeToMove = val; else timeToMove = 1; } else timeToMove = 10; return timeToMove; } /* ()getTimeToMove */ - setTimeToBlack:sender { char str[100]; if ([sender floatValue] > 0) { timeToBlack = [sender floatValue]*60; [blackTimeSlider setIntValue:timeToBlack/60]; [blackTimeCell setIntValue:timeToBlack/60]; } /* if */ else { timeToBlack = 0; [blackTimeSlider setIntValue:timeToBlack]; [blackTimeCell setStringValue:"Off"]; } /* if..else */ sprintf(str,"%d", (int)timeToBlack); NXWriteDefault("BackSpace", "MoveBlackTime", str); return self; } /* setTimeToBlack: */ - (double)getTimeToBlack { const char *ptr; float val; [blackTimeSlider setMinValue: 0]; [blackTimeSlider setMaxValue: 60]; ptr = NXGetDefaultValue("BackSpace", "MoveBlackTime"); if (ptr) { sscanf(ptr,"%f",&val); if (val >= 1) timeToBlack = val; else timeToBlack = 0; } else timeToBlack = 0; return timeToBlack; } /* ()getTimeToBlack */ - inspector:sender { char buf[MAXPATHLEN]; if (!inspectorPanel) { [NXBundle getPath:buf forResource:"MoveBlackView" ofType:"nib" inDirectory:[sender moduleDirectory:"MoveBlack"] withVersion:0]; [NXApp loadNibFile:buf owner:self withNames:NO]; [imageFileField setStringValue:imageFile]; [moveTimeSlider setIntValue:timeToMove]; [moveTimeCell setIntValue:timeToMove]; if (timeToBlack > 0) { [blackTimeSlider setIntValue:timeToBlack/60]; [blackTimeCell setIntValue:timeToBlack/60]; } /* if */ else { timeToBlack = 0; [blackTimeSlider setIntValue:timeToBlack]; [blackTimeCell setStringValue:"Off"]; } /* if..else */ } return inspectorPanel; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.