summaryrefslogtreecommitdiff
path: root/Utilities/cmpdcurses/pdcurses/kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'Utilities/cmpdcurses/pdcurses/kernel.c')
-rw-r--r--Utilities/cmpdcurses/pdcurses/kernel.c297
1 files changed, 297 insertions, 0 deletions
diff --git a/Utilities/cmpdcurses/pdcurses/kernel.c b/Utilities/cmpdcurses/pdcurses/kernel.c
new file mode 100644
index 0000000000..81915e738a
--- /dev/null
+++ b/Utilities/cmpdcurses/pdcurses/kernel.c
@@ -0,0 +1,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();
+}