diff options
author | 1996-06-02 06:04:50 +0000 | |
---|---|---|
committer | 1996-06-02 06:04:50 +0000 | |
commit | ca751a4c440c24b9feedffffe0dd93cc1e00ab0c (patch) | |
tree | 3ce3bce27611f188dc5c8a99bd9a2e9f5addfcc7 /lib/libcurses/lib_slk.c | |
parent | Add LIBOLDCURSES (diff) | |
download | wireguard-openbsd-ca751a4c440c24b9feedffffe0dd93cc1e00ab0c.tar.xz wireguard-openbsd-ca751a4c440c24b9feedffffe0dd93cc1e00ab0c.zip |
Install ncurses as -lcurses and <curses.h>
Install BSD curses library as -locurses and <ocurses.h>
Diffstat (limited to 'lib/libcurses/lib_slk.c')
-rw-r--r-- | lib/libcurses/lib_slk.c | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/lib/libcurses/lib_slk.c b/lib/libcurses/lib_slk.c new file mode 100644 index 00000000000..973a3ab6ae3 --- /dev/null +++ b/lib/libcurses/lib_slk.c @@ -0,0 +1,328 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* + * lib_slk.c + * Soft key routines. + */ + +#include "curses.priv.h" +#include <string.h> +#include <stdlib.h> +#include "term.h" /* num_labels, label_*, plab_norm */ + +#define MAX_SKEY 8 /* count of soft keys */ +#define MAX_SKEY_LEN 8 /* max length of soft key text */ + +/* + * We'd like to move these into the screen context structure, but cannot, + * because slk_init() is called before initscr()/newterm(). + */ +int _slk_init; /* TRUE if slk_init() called */ + +static int _slk_format; /* format specified in slk_init() */ +static chtype _slk_attr = A_STANDOUT; /* soft label attribute */ +static int maxlab; /* number of labels */ +static int maxlen; /* maximum length of label */ + +/* + * Fetch the label text. + */ + +char * +slk_label(int n) +{ + T(("slk_label(%d)", n)); + + if (SP->_slk == NULL || n < 1 || n > MAX_SKEY) + return NULL; + return(SP->_slk->ent[n-1].text); +} + +/* + * Write the soft labels to the soft-key window. + */ + +static void +slk_intern_refresh(SLK *slk) +{ +int i; + for (i = 0; i < MAX_SKEY; i++) { + if (slk->dirty || slk->ent[i].dirty) { + if (slk->ent[i].visible) { +#ifdef num_labels + if (num_labels > 0) + { + TPUTS_TRACE("plab_norm"); + putp(tparm(plab_norm, i, slk->win,slk->ent[i].form_text)); + } + else +#endif /* num_labels */ + { + wmove(slk->win,0,slk->ent[i].x); + wattrset(slk->win,_slk_attr); + waddstr(slk->win,slk->ent[i].form_text); + wattrset(slk->win,A_NORMAL); + } + } + slk->ent[i].dirty = FALSE; + } + } + slk->dirty = FALSE; + +#ifdef num_labels + if (num_labels > 0) + if (slk->hidden) + { + TPUTS_TRACE("label_off"); + putp(label_off); + } + else + { + TPUTS_TRACE("label_on"); + putp(label_on); + } +#endif /* num_labels */ +} + +/* + * Refresh the soft labels. + */ + +int +slk_noutrefresh(void) +{ + T(("slk_noutrefresh()")); + + if (SP->_slk == NULL) + return(ERR); + if (SP->_slk->hidden) + return(OK); + slk_intern_refresh(SP->_slk); + return(wnoutrefresh(SP->_slk->win)); +} + +/* + * Refresh the soft labels. + */ + +int +slk_refresh(void) +{ + T(("slk_refresh()")); + + if (SP->_slk == NULL) + return(ERR); + if (SP->_slk->hidden) + return(OK); + slk_intern_refresh(SP->_slk); + return(wrefresh(SP->_slk->win)); +} + +/* + * Restore the soft labels on the screen. + */ + +int +slk_restore(void) +{ + T(("slk_restore()")); + + if (SP->_slk == NULL) + return(ERR); + SP->_slk->hidden = FALSE; + SP->_slk->dirty = TRUE; + return slk_refresh(); +} + +/* + * Set soft label text. + */ + +int +slk_set(int i, const char *astr, int format) +{ +SLK *slk = SP->_slk; +size_t len; +const char *str = astr; + + T(("slk_set(%d, \"%s\", %d)", i, str, format)); + + if (slk == NULL || i < 1 || i > maxlab || format < 0 || format > 2) + return(ERR); + if (str == NULL) + str = ""; + --i; + (void) strncpy(slk->ent[i].text, str, (unsigned)maxlen); + memset(slk->ent[i].form_text,' ', (unsigned)maxlen); + slk->ent[i].text[maxlen] = 0; + slk->ent[i].form_text[maxlen] = 0; + len = strlen(slk->ent[i].text); + + switch(format) { + case 0: /* left-justified */ + memcpy(slk->ent[i].form_text, + slk->ent[i].text, + len); + break; + case 1: /* centered */ + memcpy(slk->ent[i].form_text+(MAX_SKEY_LEN-len)/2, + slk->ent[i].text, + len); + break; + case 2: /* right-justified */ + memcpy(slk->ent[i].form_text+MAX_SKEY_LEN-len, + slk->ent[i].text, + len); + break; + } + slk->ent[i].dirty = TRUE; + return(OK); +} + +/* + * Force the code to believe that the soft keys have been changed. + */ + +int +slk_touch(void) +{ + T(("slk_touch()")); + + if (SP->_slk == NULL) + return(ERR); + SP->_slk->dirty = TRUE; + return(OK); +} + +/* + * Remove soft labels from the screen. + */ + +int +slk_clear(void) +{ + T(("slk_clear()")); + + if (SP->_slk == NULL) + return(ERR); + SP->_slk->hidden = TRUE; + werase(SP->_slk->win); + return wrefresh(SP->_slk->win); +} + +/* + * Initialize soft labels. + * Called from newterm() + */ + +int +slk_initialize(WINDOW *stwin, int cols) +{ +SLK *slk; +int i, x; + + T(("slk_initialize()")); + + if ((SP->_slk = slk = (SLK*) calloc(1,sizeof(SLK))) == NULL) + return(OK); + +#ifdef num_labels + maxlab = (num_labels > 0) ? num_labels : MAX_SKEY; + maxlen = (num_labels > 0) ? label_width * label_height : MAX_SKEY_LEN; +#else + maxlab = MAX_SKEY; + maxlen = MAX_SKEY_LEN; +#endif /* num_labels */ + + for (i = 0; i < MAX_SKEY; i++) { + memset(slk->ent[i].form_text, ' ', (unsigned)maxlen); + slk->ent[i].visible = i < maxlab; + } + if (_slk_format == 1) { /* 4-4 */ + int gap = cols - (MAX_SKEY * MAX_SKEY_LEN) - 6; + + if (gap < 1) + gap = 1; + for (i = x = 0; i < MAX_SKEY; i++) { + slk->ent[i].x = x; + x += MAX_SKEY_LEN; + x += (i == 3) ? gap : 1; + } + } + else { /* 0 -> 3-2-3 */ + int gap = (cols - (MAX_SKEY * MAX_SKEY_LEN) - 5) / 2; + + if (gap < 1) + gap = 1; + for (i = x = 0; i < MAX_SKEY; i++) { + slk->ent[i].x = x; + x += MAX_SKEY_LEN; + x += (i == 2 || i == 4) ? gap : 1; + } + } + slk->dirty = TRUE; + if ((slk->win = stwin) == NULL) + { + free(slk); + return(ERR); + } + + return(OK); +} + +/* + * Initialize soft labels. Called by the user before initscr(). + */ + +int +slk_init(int format) +{ + if (format < 0 || format > 1) + return(ERR); + _slk_format = format; + _slk_init = TRUE; + return(OK); +} + +/* Functions to manipulate the soft-label attribute */ + +int +slk_attrset(attr_t attr) +{ + _slk_attr = attr; + return(OK); +} + +int +slk_attron(attr_t attr) +{ + _slk_attr |= attr; + return(OK); +} + +int +slk_attroff(attr_t attr) +{ + _slk_attr &=~ attr; + return(OK); +} + |