1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
|
/* 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();
}
|