123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- /* PDCurses */
- #include <curspriv.h>
- /*man-start**************************************************************
- kernel
- ------
- ### Synopsis
- int def_prog_mode(void);
- int def_shell_mode(void);
- int reset_prog_mode(void);
- int reset_shell_mode(void);
- int resetty(void);
- int savetty(void);
- int ripoffline(int line, int (*init)(WINDOW *, int));
- int curs_set(int visibility);
- int napms(int ms);
- int draino(int ms);
- int resetterm(void);
- int fixterm(void);
- int saveterm(void);
- ### Description
- def_prog_mode() and def_shell_mode() save the current terminal modes
- as the "program" (in curses) or "shell" (not in curses) state for use
- by the reset_prog_mode() and reset_shell_mode() functions. This is
- done automatically by initscr().
- reset_prog_mode() and reset_shell_mode() restore the terminal to
- "program" (in curses) or "shell" (not in curses) state. These are
- done automatically by endwin() and doupdate() after an endwin(), so
- they would normally not be called before these functions.
- savetty() and resetty() save and restore the state of the terminal
- modes. savetty() saves the current state in a buffer, and resetty()
- restores the state to what it was at the last call to savetty().
- curs_set() alters the appearance of the cursor. A visibility of 0
- makes it disappear; 1 makes it appear "normal" (usually an underline)
- and 2 makes it "highly visible" (usually a block).
- ripoffline() reduces the size of stdscr by one line. If the "line"
- parameter is positive, the line is removed from the top of the
- screen; if negative, from the bottom. Up to 5 lines can be ripped off
- stdscr by calling ripoffline() repeatedly. The function argument,
- init, is called from within initscr() or newterm(), so ripoffline()
- must be called before either of these functions. The init function
- receives a pointer to a one-line WINDOW, and the width of the window.
- Calling ripoffline() with a NULL init function pointer is an error.
- napms() suspends the program for the specified number of
- milliseconds. draino() is an archaic equivalent. Note that since
- napms() attempts to give up a time slice and yield control back to
- the OS, all times are approximate. (In DOS, the delay is actually
- rounded down to 50ms (1/20th sec) intervals, with a minimum of one
- interval; i.e., 1-99 will wait 50ms, 100-149 will wait 100ms, etc.)
- 0 returns immediately.
- resetterm(), fixterm() and saveterm() are archaic equivalents for
- reset_shell_mode(), reset_prog_mode() and def_prog_mode(),
- respectively.
- ### Return Value
- All functions return OK on success and ERR on error, except
- curs_set(), which returns the previous visibility.
- ### Portability
- X/Open ncurses NetBSD
- def_prog_mode Y Y Y
- def_shell_mode Y Y Y
- reset_prog_mode Y Y Y
- reset_shell_mode Y Y Y
- resetty Y Y Y
- savetty Y Y Y
- ripoffline Y Y Y
- curs_set Y Y Y
- napms Y Y Y
- fixterm - Y -
- resetterm - Y -
- saveterm - Y -
- draino - - -
- **man-end****************************************************************/
- #include <string.h>
- RIPPEDOFFLINE linesripped[5];
- char linesrippedoff = 0;
- static struct cttyset
- {
- bool been_set;
- SCREEN saved;
- } ctty[3];
- enum { PDC_SH_TTY, PDC_PR_TTY, PDC_SAVE_TTY };
- static void _save_mode(int i)
- {
- ctty[i].been_set = TRUE;
- memcpy(&(ctty[i].saved), SP, sizeof(SCREEN));
- PDC_save_screen_mode(i);
- }
- static int _restore_mode(int i)
- {
- if (ctty[i].been_set == TRUE)
- {
- memcpy(SP, &(ctty[i].saved), sizeof(SCREEN));
- if (ctty[i].saved.raw_out)
- raw();
- PDC_restore_screen_mode(i);
- if ((LINES != ctty[i].saved.lines) ||
- (COLS != ctty[i].saved.cols))
- resize_term(ctty[i].saved.lines, ctty[i].saved.cols);
- PDC_curs_set(ctty[i].saved.visibility);
- PDC_gotoyx(ctty[i].saved.cursrow, ctty[i].saved.curscol);
- }
- return ctty[i].been_set ? OK : ERR;
- }
- int def_prog_mode(void)
- {
- PDC_LOG(("def_prog_mode() - called\n"));
- if (!SP)
- return ERR;
- _save_mode(PDC_PR_TTY);
- return OK;
- }
- int def_shell_mode(void)
- {
- PDC_LOG(("def_shell_mode() - called\n"));
- if (!SP)
- return ERR;
- _save_mode(PDC_SH_TTY);
- return OK;
- }
- int reset_prog_mode(void)
- {
- PDC_LOG(("reset_prog_mode() - called\n"));
- if (!SP)
- return ERR;
- _restore_mode(PDC_PR_TTY);
- PDC_reset_prog_mode();
- return OK;
- }
- int reset_shell_mode(void)
- {
- PDC_LOG(("reset_shell_mode() - called\n"));
- if (!SP)
- return ERR;
- _restore_mode(PDC_SH_TTY);
- PDC_reset_shell_mode();
- return OK;
- }
- int resetty(void)
- {
- PDC_LOG(("resetty() - called\n"));
- if (!SP)
- return ERR;
- return _restore_mode(PDC_SAVE_TTY);
- }
- int savetty(void)
- {
- PDC_LOG(("savetty() - called\n"));
- if (!SP)
- return ERR;
- _save_mode(PDC_SAVE_TTY);
- return OK;
- }
- int curs_set(int visibility)
- {
- int ret_vis;
- PDC_LOG(("curs_set() - called: visibility=%d\n", visibility));
- if (!SP || visibility < 0 || visibility > 2)
- return ERR;
- ret_vis = PDC_curs_set(visibility);
- /* If the cursor is changing from invisible to visible, update
- its position */
- if (visibility && !ret_vis)
- PDC_gotoyx(SP->cursrow, SP->curscol);
- return ret_vis;
- }
- int napms(int ms)
- {
- PDC_LOG(("napms() - called: ms=%d\n", ms));
- if (!SP)
- return ERR;
- if (SP->dirty)
- {
- int curs_state = SP->visibility;
- bool leave_state = is_leaveok(curscr);
- SP->dirty = FALSE;
- leaveok(curscr, TRUE);
- wrefresh(curscr);
- leaveok(curscr, leave_state);
- curs_set(curs_state);
- }
- if (ms)
- PDC_napms(ms);
- return OK;
- }
- int ripoffline(int line, int (*init)(WINDOW *, int))
- {
- PDC_LOG(("ripoffline() - called: line=%d\n", line));
- if (linesrippedoff < 5 && line && init)
- {
- linesripped[(int)linesrippedoff].line = line;
- linesripped[(int)linesrippedoff++].init = init;
- return OK;
- }
- return ERR;
- }
- int draino(int ms)
- {
- PDC_LOG(("draino() - called\n"));
- return napms(ms);
- }
- int resetterm(void)
- {
- PDC_LOG(("resetterm() - called\n"));
- return reset_shell_mode();
- }
- int fixterm(void)
- {
- PDC_LOG(("fixterm() - called\n"));
- return reset_prog_mode();
- }
- int saveterm(void)
- {
- PDC_LOG(("saveterm() - called\n"));
- return def_prog_mode();
- }
|