2017-11-17 20:12:59 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* apps/graphics/pdcurses/pdc_kernel.c
|
|
|
|
*
|
2022-03-09 15:48:47 +01:00
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
|
|
* this work for additional information regarding copyright ownership. The
|
|
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
|
|
* "License"); you may not use this file except in compliance with the
|
|
|
|
* License. You may obtain a copy of the License at
|
2017-11-17 20:12:59 +01:00
|
|
|
*
|
2022-03-09 15:48:47 +01:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2017-11-17 20:12:59 +01:00
|
|
|
*
|
2022-03-09 15:48:47 +01:00
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
* License for the specific language governing permissions and limitations
|
|
|
|
* under the License.
|
2017-11-17 20:12:59 +01:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
2022-03-09 15:48:47 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* Adapted from the original public domain pdcurses by Gregory Nutt
|
|
|
|
****************************************************************************/
|
|
|
|
|
2017-11-17 20:12:59 +01:00
|
|
|
/* Name: 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).
|
|
|
|
*
|
2017-11-17 20:23:02 +01:00
|
|
|
* 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
|
2017-11-17 20:12:59 +01:00
|
|
|
* NULL init function pointer is an error.
|
|
|
|
*
|
2017-11-17 20:23:02 +01:00
|
|
|
* napms() suspends the program for the specified number of
|
2017-11-17 20:12:59 +01:00
|
|
|
* milliseconds. draino() is an archaic equivalent.
|
|
|
|
*
|
|
|
|
* 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 BSD SYS V
|
|
|
|
* 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 - 3.0
|
|
|
|
* curs_set Y - 3.0
|
|
|
|
* napms Y Y Y
|
|
|
|
* draino -
|
|
|
|
* resetterm -
|
|
|
|
* fixterm -
|
|
|
|
* saveterm -
|
|
|
|
*/
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Included Files
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "curspriv.h"
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Types
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
PDC_SH_TTY, PDC_PR_TTY, PDC_SAVE_TTY
|
|
|
|
};
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Public Data
|
|
|
|
****************************************************************************/
|
|
|
|
|
2019-01-05 20:25:12 +01:00
|
|
|
#ifndef CONFIG_PDCURSES_MULTITHREAD
|
2017-11-17 20:12:59 +01:00
|
|
|
RIPPEDOFFLINE linesripped[5];
|
|
|
|
char linesrippedoff = 0;
|
2019-01-05 20:25:12 +01:00
|
|
|
#endif
|
2017-11-17 20:12:59 +01:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Data
|
|
|
|
****************************************************************************/
|
|
|
|
|
2019-01-05 20:25:12 +01:00
|
|
|
#ifndef CONFIG_PDCURSES_MULTITHREAD
|
|
|
|
static struct cttyset ctty[3];
|
|
|
|
#endif
|
2017-11-17 20:12:59 +01:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Functions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static void _save_mode(int i)
|
|
|
|
{
|
2019-01-05 20:25:12 +01:00
|
|
|
#ifdef CONFIG_PDCURSES_MULTITHREAD
|
|
|
|
FAR struct pdc_context_s *ctx = PDC_ctx();
|
|
|
|
#endif
|
2017-11-17 20:12:59 +01:00
|
|
|
ctty[i].been_set = true;
|
|
|
|
|
|
|
|
memcpy(&(ctty[i].saved), SP, sizeof(SCREEN));
|
|
|
|
|
|
|
|
PDC_save_screen_mode(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int _restore_mode(int i)
|
|
|
|
{
|
2019-01-05 20:25:12 +01:00
|
|
|
#ifdef CONFIG_PDCURSES_MULTITHREAD
|
|
|
|
FAR struct pdc_context_s *ctx = PDC_ctx();
|
|
|
|
#endif
|
2017-11-17 20:12:59 +01:00
|
|
|
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"));
|
|
|
|
|
|
|
|
_save_mode(PDC_PR_TTY);
|
|
|
|
return OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int def_shell_mode(void)
|
|
|
|
{
|
|
|
|
PDC_LOG(("def_shell_mode() - called\n"));
|
|
|
|
|
|
|
|
_save_mode(PDC_SH_TTY);
|
|
|
|
return OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int reset_prog_mode(void)
|
|
|
|
{
|
|
|
|
PDC_LOG(("reset_prog_mode() - called\n"));
|
|
|
|
|
|
|
|
_restore_mode(PDC_PR_TTY);
|
|
|
|
PDC_reset_prog_mode();
|
|
|
|
return OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int reset_shell_mode(void)
|
|
|
|
{
|
|
|
|
PDC_LOG(("reset_shell_mode() - called\n"));
|
|
|
|
|
|
|
|
_restore_mode(PDC_SH_TTY);
|
|
|
|
PDC_reset_shell_mode();
|
|
|
|
return OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int resetty(void)
|
|
|
|
{
|
|
|
|
PDC_LOG(("resetty() - called\n"));
|
|
|
|
|
|
|
|
return _restore_mode(PDC_SAVE_TTY);
|
|
|
|
}
|
|
|
|
|
|
|
|
int savetty(void)
|
|
|
|
{
|
|
|
|
PDC_LOG(("savetty() - called\n"));
|
|
|
|
|
|
|
|
_save_mode(PDC_SAVE_TTY);
|
|
|
|
return OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int curs_set(int visibility)
|
|
|
|
{
|
|
|
|
int ret_vis;
|
2019-01-05 20:25:12 +01:00
|
|
|
#ifdef CONFIG_PDCURSES_MULTITHREAD
|
|
|
|
FAR struct pdc_context_s *ctx = PDC_ctx();
|
|
|
|
#endif
|
2017-11-17 20:12:59 +01:00
|
|
|
|
|
|
|
PDC_LOG(("curs_set() - called: visibility=%d\n", visibility));
|
|
|
|
|
|
|
|
if ((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 (ms)
|
|
|
|
{
|
|
|
|
PDC_napms(ms);
|
|
|
|
}
|
|
|
|
|
|
|
|
return OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ripoffline(int line, int (*init) (WINDOW *, int))
|
|
|
|
{
|
2019-01-05 20:25:12 +01:00
|
|
|
#ifdef CONFIG_PDCURSES_MULTITHREAD
|
|
|
|
FAR struct pdc_context_s *ctx = PDC_ctx();
|
|
|
|
#endif
|
2017-11-17 20:12:59 +01:00
|
|
|
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();
|
|
|
|
}
|