This is Qwatch.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "Qwatch.h" @implementation Qwatch - setTheStatusField:anObject { TheStatusField = anObject; return self; } - setThePasswordField:anObject { ThePasswordField = anObject; return self; } - setTheScrollView:anObject { TheScrollView = anObject; return self; } - setPassword:sender { return self; } - deleteJob:sender { int i; char str[64]; if (selentry < 0) { NXBeep(); return self; } for (i = 0; i < qtop && queue[i] != selentry; i++); if (i >= qtop) { NXBeep(); return self; } if ((int)jobowner[i] || (!strcmp(username,"root")) || (!strcmp(username,"cs124")) || (!strcmp(username,"cs126")) ) { sprintf(str,"lprm -P%s %d",PRINTER,selentry); system(str); return(self); } return self; } - appDidInit:sender { void updateFunction(); NXRect textRect; delay = 5.0; qtop = 0; selentry = -1; strcpy(username,(getpwuid(getuid()))->pw_name); textRect.origin.x = textRect.origin.y = 0.0; [TheScrollView getContentSize: &(textRect.size)]; TheText = [BrowseText newFrame:&textRect text:NULL alignment:NX_LEFTALIGNED]; [TheText setQwatch:self]; [TheText notifyAncestorWhenFrameChanged:YES]; [TheText setHorizResizable:NO]; [TheText setVertResizable:YES]; textRect.size.width = 0.0; [TheText setMinSize:&(textRect.size)]; [TheScrollView getContentSize: &(textRect.size)]; textRect.size.height = 1000000; [TheText setMaxSize:&(textRect.size)]; [[TheText superview] setAutoresizeSubviews:YES]; [[TheText superview] setAutosizing: NX_HEIGHTSIZABLE | NX_WIDTHSIZABLE]; [TheText setCharFilter: NXFieldFilter]; [TheText setMonoFont: FALSE]; OwnerFont = [Font newFont:"Courier-Bold" size:12]; OtherFont = [Font newFont:"Courier" size:12]; [TheText setFont: OtherFont]; lineheight = [TheText lineHeight]; [TheScrollView setDocView: TheText]; [self updateOutput]; tentry = DPSAddTimedEntry(delay,&updateFunction,self,NX_BASETHRESHOLD); return self; } - (char *)stringValue { return status; } void updateFunction(DPSTimedEntry te, double timeNow, void *data) { id self; self = data; [self updateOutput]; } - updateOutput { char str[128], oline[128], ofile[64], Pfiles[40], Powner[16]; FILE *fp, *fopen(); int n, Pjob, Psize, locn, seln; sprintf(ofile,"%s.%d",QFILE,getpid()); sprintf(str,"lpq -P%s > %s",PRINTER,ofile); system(str); fp = fopen(ofile,"r"); fgets(str,128,fp); str[strlen(str) - 1] = '\0'; sprintf(status,"%s %s",PRINTER,str); [TheStatusField takeStringValueFrom:self]; while (NULL != fgets(str,128,fp) && strncmp(str,"Rank",4)) ; seln = -1; n = 0; locn = 0; while (n < QSIZE && NULL != fgets(str,256,fp)) { sscanf(str+7,"%s",Powner); /* owner name at str[7] */ sscanf(str+18,"%d",&Pjob); /* job number at str[18] */ strncpy(Pfiles,str+23,38); /* files at str[23], length 38 */ Pfiles[38] = '\0'; sscanf(str+61,"%d",&Psize); /* job size at str[61] */ sprintf(oline,"%3d %8s %7d %38s\n",Pjob,Powner,Psize,Pfiles); /* PSIZE BYTES */ if (n >= qtop || Pjob != queue[n]) { if (n >=qtop) { [TheText setSel :locn :locn]; [TheText replaceSel :" "]; [TheText setSel :locn :(locn + 1)]; } else [TheText setSel :locn :(locn + PSIZE)]; if (!strcmp(username,Powner)) { [TheText setSelFont :OwnerFont]; jobowner[n] = (char)1; } else { [TheText setSelFont :OtherFont]; jobowner[n] = (char)0; } [TheText replaceSel :oline]; } queue[n] = Pjob; if (Pjob == selentry) seln = n; n++; locn += PSIZE; } [TheText setSel:locn :[TheText textLength]]; [TheText replaceSel :""]; qtop = n; fclose(fp); if (seln >= 0) { locn = seln * PSIZE; [TheText setSel :locn :(locn + PSIZE)]; } return self; } - mouseSelected:(NXPoint *)pt { int line, locn; double y; y = pt->y / (double)lineheight; line = y; if (line < qtop) { selentry = queue[line]; locn = line * PSIZE; [TheText setSel :locn :(locn + PSIZE)]; } else selentry = -1; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.