home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS - Coast to Coast
/
simteldosarchivecoasttocoast.iso
/
eel
/
winconf.e
< prev
Wrap
Text File
|
1994-03-04
|
4KB
|
127 lines
/************************************************************************
* "Epsilon", "EEL" and "Lugaru" are trademarks of Lugaru Software, Ltd. *
* *
* Copyright (C) 1989-1990 Lugaru Software Ltd. All rights reserved. *
* *
* Limited permission is hereby granted to reproduce and modify this *
* copyrighted material provided that the resulting code is used only in *
* conjunction with Lugaru products and that this notice is retained in *
* any such reproduction or modification. *
************************************************************************/
#include "eel.h"
/* This file demonstrates how to save & restore a particular window
configuration. It provides two subroutines: do_save_window() saves, and
do_restore_windows() restores, a particular arrangement of windows.
The subroutines don't restore any buffer-to-window mappings, or deal with
the possibility that the screen size may be different now.
For testing purposes, it provides two commands save-window and
restore-window, on A-F-1 and A-F-2 respectively.
*/
#define WINFO_SIZE 200 /* size of char array with window info */
#define DEMO
#ifdef DEMO
char window_info[WINFO_SIZE];
command save_windows() on reg_tab[FALT(1)] /* demo commands */
{
do_save_windows(window_info);
say("Save as %s", window_info);
}
command restore_windows() on reg_tab[FALT(2)]
{
say("Restore %s", window_info);
do_restore_windows(window_info);
}
#endif
/*
Window configurations are stored in a string as a series of commands,
each consisting of a letter H, V, or G, and a number n. H or V means
split the current window horizontally or vertically, and make the
size of the child window be n. G means go to window n.
*/
do_restore_windows(p) /* restore window pattern from p */
char *p;
{
int n, old;
window_one();
for (; *p; p++) {
n = strtoi(p + 1, 10);
switch (*p) {
case 'V': old = window_width;
window_split(VERTICAL);
window_width = old - n;
break;
case 'H': old = window_height;
window_split(HORIZONTAL);
window_height = old - n;
break;
case 'G': window_number = n;
break;
}
}
}
do_save_windows(p) /* save window configuration in p */
char *p;
{
int orig = window_number;
*p = 0;
get_win_info(p, 0, number_of_windows(), 0, screen_cols - 1,
0, screen_lines - 2);
p += strlen(p);
sprintf(p, "G%d", orig);
window_number = orig;
}
/*
Scan range of windows, looking for first that stretches to final column
or line. That tells whether the first split in the range was horiz or vert.
Next, move forward until past that whole rectangle, then record the first
split in p, and recurse for both subwindows.
*/
get_win_info(p, from, to, fcol, lcol, fline, lline)
char *p;
{
int col, line, hitbot, hitright, w;
if (from >= to)
return;
for (w = from; w < to; w++) {
window_number = w;
hitright = (lcol == window_edge(HORIZONTAL, BOTTOMRIGHT));
hitbot = (lline == window_edge(VERTICAL, BOTTOMRIGHT));
if (hitbot || hitright)
break; /* look for top-right or bottom-left corner */
} /* of some full-size rectangle */
if (hitbot && hitright) /* easy, found bottom-right corner */
return;
p += strlen(p); /* now get past other windows in rect */
for (w++; w < to; w++) {
window_number = w;
col = window_edge(HORIZONTAL, TOPLEFT);
line = window_edge(VERTICAL, TOPLEFT);
if (hitbot && fline == line) {
sprintf(p, "G%dV%d", from, col - fcol);
get_win_info(p, from, w, fcol, col - 1, fline, lline);
get_win_info(p, w, to, col, lcol, fline, lline);
return;
}
if (hitright && fcol == col) {
sprintf(p, "G%dH%d", from, line - fline);
get_win_info(p, from, w, fcol, lcol, fline, line - 1);
get_win_info(p, w, to, fcol, lcol, line, lline);
return;
}
}
}