ferguson@cs.rochester.edu (George Ferguson) (11/15/90)
#! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 3 (of 4)." # Contents: db.c month.c resources.h schedule.c # Wrapped by ferguson@swan.cs.rochester.edu on Mon Nov 12 14:07:07 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'db.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'db.c'\" else echo shar: Extracting \"'db.c'\" \(9500 characters\) sed "s/^X//" >'db.c' <<'END_OF_FILE' X/* X * db.c : Database routines for xkal. X * Handles searching and updating the appointment array. X * X * George Ferguson (ferguson@cs.rochester.edu), 27 Oct 1990. X * X * $Id: db.c,v 1.5 90/11/07 11:22:44 ferguson Exp $ X * X */ X#include <stdio.h> X#include <string.h> X#include <ctype.h> X#include <errno.h> X#include <X11/Intrinsic.h> X#include "util.h" X#include "date-strings.h" Xextern char *getenv(); X Xextern char *program; X X/* X * Functions defined here: X */ Xvoid initDb(), addAppoint(), deleteAppoint(); Xvoid addScheduleDow(), addSchedule(), deleteScheduleDow(), deleteSchedule(); Xchar *lookup(),*lookupAppoint(),*lookupScheduleDow(),*lookupSchedule(); Xvoid readAppoints(), writeAppoints(); Xstatic void parseApp(), parseSched(); Xstatic char *expandFilename(); X X/* - - - - - - - - */ X Xtypedef struct _msgrec { X int pos; X char *text; X struct _msgrec *next; X} Msgrec; Xtypedef struct _dayrec { X int day; X Msgrec *msgs; X struct _dayrec *next; X} Dayrec; Xtypedef struct _monrec { X int mon; X Dayrec *days; X struct _monrec *next; X} Monrec; Xtypedef struct _yearrec { X int year; X Monrec *mons; X struct _yearrec *next; X} Yearrec; X Xstatic Yearrec *Db = NULL; Xstatic char *schedule[7][22]; X X/* - - - - - - - - */ X/* Initialization (pretty lame) */ X Xvoid XinitDb() X{ X int i,j; X X Db = NULL; /* should really free everything... */ X for (i=0; i < 7; i++) X for (j=0; j < 22; j++) X schedule[i][j] = NULL; X} X X/* - - - - - - - - */ X/* Appointment routines */ X Xvoid XaddAppoint(pos,day,mon,year,text) Xint pos,day,mon,year; Xchar *text; X{ X Yearrec *yp; X Monrec *mp; X Dayrec *dp; X Msgrec *xp; X X if (Db == NULL) { X Db = XtNew(Yearrec); X Db->year = year; X Db->mons = NULL; X Db->next = NULL; X } X for (yp = Db; yp->year != year && yp->next != NULL; yp = yp->next) ; X if (yp->year != year) { X yp->next = XtNew(Yearrec); X yp->next->year = year; X yp->next->mons = NULL; X yp->next->next = NULL; X yp = yp->next; X } X if (yp->mons == NULL) { X yp->mons = XtNew(Monrec); X yp->mons->mon = mon; X yp->mons->days = NULL; X yp->mons->next = NULL; X } X for (mp = yp->mons; mp->mon != mon && mp->next != NULL; mp = mp->next) ; X if (mp->mon != mon) { X mp->next = XtNew(Monrec); X mp->next->mon = mon; X mp->next->days = NULL; X mp->next->next=NULL; X mp = mp->next; X } X X if (mp->days == NULL) { X mp->days = XtNew(Dayrec); X mp->days->day = day; X mp->days->msgs = NULL; X mp->days->next = NULL; X } X for (dp = mp->days; dp->day != day && dp->next != NULL; dp = dp->next) ; X if (dp->day != day) { X dp->next = XtNew(Dayrec); X dp->next->day = day; X dp->next->msgs = NULL; X dp->next->next=NULL; X dp = dp->next; X } X X if (dp->msgs == NULL) { X dp->msgs = XtNew(Msgrec); X dp->msgs->pos = pos; X dp->msgs->text = NULL; X dp->msgs->next = NULL; X } X for (xp = dp->msgs; xp->pos != pos && xp->next != NULL; xp = xp->next) ; X if (xp->pos != pos) { X xp->next = XtNew(Msgrec); X xp->next->pos = pos; X xp->next->text = NULL; X xp->next->next = NULL; X xp = xp->next; X } X XtFree(xp->text); X xp->text = XtNewString(text); X} X Xvoid XdeleteAppoint(pos,day,mon,year) Xint pos,day,mon,year; X{ X Yearrec *yp,*yp2; X Monrec *mp,*mp2; X Dayrec *dp,*dp2; X Msgrec *xp,*xp2; X X for (yp = Db; yp != NULL && yp->year != year; yp = yp->next) ; X if (yp == NULL) X return; /* error? */ X X for (mp = yp->mons; mp != NULL && mp->mon != mon; mp = mp->next) ; X if (mp == NULL) X return; /* error? */ X X for (dp = mp->days; dp != NULL && dp->day != day; dp = dp->next) ; X if (dp == NULL) X return; /* error? */ X X for (xp = dp->msgs; xp != NULL && xp->pos != pos; xp = xp->next) ; X if (xp == NULL) X return; /* error? */ X X /* Now free 'em up */ X X XtFree(xp->text); /* free the text */ X X if (dp->msgs == xp) /* and the msgrec */ X dp->msgs = xp->next; X else { X for (xp2 = dp->msgs; xp2->next != xp; xp2 = xp2->next) ; X xp2->next = xp->next; X } X XtFree(xp); X X if (dp->msgs == NULL) { /* if no more entries, free the day */ X if (mp->days == dp) X mp->days = dp->next; X else { X for (dp2 = mp->days; dp2->next != dp; dp2 = dp2->next) ; X dp2->next = dp->next; X } X XtFree(dp); X } X X if (mp->days == NULL) { /* if no more days, free the month */ X if (yp->mons == mp) X yp->mons = mp->next; X else { X for (mp2 = yp->mons; mp2->next != mp; mp2 = mp2->next) ; X mp2->next = mp->next; X } X XtFree(mp); X } X X if (yp->mons == NULL) { /* if no more months, free the year */ X if (Db == yp) X Db = NULL; X else { X for (yp2 = Db; yp2->next != yp; yp2 = yp2->next) ; X yp2->next = yp->next; X } X XtFree(yp); X } X} X X/* - - - - - - - - */ X/* Schedule routines */ X Xvoid XaddScheduleDow(pos,dow,msg) Xint pos,dow; Xchar *msg; X{ X XtFree(schedule[dow][pos]); X schedule[dow][pos] = XtNewString(msg); X} X Xvoid XaddSchedule(pos,day,mon,year,msg) Xint pos,day,mon,year; Xchar *msg; X{ X lookupScheduleDow(pos,computeDOW(day,mon,year),msg); X} X Xvoid XdeleteScheduleDow(pos,dow) Xint pos,dow; X{ X XtFree(schedule[dow][pos]); X schedule[dow][pos] = NULL; X} X Xvoid XdeleteSchedule(pos,day,mon,year) Xint pos,day,mon,year; X{ X lookupScheduleDow(pos,computeDOW(day,mon,year)); X} X X/* - - - - - - - - */ X/* Lookup routines */ X Xchar * Xlookup(pos,day,mon,year) X{ X char *s; X X if ((s=lookupAppoint(pos,day,mon,year)) != NULL) X return(s); X else X return(lookupSchedule(pos,day,mon,year)); X} X Xchar * XlookupAppoint(pos,day,mon,year) Xint pos,day,mon,year; X{ X Yearrec *yp; X Monrec *mp; X Dayrec *dp; X Msgrec *xp; X X for (yp = Db; yp != NULL && yp->year != year; yp = yp->next) ; X if (yp != NULL) { X for (mp = yp->mons; mp != NULL && mp->mon != mon; mp = mp->next) ; X if (mp != NULL) { X for (dp = mp->days; dp != NULL && dp->day != day; dp = dp->next) ; X if (dp != NULL) { X for (xp = dp->msgs; xp != NULL && xp->pos != pos; xp = xp->next) ; X if (xp != NULL) X return(xp->text); X } X } X } X return(NULL); X} X Xchar * XlookupScheduleDow(pos,dow) Xint pos,dow; X{ X return(schedule[dow][pos]); X} X Xchar * XlookupSchedule(pos,day,mon,year) Xint pos,day,mon,year; X{ X return(lookupScheduleDow(pos,computeDOW(day,mon,year))); X} X X X/* - - - - - - - - */ X/* I/O routines */ X Xvoid XreadAppoints(name) Xchar *name; X{ X FILE *fp; X char *fname,buf[256]; X int line,i,n,c; X X fname = expandFilename(name); X if ((fp=fopen(fname,"r")) == NULL) { X if (errno != ENOENT) /* appointment file may not exist */ X perror(fname); X return; X } X line = 0; X while (1) { X n = 0; X line += 1; X while (n < 255 && (c=getc(fp)) != EOF && c != '\n') X buf[n++] = c; X buf[n] = '\0'; X if (n == 0) X break; X else if (c != EOF && c != '\n') { X fprintf(stderr,"%s: line %d too long, file %s\n",program, X line,fname); X while ((c=getc(fp)) != EOF && c != '\n') ; X } X for (i=0; isspace(buf[i]) && i < n; i++) ; X if (buf[i] == '#') X continue; X else if (isdigit(buf[i])) X parseApp(buf,line,fname); X else X parseSched(buf,line,fname); X } X fclose(fp); X} X Xstatic void XparseApp(buf,line,fname) Xchar *buf; Xint line; Xchar *fname; X{ X int d,m,y,h,h2,pos; X char mstr[4],msg[256]; X X if (sscanf(buf,"%d %3s %d %d:%d %256[^\n]",&d,mstr,&y,&h,&h2,msg) != 6) { X fprintf(stderr,"%s: file \"%s\", line %d: invalid appointment: %s\n", X program,fname,line,buf); X return; X } X if (islower(mstr[0])) X mstr[0] = toupper(mstr[0]); X for (m=0; m < 12; m++) X if (strncmp(shortMonStr[m],mstr,3) == 0) X break; X if (m == 12) { X fprintf(stderr,"%s: file \"%s\", line %d: invalid month: %s\n", X program,fname,line,mstr); X return; X } X if (h2 < 30) X pos = (h-8)*2; X else X pos = (h-8)*2+1; X addAppoint(pos,d,m,y-1900,msg); X} X Xstatic void XparseSched(buf,line,fname) Xchar *buf; Xint line; Xchar *fname; X{ X int d,h,h2,pos; X char dowstr[4],msg[256]; X X if (sscanf(buf,"%3s %d:%d %256[^\n]",dowstr,&h,&h2,msg) != 4) { X fprintf(stderr,"%s: file \"%s\", line %d: invalid schedule entry: %s\n", X program,fname,line,buf); X return; X } X if (islower(dowstr[0])) X dowstr[0] = toupper(dowstr[0]); X for (d=0; d<7; d++) X if (strcmp(dowstr,shortDayStr[d]) == 0) X break; X if (d == 7) { X fprintf(stderr,"%s: file \"%s\", line %d: invalid day-of-week: %s\n", X program,fname,line,dowstr); X return; X } X if (h2 < 30) X pos = (h-8)*2; X else X pos = (h-8)*2+1; X addScheduleDow(pos,d,msg); X} X Xvoid XwriteAppoints(name) Xchar *name; X{ X FILE *fp; X char *fname; X Yearrec *yp; X Monrec *mp; X Dayrec *dp; X Msgrec *xp; X int h,h2,i,d; X X fname = expandFilename(name); X if ((fp=fopen(fname,"w")) == NULL) { X perror(fname); X return; X } X for (d=0; d < 7; d++) X for (i=0; i < 22; i++) X if (schedule[d][i] != NULL) X fprintf(fp,"%3s %2d:%02d %s\n",shortDayStr[d],i/2+8,i%2*30, X schedule[d][i]); X for (yp = Db; yp != NULL; yp = yp->next) X for (mp = yp->mons; mp != NULL; mp = mp->next) X for (dp = mp->days; dp != NULL; dp = dp->next) X for (xp = dp->msgs; xp != NULL; xp = xp->next) { X h = 8+(xp->pos / 2); X h2 = (xp->pos % 2)*30; X fprintf(fp,"%2d %3.3s %4d %2d:%02d %s\n", X dp->day,shortMonStr[mp->mon], X 1900+yp->year, X h,h2,xp->text); X } X fclose(fp); X} X Xstatic char filename[1024]; X Xstatic char * XexpandFilename(name) Xchar *name; X{ X char *s; X X if (*name == '~') { X if ((s=getenv("HOME")) == NULL) { X printf("%s: can't expand ~ to $HOME\n",program); X return; X } else { X strcpy(filename,s); X strcat(filename,name+1); X } X } else { X strcpy(filename,name); X } X return(filename); X} END_OF_FILE if test 9500 -ne `wc -c <'db.c'`; then echo shar: \"'db.c'\" unpacked with wrong size! fi # end of 'db.c' fi if test -f 'month.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'month.c'\" else echo shar: Extracting \"'month.c'\" \(5647 characters\) sed "s/^X//" >'month.c' <<'END_OF_FILE' X/* X * month.c : Widget creation and action binding for the month X * forms, and it's sub-widgets. X * X * George Ferguson (ferguson@cs.rochester.edu), 27 Oct 1990. X * X * $Id: month.c,v 1.1 90/11/07 11:22:57 ferguson Exp $ X */ X#include <X11/Intrinsic.h> X#include <X11/Shell.h> X#include <X11/StringDefs.h> X#include <X11/Xaw/Form.h> X#include <X11/Xaw/Command.h> X#include <X11/Xaw/Toggle.h> X#include <X11/Xaw/Label.h> X#include <X11/Xaw/AsciiText.h> X#include <X11/Xaw/Cardinals.h> X#include "app-resources.h" X#include "widgets.h" X#include "month.h" X#include "day.h" X#include "db.h" X#include "date-strings.h" X Xextern int numMonths; X X/* X * Functions defined in this file X */ XMonthFormData *createMonthFormData(); Xvoid setMonthFormData(); Xvoid selectDay(); Xvoid shadeButton(); X Xstatic void dayButtonCallbackProc(); Xstatic void getGCAndXY(); X X/* X * Data defined in this file X */ Xstatic int dayAppointsChanged; Xstatic Widget radioGroup; X X/* - - - - - - - - */ X/* returns an unmanaged form */ X XMonthFormData * XcreateMonthFormData(parent,name,num) XWidget parent; Xchar *name; Xint num; /* 1,3,12 */ X{ X MonthFormData *m; X DayButtonData *d; X Widget widget; X Arg args[3]; X char text[16]; X int row,col; X int w,h; X X m = XtNew(MonthFormData); X m->form = XtCreateWidget(name,formWidgetClass,parent,NULL,ZERO); X switch (num) { X case 1: w = appResources.dateWidth1; X h = appResources.dateHeight1; X break; X case 3: w = appResources.dateWidth3; X h = appResources.dateHeight3; X break; X case 12: w = appResources.dateWidth12; X h = appResources.dateHeight12; X break; X } X sprintf(text,"monthLabel%d",num); X m->label = XtCreateManagedWidget(text,labelWidgetClass,m->form,NULL,ZERO); X if (appResources.dowLabels) { X sprintf(text,"dowLabel%d",num); X XtSetArg(args[0],XtNfromVert,m->label); X XtSetArg(args[1],XtNfromHoriz,NULL); X for (col=0; col < 7; col++) { X XtSetArg(args[2],XtNlabel,shortDayStr[col]); X widget = XtCreateManagedWidget(text,labelWidgetClass,m->form, X args,THREE); X XtSetArg(args[1],XtNfromHoriz,widget); X } X XtSetArg(args[0],XtNfromVert,widget); X } else { X XtSetArg(args[0],XtNfromVert,m->label); X } X sprintf(text,"dayButton%d",num); X for (row=0; row < 6; row++) { X XtSetArg(args[1],XtNfromHoriz,NULL); X for (col=0; col < 7; col++) { X d = m->days[row*7+col] = XtNew(DayButtonData); X d->button = XtCreateManagedWidget(text,toggleWidgetClass, X m->form,args,TWO); X XtAddCallback(d->button,"callback",dayButtonCallbackProc,d); X XtSetArg(args[2],XtNradioData,d->button); X XtSetValues(d->button,args+2,ONE); X if (radioGroup == NULL) X radioGroup = d->button; X XawToggleChangeRadioGroup(d->button,radioGroup); X d->pixmap = XCreatePixmap(display,root,w,h, X DefaultDepthOfScreen(screen)); X X XtSetArg(args[1],XtNfromHoriz,d->button); X } X XtSetArg(args[0],XtNfromVert,d->button); X } X return(m); X} X Xvoid XsetMonthFormData(m,num,month,year) XMonthFormData *m; Xint num,month,year; X{ X DayButtonData *d; X Arg args[1]; X GC gc; X char text[16]; X int first,numDays; X int i,x,y,n; X X first = firstDOW(month,year); X numDays = lastDay(month,year); X getGCAndXY(num,&gc,&x,&y); X XawFormDoLayout(m->form,False); X XawToggleUnsetCurrent(radioGroup); X sprintf(text,"%s %d",longMonStr[month],year+1900); X XtSetArg(args[0],XtNlabel,text); X XtSetValues(m->label,args,ONE); X for (i=0; i < 42; i++) { X d = m->days[i]; X if (i < first || i >= first+numDays) { X d->day = 0; X XFillRectangle(display,d->pixmap,emptyGC,0,0,50,50); X XtSetArg(args[0],XtNbitmap,d->pixmap); X XtSetValues(d->button,args,ONE); X } else { X d->day = i-first+1; X d->month = month; X d->year = year; X shadeButton(d,gc,x,y); X } X } X XawFormDoLayout(m->form,True); X m->month = month; X m->year = year; X} X X/* This function is here so it can be outside the loop in setMonthFormData(), X but really belongs in shadeButton. */ Xstatic void XgetGCAndXY(num,gcp,xp,yp) XGC *gcp; Xint *xp,*yp; X{ X int w,h; X X switch (num) { X case 1: XParseGeometry(appResources.datePosition1,xp,yp,&w,&h); X *gcp = dateGC1; X break; X case 3: XParseGeometry(appResources.datePosition3,xp,yp,&w,&h); X *gcp = dateGC3; X break; X case 12: XParseGeometry(appResources.datePosition12,xp,yp,&w,&h); X *gcp = dateGC12; X break; X } X} X X/* Global so can be called after appointments have changed */ Xvoid XshadeButton(d,gc,x,y) XDayButtonData *d; XGC gc; Xint x,y; X{ X Arg args[1]; X char text[4]; X int n; X X if (gc == (GC)NULL) X getGCAndXY(numMonths,&gc,&x,&y); X n = countAppoints(d->day,d->month,d->year); X XFillRectangle(display,d->pixmap,shadeGC[n],0,0,50,50); X sprintf(text,"%d",d->day); X if (appResources.opaqueDates) X XDrawImageString(display,d->pixmap,gc,x,y,text,strlen(text)); X else X XDrawString(display,d->pixmap,gc,x,y,text,strlen(text)); X XtSetArg(args[0],XtNbitmap,d->pixmap); X XtSetValues(d->button,args,ONE); X} X Xvoid XselectDay(m,day,mon,year) XMonthFormData *m; Xint day,mon,year; X{ X int first,i; X X first = firstDOW(mon,year); X for (i=0; i < 42; i++) X if (i == first+day-1) { X XawToggleSetCurrent(radioGroup,m->days[i]->button); X break; X } X} X Xstatic void XdayButtonCallbackProc(w,client_data,call_data) XWidget w; Xcaddr_t client_data,call_data; X{ X DayButtonData *d = (DayButtonData *)client_data; X X if (d->day == 0) X return; X if (currentDayFormData == NULL) X currentDayFormData = createPopupDayFormData(); X else X checkpointAppoints(currentDayFormData); X currentDayFormData->buttonData = d; X setDayFormData(currentDayFormData,d->day,d->month,d->year); X} END_OF_FILE if test 5647 -ne `wc -c <'month.c'`; then echo shar: \"'month.c'\" unpacked with wrong size! fi # end of 'month.c' fi if test -f 'resources.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'resources.h'\" else echo shar: Extracting \"'resources.h'\" \(9114 characters\) sed "s/^X//" >'resources.h' <<'END_OF_FILE' X/* X * resources.h: All the resource definitions for xkal. X * X * These are only used in xkal.c, other users should simply X * include app-resources.h for access to the resources after X * they've been loaded. X * X */ X X/* X * Non-widget resources obtained from the resource manager X */ Xstatic XtResource resources[] = { X { "appoints", "String", XtRString, sizeof(String), X XtOffset(AppResources *,appoints), XtRImmediate, "~/.appoints" }, X { "date", "String", XtRString, sizeof(String), X XtOffset(AppResources *,date), XtRImmediate, "" }, X { "numMonths", "Int", XtRInt, sizeof(int), X XtOffset(AppResources *,numMonths), XtRImmediate, (XtPointer)1 }, X { "bothShown", "Boolean", XtRBoolean, sizeof(Boolean), X XtOffset(AppResources *,bothShown), XtRImmediate, (XtPointer)True }, X { "listOnly", "Boolean", XtRBoolean, sizeof(Boolean), X XtOffset(AppResources *,listOnly), XtRImmediate, (XtPointer)False }, X { "silent", "Boolean", XtRBoolean, sizeof(Boolean), X XtOffset(AppResources *,silent), XtRImmediate, (XtPointer)False }, X { "opaqueDates", "Boolean", XtRBoolean, sizeof(Boolean), X XtOffset(AppResources *,opaqueDates), XtRImmediate, (XtPointer)False }, X { "dowLabels", "Boolean", XtRBoolean, sizeof(Boolean), X XtOffset(AppResources *,dowLabels), XtRImmediate, (XtPointer)False }, X X { "dateFont1", "Font", XtRFont, sizeof(Font), X XtOffset(AppResources *,dateFont1), XtRString, "*fixed*bold*" }, X { "dateFont3", "Font", XtRFont, sizeof(Font), X XtOffset(AppResources *,dateFont3), XtRString, "*fixed*bold*" }, X { "dateFont12", "Font", XtRFont, sizeof(Font), X XtOffset(AppResources *,dateFont12), XtRString, "*fixed*bold*" }, X X { "datePosition1", "String", XtRString, sizeof(String), X XtOffset(AppResources *,datePosition1), XtRImmediate, "+10+10" }, X { "datePosition3", "String", XtRString, sizeof(String), X XtOffset(AppResources *,datePosition3), XtRImmediate, "+10+10" }, X { "datePosition12", "String", XtRString, sizeof(String), X XtOffset(AppResources *,datePosition12), XtRImmediate, "+10+10" }, X X { "dateWidth1", "Int", XtRInt, sizeof(int), X XtOffset(AppResources *,dateWidth1), XtRImmediate, (XtPointer)50 }, X { "dateWidth3", "Int", XtRInt, sizeof(int), X XtOffset(AppResources *,dateWidth3), XtRImmediate, (XtPointer)18 }, X { "dateWidth12", "Int", XtRInt, sizeof(int), X XtOffset(AppResources *,dateWidth12), XtRImmediate, (XtPointer)10 }, X X { "dateHeight1", "Int", XtRInt, sizeof(int), X XtOffset(AppResources *,dateHeight1), XtRImmediate, (XtPointer)50 }, X { "dateHeight3", "Int", XtRInt, sizeof(int), X XtOffset(AppResources *,dateHeight3), XtRImmediate, (XtPointer)18 }, X { "dateHeight12", "Int", XtRInt, sizeof(int), X XtOffset(AppResources *,dateHeight12), XtRImmediate, (XtPointer)10 }, X X { "noDayShade", "String", XtRString, sizeof(String), X XtOffset(AppResources *,noDayShade), XtRImmediate, "wide_weave" }, X X { "shade1", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[1]), XtRImmediate, "gray3" }, X { "shade2", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[2]), XtRImmediate, "gray3" }, X { "shade3", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[3]), XtRImmediate, "light_gray" }, X { "shade4", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[4]), XtRImmediate, "light_gray" }, X { "shade5", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[5]), XtRImmediate, "gray" }, X { "shade6", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[6]), XtRImmediate, "gray" }, X { "shade7", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[7]), XtRImmediate, "flipped_gray" }, X { "shade8", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[8]), XtRImmediate, "flipped_gray" }, X { "shade9", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[9]), XtRImmediate, "flipped_gray" }, X { "shade10", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[10]), XtRImmediate, "flipped_gray" }, X { "shade11", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[11]), XtRImmediate, "flipped_gray" }, X { "shade12", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[12]), XtRImmediate, "flipped_gray" }, X { "shade13", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[13]), XtRImmediate, "flipped_gray" }, X { "shade14", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[14]), XtRImmediate, "flipped_gray" }, X { "shade15", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[15]), XtRImmediate, "flipped_gray" }, X { "shade16", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[16]), XtRImmediate, "flipped_gray" }, X { "shade17", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[17]), XtRImmediate, "flipped_gray" }, X { "shade18", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[18]), XtRImmediate, "flipped_gray" }, X { "shade19", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[19]), XtRImmediate, "flipped_gray" }, X { "shade20", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[20]), XtRImmediate, "flipped_gray" }, X { "shade21", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[21]), XtRImmediate, "flipped_gray" }, X { "shade22", "String", XtRString, sizeof(String), X XtOffset(AppResources *,shade[22]), XtRImmediate, "flipped_gray" }, X X { "color1", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[1]), XtRString, "Green" }, X { "color2", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[2]), XtRString, "Green" }, X { "color3", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[3]), XtRString, "Blue" }, X { "color4", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[4]), XtRString, "Blue" }, X { "color5", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[5]), XtRString, "Yellow" }, X { "color6", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[6]), XtRString, "Yellow" }, X { "color7", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[7]), XtRString, "Red" }, X { "color8", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[8]), XtRString, "Red" }, X { "color9", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[9]), XtRString, "Red" }, X { "color10", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[10]), XtRString, "Red" }, X { "color11", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[11]), XtRString, "Red" }, X { "color12", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[12]), XtRString, "Red" }, X { "color13", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[13]), XtRString, "Red" }, X { "color14", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[14]), XtRString, "Red" }, X { "color15", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[15]), XtRString, "Red" }, X { "color16", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[16]), XtRString, "Red" }, X { "color17", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[17]), XtRString, "Red" }, X { "color18", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[18]), XtRString, "Red" }, X { "color19", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[19]), XtRString, "Red" }, X { "color20", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[20]), XtRString, "Red" }, X { "color21", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[21]), XtRString, "Red" }, X { "color22", "Pixel", XtRPixel, sizeof(Pixel), X XtOffset(AppResources *,color[22]), XtRString, "Red" }, X X { "revision", "Revision", XtRString, sizeof(String), X XtOffset(AppResources *,revision), XtRImmediate, "" }, X}; X X/* X * Non-widget resources settable on command line. X */ Xstatic XrmOptionDescRec options[] = { X { "-appoints", ".appoints", XrmoptionSepArg, "~/.appoints" }, X { "-date", ".date", XrmoptionSepArg, "" }, X { "-numMonths", ".numMonths", XrmoptionSepArg, "1" }, X { "-bothShown", ".bothShown", XrmoptionNoArg, "True" }, X { "-nobothShown", ".bothShown", XrmoptionNoArg, "False" }, X { "-listOnly", ".listOnly", XrmoptionNoArg, "True" }, X { "-silent", ".silent", XrmoptionNoArg, "True" }, X { "-opaqueDates", ".opaqueDates", XrmoptionNoArg, "True" }, X { "-noopaqueDates", ".opaqueDates", XrmoptionNoArg, "False" }, X { "-dowLabels", ".dowLabels", XrmoptionNoArg, "True" }, X { "-nodowLabels", ".dowLabels", XrmoptionNoArg, "False" }, X}; END_OF_FILE if test 9114 -ne `wc -c <'resources.h'`; then echo shar: \"'resources.h'\" unpacked with wrong size! fi # end of 'resources.h' fi if test -f 'schedule.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'schedule.c'\" else echo shar: Extracting \"'schedule.c'\" \(2630 characters\) sed "s/^X//" >'schedule.c' <<'END_OF_FILE' X/* X * schedule.c : The schedule editor window X * X * $Id: schedule.c,v 1.1 90/11/07 11:23:13 ferguson Exp $ X */ X#include <X11/Intrinsic.h> X#include <X11/Shell.h> X#include <X11/StringDefs.h> X#include <X11/Xaw/Form.h> X#include <X11/Xaw/Command.h> X#include <X11/Xaw/Cardinals.h> X#include "widgets.h" X#include "month.h" X#include "day.h" X#include "db.h" X#include "date-strings.h" X Xextern int appointsChanged; X X/* X * Functions defined in this file X */ Xvoid createPopupSchedule(); Xstatic void dismissSchedProc(), applySchedProc(); X X/* X * Data defined in this file X */ Xstatic Widget schedulePopupShell; Xstatic DayFormData *scheduleDayFormDatas[7]; Xstatic void dismissSchedProc(),applySchedProc(); X X/* - - - - - - - - */ X Xvoid XcreatePopupSchedule() X{ X Widget form,dismiss,apply,w; X Arg args[1]; X int dow,i; X char *s; X X schedulePopupShell = XtCreatePopupShell("schedulePopupShell", X topLevelShellWidgetClass,toplevel,NULL,ZERO); X form = XtCreateManagedWidget("popupForm",formWidgetClass,schedulePopupShell, X NULL,ZERO); X dismiss = XtCreateManagedWidget("dismissSchedButton",commandWidgetClass, X form,NULL,ZERO); X apply = XtCreateManagedWidget("applySchedButton",commandWidgetClass,form, X NULL,ZERO); X XtAddCallback(dismiss,"callback",dismissSchedProc,NULL); X XtAddCallback(apply,"callback",applySchedProc,NULL); X w = NULL; X for (dow=0; dow < 7; dow++) { X scheduleDayFormDatas[dow] = createDayFormData(form); X XtSetArg(args[0],XtNfromHoriz,w); X XtSetValues(scheduleDayFormDatas[dow]->form,args,ONE); X XtSetArg(args[0],XtNlabel,longDayStr[dow]); X XtSetValues(scheduleDayFormDatas[dow]->date,args,ONE); X w = scheduleDayFormDatas[dow]->form; X for (i=0; i < 22; i++) X if ((s=lookupScheduleDow(i,dow)) != NULL) { X XtSetArg(args[0],XtNstring,s); X XtSetValues(scheduleDayFormDatas[dow]->items[i]->text,args,ONE); X } X } X XtPopup(schedulePopupShell,XtGrabNone); X} X Xstatic void XdismissSchedProc(w,client_data,call_data) XWidget w; Xcaddr_t client_data,call_data; X{ X XtPopdown(schedulePopupShell); X XtDestroyWidget(schedulePopupShell); X} X Xstatic void XapplySchedProc(w,client_data,call_data) XWidget w; Xcaddr_t client_data,call_data; X{ X Arg args[1]; X char *new,*old; X int dow,i; X X XtSetArg(args[0],XtNstring,&new); X for (dow=0; dow < 7; dow++) X for (i=0; i < 22; i++) { X XtGetValues(scheduleDayFormDatas[dow]->items[i]->text,args,ONE); X old = lookupScheduleDow(i,dow); X if (new != old) { X if (*new == '\0') X deleteScheduleDow(i,dow,new); X else X addScheduleDow(i,dow,new); X appointsChanged = True; X } X } X /* refresh display */ X} END_OF_FILE if test 2630 -ne `wc -c <'schedule.c'`; then echo shar: \"'schedule.c'\" unpacked with wrong size! fi # end of 'schedule.c' fi echo shar: End of archive 3 \(of 4\). cp /dev/null ark3isdone MISSING="" for I in 1 2 3 4 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 4 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- George Ferguson ARPA: ferguson@cs.rochester.edu University of Rochester UUCP: {decvax,rutgers}!rochester!ferguson Rochester NY 14627 VOX: (716) 275-2527