This is TVbackMgr.m in view mode; [Download] [Up]
#import "TVController.h"
#import <appkit/Application.h>
#import <appkit/publicWraps.h>
#import <appkit/Control.h>
#import <appkit/MenuCell.h>
#import <appkit/workspaceRequest.h>
#import <objc/NXBundle.h> /* LocalizedString */
#import <defaults/defaults.h>
#import <stdio.h>
#import <stdlib.h>
#import <string.h>
#import <libc.h>
#import <bsd/libc.h>
#import <mach/mach_init.h>
#import <sys/types.h>
#import <time.h>
#import "ToyWin.h"
#import "ToyWinEPS.h"
#import "ToyView.h"
#import "BackgCtr.h"
#import "common.h"
#import "strfunc.h"
#import "backgops.h"
@implementation TVController (BackgroundManager)
/* Local Method */
- loadBackgBundle
{
char bdir[MAXFILENAMELEN];
id bundle;
int n;
static id classBackg = nil;
if (classBackg)
return self;
n = dircopy(bdir, NXArgv[0], YES);
strcpy(&bdir[n], "BackgCtr.bundle");
bundle = [[NXBundle alloc] initForDirectory: bdir];
if (bundle == nil) /* ERROR */
return nil;
classBackg = [bundle classNamed:"BackgCtr"];
if (classBackg == nil) /* ERROR */
return nil;
backgCtr = [(BackgCtr *)[classBackg alloc] init];
return self;
}
/* Local Method */
- readRCWallpaper
{
char rc[MAXFILENAMELEN], buf[MAXFILENAMELEN], *fnam, *home;
int i, j, n, cc, ln, method;
NXStream *stream;
FILE *fp;
id rtn;
home = getenv("HOME");
sprintf(rc, "%s/Library/ToyViewer/rc.wallpaper", home);
if ((fp = fopen(rc, "r")) == NULL)
return nil;
buf[0] = 0;
for (ln = 0; fgets(buf, MAXFILENAMELEN, fp); ) {
if (buf[0] == '#') continue;
for (i = 0; i < 4 && buf[i]; i++) ;
if (i < 4) break;
ln++;
}
n = 1;
if (ln > 1) {
static int prev = -1;
n = ((int)time(NULL) >> 1) % ln + 1;
if (n == prev)
n = (n % ln) + 1;
prev = n;
}
rewind(fp);
for (i = 0; i < n; ) {
fgets(buf, MAXFILENAMELEN, fp);
if (buf[0] == '#') continue;
i++;
}
fclose(fp);
method = bk_CoverScreen; /* default */
for (i = 0; i < MAXFILENAMELEN - 4; i++) {
if ((cc = buf[i] & 0xff) == ' ' || cc == '\t') {
buf[i] = 0;
while ((cc = buf[++i] & 0xff) == ' ' || cc == '\t') ;
switch (cc) {
case 'c': case 'C': /* Centering */
method = bk_Centering; break;
case 't': case 'T': /* Tiling */
method = bk_Tiling; break;
case 'b': case 'B': /* Brick */
method = bk_BrickWork; break;
case 'f': case 'F': /* Fit */
method = bk_FitScreen; break;
case 'v': case 'V': /* coVer */
method = bk_CoverScreen; break;
}
break;
}
}
if ((j = getExtension(buf)) == 0)
return nil; /* No Extension */
fnam = buf;
if (buf[0] == '~') {
sprintf(rc, "%s%s", home, &buf[1]);
fnam = rc;
}
if (access(fnam, R_OK) != 0) {
errAlert(fnam, Err_OPEN);
return nil;
}
if ((stream = [self openStreamFromFile: fnam : &buf[j]]) == NULL)
return nil;
if (backgCtr == nil)
[self loadBackgBundle];
rtn = [backgCtr setStream: stream with: method];
NXCloseMemory(stream, NX_FREEBUFFER);
if (rtn == nil)
warnAlert(fnam, Err_MEMORY);
return self;
}
- initWallpaper
{
const char *apname = [NXApp appName];
if (NXGetDefaultValue(apname, "NXServiceLaunch") != NULL
|| NXGetDefaultValue(apname, "NXOpen") != NULL)
return self;
[self readRCWallpaper];
return self;
}
- readWallpaperSetting: sender
{
if ([self readRCWallpaper] == nil)
NXBeep();
return self;
}
- cleanBackground: sender
{
if (backgCtr == nil || [backgCtr cleanBackground: sender] == nil)
NXBeep();
return self;
}
- backgMenuEnabled:(BOOL)flag
{
[menuToFront setEnabled: flag];
[menuClear setEnabled: flag];
return self;
}
- makeFront: sender
{
if (backgCtr == nil || [backgCtr makeFront: sender] == nil)
NXBeep();
return self;
}
- backWinFront: (BOOL)flag
{
const char *title;
if (flag)
title = NXLocalizedString("Send to Back", NULL, Background);
else
title = NXLocalizedString("Bring to Front", NULL, Background);
[menuToFront setTitle: title];
return self;
}
- makeBackground: sender
{
NXRect *ir;
id tw, tv, rtn;
commonInfo *cinf;
int method = [sender selectedTag];
if ((tw = [self keyWindow]) == nil) {
NXBeep();
return self;
}
tv = [tw toyView];
if (backgCtr == nil)
[self loadBackgBundle];
cinf = [tv commonInfo];
ir = [tv selectedRect];
rtn = nil;
if (ir->size.width > 0.0 && ir->size.height > 0.0) {
id tmp = [[NXImage alloc] initFromImage:[tv image] rect:ir];
[tmp setScalable:YES];
rtn = [backgCtr setImage: tmp hasAlpha: cinf->alpha with: method];
[tmp free];
}else if ([tw isKindOf: [ToyWinEPS class]]) {
NXStream *stream = [tw openEPSStream];
rtn = [backgCtr setStream: stream with: method];
NXCloseMemory(stream, NX_FREEBUFFER);
}else
rtn = [backgCtr setImage: [tv image] hasAlpha: cinf->alpha with: method];
if (rtn == nil)
warnAlert([tw filename], Err_MEMORY);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.