summaryrefslogtreecommitdiffstats
path: root/lib/libncurses/lib_slk.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1994-10-07 08:58:58 +0000
committerache <ache@FreeBSD.org>1994-10-07 08:58:58 +0000
commita80c0624fbd8bd1c784b0b5b7a0fd20b09d317b9 (patch)
tree4a94ca97fb2fc2fdc1fcdd522a66e39c6e763138 /lib/libncurses/lib_slk.c
downloadFreeBSD-src-a80c0624fbd8bd1c784b0b5b7a0fd20b09d317b9.zip
FreeBSD-src-a80c0624fbd8bd1c784b0b5b7a0fd20b09d317b9.tar.gz
Moved from ports with several enhancements
Diffstat (limited to 'lib/libncurses/lib_slk.c')
-rw-r--r--lib/libncurses/lib_slk.c272
1 files changed, 272 insertions, 0 deletions
diff --git a/lib/libncurses/lib_slk.c b/lib/libncurses/lib_slk.c
new file mode 100644
index 0000000..f220a37
--- /dev/null
+++ b/lib/libncurses/lib_slk.c
@@ -0,0 +1,272 @@
+
+/*
+ * lib_slk.c
+ * Soft key routines.
+ *
+ * Copyright (C) Gerhard Fuernkranz 1993
+ * Permisson is granted to redistribute this
+ * code under the terms of the GNU Copyleft.
+ */
+
+#include <nterm.h>
+#include "curses.priv.h"
+#include <string.h>
+#include <stdlib.h>
+
+int _slk_format; /* format specified in slk_init() */
+
+#define MAXCOLUMNS 135
+#define MAXLINES 66
+#define UNINITIALISED ((struct try * ) -1)
+/*
+ * Retrieve label text.
+ */
+
+char *
+slk_label(int n)
+{
+SLK *slk = SP->_slk;
+#ifdef TRACE
+ if (_tracing)
+ _tracef("slk_label(%d)", n);
+#endif
+
+ if (slk == NULL || n < 1 || n > 8)
+ return NULL;
+ return slk->ent[n-1].text;
+}
+
+/*
+ * Write the soft lables to the slk window.
+ */
+
+static void
+slk_intern_refresh(SLK *slk)
+{
+int i;
+#ifdef TRACE
+ if (_tracing)
+ _tracef("slk_intern_refresh(%x)", slk);
+#endif
+
+ for (i = 0; i < 8; i++) {
+ if (slk->dirty || slk->ent[i].dirty) {
+ if (slk->ent[i].visible) {
+ wmove(slk->win,0,slk->ent[i].x);
+ wattrset(slk->win,A_REVERSE);
+ waddstr(slk->win,slk->ent[i].form_text);
+ wattrset(slk->win,A_NORMAL);
+ }
+ slk->ent[i].dirty = FALSE;
+ }
+ }
+ slk->dirty = FALSE;
+}
+
+/*
+ * Refresh the soft label window.
+ */
+
+int
+slk_noutrefresh(void)
+{
+SLK *slk = SP->_slk;
+#ifdef TRACE
+ if (_tracing)
+ _tracef("slk_noutrefresh()");
+#endif
+
+ if (slk == NULL)
+ return ERR;
+ if (slk->hidden)
+ return OK;
+ slk_intern_refresh(slk);
+ return wnoutrefresh(slk->win);
+}
+
+/*
+ * Refresh the soft label window.
+ */
+
+int
+slk_refresh(void)
+{
+SLK *slk = SP->_slk;
+#ifdef TRACE
+ if (_tracing)
+ _tracef("slk_refresh()");
+#endif
+
+ if (slk == NULL)
+ return ERR;
+ if (slk->hidden)
+ return OK;
+ slk_intern_refresh(slk);
+ return wrefresh(slk->win);
+}
+
+/*
+ * Restore the soft labels on the screen.
+ */
+
+int
+slk_restore(void)
+{
+SLK *slk = SP->_slk;
+#ifdef TRACE
+ if (_tracing)
+ _tracef("slk_restore()");
+#endif
+
+ if (slk == NULL)
+ return ERR;
+ slk->hidden = FALSE;
+ slk->dirty = TRUE;
+ return slk_refresh();
+}
+
+/*
+ * Set soft label text.
+ */
+
+int
+slk_set(int i, char *str, int format)
+{
+SLK *slk = SP->_slk;
+int len;
+#ifdef TRACE
+ if (_tracing)
+ _tracef("slk_set(%d, %s, %d)", i, str, format);
+#endif
+
+ if (slk == NULL || i < 1 || i > 8 || format < 0 || format > 2)
+ return ERR;
+ if (str == NULL)
+ str = "";
+ i--;
+ strncpy(slk->ent[i].text,str,8);
+ memset(slk->ent[i].form_text,' ',8);
+ slk->ent[i].text[8] = 0;
+ slk->ent[i].form_text[8] = 0;
+ len = strlen(slk->ent[i].text);
+ switch(format) {
+ case 0: /* left */
+ memcpy(slk->ent[i].form_text,slk->ent[i].text,len);
+ break;
+ case 1: /* center */
+ memcpy(slk->ent[i].form_text+(8-len)/2,slk->ent[i].text,len);
+ break;
+ case 2: /* right */
+ memcpy(slk->ent[i].form_text+8-len,slk->ent[i].text,len);
+ break;
+ }
+ slk->ent[i].dirty = TRUE;
+ return OK;
+}
+
+/*
+ * Pretend, that soft keys have been changed.
+ */
+
+int
+slk_touch(void)
+{
+SLK *slk = SP->_slk;
+#ifdef TRACE
+ if (_tracing)
+ _tracef("slk_touch()");
+#endif
+
+ if (slk == NULL)
+ return ERR;
+ slk->dirty = TRUE;
+ return OK;
+}
+
+/*
+ * Remove soft labels from the screen.
+ */
+
+int
+slk_clear(void)
+{
+SLK *slk = SP->_slk;
+#ifdef TRACE
+ if (_tracing)
+ _tracef("slk_clear()");
+#endif
+
+ if (slk == NULL)
+ return ERR;
+ slk->hidden = TRUE;
+ werase(slk->win);
+ return wrefresh(slk->win);
+}
+
+/*
+ * Initialize soft labels.
+ * Called from newterm()
+ */
+
+static int
+slk_initialize(WINDOW *stwin, int cols)
+{
+SLK *slk;
+int i, maxlab, x;
+#ifdef TRACE
+ if (_tracing)
+ _tracef("slk_initialize()");
+#endif
+
+ if ((SP->_slk = slk = (SLK*) calloc(1,sizeof(SLK))) == NULL)
+ return OK;
+ maxlab = (cols+1)/9;
+ for (i = 0; i < 8; i++) {
+ memset(slk->ent[i].form_text,' ',8);
+ slk->ent[i].visible = i < maxlab;
+ }
+ if (_slk_format == 1) { /* 4-4 */
+ int gap = cols - 64 - 6;
+ if (gap < 1)
+ gap = 1;
+ for (i = x = 0; i < 8; i++) {
+ slk->ent[i].x = x;
+ x += 8;
+ x += (i == 3) ? gap : 1;
+ }
+ }
+ else { /* 0 -> 3-2-3 */
+ int gap = (cols - 64 - 5) / 2;
+ if (gap < 1)
+ gap = 1;
+ for (i = x = 0; i < 8; i++) {
+ slk->ent[i].x = x;
+ x += 8;
+ 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.
+ */
+
+int
+slk_init(int format)
+{
+ if (format < 0 || format > 1)
+ return ERR;
+ _slk_format = format;
+ ripoffline(-1, slk_initialize);
+ return OK;
+}
+
OpenPOWER on IntegriCloud