|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T s ┃
Length: 4419 (0x1143) Types: TextFile Names: »save.c«
└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen └─ ⟦this⟧ »cph85dist/wm/save.c«
/* ************* * DISTRIBUTION NOTICE July 30 1985 * A Revised Edition of WM, by Matt Lennon and Tom Truscott, * Research Triangle Institute, (919) 541-7005. * Based on the original by Robert Jacob (decvax!nrl-css!jacob), * Naval Research Laboratory, (202) 767-3365. * No claims or warranties of any sort are made for this distribution. * General permission is granted to copy, but not for profit, * any of this distribution, provided that this notice * is always included in the copies. ************* */ /* * save.c M. Lennon 2/07/85 * Save and restore windows between WM sessions. */ #include "wm.h" /* Save windows from this session in HOME/.wmrc. * * Produces an ascii file containing info * necessary for restoring windows in next WM session. */ Save(file) char *file; /* name of save file */ { register FILE *fp; /* save file pointer */ register WINDOW *w; register int i; if (*file == '\0') return(FALSE); if ((fp=fopen(file,"w")) == NULL) return(FALSE); fprintf(fp, "%s\n", mkprint(prefix)); for (i=botw; i>=0; i=win[i].next) { w = win[i].wptr; fprintf(fp, "%d %d %d %d %d\n", i, (win[i].flags&YFLEX)? 0: wlines(w), (win[i].flags&XFLEX)? 0: wcols(w), wbegy(w), wbegx(w)); } (void)fclose(fp); return(TRUE); } /* * Restore windows from previous session * as stored in ~/.wmrc. * Returns number of windows restored (0 on error). */ Restore(file) char *file; /* name of restore file */ { register FILE *fp; /* restore file pointer */ int w; /* window index */ int lines, cols, begline, begcol; /* window parameters */ int count; /* number of windows restored */ int lshrink, cshrink; /* amount that windows must be shrunk to fit */ int rc; /* temporary to hold return code from fscanf */ char ccbuf[10], tbuf[100]; /* temporary buffers */ register char *p; /* temp pointer into tbuf */ /* Open save/restore file. */ if (*file == '\0') return(0); if ((fp=fopen(file,"r")) == NULL) { showmsg("\007Cannot read '%s'.", file); sleep(2); return(0); } /* Read first line of ~/.wmrc to get the WM prefix character. */ if (fscanf(fp,"%2s%1[\n]", ccbuf, tbuf) != 2) { (void)fclose(fp); showmsg("\007Bad .wmrc file '%s'.", file); sleep(2); return(0); } if (ccbuf[0]=='^' && ccbuf[1]) prefix = (ccbuf[1]=='?' ? '\177' : ccbuf[1]-0100); else prefix = ccbuf[0]; /* Restore the windows. * Stop trying if input error encountered. */ count = 0; for (;;) { /* Read window parameters. * Check for end of file, format error, * bad window name, and bad window dimensions. */ rc = fscanf(fp,"%d%d%d%d%d%1[\n]", &w,&lines,&cols,&begline,&begcol,tbuf); if (rc == EOF) break; if (rc != 6 || lines < 0 || cols < 0 || begline < 0 || begcol < 0 || w < MINWINDOW || w >= MAXWINDOWS || (win[w].flags&INUSE)) { showmsg("\007Bad window entry, file '%s'.", file); sleep(2); break; } /* * check for "flex" windows */ if (lines == 0 && begline == 0) { lines = LINES-1; win[w].flags |= YFLEX; } if (cols == 0 && begcol == 0) { cols = COLS; win[w].flags |= XFLEX; } /* Check for windows which are beyond this screen */ /* Bug: if .wmrc is updated these windows are omitted! */ if (begline >= LINES-1 || begcol >= COLS) { showmsg("\007Window #%d is off this screen.", w); sleep(2); continue; } /* Check for windows which must be shrunk to fit */ /* Bug(?): if .wmrc is updated the new sizes are saved */ lshrink = cshrink = 0; if (begline+lines > LINES-1) { lshrink = begline+lines-(LINES-1); lines -= lshrink; } if (begcol+cols > COLS) { cshrink = begcol+cols-COLS; cols -= cshrink; } if (lshrink+cshrink) { p = tbuf; (void)sprintf(p, "\007Window #%d shrunk by", w); p += strlen(p); if (lshrink) { (void)sprintf(p, " %d line%s%s", lshrink, plural(lshrink), cshrink? " and": ""); p += strlen(p); } if (cshrink) { (void)sprintf(p, " %d column%s", cshrink, plural(cshrink)); p += strlen(p); } (void)sprintf(p, "."); showmsg("%s", tbuf); sleep(2); } /* Construct new window. */ if (NewWindow(w,lines,cols,begline,begcol)) continue; /* cannot happen? */ WListAdd(w); count++; } (void)fclose(fp); return(count); }