home *** CD-ROM | disk | FTP | other *** search
- /*
- Listing 12.7. An improved version of SaveEnv() that can assign cursor
- and color settings and save a specified region of the screen
- Listing 12.8. An improved version of RestEnv() that allows for a
- region to be restored instead of the entire screen.
- Author: Greg Lief / Craig Yellick
- Excerpted from "Clipper 5: A Developer's Guide"
- Copyright (c) 1991 M&T Books
- 501 Galveston Drive
- Redwood City, CA 94063-4728
- (415) 366-3600
- */
-
-
- *** NOTE: Function requires SaveEnv() to be in same file to share
- *** the ENVSTACK_ static variable.
- memvar envstack_
-
- // Manifest constants used by SaveEnv() and RestEnv().
- #define TOP coords[1]
- #define LEFT coords[2]
- #define BOTTOM coords[3]
- #define RIGHT coords[4]
- #define NTOP envstack_[ele, SCREEN][1]
- #define NLEFT envstack_[ele, SCREEN][2]
- #define NBOTTOM envstack_[ele, SCREEN][3]
- #define NRIGHT envstack_[ele, SCREEN][4]
- #define NSCREEN envstack_[ele, SCREEN][5]
-
- #define ROW 1
- #define COLUMN 2
- #define CURSOR 3
- #define COLOR 4
- #define SCREEN 5
-
- function SaveEnv(scrn_save, curs_size, newcolor)
- /*
- Save cursor row/column/size, color, and screen.
-
- Syntax: SaveEnv( <coords>, <cursorsize>, <color> )
- All parameters are optional
-
- Parameters:
- <coords> can be one of three things:
- Nil -- do not save the screen.
- Array -- four numeric expressions representing
- the screen coordinates to be saved.
- Other -- save the entire screen.
-
- <cursorsize> is a numeric representing the new cursor
- size to use. If not passed, the cursor size will
- be left unchanged. Refer to SETCURS.CH for the
- appropriate definitions. Use a comma if you want
- to skip this parameter.
-
- <color> is a character string representing the new color
- setting to use. If not passed, the color will be left
- unchanged.
-
- Examples:
- ---------
-
- #include "setcurs.ch"
-
- // Do not save screen, turn off cursor,
- // change color to W/B.
- SaveEnv(, SC_NONE, 'w/b')
-
- // Save full screen, don't change cursor,
- // change color to R/W.
- SaveEnv(.t., , 'r/w')
-
- // Save screen buffer between coordinates 10,10 and 4,69,
- // turn off cursor, leave color unchanged.
- SaveEnv( { 10, 10, 14, 69 }, SC_NONE)
- */
-
- local coords := ;
- if(scrn_save = NIL .or. valtype(scrn_save) =="A", ;
- scrn_save, { 0, 0, maxrow(), maxcol() } )
-
- aadd(envstack_, ;
- { row(), col(), ;
- setcursor(curs_size), setcolor(newcolor), ;
- if(valtype(coords) = "A", { TOP, LEFT, BOTTOM, RIGHT, ;
- savescreen(TOP, LEFT, BOTTOM, RIGHT) }, ;
- NIL) ;
- })
-
- return nil
-
- * eof
-
- function RestEnv()
- /*
- Restore cursor row/column/size, color, and screen.
- */
-
- local ele := len(envstack_)
-
- // Avoid an empty array.
- if ele > 0
-
- // Restore row/column position.
- setpos(envstack_[ele, ROW], envstack_[ele, COLUMN])
-
- // Reset cursor state.
- setcursor(envstack_[ele, CURSOR])
-
- // Restore color.
- setcolor(envstack_[ele, COLOR])
-
- // Restore screen if it was saved.
- if envstack_[ele, SCREEN] != NIL
- restscreen(NTOP, NLEFT, NBOTTOM, NRIGHT, NSCREEN)
- endif
-
- // Truncate the array
- asize(envstack_, len(envstack_) - 1)
- endif
-
- return nil
-
- // end of file CHP1207.PRG
-