pc@hillside.co.uk (Peter Collinson) (05/07/91)
Submitted-by: Peter Collinson <pc@hillside.co.uk> Posting-number: Volume 12, Issue 81 Archive-name: xcal/patch1 Patch-To: xcal: Volume 10, Issue 99-101 -------- Xcal is a calendar program. It generally sits on your screen displaying today's date - the format of this can be tailored to your taste. The diffs below should only by applied to xcal 3.2 posted to the net as comp.sources.x, Volume 10 Issue 99-101. If you are unsure of the version, check the file version.c - this should contain the full truth. Oh yes, what are the changes? These are documented in the CHANGES file (see below) - now more detailed because of someone's complaints. I did this all in January and had hoped to add a number of more things to xcal and have a formidable mail folder full of fixes, suggestions and ideas. I do want to do something when the date strip gets too big for the screen, this is probably the biggest complaint. I will eventually get around to dealing with fixes and new ideas. This patch set is being produced mostly because a number of people have asked for a way of dealing with regular events. Xcal purists will find that the basic date box now contains todays day as a string. The box grows alarmingly. You can mimic previous behaviour by using resources. Personally, I like it. Thanks to the many people who have mailed to say thanks and added ideas to xcal. Sorry to the people who I refused to listen to or whose ideas I haven't used. Patch-To: xcal: Volume 10, Issue 99-101 ------------------------- patch from here -------------- Prereq: 0 *** patchlevel.h~ Fri Mar 22 23:34:53 1991 --- patchlevel.h Fri Mar 22 23:48:23 1991 *************** *** 1 **** ! #define PATCHLEVEL 0 --- 1 ---- ! #define PATCHLEVEL 1 *** CHANGES~ Fri Mar 22 23:34:58 1991 --- CHANGES Fri Mar 22 23:48:26 1991 *************** *** 1,6 **** ! Changes: CHANGES 2.2 12/5/90 ! Xcal - Version 3.1 Issued to comp.sources.x Adds the memo functionality and the Stick/Unpin feature for alarms. --- 1,69 ---- ! Changes: CHANGES 2.12 91/03/22 ! --------------------------- 3.3 ! ! Implement the ability to deal with regular weekly events. ! This is part of the memo system. Today's current events are ! shown as part of the memo panel. They can be edited by hitting ! a button and bringing up a special strip with an entry for ! each day. These regular event files are integrated into ! the alarm system. ! ! Allow today's name: Monday, Tuesday etc to appear in the top ! level widget, the header of an edit window and the title of ! the memo box. This is controlled by the Order and Format ! resources and so previous behaviour can be maintained. Beware ! that this redefines the names of the days so ! Sunday maps to Sunday ! and a new short name is used for the abbreviated form ! Sun maps to Sun ! used in date strips. ! ! Ensure that middle and right button translations work in the ! memo button in the top level widget (suggested by Casey ! Leedom). ! ! New Imakefile from Casey Leedom. This has support for pscal. ! New pscal/Imakefile. ! ! Add initialMemo resource so the memo box can popup at startup ! time - (suggested by G. W. Pigman III) ! ! Steven Plite pointed out that the year display is ! inconsistent. To allow choice, add three new resources: ! dateYearIsTwoDigits ! memoYearIsTwoDigits ! editYearIsTwoDigits ! You can now choose how you would like to have your year ! displayed in the various places. ! Defaults to showing four digits. ! ! System V release 4 fixes from Dave McCraken. ! Alters: xcal_alarm.c, xcal_cal.c, *.bm xcal.c ! ! The memo box quit button causes a Save File ! dialogue box to be popped if the memo data has been ! altered and not saved. The behaviour of this was wrong ! when there was no memo data. Reported by Greg Bond. ! Fixed by changing tests in xcal_memo.c. ! ! Proper length of a directory entry under SYSV is ! strlen(dp->d_name) not strlen(dp->d_name)+1. ! Changed xcal_edit.c (Dave McCraken) ! ! Eliminated double definition of GetMemoFile() and incorrect ! definition of MemoHelp() in xcal_memo.c (David C Lawrence) ! ! --------------------------- 3.2 ! ! Xcal - Version 3.2 Issued to comp.sources.x ! ! Fixes some stupid bugs ! Ensures that update code works properly ! ! ---------------------------- 3.1 ! ! Xcal - Version 3.1 Issued to comp.sources.x (un-intentionally) Adds the memo functionality and the Stick/Unpin feature for alarms. *** README~ Fri Mar 22 23:34:53 1991 --- README Fri Mar 22 23:48:23 1991 *************** *** 26,37 **** program. So you can generate pretty printed calendars whenever you like - assuming that you have a PostScript printer. ! This is release 3.2. The history is: Release 1.1 posted to comp.sources.x + two patches Release 2.1 circulated privately ! Release 3.1 circulated privately Caveats --- 26,38 ---- program. So you can generate pretty printed calendars whenever you like - assuming that you have a PostScript printer. ! This is release 3.3 The history is: Release 1.1 posted to comp.sources.x + two patches Release 2.1 circulated privately ! Release 3.1 posted unintentionally to comp.sources.x ! Release 3.2 posted to comp.sources.x Caveats *************** *** 48,54 **** Fax: +44 227 762554 Email: pc@hillside.co.uk ! 18/December/1990 Fixes/enhancements welcomed.... --- 49,55 ---- Fax: +44 227 762554 Email: pc@hillside.co.uk ! 22/March/1990 Fixes/enhancements welcomed.... *** Imakefile~ Fri Mar 22 23:34:48 1991 --- Imakefile Fri Mar 22 23:48:20 1991 *************** *** 1,22 **** ! LOCAL_LIBRARIES = XawClientLibs ! INCS = xcal.h ! SRCS = xcal.c xcal_alarm.c xcal_edit.c xcal_help.c xcal_popup.c xcal_strip.c xcal_memo.c version.c ! OBJS = xcal.o xcal_alarm.o xcal_edit.o xcal_help.o xcal_popup.o xcal_strip.o xcal_memo.o version.o OSMAJORVERSION = OSMajorVersion OSMINORVERSION = OSMinorVersion ! DEFINES = -DOSMAJORVERSION=$(OSMAJORVERSION) -DOSMINORVERSION=$(OSMINORVERSION) -DVER_VEC ! AllTarget(xcal) ! NormalProgramTarget(xcal,$(OBJS),$(DEPLIBS),$(LOCAL_LIBRARIES), /**/) ! AllTarget(xcal_cal) ! NormalProgramTarget(xcal_cal, xcal_cal.o,/**/,/**/,/**/); ! InstallProgram(xcal, $(BINDIR)) ! InstallManPage(xcal, $(MANDIR)) ! InstallProgram(xcal_cal, $(BINDIR)) ! InstallManPage(xcal_cal, $(MANDIR)) InstallAppDefaults(XCal) ! DependTarget() --- 1,35 ---- ! /* ! * Define InstallPsCal if you want to have pscal compiled and installed as ! * part of the xcal compilation and installation. ! */ ! /* #define InstallPsCal */ ! OSMAJORVERSION = OSMajorVersion OSMINORVERSION = OSMinorVersion ! DEFINES = -DOSMAJORVERSION=$(OSMAJORVERSION) \ ! -DOSMINORVERSION=$(OSMINORVERSION) \ ! -DVER_VEC + SRCS1 = xcal.c xcal_alarm.c xcal_edit.c xcal_help.c xcal_popup.c \ + xcal_strip.c xcal_memo.c version.c + OBJS1 = xcal.o xcal_alarm.o xcal_edit.o xcal_help.o xcal_popup.o \ + xcal_strip.o xcal_memo.o version.o ! SRCS2 = xcal_cal.c ! OBJS2 = xcal_cal.o ! PROGRAMS = xcal xcal_cal ! ComplexProgramTarget_1(xcal, XawClientLibs, /**/) ! ComplexProgramTarget_2(xcal_cal, /**/, /**/) InstallAppDefaults(XCal) ! #ifdef InstallPsCal ! #define IHaveSubdirs ! #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' ! ! SUBDIRS = pscal ! ! MakeSubdirs($(SUBDIRS)) ! DependSubdirs($(SUBDIRS)) ! #endif *** Makefile~ Fri Mar 22 23:34:55 1991 --- Makefile Fri Mar 22 23:48:24 1991 *************** *** 225,273 **** ########################################################################### # start of Imakefile - LOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) - INCS = xcal.h - SRCS = xcal.c xcal_alarm.c xcal_edit.c xcal_help.c xcal_popup.c xcal_strip.c xcal_memo.c version.c - OBJS = xcal.o xcal_alarm.o xcal_edit.o xcal_help.o xcal_popup.o xcal_strip.o xcal_memo.o version.o OSMAJORVERSION = 4 OSMINORVERSION = 1 ! DEFINES = -DOSMAJORVERSION=$(OSMAJORVERSION) -DOSMINORVERSION=$(OSMINORVERSION) -DVER_VEC ! all:: xcal ! xcal: $(OBJS) $(DEPLIBS) ! $(RM) $@ ! $(CC) -o $@ $(OBJS) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS) ! clean:: ! $(RM) xcal ! all:: xcal_cal ! xcal_cal: xcal_cal.o $(RM) $@ ! $(CC) -o $@ xcal_cal.o $(LDOPTIONS) $(LDLIBS) $(EXTRA_LOAD_FLAGS) - clean:: - $(RM) xcal_cal; - install:: xcal ! $(INSTALL) -c $(INSTPGMFLAGS) xcal $(BINDIR) install.man:: xcal.man ! $(INSTALL) -c $(INSTMANFLAGS) xcal.man $(MANDIR)/xcal.n install:: xcal_cal ! $(INSTALL) -c $(INSTPGMFLAGS) xcal_cal $(BINDIR) install.man:: xcal_cal.man ! $(INSTALL) -c $(INSTMANFLAGS) xcal_cal.man $(MANDIR)/xcal_cal.n install:: XCal.ad $(INSTALL) -c $(INSTAPPFLAGS) XCal.ad $(XAPPLOADDIR)/XCal - - depend:: - $(DEPEND) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS) ########################################################################### # common rules for all Makefiles - do not edit --- 225,284 ---- ########################################################################### # start of Imakefile OSMAJORVERSION = 4 OSMINORVERSION = 1 ! DEFINES = -DOSMAJORVERSION=$(OSMAJORVERSION) \ ! -DOSMINORVERSION=$(OSMINORVERSION) \ ! -DVER_VEC ! SRCS1 = xcal.c xcal_alarm.c xcal_edit.c xcal_help.c xcal_popup.c \ ! xcal_strip.c xcal_memo.c version.c ! OBJS1 = xcal.o xcal_alarm.o xcal_edit.o xcal_help.o xcal_popup.o \ ! xcal_strip.o xcal_memo.o version.o ! SRCS2 = xcal_cal.c ! OBJS2 = xcal_cal.o ! PROGRAMS = xcal xcal_cal ! OBJS = $(OBJS1) $(OBJS2) $(OBJS3) ! SRCS = $(SRCS1) $(SRCS2) $(SRCS3) ! all:: $(PROGRAMS) ! ! xcal: $(OBJS1) $(DEPLIBS1) $(RM) $@ ! $(CC) -o $@ $(LDOPTIONS) $(OBJS1) $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) $(LDLIBS) $(EXTRA_LOAD_FLAGS) install:: xcal ! $(INSTALL) -c $(INSTPGMFLAGS) xcal $(BINDIR) install.man:: xcal.man ! $(INSTALL) -c $(INSTMANFLAGS) xcal.man $(MANDIR)/xcal.n + depend:: + $(DEPEND) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS) + + lint: + $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS) + lint1: + $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS) + + clean:: + $(RM) $(PROGRAMS) + + xcal_cal: $(OBJS2) $(DEPLIBS2) + $(RM) $@ + $(CC) -o $@ $(LDOPTIONS) $(OBJS2) $(LDLIBS) $(EXTRA_LOAD_FLAGS) + install:: xcal_cal ! $(INSTALL) -c $(INSTPGMFLAGS) xcal_cal $(BINDIR) install.man:: xcal_cal.man ! $(INSTALL) -c $(INSTMANFLAGS) xcal_cal.man $(MANDIR)/xcal_cal.n install:: XCal.ad $(INSTALL) -c $(INSTAPPFLAGS) XCal.ad $(XAPPLOADDIR)/XCal ########################################################################### # common rules for all Makefiles - do not edit *** XCal.ad~ Fri Mar 22 23:34:51 1991 --- XCal.ad Fri Mar 22 23:48:21 1991 *************** *** 1,8 **** XCal.MarkForeground: Black XCal.MarkBackground: White ! XCal.edit.geometry: 300x150 ! XCal.memo.geometry: 300x300 ! XCal.alarm.geometry: 300x100+0+150 XCal*help.geometry: 600x300 XCal.fontToday: lucidasanstypewriter-12 XCal*Font: lucidasanstypewriter-12 --- 1,8 ---- XCal.MarkForeground: Black XCal.MarkBackground: White ! XCal.edit.geometry: 325x150 ! XCal.memo.geometry: 325x300 ! XCal.alarm.geometry: 325x100+0+150 XCal*help.geometry: 600x300 XCal.fontToday: lucidasanstypewriter-12 XCal*Font: lucidasanstypewriter-12 *************** *** 40,45 **** --- 40,48 ---- XCal*alarmQuit.Label: Unpin XCal*alarmHold.Label: Stick XCal*memoTitle.Label: Edit the memo file + XCal*weeklyEdit.Label: Edit + XCal*weeklyTitle.Label: Today's regular events + ! ! Colours from reed wade@cs.utk.edu ! *** mouse.bm~ Fri Mar 22 23:34:58 1991 --- mouse.bm Fri Mar 22 23:48:26 1991 *************** *** 1,6 **** #define mouse_width 16 #define mouse_height 13 ! static char mouse_bits[] = { 0xfe, 0x7f, 0xff, 0xff, 0x21, 0x84, 0xa1, 0xb5, 0xa1, 0xb5, 0xa1, 0xb5, 0xa1, 0xb5, 0xa1, 0xb5, 0xa1, 0xb5, 0x21, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; --- 1,6 ---- #define mouse_width 16 #define mouse_height 13 ! static unsigned char mouse_bits[] = { 0xfe, 0x7f, 0xff, 0xff, 0x21, 0x84, 0xa1, 0xb5, 0xa1, 0xb5, 0xa1, 0xb5, 0xa1, 0xb5, 0xa1, 0xb5, 0xa1, 0xb5, 0x21, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; *** mouseaway.bm~ Fri Mar 22 23:34:58 1991 --- mouseaway.bm Fri Mar 22 23:48:26 1991 *************** *** 1,6 **** #define mouseaway_width 16 #define mouseaway_height 13 ! static char mouseaway_bits[] = { 0xfe, 0x7f, 0xff, 0xff, 0x21, 0x84, 0xad, 0xb5, 0xad, 0xb5, 0xad, 0xb5, 0xad, 0xb5, 0xad, 0xb5, 0xad, 0xb5, 0x21, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; --- 1,6 ---- #define mouseaway_width 16 #define mouseaway_height 13 ! static unsigned char mouseaway_bits[] = { 0xfe, 0x7f, 0xff, 0xff, 0x21, 0x84, 0xad, 0xb5, 0xad, 0xb5, 0xad, 0xb5, 0xad, 0xb5, 0xad, 0xb5, 0xad, 0xb5, 0x21, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; *** version.c~ Fri Mar 22 23:34:48 1991 --- version.c Fri Mar 22 23:48:20 1991 *************** *** 1,10 **** #ifndef lint ! static char *sccsid = "@(#)version.c 3.2 (Hillside Systems) 12/18/90"; #endif /* lint */ /* * Version control file ! * version.c 3.2 12/18/90 ! * Automatically created on Tue Dec 18 21:15:55 GMT 1990 * * Hand edit none of this if you want freeze to continue to work */ --- 1,10 ---- #ifndef lint ! static char *sccsid = "@(#)version.c 3.3 (Hillside Systems) 3/22/91"; #endif /* lint */ /* * Version control file ! * version.c 3.3 3/22/91 ! * Automatically created on Fri Mar 22 23:48:16 GMT 1991 * * Hand edit none of this if you want freeze to continue to work */ *************** *** 12,43 **** #define PROGNAME XCal #endif #ifdef VER_VEC ! char version[] = "XCal Version 3.2, released Tue Dec 18 21:15:55 GMT 1990"; #endif #ifdef VER_DEF ! #define VERSION "XCal Version 3.2, released Tue Dec 18 21:15:55 GMT 1990" #endif /* SCCS files * ! +1.7 Imakefile ! +3.5 xcal_help.c ! +1.4 xcal_cal.c ! +1.12 xcal.man ! +1.5 xcal_memo.c ! +1.10 XCal.ad ! +1.10 xcal_alarm.c ! +3.9 xcal_edit.c ! +1.4 README ! +2.1 patchlevel.h ! +3.6 xcal_strip.c +1.2 xcal_cal.man ! +1.8 Makefile ! +3.4 xcal_popup.c ! +3.13 xcal.c ! +3.8 xcal.h ! +2.2 CHANGES ! +1.1 mouse.bm ! +1.1 mouseaway.bm * */ --- 12,43 ---- #define PROGNAME XCal #endif #ifdef VER_VEC ! char version[] = "XCal Version 3.3, released Fri Mar 22 23:48:16 GMT 1991"; #endif #ifdef VER_DEF ! #define VERSION "XCal Version 3.3, released Fri Mar 22 23:48:16 GMT 1991" #endif /* SCCS files * ! +1.9 Imakefile ! +3.6 xcal_help.c ! +1.6 xcal_cal.c ! +1.17 xcal.man ! +1.11 xcal_memo.c ! +1.13 XCal.ad ! +1.13 xcal_alarm.c ! +3.15 xcal_edit.c ! +1.6 README ! +2.2 patchlevel.h ! +3.10 xcal_strip.c +1.2 xcal_cal.man ! +1.10 Makefile ! +3.5 xcal_popup.c ! +3.22 xcal.c ! +3.14 xcal.h ! +2.12 CHANGES ! +1.2 mouse.bm ! +1.2 mouseaway.bm * */ *** xcal.c~ Fri Mar 22 23:34:56 1991 --- xcal.c Fri Mar 22 23:48:25 1991 *************** *** 1,5 **** #ifndef lint ! static char *sccsid = "@(#)xcal.c 3.13 (Hillside Systems) 12/7/90"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** --- 1,5 ---- #ifndef lint ! static char *sccsid = "@(#)xcal.c 3.22 (Hillside Systems) 1/16/91"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** *************** *** 13,18 **** --- 13,19 ---- -format str use str as a display format -order ord set the argument order to this -debug run quickly incrementing time - 1 day per sec + -alarmscan print alarm debug info * libraries used: libXaw.a, libXmu.a libXt.a libX11.a * compile time parameters: *************** *** 91,96 **** --- 92,99 ---- offset(initialCalendar), XtRString, "False" }, {"initialEdit", "InitialEdit", XtRBoolean, sizeof(Boolean), offset(initialEdit), XtRString, "False" }, + {"initialMemo", "InitialMemo", XtRBoolean, sizeof(Boolean), + offset(initialMemo), XtRString, "False" }, {"markForeground", "MarkForeground", XtRPixel, sizeof(Pixel), offset(marked.fg), XtRString, "White" }, {"markBackground", "MarkBackground", XtRPixel, sizeof(Pixel), *************** *** 104,112 **** {"todayBackground", "TodayBackground", XtRPixel, sizeof(Pixel), offset(today.bg), XtRString, "Black" }, {"format", "Format",XtRString, sizeof(String), ! offset(opfmt), XtRString, "%2d %s %d"}, {"order", "Order", XtRString, sizeof(String), ! offset(order), XtRString, "dmy"}, {"directory", "Directory", XtRString, sizeof(String), offset(directory), XtRString, "Calendar"}, {"textBufferSize", "TextBufferSize", XtRInt, sizeof(int), --- 107,121 ---- {"todayBackground", "TodayBackground", XtRPixel, sizeof(Pixel), offset(today.bg), XtRString, "Black" }, {"format", "Format",XtRString, sizeof(String), ! offset(opfmt), XtRString, "%s %2d %s %d"}, {"order", "Order", XtRString, sizeof(String), ! offset(order), XtRString, "wdmy"}, ! {"dateYearIsTwoDigits", "DateYearIsTwoDigits", XtRBoolean, sizeof(Boolean), ! offset(dateYearIs2), XtRString, "False" }, ! {"editYearIsTwoDigits", "EditYearIsTwoDigits", XtRBoolean, sizeof(Boolean), ! offset(editYearIs2), XtRString, "False" }, ! {"memoYearIsTwoDigits", "MemoYearIsTwoDigits", XtRBoolean, sizeof(Boolean), ! offset(memoYearIs2), XtRString, "False" }, {"directory", "Directory", XtRString, sizeof(String), offset(directory), XtRString, "Calendar"}, {"textBufferSize", "TextBufferSize", XtRInt, sizeof(int), *************** *** 164,182 **** {"dec", "Dec", XtRString, sizeof(String), offset(smon[11]), XtRString, "Dec"}, {"sunday", "Sunday", XtRString, sizeof(String), ! offset(day[0]), XtRString, "Sun"}, {"monday", "Monday", XtRString, sizeof(String), ! offset(day[1]), XtRString, "Mon"}, {"tuesday", "Tuesday", XtRString, sizeof(String), ! offset(day[2]), XtRString, "Tue"}, {"wednesday", "Wednesday", XtRString, sizeof(String), ! offset(day[3]), XtRString, "Wed"}, {"thursday", "Thursday", XtRString, sizeof(String), ! offset(day[4]), XtRString, "Thu"}, {"friday", "Friday", XtRString, sizeof(String), ! offset(day[5]), XtRString, "Fri"}, {"saturday", "Saturday", XtRString, sizeof(String), ! offset(day[6]), XtRString, "Sat"}, {"alarms", "Alarms", XtRBoolean, sizeof(Boolean), offset(alarms), XtRString, "True"}, {"update", "Update", XtRInt, sizeof(int), --- 173,207 ---- {"dec", "Dec", XtRString, sizeof(String), offset(smon[11]), XtRString, "Dec"}, {"sunday", "Sunday", XtRString, sizeof(String), ! offset(day[0]), XtRString, "Sunday"}, {"monday", "Monday", XtRString, sizeof(String), ! offset(day[1]), XtRString, "Monday"}, {"tuesday", "Tuesday", XtRString, sizeof(String), ! offset(day[2]), XtRString, "Tuesday"}, {"wednesday", "Wednesday", XtRString, sizeof(String), ! offset(day[3]), XtRString, "Wednesday"}, {"thursday", "Thursday", XtRString, sizeof(String), ! offset(day[4]), XtRString, "Thursday"}, {"friday", "Friday", XtRString, sizeof(String), ! offset(day[5]), XtRString, "Friday"}, {"saturday", "Saturday", XtRString, sizeof(String), ! offset(day[6]), XtRString, "Saturday"}, ! {"sun", "Sun", XtRString, sizeof(String), ! offset(sday[0]), XtRString, "Sun"}, ! {"mon", "Mon", XtRString, sizeof(String), ! offset(sday[1]), XtRString, "Mon"}, ! {"tue", "Tue", XtRString, sizeof(String), ! offset(sday[2]), XtRString, "Tue"}, ! {"wed", "Wed", XtRString, sizeof(String), ! offset(sday[3]), XtRString, "Wed"}, ! {"thu", "Thu", XtRString, sizeof(String), ! offset(sday[4]), XtRString, "Thu"}, ! {"fri", "Fri", XtRString, sizeof(String), ! offset(sday[5]), XtRString, "Fri"}, ! {"sat", "Sat", XtRString, sizeof(String), ! offset(sday[6]), XtRString, "Sat"}, ! {"weekly", "Weekly", XtRString, sizeof(String), ! offset(weekly), XtRString, "Weekly"}, {"alarms", "Alarms", XtRBoolean, sizeof(Boolean), offset(alarms), XtRString, "True"}, {"update", "Update", XtRInt, sizeof(int), *************** *** 231,240 **** /* * Forward routines local to this file */ ! void MkDate(); ! void DebugMkDate(); ! void DoTemplate(); ! void DecodeOrder(); #include "mouse.bm" #include "mouseaway.bm" --- 256,267 ---- /* * Forward routines local to this file */ ! static void MkDate(); ! static void DebugMkDate(); ! static void DoTemplate(); ! static void DecodeOrder(); ! static void PixInit(); ! #include "mouse.bm" #include "mouseaway.bm" *************** *** 362,367 **** --- 389,396 ---- } XtAddActions(appActions, 3); /* register actions */ XtAugmentTranslations(lab, XtParseTranslationTable(defTranslations)); + if (appResources.useMemo) + XtAugmentTranslations(memo, XtParseTranslationTable(defTranslations)); XtMapWidget(toplevel); *************** *** 377,390 **** --- 406,424 ---- StartEditing(lab, &today); } + if (appResources.useMemo && appResources.initialMemo) + DoMemo(memo, NULL, NULL); + InitAlarms(); XtMainLoop(); + exit(0); } /* * Initialise Pixmaps */ + static void PixInit(toplevel) Widget toplevel; { *************** *** 392,406 **** MouseOnPix = XCreateBitmapFromData(theDisplay, DefaultRootWindow(theDisplay), ! mouse_bits, mouse_width, mouse_height); MouseOffPix = XCreateBitmapFromData(theDisplay, DefaultRootWindow(theDisplay), ! mouseaway_bits, mouseaway_width, mouseaway_height); } /* * Flip mouse state */ MouseShow(w, OnOff) Widget w; Boolean OnOff; --- 426,441 ---- MouseOnPix = XCreateBitmapFromData(theDisplay, DefaultRootWindow(theDisplay), ! (char *)mouse_bits, mouse_width, mouse_height); MouseOffPix = XCreateBitmapFromData(theDisplay, DefaultRootWindow(theDisplay), ! (char *)mouseaway_bits, mouseaway_width, mouseaway_height); } /* * Flip mouse state */ + void MouseShow(w, OnOff) Widget w; Boolean OnOff; *************** *** 417,422 **** --- 452,458 ---- */ void Leave(retval) + int retval; { exit(retval); } *************** *** 440,445 **** --- 476,482 ---- dp->day = tm->tm_mday; dp->month = tm->tm_mon; dp->year = tm->tm_year + 1900; + dp->wday = tm->tm_wday; } *************** *** 454,466 **** if (timedOut) yesterday = today; ! ti = time(0); tm = localtime(&ti); ConvDate(tm, &today); ! PlaceStr(date_area, ! tm->tm_mday, appResources.mon[tm->tm_mon], tm->tm_year); XtSetValues(w, wargs, 1); if (timedOut) --- 491,503 ---- if (timedOut) yesterday = today; ! (void) time(&ti); tm = localtime(&ti); ConvDate(tm, &today); ! PlaceStr(date_area, &today, appResources.dateYearIs2); ! XtSetValues(w, wargs, 1); if (timedOut) *************** *** 486,499 **** yesterday = today; if (ti == 0) ! ti = time(0); else ti += 24*60*60; tm = localtime(&ti); ConvDate(tm, &today); ! PlaceStr(date_area, ! tm->tm_mday, appResources.mon[tm->tm_mon], tm->tm_year); XtSetValues(w, wargs, 1); if (timedOut) --- 523,536 ---- yesterday = today; if (ti == 0) ! (void) time(&ti); else ti += 24*60*60; tm = localtime(&ti); ConvDate(tm, &today); ! PlaceStr(date_area, &today, appResources.dateYearIs2); ! XtSetValues(w, wargs, 1); if (timedOut) *************** *** 513,529 **** */ static void DoTemplate() ! { int maxmon; int i; int len; char trial[BUFSIZ]; ! for (maxmon = i = 0; i < 12; i++) ! { PlaceStr(trial, 99, appResources.mon[i], 99); len = strlen(trial); ! if (len > maxmon) ! { maxmon = len; strcpy(date_area, trial); } } --- 550,578 ---- */ static void DoTemplate() ! { int max; int i; int len; char trial[BUFSIZ]; + Date da; + da.day = 99; + da.year = 9999; ! for (da.wday = max = i = 0; i < 7; i++) ! { len = strlen(appResources.day[i]); ! if (len > max) ! { max = len; ! da.wday = i; ! } ! } ! ! for (max = i = 0; i < 12; i++) ! { da.month = i; ! PlaceStr(trial, &da, appResources.dateYearIs2); len = strlen(trial); ! if (len > max) ! { max = len; strcpy(date_area, trial); } } *************** *** 536,565 **** DecodeOrder() { register char *p; ! p = appResources.order; ! if (*p == 'd' && strcmp(p, "dmy") == 0) ! appResources.val_order = O_DMY; else if (*p == 'y') ! { if (strcmp(p, "ymd") == 0) ! appResources.val_order = O_YMD; else ! if (strcmp(p, "ydm") == 0) ! appResources.val_order = O_YDM; else ! appResources.val_order = -1; } else ! if (*p == 'm' && strcmp(p, "mdy") == 0) ! appResources.val_order = O_MDY; else ! appResources.val_order = -1; ! if (appResources.val_order == -1) { fprintf(stderr, "Unknown order: %s\n", p); ! appResources.val_order = O_DMY; } } /* --- 585,626 ---- DecodeOrder() { register char *p; ! int order = 0; ! int addweekday = 0; ! p = appResources.order; ! if (*p == 'w') ! { addweekday = O_WEEKLEFT; ! p++; ! } ! ! if (*p == 'd' && strncmp(p, "dmy", 3) == 0) ! order = O_DMY; else if (*p == 'y') ! { if (strncmp(p, "ymd", 3) == 0) ! order = O_YMD; else ! if (strncmp(p, "ydm", 3) == 0) ! order = O_YDM; else ! order = -1; } else ! if (*p == 'm' && strncmp(p, "mdy", 3) == 0) ! order = O_MDY; else ! order = -1; ! if (order == -1) { fprintf(stderr, "Unknown order: %s\n", p); ! order = O_DMY; } + + if (addweekday == 0 && p[3] == 'w') + addweekday = O_WEEKRIGHT; + + appResources.val_order = order | addweekday; } /* *************** *** 566,581 **** * make a string */ void ! PlaceStr(dest, d, m, y) String dest; ! int d; ! String m; ! int y; { register String fmt; if (y > 99 && y < 1900) y -= 100; fmt = appResources.opfmt; --- 627,648 ---- * make a string */ void ! PlaceStr(dest, da, is2) String dest; ! Date *da; ! Boolean is2; { register String fmt; + int d = da->day; + String m = appResources.mon[da->month]; + int y = da->year; + String w = appResources.day[da->wday]; if (y > 99 && y < 1900) y -= 100; + + if (is2) + y %= 100; fmt = appResources.opfmt; *************** *** 584,597 **** --- 651,688 ---- case O_DMY: /* default */ (void) sprintf(dest, fmt, d, m, y); break; + case O_DMY|O_WEEKLEFT: + (void) sprintf(dest, fmt, w, d, m, y); + break; + case O_DMY|O_WEEKRIGHT: + (void) sprintf(dest, fmt, d, m, y, w); + break; case O_YMD: /* Year/Month/Day */ (void) sprintf(dest, fmt, y, m, d); break; + case O_YMD|O_WEEKLEFT: /* Year/Month/Day */ + (void) sprintf(dest, fmt, w, y, m, d); + break; + case O_YMD|O_WEEKRIGHT: /* Year/Month/Day */ + (void) sprintf(dest, fmt, y, m, d, w); + break; case O_MDY: /* Month/Day/Year */ (void) sprintf(dest, fmt, m, d, y); break; + case O_MDY|O_WEEKLEFT: /* Month/Day/Year */ + (void) sprintf(dest, fmt, w, m, d, y); + break; + case O_MDY|O_WEEKRIGHT: /* Month/Day/Year */ + (void) sprintf(dest, fmt, m, d, y, w); + break; case O_YDM: /* Year/Day/Month */ (void) sprintf(dest, fmt, y, d, m); + break; + case O_YDM|O_WEEKLEFT: /* Year/Day/Month */ + (void) sprintf(dest, fmt, w, y, d, m); + break; + case O_YDM|O_WEEKRIGHT: /* Year/Day/Month */ + (void) sprintf(dest, fmt, y, d, m, w); break; } } *** xcal.h~ Fri Mar 22 23:34:57 1991 --- xcal.h Fri Mar 22 23:48:25 1991 *************** *** 1,5 **** /* ! * xcal.h 3.8 12/12/90 * * Header file for the xcal program */ --- 1,5 ---- /* ! * xcal.h 3.14 1/16/91 * * Header file for the xcal program */ *************** *** 10,28 **** * so undef if not true * and fiddle with the definitions below */ ! #define LONG_IS_32_BITS /* pack year and month into Cardinals */ #ifdef LONG_IS_32_BITS ! #define DatePack(d, m, y) ((((d)&0x1f)<<16) | (((m)&0xf)<<12) | ((y)&0xfff)) #define YrUnpack(v) ((v)&0xfff) #define MoUnpack(v) (((v)>>12)&0xf) #define DyUnpack(v) (((v)>>16)&0x1f) ! #else LONG_IS_32_BITS #define DatePack(m, y) ((((m)&0xf)<<12) | ((y)&0xfff)) #define YrUnpack(v) ((v)&0xfff) #define MoUnpack(v) (((v)>>12)&0xf) ! #endif LONG_IS_32_BITS /* * Foreground/Background colours --- 10,32 ---- * so undef if not true * and fiddle with the definitions below */ ! /* #define LONG_IS_32_BITS */ /* pack year and month into Cardinals */ #ifdef LONG_IS_32_BITS ! #define DatePack(w, d, m, y) ((((w)&0x7)<<21) | (((d)&0x1f)<<16) | (((m)&0xf)<<12) | ((y)&0xfff)) #define YrUnpack(v) ((v)&0xfff) #define MoUnpack(v) (((v)>>12)&0xf) #define DyUnpack(v) (((v)>>16)&0x1f) ! #define WdUnpack(v) (((v)>>21)&0x7) ! #else /* LONG_IS_32_BITS */ #define DatePack(m, y) ((((m)&0xf)<<12) | ((y)&0xfff)) + #define DayPack(w, d) ((((w)&0x7)<<5) | ((d)&0x1f)) #define YrUnpack(v) ((v)&0xfff) #define MoUnpack(v) (((v)>>12)&0xf) ! #define DyUnpack(v) ((v)&0x1f) ! #define WdUnpack(v) (((v)>>5)&0xf) ! #endif /* LONG_IS_32_BITS */ /* * Foreground/Background colours *************** *** 47,55 **** Boolean giveHelp; /* True if help is needed (default) */ Boolean initialCalendar;/* Pop up Calendar on startup if True */ Boolean initialEdit; /* Pop up today's Edit on startup if True */ String mon[12]; /* Long month names */ String smon[12]; /* Short month names */ ! String day[7]; /* day names */ String opfmt; /* format for main box */ String order; /* Orders are dmy/ymd/mdy/ydm */ int val_order; /* The selected order */ --- 51,65 ---- Boolean giveHelp; /* True if help is needed (default) */ Boolean initialCalendar;/* Pop up Calendar on startup if True */ Boolean initialEdit; /* Pop up today's Edit on startup if True */ + Boolean initialMemo; /* Pop up memo box on start */ + Boolean dateYearIs2; /* Display year as two digits in date strip */ + Boolean editYearIs2; /* Display year as two digits in edit strip */ + Boolean memoYearIs2; /* Display year as two digits in memo strip */ String mon[12]; /* Long month names */ String smon[12]; /* Short month names */ ! String day[7]; /* Day names - full */ ! String sday[7]; /* Short day names */ ! String weekly; /* Title of weekly edit strip */ String opfmt; /* format for main box */ String order; /* Orders are dmy/ymd/mdy/ydm */ int val_order; /* The selected order */ *************** *** 65,72 **** int update; /* interval between peeks (60 secs) */ int volume; /* how loud to beep the alarm 0-100 */ int nbeeps; /* how many beeps for an alarm ? */ - long last_size; /* save the last time size */ - long last_time; /* save the last time file accessed */ int autoquit; /* Automatically delete message boxes */ String countdown; /* Comma separated countdown string for alarms */ String cmd; /* command to execute for every alarm */ --- 75,80 ---- *************** *** 85,94 **** /* * Order coding inserted into val_order */ ! #define O_DMY 0 /* default */ ! #define O_YMD 1 /* Year/Month/Day */ ! #define O_MDY 2 /* Month/Day/Year */ ! #define O_YDM 3 /* Year/Day/Month */ /* * Date structure --- 93,105 ---- /* * Order coding inserted into val_order */ ! #define O_DMY 0 /* default */ ! #define O_YMD 1 /* Year/Month/Day */ ! #define O_MDY 2 /* Month/Day/Year */ ! #define O_YDM 3 /* Year/Day/Month */ ! #define O_WEEKLEFT 4 /* Place day of the week on the left */ ! #define O_WEEKRIGHT 8 /* Place day of the week on the right */ ! #define O_WEEKMASK O_WEEKLEFT|O_WEEKRIGHT /* * Date structure *************** *** 97,102 **** --- 108,114 ---- { Cardinal day; Cardinal month; Cardinal year; + Cardinal wday; } Date; /* *************** *** 108,115 **** --- 120,131 ---- Cardinal me_month; /* which month */ String me_have[32]; /* if a file present for the day */ /* then will have a non-zero entry */ + int me_type; /* type of displayed strip */ } MonthEntry; + #define ME_MONTHLY 1 /* `Normal' monthly strip */ + #define ME_WEEKLY 2 /* Weekly strip */ + /* * An instance of the strip */ *************** *** 150,156 **** --- 166,175 ---- /* * Global routines */ + void InitAlarms(); + void MouseShow(); void Leave(); + void Fatal(); void SetDate(); void AskLeave(); void DialogPopup(); *************** *** 158,171 **** --- 177,198 ---- void TextCal(); void DoCalendar(); void DoMemo(); + void DoWeekly(); void MemoPoll(); void NewMonthStrip(); void InitMonthEntries(); void ChangeHighlight(); void NoEditIsPossible(); + void NoDayEditIsPossible(); void StartEditing(); MonthEntry *GetMonthEntry(); + MonthEntry *GetWeeklyEntry(); void AlarmFilePoll(); String ReadCalendarFile(); void UpdateMemo(); void PlaceStr(); + String MakeWeeklyName(); + String GetWeeklyFile(); + Boolean NeedTop(); + + time_t time(); *** xcal.man~ Fri Mar 22 23:34:50 1991 --- xcal.man Fri Mar 22 23:48:21 1991 *************** *** 21,28 **** program. The format of the command box may be altered using the resource manager, so you are not stuck with my preferred format. ! A small button in the top level window can be pressed to inspect todays ! appointments and also to edit or display a memo file. .LP The calendar and notebook functions are accessed by clicking the mouse buttons inside date portion of the command window. --- 21,31 ---- program. The format of the command box may be altered using the resource manager, so you are not stuck with my preferred format. ! A small button in the top level window can be pressed to ! inspect appointments for today. ! This generates a panel showing information from the calendar file for today and ! information from a set of seven daily files holding regular commitments. ! Finally, the memo panel displays and allows the edit of a memo file. .LP The calendar and notebook functions are accessed by clicking the mouse buttons inside date portion of the command window. *************** *** 113,123 **** .I Xcal is accessed by pressing the non-date portion of the command window. Currently this shows a bitmap diagram of three mouse buttons. ! Clicking the left mouse button in this area brings up a complex panel. The top half of the panel displays the information held in the diary for today; you cannot edit the data from here \- and must open the diary strip to change the data. ! The bottom half of the panel is an edit window displaying the contents of a file usually called `memo' in the Calendar directory. The idea of this panel is to allow you to access your current information in one button click. --- 116,132 ---- .I Xcal is accessed by pressing the non-date portion of the command window. Currently this shows a bitmap diagram of three mouse buttons. ! Clicking the left mouse button in this area brings up a complex panel, ! clicking on the button again will pop is back down again. The top half of the panel displays the information held in the diary for today; you cannot edit the data from here \- and must open the diary strip to change the data. ! The next section of the panel displays the information held in the ! weekly files. ! Again you cannot directly change the text in this area, you must ! press on the Edit button to bring up a strip enabling you to ! change things. ! The bottom portion of the panel is an edit window displaying the contents of a file usually called `memo' in the Calendar directory. The idea of this panel is to allow you to access your current information in one button click. *************** *** 197,202 **** --- 206,224 ---- info command containing the file data .EE .LP + The weekly popup strip is: + .EX + weekly the popup shell + weekly panel containing the strip + header label containing the title + action form containing quit and help + quit command containing exit button + help command generating help + shortday form containing days + label label containing day of the week + info command containing the file data + .EE + .LP The Edit Window is: .EX edit the popup shell *************** *** 203,209 **** panel the panel inside the shell title the form containing the first line quit the exit button ! .EE .LP The Help Window is: .EX --- 225,231 ---- panel the panel inside the shell title the form containing the first line quit the exit button ! .EE .LP The Help Window is: .EX *************** *** 234,239 **** --- 256,265 ---- help the help button date display today's date display text from today's date file + weeklyMemo form for the Memo title line + weeklyEdit Edit button + weeklyTitle Title area + 2 display text from today's weekly file memoMiddle Middle line form widget save Save button memoTitle text title of middle line *************** *** 299,316 **** If true display the output in reverse video. .IP .B Format ! The \fIprintf\fP string used to create the contents of the top command ! button. ! The default is "%2d %s %d", the arguments to this command are presented in a default order: day, month string and year. ! The order is controlled by the Order resource which contains the default ! string "dmy". ! These two resources should allow all forms of date printing. .TP .B Order ! Legal combinations are: dmy, ymd, mdy, ydm. ! The default is dmy. .TP .B MarkBackground The background colour for highlighting entries. Default Black. --- 325,371 ---- If true display the output in reverse video. .IP .B Format ! The \fIprintf\fP format used to create the contents of the top command button, ! the title in an edit window and the title in the memo window. ! The default is "%s %2d %s %d", the arguments to this command are presented in a default order: day, month string and year. ! The order is controlled by the Order resource, this contains the default ! string "wdmy". .TP .B Order ! This resource gives the order that various arguments are presented to the ! printf using the format string defined above. ! Legal combinations using day, month and year are: dmy, ymd, mdy, ydm. ! The name of today can be inserted at the start of the string by ! using one of the formats: wdmy, wymd, wmdy, wydm. ! It can be entered at the end by using on of the formats: dmyw, ymdw, mdyw, ydmw. ! In case you are wondering the `w' stands for `day' of the week. ! Beware that altering this resource from ! the default may force you to change the format string, ! see the previous resource. ! The default is wdmy. .TP + .B DateYearIsTwoDigits + The display of the year in the date strip is controlled + the format above. + If this resource is true then the year will be displayed as a two + digit number; if false the whole four digits will be displayed. + Default: False. + .TP + .B EditYearIsTwoDigits + The display of the year in the edit boxes is controlled by + the format above. + If this resource is true then the year will be displayed as a two + digit number; if false the whole four digits will be displayed. + Default: False. + .TP + .B MemoYearIsTwoDigits + The display of the year in the memo box is controlled + the format above. + If this resource is true then the year will be displayed as a two + digit number; if false the whole four digits will be displayed. + Default: False. + .TP .B MarkBackground The background colour for highlighting entries. Default Black. *************** *** 362,367 **** --- 417,426 ---- If False, the edit window is not automatically displayed. Default: False. .TP + .B InitialMemo + If True then the memo window is automatically displayed on startup. + Default: False. + .TP .B UseWmTitle If True display the month and the year at the head of each strip. This information is duplicated if your window manager uses titles *************** *** 485,491 **** .B Sunday .B Monday and so on. ! The names of the days, these are currently set to a three character short form. .SH FILES .PP $HOME/Calendar/* --- 544,560 ---- .B Sunday .B Monday and so on. ! The \fIlong\fP names of the days: Sunday, Monday etc. ! These are used in titles: the top level widget, the title of an edit window ! and the memo frame. ! .TP ! .B Sun ! .B Mon ! and so on. ! The short names of the days \- used in date strips. ! .TP ! .B Weekly ! The word `Weekly' used in various places. .SH FILES .PP $HOME/Calendar/* *************** *** 496,501 **** --- 565,576 ---- .TP xy<Year> A year directory. + .TP + xw<Day> + A data file for the weekly code, one per day. + .TP + memo + The memo file. .LP The standard resource database can be found in /usr/lib/X11/app-defaults/Xcal. Assuming that this is where the system admin installed it. *************** *** 514,519 **** --- 589,596 ---- Countdown does not work in the early hours of the morning, if you have a ten minute countdown and an alarm set at 0005 \- then you will not get warning at 2325. + .LP + Alarms set at 0000 probably won't work. .SH AUTHOR .LP Copyright 1989,1990 by Peter Collinson, Hillside Systems *** xcal_alarm.c~ Fri Mar 22 23:34:52 1991 --- xcal_alarm.c Fri Mar 22 23:48:22 1991 *************** *** 1,5 **** #ifndef lint ! static char *sccsid = "@(#)xcal_alarm.c 1.10 (Hillside Systems) 12/12/90"; static char *copyright = "@(#)Copyright 1989/1990 Mark Majhor, Peter Collinson"; #endif /* lint */ /*** --- 1,5 ---- #ifndef lint ! static char *sccsid = "@(#)xcal_alarm.c 1.13 (Hillside Systems) 1/16/91"; static char *copyright = "@(#)Copyright 1989/1990 Mark Majhor, Peter Collinson"; #endif /* lint */ /*** *************** *** 44,54 **** #define scrollVertical 0x02 #endif ! static struct stat stbuf; ! static Boolean false = False; ! static Boolean true = True; ! static char *LocalMapStem; ! static Boolean LocalFoundCalendarFile; static Alarm head; static int *countDown; static int countDownCt; --- 44,51 ---- #define scrollVertical 0x02 #endif ! static char *LocalMapStem; ! static char *TodayFile; static Alarm head; static int *countDown; static int countDownCt; *************** *** 169,175 **** struct tm *tm; { time_t ti; ! struct stat stbuf; char *home; char buf[256]; char *getenv(); --- 166,172 ---- struct tm *tm; { time_t ti; ! int files; char *home; char buf[256]; char *getenv(); *************** *** 209,236 **** if (LocalMapStem) XtFree(LocalMapStem); LocalMapStem = XtNewString(buf); ! dprintf("Todays Filename = %s\n", LocalMapStem); } /* * check for file existence */ ! if (access(LocalMapStem, F_OK)) ! { FreeAlarmList(); ! UpdateMemo(); ! return; ! } ! if (stat(LocalMapStem, &stbuf) < 0) ! Fatal("Panic: cannot stat %s\n", LocalMapStem); ! if (stbuf.st_size != appResources.last_size || ! stbuf.st_mtime > appResources.last_time) ! { appResources.last_size = stbuf.st_size; ! appResources.last_time = stbuf.st_mtime; ! AlarmScan(LocalMapStem, tm, MINUTES(tm->tm_hour, tm->tm_min)); ! UpdateMemo(); } } static void --- 206,240 ---- if (LocalMapStem) XtFree(LocalMapStem); LocalMapStem = XtNewString(buf); ! dprintf("Todays Daily Filename = %s\n", LocalMapStem); ! ! if (TodayFile) ! XtFree(TodayFile); ! ! TodayFile = MakeWeeklyName(today.wday); } + files = 0; /* * check for file existence */ ! if (access(LocalMapStem, F_OK) == 0) ! files = 1; ! if (access(TodayFile, F_OK) == 0) ! files |= 2; ! FreeAlarmList(); ! if (files) ! { if (files&1) ! AlarmScan(LocalMapStem, tm, MINUTES(tm->tm_hour, tm->tm_min)); ! if (files&2) ! AlarmScan(TodayFile, tm, MINUTES(tm->tm_hour, tm->tm_min)); } + else + dprintf("No files to scan"); + + UpdateMemo(); } static void *************** *** 247,256 **** Boolean isAction; ! dprintf("Scanning data file\n"); - FreeAlarmList(); - if ((fp = fopen(file, "r")) == NULL) { fprintf(stderr, "Unexpected failure to open: %s\n", file); exit(1); --- 251,258 ---- Boolean isAction; ! dprintf("Scanning data file %s\n", file); if ((fp = fopen(file, "r")) == NULL) { fprintf(stderr, "Unexpected failure to open: %s\n", file); exit(1); *************** *** 308,314 **** { Alarm *al, *prev, *new; - int bo; char *XtMalloc(); int al_hr, al_mn, mm; int loop; --- 310,315 ---- *************** *** 393,399 **** LookSp, LoseSp, Store, AllDone } state; register int c = 0; ! int hr, mn; char *destp; if (feof(fin)) --- 394,400 ---- LookSp, LoseSp, Store, AllDone } state; register int c = 0; ! int hr = 0, mn = 0; char *destp; if (feof(fin)) *************** *** 522,528 **** { Alarm *sc; int togo; - int mwanted; for (sc = head.next; sc; sc = sc->next) { togo = sc->alarm_mm - mnow; --- 523,528 ---- *************** *** 586,592 **** beep() { register Display *dpy = XtDisplay(toplevel); - register Window win = XtWindow(toplevel); int i; for (i = 0; i < appResources.nbeeps; i++) --- 586,591 ---- *** xcal_cal.c~ Fri Mar 22 23:34:49 1991 --- xcal_cal.c Fri Mar 22 23:48:20 1991 *************** *** 45,54 **** #include <ctype.h> #include <sys/param.h> #include <sys/types.h> #include <sys/dir.h> #include <time.h> - #include <strings.h> char *directory = "Calendar"; char *file = ".xcal"; char *home; --- 45,63 ---- #include <ctype.h> #include <sys/param.h> #include <sys/types.h> + #ifdef SYSV + #include <dirent.h> + #include <string.h> + #else + #include <strings.h> + #endif #include <sys/dir.h> #include <time.h> + + #ifdef SYSV + #define index strchr + #endif char *directory = "Calendar"; char *file = ".xcal"; char *home; *** xcal_edit.c~ Fri Mar 22 23:34:53 1991 --- xcal_edit.c Fri Mar 22 23:48:22 1991 *************** *** 1,5 **** #ifndef lint ! static char *sccsid = "@(#)xcal_edit.c 3.9 (Hillside Systems) 12/13/90"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** --- 1,5 ---- #ifndef lint ! static char *sccsid = "@(#)xcal_edit.c 3.15 (Hillside Systems) 1/16/91"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** *************** *** 63,68 **** --- 63,70 ---- #define mw_month mw_me.me_month #define mw_have mw_me.me_have + #define StripType(mw) (mw->mw_me.me_type) + static MeWrap *WrapBase; /* base of the list */ static MeWrap *WrapEnd; /* the last one in the list */ *************** *** 84,89 **** --- 86,92 ---- static MeWrap *MeWrapSearch(); static void DeRegisterMonth(); static Boolean WriteCalendarFile(); + static Boolean WriteWeeklyFile(); static void DeleteCalendarFile(); static void SetAllButtons(); static void TextChanged(); *************** *** 93,98 **** --- 96,102 ---- static void CheckDia(); static void YesCheck(); static void NoCheck(); + static int DayMatch(); void StartDayEditor(); void Fatal(); *************** *** 202,209 **** while ((dp = readdir(dirp)) != NULL) { #ifdef SYSV ! int d_namlen = strlen(dp->d_name) +1; ! switch(d_namlen) #else switch(dp->d_namlen) #endif --- 206,212 ---- while ((dp = readdir(dirp)) != NULL) { #ifdef SYSV ! switch(strlen(dp->d_name)) #else switch(dp->d_namlen) #endif *************** *** 272,277 **** --- 275,341 ---- } /* + * Get the entry for the weekly strip + * Files are xw<Day> in the Calendar directory + */ + MonthEntry * + GetWeeklyEntry(yr, mo) + Cardinal yr; + Cardinal mo; + { + MeWrap *mw; + int da; + DIR *dirp; + #ifdef SYSV + struct dirent *dp; + #else + struct direct *dp; + #endif + + if ((mw = MeWrapSearch(0, 0)) == NULL) + mw = NewMeWrap(0, 0); + + if (!FoundCalendarDir) + return(&mw->mw_me); + + if ((dirp = opendir(".")) == NULL) + Fatal("Cannot open directory: %s", MapStem); + + for (da = 0; da < 7; da++) + if (mw->mw_have[da]) + { XtFree(mw->mw_have[da]); + mw->mw_have[da] = NULL; + } + + while ((dp = readdir(dirp)) != NULL) + { + if (dp->d_name[0] == 'x' && + dp->d_name[1] == 'w' && + ((da = DayMatch(&dp->d_name[2])) != -1)) + { + mw->mw_have[da] = ReadCalendarFile(NULL, dp->d_name); + } + } + closedir(dirp); + return(&mw->mw_me); + } + + /* + * Look for a short name match with a day + */ + static int + DayMatch(day) + String day; + { + register i; + + for (i = 0; i < 7; i++) + if (strcmp(day, appResources.sday[i]) == 0) + return(i); + return (-1); + } + + /* * create a new MapWrap area */ static MeWrap * *************** *** 335,341 **** callbacks[0].callback = DeRegisterMonth; #ifdef LONG_IS_32_BITS ! callbacks[0].closure = (caddr_t)DatePack(0, mo, yr); #else callbacks[0].closure = (caddr_t)DatePack(mo, yr); #endif --- 399,405 ---- callbacks[0].callback = DeRegisterMonth; #ifdef LONG_IS_32_BITS ! callbacks[0].closure = (caddr_t)DatePack(0, 0, mo, yr); #else callbacks[0].closure = (caddr_t)DatePack(mo, yr); #endif *************** *** 434,439 **** --- 498,529 ---- } /* + * Check to see if we should create the top directory + */ + Boolean + NeedTop() + { + if (!FoundCalendarDir) + { if (mkdir(MapStem, 0700) == -1) + { XBell(XtDisplay(toplevel), 0); + fprintf(stderr, "xcal: Could not create: %s directory.\n", MapStem); + perror("xcal: mkdir"); + fflush(stderr); + return(False); + } + if (chdir(MapStem) < 0) + { XBell(XtDisplay(toplevel), 0); + fprintf(stderr, "xcal: Could not chdir into %s.\n", MapStem); + perror("xcal: chdir"); + fflush(stderr); + return(False); + } + FoundCalendarDir = True; + } + return(True); + } + + /* * Write a calendar file creating any directories * which are needed * Return True is OK *************** *** 454,481 **** { DeleteCalendarFile(mw, day); return(True); } /* - * First let's see if we have - * to create the toplevel directory - */ - if (!FoundCalendarDir) - { if (mkdir(MapStem, 0700) == -1) - { XBell(XtDisplay(toplevel), 0); - fprintf(stderr, "xcal: Could not create: %s directory.\n", MapStem); - perror("xcal: mkdir"); - fflush(stderr); - return(False); - } - if (chdir(MapStem) < 0) - { XBell(XtDisplay(toplevel), 0); - fprintf(stderr, "xcal: Could not chdir into %s.\n", MapStem); - perror("xcal: chdir"); - fflush(stderr); - return(False); - } - FoundCalendarDir = True; - } - /* * So that looks OK * We can now create the output file. * However, we would like to put any new data into subdirectories --- 544,553 ---- { DeleteCalendarFile(mw, day); return(True); } + if (!NeedTop()) + return(False); + /* * So that looks OK * We can now create the output file. * However, we would like to put any new data into subdirectories *************** *** 570,575 **** --- 642,726 ---- } /* + * Write daily file out + */ + static Boolean + WriteWeeklyFile(mw, day, contents) + register MeWrap *mw; + Cardinal day; + char *contents; + { + int fd; + Cardinal len; + char *fname; + + fname = MakeWeeklyName(day); + + len = strlen(contents); + if (len == 0) + (void) unlink(fname); + else + { if ((fd = open(fname, O_WRONLY|O_TRUNC|O_CREAT, 0666)) < 0) + { XBell(XtDisplay(toplevel), 0); + fprintf(stderr, "xcal: Could not open %s/%s for writing.\n", MapStem, fname); + perror("xcal: open"); + fflush(stderr); + return(False); + } + + if (write(fd, contents, len) != len) + { XBell(XtDisplay(toplevel), 0); + fprintf(stderr, "xcal: Write error %s/%s file.\n", MapStem, fname); + perror("xcal: write"); + fflush(stderr); + close(fd); + return(False); + } + close(fd); + } + /* + * tickle the alarm system if we have altered `today' + */ + if (today.wday == day) + AlarmFilePoll(NULL); + + return(True); + } + + /* + * Create a standard weekly file name + */ + String + MakeWeeklyName(day) + Cardinal day; + { + static char fname[16]; + + (void) sprintf(fname, "xw%s", appResources.sday[day]); + return(fname); + } + + /* + * Get the contents of the current Weekly file if any + */ + String + GetWeeklyFile(day) + Cardinal day; + { + char *fname; + + if (FoundCalendarDir == False) + return (NULL); + + fname = MakeWeeklyName(day); + + if (access(fname, F_OK) < 0) + return(NULL); + + return (ReadCalendarFile(NULL, fname)); + } + + /* * Start up an editor window from the callback * Pass the calling widget so we can change its contents * after the edit *************** *** 592,598 **** { if (ed->ed_day == da->day) { /* we are! */ /* Complain via a popup */ ! NoEditIsPossible(w, da); return; } } --- 743,757 ---- { if (ed->ed_day == da->day) { /* we are! */ /* Complain via a popup */ ! switch (StripType(mw)) ! { ! case ME_MONTHLY: ! NoEditIsPossible(w, da); ! break; ! case ME_WEEKLY: ! NoDayEditIsPossible(w, da->day); ! break; ! } return; } } *************** *** 724,730 **** lw = XtCreateManagedWidget("help", commandWidgetClass, frame, args, nargs); } ! PlaceStr(buf, da->day, appResources.mon[da->month], da->year); nargs = 0; XtSetArg(args[nargs], XtNlabel, buf); nargs++; XtSetArg(args[nargs], XtNborderWidth, 0); nargs++; --- 883,897 ---- lw = XtCreateManagedWidget("help", commandWidgetClass, frame, args, nargs); } ! switch (StripType(mw)) ! { ! case ME_MONTHLY: ! PlaceStr(buf, da, appResources.editYearIs2); ! break; ! case ME_WEEKLY: ! (void) strcpy(buf, appResources.day[da->day]); ! break; ! } nargs = 0; XtSetArg(args[nargs], XtNlabel, buf); nargs++; XtSetArg(args[nargs], XtNborderWidth, 0); nargs++; *************** *** 786,799 **** register Instance *ins; register MeWrap *mw; register Cardinal day; - extern Widget toplevel; Arg args[3]; mw = ed->ed_meWrap; day = ed->ed_day; ! if (WriteCalendarFile(mw, day, ed->ed_data) == False) ! return; /* * Otherwise change the displayed string */ --- 953,974 ---- register Instance *ins; register MeWrap *mw; register Cardinal day; Arg args[3]; mw = ed->ed_meWrap; day = ed->ed_day; ! switch (StripType(mw)) ! { ! case ME_MONTHLY: ! if (WriteCalendarFile(mw, day, ed->ed_data) == False) ! return; ! break; ! case ME_WEEKLY: ! if (WriteWeeklyFile(mw, day, ed->ed_data) == False) ! return; ! break; ! } /* * Otherwise change the displayed string */ *************** *** 819,827 **** /* * worry about updating the memo system */ ! if (today.day == day && today.month == mw->mw_month && ! today.year == mw->mw_year) ! UpdateMemo(); } --- 994,1012 ---- /* * worry about updating the memo system */ ! ! switch (StripType(mw)) ! { ! case ME_MONTHLY: ! if (today.day == day && today.month == mw->mw_month && ! today.year == mw->mw_year) ! UpdateMemo(); ! break; ! case ME_WEEKLY: ! if (today.wday == day) ! UpdateMemo(); ! break; ! } } *** xcal_help.c~ Fri Mar 22 23:34:49 1991 --- xcal_help.c Fri Mar 22 23:48:20 1991 *************** *** 1,5 **** #ifndef lint ! static char *sccsid = "@(#)xcal_help.c 3.5 (Hillside Systems) 12/7/90"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** --- 1,5 ---- #ifndef lint ! static char *sccsid = "@(#)xcal_help.c 3.6 (Hillside Systems) 1/16/91"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** *************** *** 223,225 **** --- 223,260 ---- DisplayHelpWindow(memoHelp); } + + static char weeklyHelp[] = "\ + The weekly strip consists of a number of lines of text. \n\n\ + Line 1: The title\n\ + Line 2: The Quit button that removes the strip from the screen\n\ + Line 3: The Help Button.\n\ + Help can be suppressed by setting `giveHelp' to False.\n\n\ + Then - A line for each day in the week.\n\ + Each line is two areas:\n\ + The left hand side shows the day in the week\n\ + The right hand side is an active button. When pressed it starts\n\ + up an editor for the day. This will create a file for the day\n\ + in the user's Calendar directory. The label on the button will\n\ + be the first few characters of the file, if there are any.\n\ + \n\ + XCal was written by Peter Collinson\n\ + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"; + + /* ARGSUSED */ + void + WeeklyHelp(w, closure, call_data) + Widget w; + caddr_t closure; + caddr_t call_data; + { + static int vadded; + + if (vadded == 0) + { vadded = 1; + addversion(weeklyHelp); + } + + DisplayHelpWindow(weeklyHelp); + } + *** xcal_memo.c~ Fri Mar 22 23:34:51 1991 --- xcal_memo.c Fri Mar 22 23:48:21 1991 *************** *** 1,5 **** #ifndef lint ! static char *sccsid = "@(#)xcal_memo.c 1.5 (Hillside Systems) 12/13/90"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** --- 1,5 ---- #ifndef lint ! static char *sccsid = "@(#)xcal_memo.c 1.11 (Hillside Systems) 1/16/91"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** *************** *** 53,69 **** Widget m_display; /* widget of display title area */ Widget m_text; /* the text area */ Widget m_today; /* today's data */ Cardinal m_size; /* size of the buffer */ char *m_data; /* pointer to malloc'ed data buffer */ } MemoEdit; static MemoEdit memo; - String GetMemoFile(); extern Boolean FoundCalendarDir; /* whether the Calendar directory exists */ static String memoContents; /* * Internal routines --- 53,70 ---- Widget m_display; /* widget of display title area */ Widget m_text; /* the text area */ Widget m_today; /* today's data */ + Widget m_weekly; /* widget of text image of weekly events */ Cardinal m_size; /* size of the buffer */ char *m_data; /* pointer to malloc'ed data buffer */ } MemoEdit; static MemoEdit memo; extern Boolean FoundCalendarDir; /* whether the Calendar directory exists */ static String memoContents; + extern void MemoHelp(); /* look in xcal_help.c */ /* * Internal routines *************** *** 77,83 **** static String GetMemoFile(); static void SaveMemoEdits(); static void MemoTextChanged(); - static void MemoHelp(); static void FinishMemoEditing(); static void YesCheck(); static void NoCheck(); --- 78,83 ---- *************** *** 145,153 **** Widget frame; Arg args[10]; Cardinal nargs; - Cardinal len; String str; MonthEntry *me; char buf[32]; /* --- 145,153 ---- Widget frame; Arg args[10]; Cardinal nargs; String str; MonthEntry *me; + Dimension charHeight; char buf[32]; /* *************** *** 207,213 **** /* * The remaining bit here is a date label */ ! PlaceStr(buf, today.day, appResources.mon[today.month], today.year); nargs = 0; XtSetArg(args[nargs], XtNlabel, buf); nargs++; XtSetArg(args[nargs], XtNborderWidth, 0); nargs++; --- 207,213 ---- /* * The remaining bit here is a date label */ ! PlaceStr(buf, &today, appResources.memoYearIs2); nargs = 0; XtSetArg(args[nargs], XtNlabel, buf); nargs++; XtSetArg(args[nargs], XtNborderWidth, 0); nargs++; *************** *** 233,244 **** XtSetArg(args[0], XtNheight, &height); XtGetValues(memo.m_today, args, 1); height = height*NewlineCount(str); XtSetArg(args[0], XtNheight, height); XtSetValues(memo.m_today, args, 1); } ! /* * Another form with some buttons */ nargs = 0; --- 233,294 ---- XtSetArg(args[0], XtNheight, &height); XtGetValues(memo.m_today, args, 1); + charHeight = height; height = height*NewlineCount(str); XtSetArg(args[0], XtNheight, height); XtSetValues(memo.m_today, args, 1); } ! /* + * Weekly details - the data for today + an edit button + * The header to this is a form + */ + nargs = 0; + XtSetArg(args[nargs], XtNshowGrip, False); nargs++; + XtSetArg(args[nargs], XtNskipAdjust, True); nargs++; + XtSetArg(args[nargs], XtNdefaultDistance, 1); nargs++; + frame = XtCreateManagedWidget("weeklyMemo", formWidgetClass, et, args, nargs); + + /* + * Take label "edit" from resources + */ + callbacks[0].callback = DoWeekly; + callbacks[0].closure = (caddr_t)&memo; + nargs = 0; + XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; + XtSetArg(args[nargs], XtNfromHoriz, NULL); nargs++; + XtSetArg(args[nargs], XtNleft, XtChainLeft); nargs++; + XtSetArg(args[nargs], XtNright, XtChainLeft); nargs++; + lw = XtCreateManagedWidget("weeklyEdit", commandWidgetClass, frame, args, nargs); + + /* + * Say this is a weekly commitment + */ + nargs = 0; + + XtSetArg(args[nargs], XtNshowGrip, True); nargs++; + XtSetArg(args[nargs], XtNborderWidth, 0); nargs++; + XtSetArg(args[nargs], XtNfromHoriz, lw); nargs++; + XtSetArg(args[nargs], XtNfromVert, NULL); nargs++; + XtSetArg(args[nargs], XtNvertDistance, 2); nargs++; + XtSetArg(args[nargs], XtNleft, XtChainLeft); nargs++; + XtSetArg(args[nargs], XtNright, XtChainRight); nargs++; + lw = XtCreateManagedWidget("weeklyTitle", labelWidgetClass, frame, args, nargs); + + /* + * Details for today + */ + nargs = 0; + str = GetWeeklyFile(today.wday); + if (str == NULL) + str = ""; + XtSetArg(args[nargs], XtNstring, str); nargs++; + XtSetArg(args[nargs], XtNdisplayCaret, False); nargs++; + XtSetArg(args[nargs], XtNeditType, XawtextRead); nargs++; + if (charHeight) + XtSetArg(args[nargs], XtNheight, NewlineCount(str)*charHeight); nargs++; + memo.m_weekly = XtCreateManagedWidget("display", asciiTextWidgetClass, et, args, nargs); + /* * Another form with some buttons */ nargs = 0; *************** *** 342,347 **** --- 392,404 ---- (void) sprintf(buf, "%d %s %d", today.day, appResources.mon[today.month], today.year); XtSetArg(args[0], XtNlabel, buf); XtSetValues(memo.m_display, args, 1); + + str = GetWeeklyFile(today.wday); + if (str == NULL) + str = ""; + XtSetArg(args[0], XtNstring, str); + XtSetValues(memo.m_weekly, args, 1); + } /* *************** *** 441,465 **** * First let's see if we have * to create the toplevel directory */ ! if (!FoundCalendarDir) ! { if (mkdir(MapStem, 0700) == -1) ! { XBell(XtDisplay(toplevel), 0); ! fprintf(stderr, "xcal: Could not create: %s directory.\n", MapStem); ! perror("xcal: mkdir"); ! fflush(stderr); ! return(False); ! } ! if (chdir(MapStem) < 0) ! { XBell(XtDisplay(toplevel), 0); ! fprintf(stderr, "xcal: Could not chdir into %s.\n", MapStem); ! perror("xcal: chdir"); ! fflush(stderr); ! return(False); ! } ! FoundCalendarDir = True; ! } fname = appResources.memoFile; if ((fd = open(fname, O_WRONLY|O_TRUNC|O_CREAT, 0666)) < 0) { XBell(XtDisplay(toplevel), 0); fprintf(stderr, "xcal: Could not open %s/%s for writing.\n", MapStem, fname); --- 498,508 ---- * First let's see if we have * to create the toplevel directory */ ! if (!NeedTop()) ! return (False); fname = appResources.memoFile; + if ((fd = open(fname, O_WRONLY|O_TRUNC|O_CREAT, 0666)) < 0) { XBell(XtDisplay(toplevel), 0); fprintf(stderr, "xcal: Could not open %s/%s for writing.\n", MapStem, fname); *************** *** 487,493 **** caddr_t call_data; { ! if (memoContents == NULL || strcmp(memoContents, memo.m_data)) { MemoCheckExit(); return; } --- 530,536 ---- caddr_t call_data; { ! if (memo.m_savesens == True) { MemoCheckExit(); return; } *** xcal_popup.c~ Fri Mar 22 23:34:56 1991 --- xcal_popup.c Fri Mar 22 23:48:24 1991 *************** *** 1,5 **** #ifndef lint ! static char *sccsid = "@(#)xcal_popup.c 3.4 (Hillside Systems) 12/12/90"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** --- 1,5 ---- #ifndef lint ! static char *sccsid = "@(#)xcal_popup.c 3.5 (Hillside Systems) 1/16/91"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** *************** *** 395,400 **** --- 395,413 ---- static char errmsg[32]; (void) sprintf(errmsg, "Already editing %d %s %d", da->day, appResources.mon[da->month], da->year); + + DialogPopup(w, NoEdit, errmsg); + + } + + void + NoDayEditIsPossible(w, day) + Widget w; + Cardinal day; + { + static char errmsg[32]; + + (void) sprintf(errmsg, "Already editing %s", appResources.day[day]); DialogPopup(w, NoEdit, errmsg); *** xcal_strip.c~ Fri Mar 22 23:34:54 1991 --- xcal_strip.c Fri Mar 22 23:48:23 1991 *************** *** 1,5 **** #ifndef lint ! static char *sccsid = "@(#)xcal_strip.c 3.6 (Hillside Systems) 12/7/90"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** --- 1,5 ---- #ifndef lint ! static char *sccsid = "@(#)xcal_strip.c 3.10 (Hillside Systems) 1/16/91"; static char *copyright = "@(#)Copyright 1989,1990 Peter Collinson, Hillside Systems"; #endif /* lint */ /*** *************** *** 45,55 **** */ void MakeMonth(); void DayBack(); ! #ifdef LONG_IS_32_BITS void YmBack(); #endif void StripQuit(); ! void MakeNewMonth(); Cardinal DateSum(); --- 45,56 ---- */ void MakeMonth(); void DayBack(); ! #ifndef LONG_IS_32_BITS void YmBack(); #endif void StripQuit(); ! void StripHelp(); ! void WeeklyHelp(); void MakeNewMonth(); Cardinal DateSum(); *************** *** 56,63 **** Cardinal NumberOfDays(); Cardinal FirstDay(); Cardinal JanuaryOne(); /* ! * Start a strip calendar happening * a callback of left button */ /* ARGSUSED */ --- 57,71 ---- Cardinal NumberOfDays(); Cardinal FirstDay(); Cardinal JanuaryOne(); + /* ! * Local routines ! */ ! static void CreateActionBar(); ! static void CreateWeeklyActionBar(); ! ! /* ! * Start a strip calendar happening * a callback of left button */ /* ARGSUSED */ *************** *** 70,75 **** --- 78,100 ---- NewMonthStrip(&today); /* today is global */ } + /* ARGSUSED */ + void + DoWeekly(w, closure, call_data) + Widget w; + caddr_t closure; + caddr_t call_data; + { + Date thisday; + + thisday.day = 0; + thisday.month = 0; + thisday.year = 0; + thisday.wday = 0; + NewMonthStrip(&thisday); /* today is global */ + } + + /* * Start a strip calendar happening * a callback of the > or < buttons in another strip *************** *** 112,125 **** Date *td; { Widget shell, mon, dw, lw, lwi, form; ! Arg args[15]; char nbuf[256]; char iconName[80]; MonthEntry *me; Instance *ins; register int i; register Cardinal nargs; Cardinal thisDay; String dayStr; Cardinal numberOfDays; Boolean defaultsAreSet = False; --- 137,152 ---- Date *td; { Widget shell, mon, dw, lw, lwi, form; ! Arg args[15]; char nbuf[256]; char iconName[80]; + int type; MonthEntry *me; Instance *ins; register int i; register Cardinal nargs; Cardinal thisDay; + Cardinal startLoop; String dayStr; Cardinal numberOfDays; Boolean defaultsAreSet = False; *************** *** 129,161 **** Dimension labelH, infoH; Dimension width; Dimension totalWidth; - void StripHelp(); ! (void) sprintf(iconName, "%s %d", appResources.smon[td->month], td->year); ! ! XtSetArg(args[0], XtNiconName, iconName); ! shell = XtCreatePopupShell(XtNewString(iconName), topLevelShellWidgetClass, toplevel, args, 1); ! ! ins = RegisterMonth(td->year, td->month, shell); ! ! mon = XtCreateManagedWidget(appResources.mon[td->month], panedWidgetClass, shell, NULL, 0); ! ! thisDay = FirstDay(td->month, td->year); ! numberOfDays = NumberOfDays(td->month, td->year); /* ! * Get the map for this year */ ! me = GetMonthEntry(td->year, td->month); /* - * Title bar is month and date - */ - (void) sprintf(nbuf, "%s %d", appResources.mon[td->month], td->year); - /* - * see if we will need to worry about marking today's entry - */ - if (appResources.markToday && td->year == today.year && td->month == today.month) - markThisMonth = True; - /* * Find size of title bar * by creating the widget and then throwing it away */ --- 156,221 ---- Dimension labelH, infoH; Dimension width; Dimension totalWidth; ! type = (td->day == 0) ? ME_WEEKLY : ME_MONTHLY; ! /* ! * There are lots of differences between ! * Months and weekly strips here. ! * Later tests are done using a switch structure */ ! switch (type) ! { ! case ME_MONTHLY: ! (void) sprintf(iconName, "%s %d", appResources.smon[td->month], td->year); ! XtSetArg(args[0], XtNiconName, iconName); ! shell = XtCreatePopupShell(XtNewString(iconName), topLevelShellWidgetClass, toplevel, args, 1); ! ins = RegisterMonth(td->year, td->month, shell); ! mon = XtCreateManagedWidget(appResources.mon[td->month], panedWidgetClass, shell, NULL, 0); ! thisDay = FirstDay(td->month, td->year); ! numberOfDays = NumberOfDays(td->month, td->year); ! startLoop = 1; ! /* ! * Get the map for this year ! */ ! me = GetMonthEntry(td->year, td->month); ! me->me_type = type; ! /* ! * Title bar is month and date ! */ ! (void) sprintf(nbuf, "%s %d", appResources.mon[td->month], td->year); ! /* ! * see if we will need to worry about marking today's entry ! */ ! if (appResources.markToday && td->year == today.year && td->month == today.month) ! markThisMonth = True; ! break; ! case ME_WEEKLY: ! (void) strcpy(iconName, appResources.weekly); ! XtSetArg(args[0], XtNiconName, iconName); ! shell = XtCreatePopupShell(XtNewString(iconName), topLevelShellWidgetClass, toplevel, args, 1); ! ins = RegisterMonth(0, 0, shell); ! mon = XtCreateManagedWidget(iconName, panedWidgetClass, shell, NULL, 0); ! thisDay = 0; ! numberOfDays = 6; /* test is <= */ ! startLoop = 0; ! /* ! * Get the map for this year ! */ ! me = GetWeeklyEntry(); ! me->me_type = type; ! /* ! * Title bar is from the resources ! */ ! strcpy(nbuf, iconName); ! /* ! * see if we will need to worry about marking today's entry ! */ ! if (appResources.markToday) ! markThisMonth = True; ! break; ! } /* * Find size of title bar * by creating the widget and then throwing it away */ *************** *** 185,245 **** XtSetArg(args[nargs], XtNdefaultDistance, 2); nargs++; dw = XtCreateManagedWidget("action", formWidgetClass, mon, args, nargs); ! /* ! * back one month ! * label "<" from resources ! */ ! callbacks[0].callback = MakeNewMonth; ! callbacks[0].closure = (caddr_t)DateSum(td, -1); ! nargs = 0; ! XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; ! XtSetArg(args[nargs], XtNfromHoriz, NULL); nargs++; ! XtSetArg(args[nargs], XtNleft, XtChainLeft); nargs++; ! XtSetArg(args[nargs], XtNright, XtChainLeft); nargs++; ! lw = XtCreateManagedWidget("back", commandWidgetClass, dw, args, nargs); ! ClearCallbacks(); ! ! /* ! * Quit button ! * label "quit" from resources ! */ ! callbacks[0].callback = StripQuit; ! callbacks[0].closure = (caddr_t)shell; ! nargs = 0; ! XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; ! XtSetArg(args[nargs], XtNfromHoriz, lw); nargs++; ! XtSetArg(args[nargs], XtNleft, XtChainLeft); nargs++; ! XtSetArg(args[nargs], XtNright, XtChainRight); nargs++; ! lw = XtCreateManagedWidget("quit", commandWidgetClass, dw, args, nargs); ! ClearCallbacks(); ! ! /* ! * On one month ! * label ">" from reources ! */ ! callbacks[0].callback = MakeNewMonth; ! callbacks[0].closure = (caddr_t)DateSum(td, 1); ! nargs = 0; ! XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; ! XtSetArg(args[nargs], XtNfromHoriz, lw); nargs++; ! XtSetArg(args[nargs], XtNleft, XtChainRight); nargs++; ! XtSetArg(args[nargs], XtNright, XtChainRight); nargs++; ! lw = XtCreateManagedWidget("next", commandWidgetClass, dw, args, nargs); ! ClearCallbacks(); ! ! /* ! * Help button ! * label help from resources ! */ ! if (appResources.giveHelp) ! { ! callbacks[0].callback = StripHelp; ! callbacks[0].closure = (caddr_t)0; ! nargs = 0; ! XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; ! XtSetArg(args[nargs], XtNshowGrip, False); nargs++; ! lw = XtCreateManagedWidget("help", commandWidgetClass, mon, args, nargs); ! ClearCallbacks(); } #ifdef LONG_IS_32_BITS --- 245,258 ---- XtSetArg(args[nargs], XtNdefaultDistance, 2); nargs++; dw = XtCreateManagedWidget("action", formWidgetClass, mon, args, nargs); ! switch (type) ! { ! case ME_MONTHLY: ! CreateActionBar(shell, dw, mon, td); ! break; ! case ME_WEEKLY: ! CreateWeeklyActionBar(shell, dw); ! break; } #ifdef LONG_IS_32_BITS *************** *** 248,265 **** callbacks[0].callback = YmBack; callbacks[1].callback = DayBack; #endif ! for (i = 1; i <= numberOfDays; i++) { ! dayStr = appResources.day[thisDay]; ! (void) sprintf(nbuf, "%2d %s", i, dayStr); ! thisDay = (thisDay+1)%7; ! #ifdef LONG_IS_32_BITS ! callbacks[0].closure = (caddr_t)DatePack(i, td->month, td->year); #else callbacks[0].closure = (caddr_t)DatePack(td->month, td->year); ! callbacks[1].closure = (caddr_t)i; #endif /* * Each line in the strip is * form containing --- 261,287 ---- callbacks[0].callback = YmBack; callbacks[1].callback = DayBack; #endif ! for (i = startLoop; i <= numberOfDays; i++) { ! dayStr = appResources.sday[thisDay]; ! switch(type) ! { ! case ME_MONTHLY: ! (void) sprintf(nbuf, "%2d %s", i, dayStr); ! break; ! case ME_WEEKLY: ! (void) strcpy(nbuf, dayStr); ! break; ! } #ifdef LONG_IS_32_BITS ! callbacks[0].closure = (caddr_t)DatePack(thisDay, i, td->month, td->year); #else callbacks[0].closure = (caddr_t)DatePack(td->month, td->year); ! callbacks[1].closure = (caddr_t)DayPack(thisDay, i); #endif + + thisDay = (thisDay+1)%7; + /* * Each line in the strip is * form containing *************** *** 288,294 **** * highlighting we get them after we have created the * widget. Then we highlight today. */ ! if (markThisMonth && today.day == i) { nargs = 0; XtSetArg(args[nargs], XtNforeground, &ins->i_col.fg); nargs++; --- 310,318 ---- * highlighting we get them after we have created the * widget. Then we highlight today. */ ! if (markThisMonth && ! ((type == ME_MONTHLY && today.day == i) || ! (type == ME_WEEKLY && today.wday == i))) { nargs = 0; XtSetArg(args[nargs], XtNforeground, &ins->i_col.fg); nargs++; *************** *** 372,377 **** --- 396,517 ---- } /* + * Create action bar for normal monthly strip + */ + static void + CreateActionBar(shell, dw, mon, td) + Widget shell; + Widget dw; + Widget mon; + Date *td; + { + Widget lw; + register Cardinal nargs; + Arg args[8]; + + /* + * back one month + * label "<" from resources + */ + callbacks[0].callback = MakeNewMonth; + callbacks[0].closure = (caddr_t)DateSum(td, -1); + nargs = 0; + XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; + XtSetArg(args[nargs], XtNfromHoriz, NULL); nargs++; + XtSetArg(args[nargs], XtNleft, XtChainLeft); nargs++; + XtSetArg(args[nargs], XtNright, XtChainLeft); nargs++; + lw = XtCreateManagedWidget("back", commandWidgetClass, dw, args, nargs); + ClearCallbacks(); + + /* + * Quit button + * label "quit" from resources + */ + callbacks[0].callback = StripQuit; + callbacks[0].closure = (caddr_t)shell; + nargs = 0; + XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; + XtSetArg(args[nargs], XtNfromHoriz, lw); nargs++; + XtSetArg(args[nargs], XtNleft, XtChainLeft); nargs++; + XtSetArg(args[nargs], XtNright, XtChainRight); nargs++; + lw = XtCreateManagedWidget("quit", commandWidgetClass, dw, args, nargs); + ClearCallbacks(); + + /* + * On one month + * label ">" from reources + */ + callbacks[0].callback = MakeNewMonth; + callbacks[0].closure = (caddr_t)DateSum(td, 1); + nargs = 0; + XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; + XtSetArg(args[nargs], XtNfromHoriz, lw); nargs++; + XtSetArg(args[nargs], XtNleft, XtChainRight); nargs++; + XtSetArg(args[nargs], XtNright, XtChainRight); nargs++; + lw = XtCreateManagedWidget("next", commandWidgetClass, dw, args, nargs); + ClearCallbacks(); + + /* + * Help button + * label help from resources + */ + if (appResources.giveHelp) + { + callbacks[0].callback = StripHelp; + callbacks[0].closure = (caddr_t)0; + nargs = 0; + XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; + XtSetArg(args[nargs], XtNshowGrip, False); nargs++; + lw = XtCreateManagedWidget("help", commandWidgetClass, mon, args, nargs); + ClearCallbacks(); + } + } + + /* + * Create action bar for normal monthly strip + */ + static void + CreateWeeklyActionBar(shell, dw) + Widget shell; + Widget dw; + { + Widget lw; + register Cardinal nargs; + Arg args[8]; + + /* + * Quit button + * label "quit" from resources + */ + callbacks[0].callback = StripQuit; + callbacks[0].closure = (caddr_t)shell; + nargs = 0; + XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; + XtSetArg(args[nargs], XtNfromHoriz, NULL); nargs++; + XtSetArg(args[nargs], XtNleft, XtChainLeft); nargs++; + XtSetArg(args[nargs], XtNright, appResources.giveHelp ? XtChainLeft: XtChainRight); nargs++; + lw = XtCreateManagedWidget("quit", commandWidgetClass, dw, args, nargs); + ClearCallbacks(); + + /* + * Help button + * label help from resources + */ + if (appResources.giveHelp) + { + callbacks[0].callback = WeeklyHelp; + callbacks[0].closure = (caddr_t)0; + nargs = 0; + XtSetArg(args[nargs], XtNcallback, callbacks); nargs++; + XtSetArg(args[nargs], XtNfromHoriz, lw); nargs++; + XtSetArg(args[nargs], XtNleft, XtChainLeft); nargs++; + XtSetArg(args[nargs], XtNright, XtChainRight); nargs++; + lw = XtCreateManagedWidget("help", commandWidgetClass, dw, args, nargs); + ClearCallbacks(); + } + } + + /* * Called when the date changes to ensure that * the correct day has the appropriate highlights */ *************** *** 445,451 **** y++; } #ifdef LONG_IS_32_BITS ! return(DatePack(0, m, y)); #else return(DatePack(m, y)); #endif --- 585,591 ---- y++; } #ifdef LONG_IS_32_BITS ! return(DatePack(0, 0, m, y)); #else return(DatePack(m, y)); #endif *************** *** 465,474 **** #ifdef LONG_IS_32_BITS callb.month = MoUnpack((Cardinal)closure); callb.year = YrUnpack((Cardinal)closure); - callb.day = DyUnpack((Cardinal)closure); - #else - callb.day = (Cardinal)closure; #endif StartEditing(w, &callb); } --- 605,613 ---- #ifdef LONG_IS_32_BITS callb.month = MoUnpack((Cardinal)closure); callb.year = YrUnpack((Cardinal)closure); #endif + callb.day = DyUnpack((Cardinal)closure); + callb.wday = WdUnpack((Cardinal)closure); StartEditing(w, &callb); } -- Dan Heller O'Reilly && Associates Z-Code Software Comp-sources-x: Senior Writer President comp-sources.x@uunet.uu.net argv@ora.com argv@zipcode.com