Index: Makefile.in
===================================================================
--- Makefile.in (nonexistent)
+++ Makefile.in (revision 5)
@@ -0,0 +1,191 @@
+# -*-makefile-*- (gpm/src)
+#
+# Copyright 1994,1997 rubini@linux.it
+# Copyright 1997 dickey@clark.net
+# Copyright (C) 1998 Ian Zimmerman <itz@rahul.net>
+# Copyright (C) 2001-2008 Nico Schottelius <nico-gpm2008 at schottelius.org>
+#
+
+srcdir = @srcdir@
+top_builddir = ..
+
+include $(top_builddir)/Makefile.include
+
+# Main portion: regular build rules
+
+GSRC = mice.c twiddler.c synaptics.c \
+ daemon/add_mouse.c daemon/init_mice.c daemon/reset_mice.c \
+ daemon/build_argv.c daemon/disable_paste.c daemon/do_client.c \
+ daemon/do_selection.c daemon/get_console_size.c daemon/get_data.c \
+ daemon/getmousedata.c daemon/gpm.c daemon/gpm-killed.c \
+ daemon/header.c daemon/main.c daemon/old_main.c \
+ daemon/open_console.c daemon/check_kill.c daemon/gpm_exited.c \
+ generic/isodigit.c generic/getsym.c \
+ daemon/processspecial.c daemon/processconn.c daemon/processmouse.c \
+ daemon/processrequest.c daemon/selection_copy.c daemon/selection_paste.c\
+ daemon/cmdline.c daemon/loadlut.c daemon/find_mouse_by_name.c \
+ daemon/usage.c daemon/check_uniqueness.c \
+ daemon/startup.c daemon/wait_text.c
+
+GOBJ = $(GSRC:.c=.o) report.o tools.o
+
+LSRC = lib/libcurses.c lib/liblow.c lib/libhigh.c lib/libxtra.c lib/report-lib.c
+
+LOBJ = $(LSRC:.c=.o) tools.o @CURSES_OBJS@
+
+PICS = $(LOBJ:.o=.lo)
+
+HDRS = gpm.h gpmInt.h twiddler.h synaptics.h message.h
+
+PSRC = prog/mev.c prog/hltest.c prog/mouse-test.c prog/disable-paste.c \
+ prog/display-buttons.c prog/display-coords.c prog/get-versions.c
+
+POBJ = $(PSRC:.c=.o) prog/gpm-root.o
+
+PROG = $(POBJ:.o=)
+
+SRCS = $(GSRC) $(LSRC) $(PSRC) report.c
+
+DEFS = @DEFS@ -DHAVE_CURSES_H -I lib/ncurses -I headers
+
+STRIP = -s
+
+### BUILD PROCESS
+
+# allow CFLAGS to be overriden from make command line
+# ideally one would never have to write this rule again, but the GNU
+# makefile standards are at cross-purposes: CFLAGS is reserved for
+# user-overridable flags, but it's also all the implicit rule looks at.
+
+# the prog rules are not very clean...
+prog/%.o: prog/%.c
+ $(CC) -I@srcdir@/headers @CPPFLAGS@ $(CPPFLAGS) @CFLAGS@ $(CFLAGS) -c -o $@ $<
+
+prog/%: prog/%.o
+ $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $^ @LIBS@ $(LIBS)
+
+%.o: %.c
+ $(CC) @CPPFLAGS@ $(CPPFLAGS) @CFLAGS@ $(CFLAGS) -c -o $@ $<
+
+%.lo: %.c
+ $(CC) @CPPFLAGS@ $(CPPFLAGS) @PICFLAGS@ @CFLAGS@ $(CFLAGS) -c -o $@ $<
+
+%: %.o
+ $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $^ @LIBS@ $(LIBS)
+
+# old, unused, but good rule [dependings]
+#%.d: $(srcdir)/%.c
+# $(SHELL) -ec '$(CC) -M $(GPMCPPFLAGS) $(CPPFLAGS) $< \
+# | $(SED) '\''s/\($*\)\.o\([ :]*\)/\1.o \1.lo\2/g'\'' > $(DEPDIR)/$@'
+
+# Do it all!
+all: gpm lib/libgpm.so.@abi_lev@ @LIBGPM_A@ $(PROG)
+
+gpm: $(GOBJ)
+ $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $(GOBJ) @LIBS@ $(LIBS) -lm
+
+# construct dependings of sourcefiles and link sourcefiles
+$(DEPFILE) dep: prog/gpm-root.c
+ # make links in subdirectories
+ -@for cfiledirs in prog lib; do $(MKDIR) $$cfiledirs; \
+ cd $$cfiledirs; for cfiles in `echo $(srcdir)/$$cfiledirs/*.c`; \
+ do $(LN_S) $$cfiles 2>/dev/null; done; cd ..; done
+
+ # make links in srcdir
+ -@if [ "$(CURDIR)" != "$(srcdir)" ] ; then for cfiles in `echo $(srcdir)/*.c`; do $(LN_S) $$cfiles 2>/dev/null; done ; fi
+
+ # create dependencies
+ for DEPS in `echo *.c */*.c`; do \
+ $(CC) -I. -I $(srcdir) -M @CPPFLAGS@ $(CPPFLAGS) $$DEPS | \
+ $(SED) 's/^\(.*\)\.o\([ :]+\)/\1.o \1.lo\2/g' >> $(DEPFILE) ; done
+
+### INSTALL
+check: all
+installdirs:
+
+install: check
+ $(INSTALL_PROGRAM) gpm $(sbindir)/gpm
+ if [ -f lib/libgpm.a ] ; then \
+ $(INSTALL_DATA) -m 644 lib/libgpm.a $(libdir)/libgpm.a ; \
+ fi
+ $(INSTALL_DATA) -m 644 $(srcdir)/headers/gpm.h $(includedir)/gpm.h
+ # POSIX requires the range of a for loop be nonempty and Bash
+ # 2.x goes along; unfortunately that means an additional
+ # headache in cases like this
+ if test "x@SHLIB@" != "x" ; then \
+ $(INSTALL_DATA) -m 644 lib/libgpm.so.@abi_full@ $(libdir)/libgpm.so.@abi_full@ ; \
+ cd $(libdir) && $(LN_S) -f libgpm.so.@abi_full@ libgpm.so.@abi_lev@ ; \
+ echo "WARNING: We installed a lib, you should now call ldconfig" ; \
+ echo "f.i.: ldconfig -n -l $(libdir)/libgpm.so.@abi_full@" ; \
+ echo "Or to update everything just type ldconfig" ; \
+ fi
+# The unversioned files seems to be not needed -> correct me, if I am wrong.
+# && $(LN_S) -f libgpm.so.@abi_lev@ libgpm.so ; \
+
+ # prog/
+ for i in $(PROG); do \
+ $(INSTALL_PROGRAM) $$i $(bindir)/`echo $$i | sed 's,prog/,,'` ;\
+ done
+
+install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) $(STRIP)' install
+
+# Note: this leaves around /usr/lib/libgpm.so.1 and /usr/lib/libgpm.so.1.nn
+# This is probably the right thing, because programs may be linked to it
+uninstall:
+ rm -f $(bindir)/mev $(bindir)/gpm-root $(bindir)/disable-paste \
+ $(sbindir)/gpm $(libdir)/libgpm.a $(libdir)/libgpm.so $(includedir)/gpm.h
+ for i in $(PROG); do \
+ rm -f $(bindir)/$$i ;\
+ done
+
+# Configure & unconfigure
+
+Makefile: Makefile.in
+ $(top_builddir)/config.status Makefile
+
+# Subdirectory prog/
+prog/gpm-root.c: $(srcdir)/prog/gpm-root.y
+ $(YACC) $(YFLAGS) $< && mv y.tab.c prog/gpm-root.c
+
+# gpm-root needs an own rule, because gpm-root.c is not in $(srcdir)
+prog/gpm-root: prog/gpm-root.c lib/libgpm.so.@abi_lev@
+ $(CC) -I. @CPPFLAGS@ $(CPPFLAGS) @CFLAGS@ $(CFLAGS) -c -o $@.o $<
+ $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $@.o @LIBS@ $(LIBS) lib/libgpm.so.@abi_lev@
+
+prog/mouse-test: prog/mouse-test.o mice.o twiddler.o synaptics.o prog/open_console.o
+ $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $^ @LIBS@ $(LIBS) -lm
+
+$(PROG): lib/libgpm.so.@abi_lev@
+
+# Subdirectory lib/
+lib/libgpm.a: $(LOBJ)
+ $(AR) rc lib/libgpm.a $(LOBJ)
+ $(RANLIB) lib/libgpm.a
+
+lib/libgpm.so.@abi_full@: $(PICS)
+ $(CC) @SOLDFLAGS@libgpm.so.@abi_lev@ \
+ @LDFLAGS@ $(LDFLAGS) -o lib/libgpm.so.@abi_full@ $^ @LIBS@ @SHARED_LIBS@ $(LIBS)
+lib/libgpm.so.@abi_lev@: lib/libgpm.so.@abi_full@
+ $(LN_S) -f libgpm.so.@abi_full@ lib/libgpm.so.@abi_lev@
+# unneeded, isn't it?
+#lib/libgpm.so: lib/libgpm.so.@abi_full@
+# $(LN_S) -f libgpm.so.@abi_full@ lib/libgpm.so
+
+include $(DEPFILE)
+
+## Release / Dist
+
+
+## Cleanup
+clean:
+ rm -f gpm lib/libgpm.a lib/libgpm.so.* $(RDEPS)
+ rm -f core *~ $(GOBJ) $(LOBJ) $(POBJ) $(PICS) gpm-root.c $(DEPFILE)
+ rm -f $(PROG) $(POBJ) prog/gpm-root.c prog/open_console.o
+
+distclean: clean
+ rm -f headers/config.h headers/drivers.h \
+ Makefile $(DEPFILE)
+
+allclean: clean
+ rm -f headers/config.h.in
Index: daemon/open_console.c
===================================================================
--- daemon/open_console.c (nonexistent)
+++ daemon/open_console.c (revision 5)
@@ -0,0 +1,61 @@
+/*
+ * general purpose mouse (gpm)
+ *
+ * Copyright (c) 2008 Nico Schottelius <nico-gpm2008 at schottelius.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ *
+ ********/
+
+#include <fcntl.h> /* open and co. */
+#include <sys/stat.h> /* stat() */
+#include <sys/ioctl.h> /* ioctl */
+#include <sys/types.h>
+
+#ifdef HAVE_SYS_SYSMACROS_H
+#include <sys/sysmacros.h> /* major() w/newer glibc */
+#endif
+
+/* Linux specific (to be outsourced in gpm2 */
+#include <linux/serial.h> /* for serial console check */
+#include <asm/ioctls.h> /* for serial console check */
+
+
+#include "headers/message.h" /* messaging in gpm */
+#include "headers/daemon.h" /* daemon internals */
+
+int open_console(const int mode)
+{
+ int fd;
+ int maj;
+ int twelve = 12;
+ struct serial_struct si;
+ struct stat sb;
+
+ fd = open(option.consolename, mode);
+ if (fd != -1) {
+ fstat(fd, &sb);
+ maj = major(sb.st_rdev);
+ if (maj != 4 && (maj < 136 || maj > 143)) {
+ if (ioctl(fd, TIOCLINUX, &twelve) < 0) {
+ if (si.line > 0) {
+ gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_SERIALCON);
+ }
+ }
+ }
+ } else
+ gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON);
+ return fd;
+}
Index: daemon/startup.c
===================================================================
--- daemon/startup.c (nonexistent)
+++ daemon/startup.c (revision 5)
@@ -0,0 +1,151 @@
+/*
+ * general purpose mouse support for Linux
+ *
+ * *Startup and Daemon functions*
+ *
+ * Copyright (c) 2002-2008 Nico Schottelius <nico@schottelius.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ ********/
+
+#include <stdlib.h> /* atexit() */
+#include <string.h> /* strlen() */
+#include <errno.h> /* errno */
+#include <unistd.h> /* unlink,geteuid */
+#include <sys/types.h> /* geteuid, mknod */
+#include <sys/stat.h> /* mknod */
+#include <fcntl.h> /* mknod */
+
+
+#include "headers/gpmInt.h"
+#include "headers/message.h"
+#include "headers/daemon.h"
+
+void startup(int argc, char **argv)
+{
+ int i, opt;
+
+ static struct {
+ char *in;
+ char *out;
+ } seq[] = {
+ {"123","01234567"},
+ {"132","02134657"},
+ {"213","01452367"}, /* warning: these must be readable as integers... */
+ {"231","02461357"},
+ {"312","04152637"},
+ {"321","04261537"},
+ {NULL,NULL}
+ };
+
+ /* log to debug, who we are */
+ gpm_report(GPM_PR_DEBUG, GPM_MESS_VERSION);
+
+ /* basic settings */
+ option.run_status = GPM_RUN_STARTUP; /* 10,9,8,... let's go */
+ option.autodetect = 0; /* no mouse autodection */
+ option.progname = argv[0]; /* who we are */
+ option.consolename = Gpm_get_console(); /* get consolename */
+
+ /* basic2: are not necessary for oops()ing, if not root */
+ option.no_mice = 0; /* counts -m + -t */
+ option.micelist = NULL; /* no mice found yet */
+ option.repeater = 0; /* repeat data */
+ option.repeater_type = NULL; /* type of */
+
+
+ cmdline(argc, argv); /* parse command line */
+
+ if (geteuid() != 0) gpm_report(GPM_PR_OOPS,GPM_MESS_ROOT); /* root or exit */
+
+ /* Planned for gpm-1.30, but only with devfs */
+ /* if(option.autodetect) autodetect(); */
+
+
+ /****************** OLD CODE from gpn.c ***********************/
+
+ openlog(option.progname, LOG_PID,
+ option.run_status != GPM_RUN_DEBUG ? LOG_DAEMON : LOG_USER);
+ loadlut(opt_lut);
+
+ if (option.repeater) {
+ if(mkfifo(GPM_NODE_FIFO,0666) && errno!=EEXIST)
+ gpm_report(GPM_PR_OOPS,GPM_MESS_CREATE_FIFO,GPM_NODE_FIFO);
+ if((fifofd=open(GPM_NODE_FIFO, O_RDWR|O_NONBLOCK)) < 0)
+ gpm_report(GPM_PR_OOPS, GPM_MESS_OPEN, GPM_NODE_FIFO);
+ }
+
+ /* duplicate initialization */
+ for (i=1; i <= 1+opt_double; i++) {
+ which_mouse=mouse_table+i; /* used to access options */
+ if ((which_mouse->opt_accel) < 1) exit(usage("acceleration"));
+ if ((which_mouse->opt_delta) < 2) exit(usage("delta"));
+ if (strlen((which_mouse->opt_sequence)) != 3 || atoi((which_mouse->opt_sequence))<100)
+ exit(usage("sequence"));
+ if ((which_mouse->opt_glidepoint_tap) > 3) exit(usage("glidepoint tap button"));
+ if ((which_mouse->opt_glidepoint_tap))
+ (which_mouse->opt_glidepoint_tap)=GPM_B_LEFT >> ((which_mouse->opt_glidepoint_tap)-1);
+
+ /* choose the sequence */
+ for (opt=0; seq[opt].in && strcmp(seq[opt].in,(which_mouse->opt_sequence)); opt++) ;
+ if(!seq[opt].in) exit(usage("button sequence"));
+ (which_mouse->opt_sequence)=strdup(seq[opt].out); /* I can rewrite on it */
+
+ /* look for the mouse type */
+ (which_mouse->m_type) = find_mouse_by_name((which_mouse->opt_type));
+ if (!(which_mouse->m_type)) /* not found */
+ exit(M_listTypes());
+ }
+
+ /* Check repeater status */
+ if (option.repeater) {
+ if (strcmp(option.repeater_type,"raw") == 0)
+ opt_rawrep = 1;
+ else {
+ /* look for the type */
+ repeated_type = find_mouse_by_name(option.repeater_type);
+
+ if(!repeated_type) exit(M_listTypes()); /* not found */
+
+ if (!(repeated_type->repeat_fun)) /* unsupported translation */
+ gpm_report(GPM_PR_OOPS,GPM_MESS_NO_REPEAT,option.repeater_type);
+ }
+ }
+
+ if (option.run_status == GPM_RUN_STARTUP ) { /* else is debugging */
+ if (daemon(0,0))
+ gpm_report(GPM_PR_OOPS,GPM_MESS_FORK_FAILED); /* error */
+
+ option.run_status = GPM_RUN_DAEMON; /* child */
+ }
+
+ /* damon init: check whether we run or not, display message */
+ check_uniqueness();
+ gpm_report(GPM_PR_INFO,GPM_MESS_STARTED);
+
+ /* close extra fds */
+ if (option.run_status == GPM_RUN_STARTUP ) {
+ close(0);
+ close(1);
+ close(2);
+ }
+
+ //return mouse_table[1].fd; /* the second is handled in the main() */
+
+ /****************** OLD CODE from gpn.c END ***********************/
+
+ init_mice(option.micelist); /* reads option.micelist */
+ atexit(gpm_exited); /* call gpm_exited at the end */
+}
Index: daemon
===================================================================
--- daemon (nonexistent)
+++ daemon (revision 5)
Property changes on: daemon
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: headers/daemon.h
===================================================================
--- headers/daemon.h (nonexistent)
+++ headers/daemon.h (revision 5)
@@ -0,0 +1,240 @@
+/*
+ * Daemon internals
+ *
+ * Copyright (c) 2008 Nico Schottelius <nico-gpm2008 at schottelius.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _GPM_DAEMON_H
+#define _GPM_DAEMON_H
+
+/*************************************************************************
+ * Includes
+ */
+#include "gpm.h" /* Gpm_Event */
+#include <sys/select.h> /* fd_set */
+
+/*************************************************************************
+ * Types / structures
+ */
+
+struct micetab {
+ struct micetab *next;
+ char *device;
+ char *protocol;
+ char *options;
+};
+
+struct options {
+ int autodetect; /* -u [aUtodetect..'A' is unavailable] */
+ int no_mice; /* number of mice */
+ int repeater; /* repeat data */
+ char *repeater_type; /* repeat data as which mouse type */
+ int run_status; /* startup/daemon/debug */
+ char *progname; /* hopefully gpm ;) */
+ struct micetab *micelist; /* mice and their options */
+ char *consolename; /* /dev/tty0 || /dev/vc/0 */
+};
+
+typedef struct Gpm_Cinfo {
+ Gpm_Connect data;
+ int fd;
+ struct Gpm_Cinfo *next;
+} Gpm_Cinfo;
+
+/* and this is the entry in the mouse-type table */
+typedef struct Gpm_Type {
+ char *name;
+ char *desc; /* a descriptive line */
+ char *synonyms; /* extra names (the XFree name etc) as a list */
+ /* mouse specific event handler: */
+ int (*fun)(Gpm_Event *state, unsigned char *data);
+
+ /* mouse specific initialisation function: */
+ struct Gpm_Type *(*init)(int fd, unsigned short flags,
+ struct Gpm_Type *type, int argc, char **argv);
+
+ unsigned short flags;
+ unsigned char proto[4];
+ int packetlen;
+ int howmany; /* how many bytes to read at a time */
+ int getextra; /* does it get an extra byte? (only mouseman) */
+ int absolute; /* flag indicating absolute pointing device */
+
+ /* repeat this event into fd */
+ int (*repeat_fun)(Gpm_Event *state, int fd);
+} Gpm_Type;
+
+/* this structure is used to hide the dual-mouse stuff */
+struct mouse_features {
+ char *opt_type,
+ *opt_dev,
+ *opt_sequence;
+ int opt_baud,
+ opt_sample,
+ opt_delta,
+ opt_accel,
+ opt_scale,
+ opt_scaley,
+ opt_time,
+ opt_cluster,
+ opt_three,
+ opt_glidepoint_tap;
+ char *opt_options; /* extra textual configuration */
+ Gpm_Type *m_type;
+ int fd;
+};
+
+/*************************************************************************
+ * Macros
+ */
+
+/* How many virtual consoles are managed? */
+#ifndef MAX_NR_CONSOLES
+# define MAX_NR_CONSOLES 64 /* this is always sure */
+#endif
+
+#define MAX_VC MAX_NR_CONSOLES /* doesn't work before 1.3.77 */
+
+/* for adding a mouse; add_mouse */
+#define GPM_ADD_DEVICE 0
+#define GPM_ADD_TYPE 1
+#define GPM_ADD_OPTIONS 2
+
+/* all the default values */
+#define DEF_TYPE "ms"
+#define DEF_DEV NULL /* use the type-related one */
+#define DEF_LUT "-a-zA-Z0-9_./\300-\326\330-\366\370-\377"
+#define DEF_SEQUENCE "123" /* how buttons are reordered */
+#define DEF_BAUD 1200
+#define DEF_SAMPLE 100
+#define DEF_DELTA 25
+#define DEF_ACCEL 2
+#define DEF_SCALE 10
+#define DEF_TIME 250 /* time interval (ms) for multiple clicks */
+#define DEF_THREE 0 /* have three buttons? */
+#define DEF_KERNEL 0 /* no kernel module, by default */
+
+/* 10 on old computers (<=386), 0 on current machines */
+#define DEF_CLUSTER 0 /* maximum number of clustered events */
+
+#define DEF_TEST 0
+#define DEF_PTRDRAG 1 /* double or triple click */
+#define DEF_GLIDEPOINT_TAP 0 /* tapping emulates no buttons by default */
+
+
+
+/*************************************************************************
+ * Global variables
+ */
+
+extern char *opt_lut;
+extern char *opt_special;
+
+extern int opt_resize; /* not really an option */
+extern time_t opt_age_limit;
+extern struct options option; /* one should be enough for us */
+extern int mouse_argc[3]; /* 0 for default (unused) */
+extern char **mouse_argv[3]; /* and two mice */
+
+extern int opt_aged,
+ opt_ptrdrag,
+ opt_test,
+ opt_double;
+
+
+extern int statusX,
+ statusY,
+ statusB,
+ statusC; /* clicks */
+extern int fifofd;
+extern int opt_rawrep;
+extern int maxx,
+ maxy;
+
+
+extern fd_set selSet,
+ readySet,
+ connSet;
+extern int eventFlag;
+extern struct winsize win;
+
+extern Gpm_Cinfo *cinfo[MAX_VC+1];
+
+extern struct mouse_features mouse_table[3],
+ *which_mouse; /*the current one*/
+
+extern Gpm_Type mice[];
+extern Gpm_Type *repeated_type;
+
+extern time_t last_selection_time;
+
+
+
+
+/*************************************************************************
+ * Functions
+ */
+
+char **build_argv(char *argv0, char *str, int *argcptr, char sep);
+void disable_paste(int vc);
+
+int do_client(Gpm_Cinfo *cinfo, Gpm_Event *event);
+int do_selection(Gpm_Event *event);
+
+void get_console_size(Gpm_Event *ePtr);
+int get_data(Gpm_Connect *where, int whence);
+char *getMouseData(int fd, Gpm_Type *type, int kd_mode);
+int getsym(const unsigned char *p0, unsigned char *res);
+
+void gpm_exited(void);
+void gpm_killed(int signo);
+
+int open_console(const int mode);
+int old_main();
+
+int processConn(int fd);
+int processMouse(int fd, Gpm_Event *event, Gpm_Type *type, int kd_mode);
+int processRequest(Gpm_Cinfo *ci, int vc);
+int processSpecial(Gpm_Event *event);
+
+void selection_copy(int x1, int y1, int x2, int y2, int mode);
+void selection_paste(void);
+
+void startup(int argc, char **argv);
+
+
+int wait_text(int *fdptr);
+
+/* meta-mouse functions */
+void add_mouse (int type, char *value);
+int init_mice (struct micetab *micelist);
+int reset_mice(struct micetab *micelist);
+
+/* gpn.c */
+void cmdline(int argc, char **argv);
+int giveInfo(int request, int fd);
+int loadlut(char *charset);
+int usage(char *whofailed);
+struct Gpm_Type *find_mouse_by_name(char *name);
+void check_uniqueness(void);
+void check_kill(void);
+
+/* gpm.c */
+int old_main();
+
+
+#endif
Index: headers
===================================================================
--- headers (nonexistent)
+++ headers (revision 5)
Property changes on: headers
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: lib/libcurses.c
===================================================================
--- lib/libcurses.c (nonexistent)
+++ lib/libcurses.c (revision 5)
@@ -0,0 +1,163 @@
+/*
+ * libcurses.c - client library - curses level (gpm-Linux)
+ *
+ * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini)
+ * Copyright 2002 nico@schottelius.org (Nico Schottelius)
+ *
+ * xterm management is mostly by Miguel de Icaza
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ ********/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h> /* select(); */
+#include <sys/time.h> /* timeval */
+#include <sys/types.h> /* socket() */
+
+#include "headers/gpmInt.h"
+
+#ifdef HAVE_NCURSES_H
+#include <ncurses.h>
+#else
+#ifdef HAVE_NCURSES_CURSES_H
+#include <ncurses/curses.h>
+#else
+#ifdef HAVE_CURSES_H
+#include <curses.h>
+#endif /* HAVE_CURSES_H */
+#endif /* HAVE_NCURSES_CURSES_H */
+#endif /* HAVE_NCURSES_H */
+
+/* If win != NULL, it must have been created by ncurses anyway.
+ Avoid circular library dependencies. */
+#pragma weak wgetch
+#pragma weak stdscr
+
+#define GET(win) ((win && wgetch) ? wgetch(win) : getch())
+
+int Gpm_Wgetch(WINDOW *win)
+{
+fd_set selSet;
+int max, flag, result;
+int fd=STDIN_FILENO;
+static Gpm_Event ev;
+
+ if (!gpm_flag || gpm_fd==-1) return GET(win);
+ if (gpm_morekeys) return (*gpm_handler)(&ev,gpm_data);
+ gpm_hflag=0;
+
+ max = (gpm_fd>fd) ? gpm_fd : fd;
+
+/*...................................................................*/
+ if (gpm_fd>=0) /* linux */
+ while(1)
+ {
+ if (gpm_visiblepointer) GPM_DRAWPOINTER(&ev);
+ do
+ {
+ FD_ZERO(&selSet);
+ FD_SET(fd,&selSet);
+ if (gpm_fd>-1)
+ FD_SET(gpm_fd,&selSet);
+ gpm_timeout.tv_sec=SELECT_TIME;
+ flag=select(max+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&gpm_timeout);
+ }
+ while (!flag);
+
+ if (flag==-1)
+ continue;
+
+ if (FD_ISSET(fd,&selSet))
+ return GET(win);
+
+ if (Gpm_GetEvent(&ev) && gpm_handler
+ && (result=(*gpm_handler)(&ev,gpm_data)))
+ {
+ gpm_hflag=1;
+ return result;
+ }
+ }
+ else
+/*...................................................................*/
+ if (gpm_fd==-2) /* xterm */
+ {
+#define DELAY_MS 100
+ static struct timeval to={0,DELAY_MS*1000};
+ static fd_set selSet;
+/* JD patch 11/08/1998 */
+#define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */
+ static int nbprevchar=0, prevchar[MAXNBPREVCHAR];
+ extern int gpm_convert_event(char *data, Gpm_Event *event);
+ int c; unsigned char mdata[4];
+
+/* JD patch 11/08/1998 */
+ if (nbprevchar) /* if there are some consumed char ... */
+ return prevchar[--nbprevchar];
+/* if ungetc() didn't suffice... */
+/* if ((c=prevchar)!=EOF)
+ {
+ prevchar=EOF;
+ return c;
+ }
+*/
+
+ while(1)
+ {
+ do
+ {
+ FD_ZERO(&selSet); FD_SET(fd,&selSet);
+ gpm_timeout.tv_sec=SELECT_TIME;
+ flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&gpm_timeout);
+ }
+ while (!flag);
+
+ if ((c=GET(win))!=0x1b) return c;
+
+ /* escape: go on */
+ FD_ZERO(&selSet); FD_SET(fd,&selSet); to.tv_usec=DELAY_MS*1000;
+ if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0)
+ return c;
+ if ((c=GET(win))!='[')
+ {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */
+ /* {ungetc(c,stdin); return 0x1B;} */
+
+ /* '[': go on */
+ FD_ZERO(&selSet); FD_SET(fd,&selSet); to.tv_usec=DELAY_MS*1000;
+
+ if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0)
+ {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */
+ /* {ungetc(c,stdin); return 0x1B;} */
+
+ if ((c=GET(win))!='M')
+ /* patche par JD 11/08/1998 NOTICE: prevchar is a lifo !*/
+ {prevchar[nbprevchar++]=c; prevchar[nbprevchar++]='['; return 0x1B;}
+ /* {ungetc(c,stdin);prevchar='['; return 0x1B;} */
+
+
+ /* now, it surely is a mouse event */
+
+ for (c=0;c<3;c++) mdata[c]=GET(win);
+ gpm_convert_event(mdata,&ev);
+
+ if (gpm_handler && (result=(*gpm_handler)(&ev,gpm_data)))
+ {
+ gpm_hflag=1;
+ return result;
+ }
+ } /* while(1) */
+ }
+ return 0;
+}
Index: lib/ncurses/curses.h
===================================================================
--- lib/ncurses/curses.h (nonexistent)
+++ lib/ncurses/curses.h (revision 5)
@@ -0,0 +1,2065 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey *
+ * Copyright 1998-2016,2017 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders shall not be used in advertising or otherwise to promote the *
+ * sale, use or other dealings in this Software without prior written *
+ * authorization. *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ * and: Thomas E. Dickey 1996-on *
+ ****************************************************************************/
+
+/* $Id: curses.h.in,v 1.269 2020/08/17 14:14:12 tom Exp $ */
+
+#ifndef __NCURSES_H
+#define __NCURSES_H
+
+#define CURSES 1
+#define CURSES_H 1
+
+/* These are defined only in curses.h, and are used for conditional compiles */
+#define NCURSES_VERSION_MAJOR 6
+#define NCURSES_VERSION_MINOR 2
+#define NCURSES_VERSION_PATCH 20201024
+
+/* This is defined in more than one ncurses header, for identification */
+#undef NCURSES_VERSION
+#define NCURSES_VERSION "6.2"
+
+/*
+ * Identify the mouse encoding version.
+ */
+#define NCURSES_MOUSE_VERSION 2
+
+/*
+ * Definitions to facilitate DLL's.
+ */
+#include <ncurses_dll.h>
+
+#if 1
+#include <stdint.h>
+#endif
+
+/*
+ * User-definable tweak to disable the include of <stdbool.h>.
+ */
+#ifndef NCURSES_ENABLE_STDBOOL_H
+#define NCURSES_ENABLE_STDBOOL_H 1
+#endif
+
+/*
+ * NCURSES_ATTR_T is used to quiet compiler warnings when building ncurses
+ * configured using --disable-macros.
+ */
+#ifndef NCURSES_ATTR_T
+#define NCURSES_ATTR_T int
+#endif
+
+/*
+ * Expands to 'const' if ncurses is configured using --enable-const. Note that
+ * doing so makes it incompatible with other implementations of X/Open Curses.
+ */
+#undef NCURSES_CONST
+#define NCURSES_CONST const
+
+#undef NCURSES_INLINE
+#define NCURSES_INLINE inline
+
+/*
+ * The standard type used for color values, and for color-pairs. The latter
+ * allows the curses library to enumerate the combinations of foreground and
+ * background colors used by an application, and is normally the product of the
+ * total foreground and background colors.
+ *
+ * X/Open uses "short" for both of these types, ultimately because they are
+ * numbers from the SVr4 terminal database, which uses 16-bit signed values.
+ */
+#undef NCURSES_COLOR_T
+#define NCURSES_COLOR_T short
+
+#undef NCURSES_PAIRS_T
+#define NCURSES_PAIRS_T short
+
+/*
+ * Definitions used to make WINDOW and similar structs opaque.
+ */
+#ifndef NCURSES_INTERNALS
+#define NCURSES_OPAQUE 0
+#define NCURSES_OPAQUE_FORM 0
+#define NCURSES_OPAQUE_MENU 0
+#define NCURSES_OPAQUE_PANEL 0
+#endif
+
+/*
+ * Definition used to optionally suppress wattr* macros to help with the
+ * transition from ncurses5 to ncurses6 by allowing the header files to
+ * be shared across development packages for ncursesw in both ABIs.
+ */
+#ifndef NCURSES_WATTR_MACROS
+#define NCURSES_WATTR_MACROS 1
+#endif
+
+/*
+ * The reentrant code relies on the opaque setting, but adds features.
+ */
+#ifndef NCURSES_REENTRANT
+#define NCURSES_REENTRANT 0
+#endif
+
+/*
+ * In certain environments, we must work around linker problems for data
+ */
+#undef NCURSES_BROKEN_LINKER
+#if 0
+#define NCURSES_BROKEN_LINKER 1
+#endif
+
+/*
+ * Control whether bindings for interop support are added.
+ */
+#undef NCURSES_INTEROP_FUNCS
+#define NCURSES_INTEROP_FUNCS 1
+
+/*
+ * The internal type used for window dimensions.
+ */
+#undef NCURSES_SIZE_T
+#define NCURSES_SIZE_T short
+
+/*
+ * Control whether tparm() supports varargs or fixed-parameter list.
+ */
+#undef NCURSES_TPARM_VARARGS
+#define NCURSES_TPARM_VARARGS 1
+
+/*
+ * Control type used for tparm's arguments. While X/Open equates long and
+ * char* values, this is not always workable for 64-bit platforms.
+ */
+#undef NCURSES_TPARM_ARG
+#define NCURSES_TPARM_ARG intptr_t
+
+/*
+ * Control whether ncurses uses wcwidth() for checking width of line-drawing
+ * characters.
+ */
+#undef NCURSES_WCWIDTH_GRAPHICS
+#define NCURSES_WCWIDTH_GRAPHICS 1
+
+/*
+ * NCURSES_CH_T is used in building the library, but not used otherwise in
+ * this header file, since that would make the normal/wide-character versions
+ * of the header incompatible.
+ */
+#undef NCURSES_CH_T
+#define NCURSES_CH_T cchar_t
+
+#if 1 && defined(_LP64)
+typedef unsigned chtype;
+typedef unsigned mmask_t;
+#else
+typedef unsigned long chtype;
+typedef unsigned long mmask_t;
+#endif
+
+/*
+ * We need FILE, etc. Include this before checking any feature symbols.
+ */
+#include <stdio.h>
+
+/*
+ * With XPG4, you must define _XOPEN_SOURCE_EXTENDED, it is redundant (or
+ * conflicting) when _XOPEN_SOURCE is 500 or greater. If NCURSES_WIDECHAR is
+ * not already defined, e.g., if the platform relies upon nonstandard feature
+ * test macros, define it at this point if the standard feature test macros
+ * indicate that it should be defined.
+ */
+#ifndef NCURSES_WIDECHAR
+#if defined(_XOPEN_SOURCE_EXTENDED) || (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0 >= 500))
+#define NCURSES_WIDECHAR 1
+#else
+#define NCURSES_WIDECHAR 0
+#endif
+#endif /* NCURSES_WIDECHAR */
+
+#include <stdarg.h> /* we need va_list */
+#if NCURSES_WIDECHAR
+#include <stddef.h> /* we want wchar_t */
+#endif
+
+/* X/Open and SVr4 specify that curses implements 'bool'. However, C++ may also
+ * implement it. If so, we must use the C++ compiler's type to avoid conflict
+ * with other interfaces.
+ *
+ * A further complication is that <stdbool.h> may declare 'bool' to be a
+ * different type, such as an enum which is not necessarily compatible with
+ * C++. If we have <stdbool.h>, make 'bool' a macro, so users may #undef it.
+ * Otherwise, let it remain a typedef to avoid conflicts with other #define's.
+ * In either case, make a typedef for NCURSES_BOOL which can be used if needed
+ * from either C or C++.
+ */
+
+#undef TRUE
+#define TRUE 1
+
+#undef FALSE
+#define FALSE 0
+
+typedef unsigned char NCURSES_BOOL;
+
+#if defined(__cplusplus) /* __cplusplus, etc. */
+
+/* use the C++ compiler's bool type */
+#define NCURSES_BOOL bool
+
+#else /* c89, c99, etc. */
+
+#if NCURSES_ENABLE_STDBOOL_H
+#include <stdbool.h>
+/* use whatever the C compiler decides bool really is */
+#define NCURSES_BOOL bool
+#else
+/* there is no predefined bool - use our own */
+#undef bool
+#define bool NCURSES_BOOL
+#endif
+
+#endif /* !__cplusplus, etc. */
+
+#ifdef __cplusplus
+extern "C" {
+#define NCURSES_CAST(type,value) static_cast<type>(value)
+#else
+#define NCURSES_CAST(type,value) (type)(value)
+#endif
+
+#define NCURSES_OK_ADDR(p) (0 != NCURSES_CAST(const void *, (p)))
+
+/*
+ * X/Open attributes. In the ncurses implementation, they are identical to the
+ * A_ attributes.
+ */
+#define WA_ATTRIBUTES A_ATTRIBUTES
+#define WA_NORMAL A_NORMAL
+#define WA_STANDOUT A_STANDOUT
+#define WA_UNDERLINE A_UNDERLINE
+#define WA_REVERSE A_REVERSE
+#define WA_BLINK A_BLINK
+#define WA_DIM A_DIM
+#define WA_BOLD A_BOLD
+#define WA_ALTCHARSET A_ALTCHARSET
+#define WA_INVIS A_INVIS
+#define WA_PROTECT A_PROTECT
+#define WA_HORIZONTAL A_HORIZONTAL
+#define WA_LEFT A_LEFT
+#define WA_LOW A_LOW
+#define WA_RIGHT A_RIGHT
+#define WA_TOP A_TOP
+#define WA_VERTICAL A_VERTICAL
+
+#if 1
+#define WA_ITALIC A_ITALIC /* ncurses extension */
+#endif
+
+/* colors */
+#define COLOR_BLACK 0
+#define COLOR_RED 1
+#define COLOR_GREEN 2
+#define COLOR_YELLOW 3
+#define COLOR_BLUE 4
+#define COLOR_MAGENTA 5
+#define COLOR_CYAN 6
+#define COLOR_WHITE 7
+
+/* line graphics */
+
+#if 0 || NCURSES_REENTRANT
+NCURSES_WRAPPED_VAR(chtype*, acs_map);
+#define acs_map NCURSES_PUBLIC_VAR(acs_map())
+#else
+extern NCURSES_EXPORT_VAR(chtype) acs_map[];
+#endif
+
+#define NCURSES_ACS(c) (acs_map[NCURSES_CAST(unsigned char,(c))])
+
+/* VT100 symbols begin here */
+#define ACS_ULCORNER NCURSES_ACS('l') /* upper left corner */
+#define ACS_LLCORNER NCURSES_ACS('m') /* lower left corner */
+#define ACS_URCORNER NCURSES_ACS('k') /* upper right corner */
+#define ACS_LRCORNER NCURSES_ACS('j') /* lower right corner */
+#define ACS_LTEE NCURSES_ACS('t') /* tee pointing right */
+#define ACS_RTEE NCURSES_ACS('u') /* tee pointing left */
+#define ACS_BTEE NCURSES_ACS('v') /* tee pointing up */
+#define ACS_TTEE NCURSES_ACS('w') /* tee pointing down */
+#define ACS_HLINE NCURSES_ACS('q') /* horizontal line */
+#define ACS_VLINE NCURSES_ACS('x') /* vertical line */
+#define ACS_PLUS NCURSES_ACS('n') /* large plus or crossover */
+#define ACS_S1 NCURSES_ACS('o') /* scan line 1 */
+#define ACS_S9 NCURSES_ACS('s') /* scan line 9 */
+#define ACS_DIAMOND NCURSES_ACS('`') /* diamond */
+#define ACS_CKBOARD NCURSES_ACS('a') /* checker board (stipple) */
+#define ACS_DEGREE NCURSES_ACS('f') /* degree symbol */
+#define ACS_PLMINUS NCURSES_ACS('g') /* plus/minus */
+#define ACS_BULLET NCURSES_ACS('~') /* bullet */
+/* Teletype 5410v1 symbols begin here */
+#define ACS_LARROW NCURSES_ACS(',') /* arrow pointing left */
+#define ACS_RARROW NCURSES_ACS('+') /* arrow pointing right */
+#define ACS_DARROW NCURSES_ACS('.') /* arrow pointing down */
+#define ACS_UARROW NCURSES_ACS('-') /* arrow pointing up */
+#define ACS_BOARD NCURSES_ACS('h') /* board of squares */
+#define ACS_LANTERN NCURSES_ACS('i') /* lantern symbol */
+#define ACS_BLOCK NCURSES_ACS('0') /* solid square block */
+/*
+ * These aren't documented, but a lot of System Vs have them anyway
+ * (you can spot pprryyzz{{||}} in a lot of AT&T terminfo strings).
+ * The ACS_names may not match AT&T's, our source didn't know them.
+ */
+#define ACS_S3 NCURSES_ACS('p') /* scan line 3 */
+#define ACS_S7 NCURSES_ACS('r') /* scan line 7 */
+#define ACS_LEQUAL NCURSES_ACS('y') /* less/equal */
+#define ACS_GEQUAL NCURSES_ACS('z') /* greater/equal */
+#define ACS_PI NCURSES_ACS('{') /* Pi */
+#define ACS_NEQUAL NCURSES_ACS('|') /* not equal */
+#define ACS_STERLING NCURSES_ACS('}') /* UK pound sign */
+
+/*
+ * Line drawing ACS names are of the form ACS_trbl, where t is the top, r
+ * is the right, b is the bottom, and l is the left. t, r, b, and l might
+ * be B (blank), S (single), D (double), or T (thick). The subset defined
+ * here only uses B and S.
+ */
+#define ACS_BSSB ACS_ULCORNER
+#define ACS_SSBB ACS_LLCORNER
+#define ACS_BBSS ACS_URCORNER
+#define ACS_SBBS ACS_LRCORNER
+#define ACS_SBSS ACS_RTEE
+#define ACS_SSSB ACS_LTEE
+#define ACS_SSBS ACS_BTEE
+#define ACS_BSSS ACS_TTEE
+#define ACS_BSBS ACS_HLINE
+#define ACS_SBSB ACS_VLINE
+#define ACS_SSSS ACS_PLUS
+
+#undef ERR
+#define ERR (-1)
+
+#undef OK
+#define OK (0)
+
+/* values for the _flags member */
+#define _SUBWIN 0x01 /* is this a sub-window? */
+#define _ENDLINE 0x02 /* is the window flush right? */
+#define _FULLWIN 0x04 /* is the window full-screen? */
+#define _SCROLLWIN 0x08 /* bottom edge is at screen bottom? */
+#define _ISPAD 0x10 /* is this window a pad? */
+#define _HASMOVED 0x20 /* has cursor moved since last refresh? */
+#define _WRAPPED 0x40 /* cursor was just wrappped */
+
+/*
+ * this value is used in the firstchar and lastchar fields to mark
+ * unchanged lines
+ */
+#define _NOCHANGE -1
+
+/*
+ * this value is used in the oldindex field to mark lines created by insertions
+ * and scrolls.
+ */
+#define _NEWINDEX -1
+
+typedef struct screen SCREEN;
+typedef struct _win_st WINDOW;
+
+typedef chtype attr_t; /* ...must be at least as wide as chtype */
+
+#if NCURSES_WIDECHAR
+
+#if 0
+#ifdef mblen /* libutf8.h defines it w/o undefining first */
+#undef mblen
+#endif
+#include <libutf8.h>
+#endif
+
+#if 1
+#include <wchar.h> /* ...to get mbstate_t, etc. */
+#endif
+
+#if 0
+typedef unsigned short wchar_t1;
+#endif
+
+#if 0
+typedef unsigned int wint_t1;
+#endif
+
+/*
+ * cchar_t stores an array of CCHARW_MAX wide characters. The first is
+ * normally a spacing character. The others are non-spacing. If those
+ * (spacing and nonspacing) do not fill the array, a null L'\0' follows.
+ * Otherwise, a null is assumed to follow when extracting via getcchar().
+ */
+#define CCHARW_MAX 5
+typedef struct
+{
+ attr_t attr;
+ wchar_t chars[CCHARW_MAX];
+#if 1
+#undef NCURSES_EXT_COLORS
+#define NCURSES_EXT_COLORS 20201024
+ int ext_color; /* color pair, must be more than 16-bits */
+#endif
+}
+cchar_t;
+
+#endif /* NCURSES_WIDECHAR */
+
+#if !NCURSES_OPAQUE
+struct ldat;
+
+struct _win_st
+{
+ NCURSES_SIZE_T _cury, _curx; /* current cursor position */
+
+ /* window location and size */
+ NCURSES_SIZE_T _maxy, _maxx; /* maximums of x and y, NOT window size */
+ NCURSES_SIZE_T _begy, _begx; /* screen coords of upper-left-hand corner */
+
+ short _flags; /* window state flags */
+
+ /* attribute tracking */
+ attr_t _attrs; /* current attribute for non-space character */
+ chtype _bkgd; /* current background char/attribute pair */
+
+ /* option values set by user */
+ bool _notimeout; /* no time out on function-key entry? */
+ bool _clear; /* consider all data in the window invalid? */
+ bool _leaveok; /* OK to not reset cursor on exit? */
+ bool _scroll; /* OK to scroll this window? */
+ bool _idlok; /* OK to use insert/delete line? */
+ bool _idcok; /* OK to use insert/delete char? */
+ bool _immed; /* window in immed mode? (not yet used) */
+ bool _sync; /* window in sync mode? */
+ bool _use_keypad; /* process function keys into KEY_ symbols? */
+ int _delay; /* 0 = nodelay, <0 = blocking, >0 = delay */
+
+ struct ldat *_line; /* the actual line data */
+
+ /* global screen state */
+ NCURSES_SIZE_T _regtop; /* top line of scrolling region */
+ NCURSES_SIZE_T _regbottom; /* bottom line of scrolling region */
+
+ /* these are used only if this is a sub-window */
+ int _parx; /* x coordinate of this window in parent */
+ int _pary; /* y coordinate of this window in parent */
+ WINDOW *_parent; /* pointer to parent if a sub-window */
+
+ /* these are used only if this is a pad */
+ struct pdat
+ {
+ NCURSES_SIZE_T _pad_y, _pad_x;
+ NCURSES_SIZE_T _pad_top, _pad_left;
+ NCURSES_SIZE_T _pad_bottom, _pad_right;
+ } _pad;
+
+ NCURSES_SIZE_T _yoffset; /* real begy is _begy + _yoffset */
+
+#if NCURSES_WIDECHAR
+ cchar_t _bkgrnd; /* current background char/attribute pair */
+#if 1
+ int _color; /* current color-pair for non-space character */
+#endif
+#endif
+};
+#endif /* NCURSES_OPAQUE */
+
+/*
+ * GCC (and some other compilers) define '__attribute__'; we're using this
+ * macro to alert the compiler to flag inconsistencies in printf/scanf-like
+ * function calls. Just in case '__attribute__' isn't defined, make a dummy.
+ * Old versions of G++ do not accept it anyway, at least not consistently with
+ * GCC.
+ */
+#if !(defined(__GNUC__) || defined(__GNUG__) || defined(__attribute__))
+#define __attribute__(p) /* nothing */
+#endif
+
+/*
+ * We cannot define these in ncurses_cfg.h, since they require parameters to be
+ * passed (that is non-portable). If you happen to be using gcc with warnings
+ * enabled, define
+ * GCC_PRINTF
+ * GCC_SCANF
+ * to improve checking of calls to printw(), etc.
+ */
+#ifndef GCC_PRINTFLIKE
+#if defined(GCC_PRINTF) && !defined(printf)
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#endif
+
+#ifndef GCC_SCANFLIKE
+#if defined(GCC_SCANF) && !defined(scanf)
+#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var) /*nothing*/
+#endif
+#endif
+
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+
+#undef GCC_DEPRECATED
+#if (__GNUC__ - 0 > 3 || (__GNUC__ - 0 == 3 && __GNUC_MINOR__ - 0 >= 2)) && !defined(NCURSES_INTERNALS)
+#define GCC_DEPRECATED(msg) __attribute__((deprecated))
+#else
+#define GCC_DEPRECATED(msg) /* nothing */
+#endif
+
+/*
+ * Curses uses a helper function. Define our type for this to simplify
+ * extending it for the sp-funcs feature.
+ */
+typedef int (*NCURSES_OUTC)(int);
+
+/*
+ * Function prototypes. This is the complete X/Open Curses list of required
+ * functions. Those marked `generated' will have sources generated from the
+ * macro definitions later in this file, in order to satisfy XPG4.2
+ * requirements.
+ */
+
+extern NCURSES_EXPORT(int) addch (const chtype); /* generated */
+extern NCURSES_EXPORT(int) addchnstr (const chtype *, int); /* generated */
+extern NCURSES_EXPORT(int) addchstr (const chtype *); /* generated */
+extern NCURSES_EXPORT(int) addnstr (const char *, int); /* generated */
+extern NCURSES_EXPORT(int) addstr (const char *); /* generated */
+extern NCURSES_EXPORT(int) attroff (NCURSES_ATTR_T); /* generated */
+extern NCURSES_EXPORT(int) attron (NCURSES_ATTR_T); /* generated */
+extern NCURSES_EXPORT(int) attrset (NCURSES_ATTR_T); /* generated */
+extern NCURSES_EXPORT(int) attr_get (attr_t *, NCURSES_PAIRS_T *, void *); /* generated */
+extern NCURSES_EXPORT(int) attr_off (attr_t, void *); /* generated */
+extern NCURSES_EXPORT(int) attr_on (attr_t, void *); /* generated */
+extern NCURSES_EXPORT(int) attr_set (attr_t, NCURSES_PAIRS_T, void *); /* generated */
+extern NCURSES_EXPORT(int) baudrate (void); /* implemented */
+extern NCURSES_EXPORT(int) beep (void); /* implemented */
+extern NCURSES_EXPORT(int) bkgd (chtype); /* generated */
+extern NCURSES_EXPORT(void) bkgdset (chtype); /* generated */
+extern NCURSES_EXPORT(int) border (chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype); /* generated */
+extern NCURSES_EXPORT(int) box (WINDOW *, chtype, chtype); /* generated */
+extern NCURSES_EXPORT(bool) can_change_color (void); /* implemented */
+extern NCURSES_EXPORT(int) cbreak (void); /* implemented */
+extern NCURSES_EXPORT(int) chgat (int, attr_t, NCURSES_PAIRS_T, const void *); /* generated */
+extern NCURSES_EXPORT(int) clear (void); /* generated */
+extern NCURSES_EXPORT(int) clearok (WINDOW *,bool); /* implemented */
+extern NCURSES_EXPORT(int) clrtobot (void); /* generated */
+extern NCURSES_EXPORT(int) clrtoeol (void); /* generated */
+extern NCURSES_EXPORT(int) color_content (NCURSES_COLOR_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*,NCURSES_COLOR_T*); /* implemented */
+extern NCURSES_EXPORT(int) color_set (NCURSES_PAIRS_T,void*); /* generated */
+extern NCURSES_EXPORT(int) COLOR_PAIR (int); /* generated */
+extern NCURSES_EXPORT(int) copywin (const WINDOW*,WINDOW*,int,int,int,int,int,int,int); /* implemented */
+extern NCURSES_EXPORT(int) curs_set (int); /* implemented */
+extern NCURSES_EXPORT(int) def_prog_mode (void); /* implemented */
+extern NCURSES_EXPORT(int) def_shell_mode (void); /* implemented */
+extern NCURSES_EXPORT(int) delay_output (int); /* implemented */
+extern NCURSES_EXPORT(int) delch (void); /* generated */
+extern NCURSES_EXPORT(void) delscreen (SCREEN *); /* implemented */
+extern NCURSES_EXPORT(int) delwin (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) deleteln (void); /* generated */
+extern NCURSES_EXPORT(WINDOW *) derwin (WINDOW *,int,int,int,int); /* implemented */
+extern NCURSES_EXPORT(int) doupdate (void); /* implemented */
+extern NCURSES_EXPORT(WINDOW *) dupwin (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) echo (void); /* implemented */
+extern NCURSES_EXPORT(int) echochar (const chtype); /* generated */
+extern NCURSES_EXPORT(int) erase (void); /* generated */
+extern NCURSES_EXPORT(int) endwin (void); /* implemented */
+extern NCURSES_EXPORT(char) erasechar (void); /* implemented */
+extern NCURSES_EXPORT(void) filter (void); /* implemented */
+extern NCURSES_EXPORT(int) flash (void); /* implemented */
+extern NCURSES_EXPORT(int) flushinp (void); /* implemented */
+extern NCURSES_EXPORT(chtype) getbkgd (WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) getch (void); /* generated */
+extern NCURSES_EXPORT(int) getnstr (char *, int); /* generated */
+extern NCURSES_EXPORT(int) getstr (char *); /* generated */
+extern NCURSES_EXPORT(WINDOW *) getwin (FILE *); /* implemented */
+extern NCURSES_EXPORT(int) halfdelay (int); /* implemented */
+extern NCURSES_EXPORT(bool) has_colors (void); /* implemented */
+extern NCURSES_EXPORT(bool) has_ic (void); /* implemented */
+extern NCURSES_EXPORT(bool) has_il (void); /* implemented */
+extern NCURSES_EXPORT(int) hline (chtype, int); /* generated */
+extern NCURSES_EXPORT(void) idcok (WINDOW *, bool); /* implemented */
+extern NCURSES_EXPORT(int) idlok (WINDOW *, bool); /* implemented */
+extern NCURSES_EXPORT(void) immedok (WINDOW *, bool); /* implemented */
+extern NCURSES_EXPORT(chtype) inch (void); /* generated */
+extern NCURSES_EXPORT(int) inchnstr (chtype *, int); /* generated */
+extern NCURSES_EXPORT(int) inchstr (chtype *); /* generated */
+extern NCURSES_EXPORT(WINDOW *) initscr (void); /* implemented */
+extern NCURSES_EXPORT(int) init_color (NCURSES_COLOR_T,NCURSES_COLOR_T,NCURSES_COLOR_T,NCURSES_COLOR_T); /* implemented */
+extern NCURSES_EXPORT(int) init_pair (NCURSES_PAIRS_T,NCURSES_COLOR_T,NCURSES_COLOR_T); /* implemented */
+extern NCURSES_EXPORT(int) innstr (char *, int); /* generated */
+extern NCURSES_EXPORT(int) insch (chtype); /* generated */
+extern NCURSES_EXPORT(int) insdelln (int); /* generated */
+extern NCURSES_EXPORT(int) insertln (void); /* generated */
+extern NCURSES_EXPORT(int) insnstr (const char *, int); /* generated */
+extern NCURSES_EXPORT(int) insstr (const char *); /* generated */
+extern NCURSES_EXPORT(int) instr (char *); /* generated */
+extern NCURSES_EXPORT(int) intrflush (WINDOW *,bool); /* implemented */
+extern NCURSES_EXPORT(bool) isendwin (void); /* implemented */
+extern NCURSES_EXPORT(bool) is_linetouched (WINDOW *,int); /* implemented */
+extern NCURSES_EXPORT(bool) is_wintouched (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(NCURSES_CONST char *) keyname (int); /* implemented */
+extern NCURSES_EXPORT(int) keypad (WINDOW *,bool); /* implemented */
+extern NCURSES_EXPORT(char) killchar (void); /* implemented */
+extern NCURSES_EXPORT(int) leaveok (WINDOW *,bool); /* implemented */
+extern NCURSES_EXPORT(char *) longname (void); /* implemented */
+extern NCURSES_EXPORT(int) meta (WINDOW *,bool); /* implemented */
+extern NCURSES_EXPORT(int) move (int, int); /* generated */
+extern NCURSES_EXPORT(int) mvaddch (int, int, const chtype); /* generated */
+extern NCURSES_EXPORT(int) mvaddchnstr (int, int, const chtype *, int); /* generated */
+extern NCURSES_EXPORT(int) mvaddchstr (int, int, const chtype *); /* generated */
+extern NCURSES_EXPORT(int) mvaddnstr (int, int, const char *, int); /* generated */
+extern NCURSES_EXPORT(int) mvaddstr (int, int, const char *); /* generated */
+extern NCURSES_EXPORT(int) mvchgat (int, int, int, attr_t, NCURSES_PAIRS_T, const void *); /* generated */
+extern NCURSES_EXPORT(int) mvcur (int,int,int,int); /* implemented */
+extern NCURSES_EXPORT(int) mvdelch (int, int); /* generated */
+extern NCURSES_EXPORT(int) mvderwin (WINDOW *, int, int); /* implemented */
+extern NCURSES_EXPORT(int) mvgetch (int, int); /* generated */
+extern NCURSES_EXPORT(int) mvgetnstr (int, int, char *, int); /* generated */
+extern NCURSES_EXPORT(int) mvgetstr (int, int, char *); /* generated */
+extern NCURSES_EXPORT(int) mvhline (int, int, chtype, int); /* generated */
+extern NCURSES_EXPORT(chtype) mvinch (int, int); /* generated */
+extern NCURSES_EXPORT(int) mvinchnstr (int, int, chtype *, int); /* generated */
+extern NCURSES_EXPORT(int) mvinchstr (int, int, chtype *); /* generated */
+extern NCURSES_EXPORT(int) mvinnstr (int, int, char *, int); /* generated */
+extern NCURSES_EXPORT(int) mvinsch (int, int, chtype); /* generated */
+extern NCURSES_EXPORT(int) mvinsnstr (int, int, const char *, int); /* generated */
+extern NCURSES_EXPORT(int) mvinsstr (int, int, const char *); /* generated */
+extern NCURSES_EXPORT(int) mvinstr (int, int, char *); /* generated */
+extern NCURSES_EXPORT(int) mvprintw (int,int, const char *,...) /* implemented */
+ GCC_PRINTFLIKE(3,4);
+extern NCURSES_EXPORT(int) mvscanw (int,int, const char *,...) /* implemented */
+ GCC_SCANFLIKE(3,4);
+extern NCURSES_EXPORT(int) mvvline (int, int, chtype, int); /* generated */
+extern NCURSES_EXPORT(int) mvwaddch (WINDOW *, int, int, const chtype); /* generated */
+extern NCURSES_EXPORT(int) mvwaddchnstr (WINDOW *, int, int, const chtype *, int);/* generated */
+extern NCURSES_EXPORT(int) mvwaddchstr (WINDOW *, int, int, const chtype *); /* generated */
+extern NCURSES_EXPORT(int) mvwaddnstr (WINDOW *, int, int, const char *, int); /* generated */
+extern NCURSES_EXPORT(int) mvwaddstr (WINDOW *, int, int, const char *); /* generated */
+extern NCURSES_EXPORT(int) mvwchgat (WINDOW *, int, int, int, attr_t, NCURSES_PAIRS_T, const void *);/* generated */
+extern NCURSES_EXPORT(int) mvwdelch (WINDOW *, int, int); /* generated */
+extern NCURSES_EXPORT(int) mvwgetch (WINDOW *, int, int); /* generated */
+extern NCURSES_EXPORT(int) mvwgetnstr (WINDOW *, int, int, char *, int); /* generated */
+extern NCURSES_EXPORT(int) mvwgetstr (WINDOW *, int, int, char *); /* generated */
+extern NCURSES_EXPORT(int) mvwhline (WINDOW *, int, int, chtype, int); /* generated */
+extern NCURSES_EXPORT(int) mvwin (WINDOW *,int,int); /* implemented */
+extern NCURSES_EXPORT(chtype) mvwinch (WINDOW *, int, int); /* generated */
+extern NCURSES_EXPORT(int) mvwinchnstr (WINDOW *, int, int, chtype *, int); /* generated */
+extern NCURSES_EXPORT(int) mvwinchstr (WINDOW *, int, int, chtype *); /* generated */
+extern NCURSES_EXPORT(int) mvwinnstr (WINDOW *, int, int, char *, int); /* generated */
+extern NCURSES_EXPORT(int) mvwinsch (WINDOW *, int, int, chtype); /* generated */
+extern NCURSES_EXPORT(int) mvwinsnstr (WINDOW *, int, int, const char *, int); /* generated */
+extern NCURSES_EXPORT(int) mvwinsstr (WINDOW *, int, int, const char *); /* generated */
+extern NCURSES_EXPORT(int) mvwinstr (WINDOW *, int, int, char *); /* generated */
+extern NCURSES_EXPORT(int) mvwprintw (WINDOW*,int,int, const char *,...) /* implemented */
+ GCC_PRINTFLIKE(4,5);
+extern NCURSES_EXPORT(int) mvwscanw (WINDOW *,int,int, const char *,...) /* implemented */
+ GCC_SCANFLIKE(4,5);
+extern NCURSES_EXPORT(int) mvwvline (WINDOW *,int, int, chtype, int); /* generated */
+extern NCURSES_EXPORT(int) napms (int); /* implemented */
+extern NCURSES_EXPORT(WINDOW *) newpad (int,int); /* implemented */
+extern NCURSES_EXPORT(SCREEN *) newterm (const char *,FILE *,FILE *); /* implemented */
+extern NCURSES_EXPORT(WINDOW *) newwin (int,int,int,int); /* implemented */
+extern NCURSES_EXPORT(int) nl (void); /* implemented */
+extern NCURSES_EXPORT(int) nocbreak (void); /* implemented */
+extern NCURSES_EXPORT(int) nodelay (WINDOW *,bool); /* implemented */
+extern NCURSES_EXPORT(int) noecho (void); /* implemented */
+extern NCURSES_EXPORT(int) nonl (void); /* implemented */
+extern NCURSES_EXPORT(void) noqiflush (void); /* implemented */
+extern NCURSES_EXPORT(int) noraw (void); /* implemented */
+extern NCURSES_EXPORT(int) notimeout (WINDOW *,bool); /* implemented */
+extern NCURSES_EXPORT(int) overlay (const WINDOW*,WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) overwrite (const WINDOW*,WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) pair_content (NCURSES_PAIRS_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*); /* implemented */
+extern NCURSES_EXPORT(int) PAIR_NUMBER (int); /* generated */
+extern NCURSES_EXPORT(int) pechochar (WINDOW *, const chtype); /* implemented */
+extern NCURSES_EXPORT(int) pnoutrefresh (WINDOW*,int,int,int,int,int,int);/* implemented */
+extern NCURSES_EXPORT(int) prefresh (WINDOW *,int,int,int,int,int,int); /* implemented */
+extern NCURSES_EXPORT(int) printw (const char *,...) /* implemented */
+ GCC_PRINTFLIKE(1,2);
+extern NCURSES_EXPORT(int) putwin (WINDOW *, FILE *); /* implemented */
+extern NCURSES_EXPORT(void) qiflush (void); /* implemented */
+extern NCURSES_EXPORT(int) raw (void); /* implemented */
+extern NCURSES_EXPORT(int) redrawwin (WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) refresh (void); /* generated */
+extern NCURSES_EXPORT(int) resetty (void); /* implemented */
+extern NCURSES_EXPORT(int) reset_prog_mode (void); /* implemented */
+extern NCURSES_EXPORT(int) reset_shell_mode (void); /* implemented */
+extern NCURSES_EXPORT(int) ripoffline (int, int (*)(WINDOW *, int)); /* implemented */
+extern NCURSES_EXPORT(int) savetty (void); /* implemented */
+extern NCURSES_EXPORT(int) scanw (const char *,...) /* implemented */
+ GCC_SCANFLIKE(1,2);
+extern NCURSES_EXPORT(int) scr_dump (const char *); /* implemented */
+extern NCURSES_EXPORT(int) scr_init (const char *); /* implemented */
+extern NCURSES_EXPORT(int) scrl (int); /* generated */
+extern NCURSES_EXPORT(int) scroll (WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) scrollok (WINDOW *,bool); /* implemented */
+extern NCURSES_EXPORT(int) scr_restore (const char *); /* implemented */
+extern NCURSES_EXPORT(int) scr_set (const char *); /* implemented */
+extern NCURSES_EXPORT(int) setscrreg (int,int); /* generated */
+extern NCURSES_EXPORT(SCREEN *) set_term (SCREEN *); /* implemented */
+extern NCURSES_EXPORT(int) slk_attroff (const chtype); /* implemented */
+extern NCURSES_EXPORT(int) slk_attr_off (const attr_t, void *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) slk_attron (const chtype); /* implemented */
+extern NCURSES_EXPORT(int) slk_attr_on (attr_t,void*); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) slk_attrset (const chtype); /* implemented */
+extern NCURSES_EXPORT(attr_t) slk_attr (void); /* implemented */
+extern NCURSES_EXPORT(int) slk_attr_set (const attr_t,NCURSES_PAIRS_T,void*); /* implemented */
+extern NCURSES_EXPORT(int) slk_clear (void); /* implemented */
+extern NCURSES_EXPORT(int) slk_color (NCURSES_PAIRS_T); /* implemented */
+extern NCURSES_EXPORT(int) slk_init (int); /* implemented */
+extern NCURSES_EXPORT(char *) slk_label (int); /* implemented */
+extern NCURSES_EXPORT(int) slk_noutrefresh (void); /* implemented */
+extern NCURSES_EXPORT(int) slk_refresh (void); /* implemented */
+extern NCURSES_EXPORT(int) slk_restore (void); /* implemented */
+extern NCURSES_EXPORT(int) slk_set (int,const char *,int); /* implemented */
+extern NCURSES_EXPORT(int) slk_touch (void); /* implemented */
+extern NCURSES_EXPORT(int) standout (void); /* generated */
+extern NCURSES_EXPORT(int) standend (void); /* generated */
+extern NCURSES_EXPORT(int) start_color (void); /* implemented */
+extern NCURSES_EXPORT(WINDOW *) subpad (WINDOW *, int, int, int, int); /* implemented */
+extern NCURSES_EXPORT(WINDOW *) subwin (WINDOW *, int, int, int, int); /* implemented */
+extern NCURSES_EXPORT(int) syncok (WINDOW *, bool); /* implemented */
+extern NCURSES_EXPORT(chtype) termattrs (void); /* implemented */
+extern NCURSES_EXPORT(char *) termname (void); /* implemented */
+extern NCURSES_EXPORT(void) timeout (int); /* generated */
+extern NCURSES_EXPORT(int) touchline (WINDOW *, int, int); /* generated */
+extern NCURSES_EXPORT(int) touchwin (WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) typeahead (int); /* implemented */
+extern NCURSES_EXPORT(int) ungetch (int); /* implemented */
+extern NCURSES_EXPORT(int) untouchwin (WINDOW *); /* generated */
+extern NCURSES_EXPORT(void) use_env (bool); /* implemented */
+extern NCURSES_EXPORT(void) use_tioctl (bool); /* implemented */
+extern NCURSES_EXPORT(int) vidattr (chtype); /* implemented */
+extern NCURSES_EXPORT(int) vidputs (chtype, NCURSES_OUTC); /* implemented */
+extern NCURSES_EXPORT(int) vline (chtype, int); /* generated */
+extern NCURSES_EXPORT(int) vwprintw (WINDOW *, const char *,va_list) GCC_DEPRECATED(use vw_printw); /* implemented */
+extern NCURSES_EXPORT(int) vw_printw (WINDOW *, const char *,va_list); /* implemented */
+extern NCURSES_EXPORT(int) vwscanw (WINDOW *, const char *,va_list) GCC_DEPRECATED(use vw_scanw); /* implemented */
+extern NCURSES_EXPORT(int) vw_scanw (WINDOW *, const char *,va_list); /* implemented */
+extern NCURSES_EXPORT(int) waddch (WINDOW *, const chtype); /* implemented */
+extern NCURSES_EXPORT(int) waddchnstr (WINDOW *,const chtype *,int); /* implemented */
+extern NCURSES_EXPORT(int) waddchstr (WINDOW *,const chtype *); /* generated */
+extern NCURSES_EXPORT(int) waddnstr (WINDOW *,const char *,int); /* implemented */
+extern NCURSES_EXPORT(int) waddstr (WINDOW *,const char *); /* generated */
+extern NCURSES_EXPORT(int) wattron (WINDOW *, int); /* generated */
+extern NCURSES_EXPORT(int) wattroff (WINDOW *, int); /* generated */
+extern NCURSES_EXPORT(int) wattrset (WINDOW *, int); /* generated */
+extern NCURSES_EXPORT(int) wattr_get (WINDOW *, attr_t *, NCURSES_PAIRS_T *, void *); /* generated */
+extern NCURSES_EXPORT(int) wattr_on (WINDOW *, attr_t, void *); /* implemented */
+extern NCURSES_EXPORT(int) wattr_off (WINDOW *, attr_t, void *); /* implemented */
+extern NCURSES_EXPORT(int) wattr_set (WINDOW *, attr_t, NCURSES_PAIRS_T, void *); /* generated */
+extern NCURSES_EXPORT(int) wbkgd (WINDOW *, chtype); /* implemented */
+extern NCURSES_EXPORT(void) wbkgdset (WINDOW *,chtype); /* implemented */
+extern NCURSES_EXPORT(int) wborder (WINDOW *,chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype); /* implemented */
+extern NCURSES_EXPORT(int) wchgat (WINDOW *, int, attr_t, NCURSES_PAIRS_T, const void *);/* implemented */
+extern NCURSES_EXPORT(int) wclear (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) wclrtobot (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) wclrtoeol (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) wcolor_set (WINDOW*,NCURSES_PAIRS_T,void*); /* implemented */
+extern NCURSES_EXPORT(void) wcursyncup (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) wdelch (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) wdeleteln (WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) wechochar (WINDOW *, const chtype); /* implemented */
+extern NCURSES_EXPORT(int) werase (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) wgetch (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) wgetnstr (WINDOW *,char *,int); /* implemented */
+extern NCURSES_EXPORT(int) wgetstr (WINDOW *, char *); /* generated */
+extern NCURSES_EXPORT(int) whline (WINDOW *, chtype, int); /* implemented */
+extern NCURSES_EXPORT(chtype) winch (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) winchnstr (WINDOW *, chtype *, int); /* implemented */
+extern NCURSES_EXPORT(int) winchstr (WINDOW *, chtype *); /* generated */
+extern NCURSES_EXPORT(int) winnstr (WINDOW *, char *, int); /* implemented */
+extern NCURSES_EXPORT(int) winsch (WINDOW *, chtype); /* implemented */
+extern NCURSES_EXPORT(int) winsdelln (WINDOW *,int); /* implemented */
+extern NCURSES_EXPORT(int) winsertln (WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) winsnstr (WINDOW *, const char *,int); /* implemented */
+extern NCURSES_EXPORT(int) winsstr (WINDOW *, const char *); /* generated */
+extern NCURSES_EXPORT(int) winstr (WINDOW *, char *); /* generated */
+extern NCURSES_EXPORT(int) wmove (WINDOW *,int,int); /* implemented */
+extern NCURSES_EXPORT(int) wnoutrefresh (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) wprintw (WINDOW *, const char *,...) /* implemented */
+ GCC_PRINTFLIKE(2,3);
+extern NCURSES_EXPORT(int) wredrawln (WINDOW *,int,int); /* implemented */
+extern NCURSES_EXPORT(int) wrefresh (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(int) wscanw (WINDOW *, const char *,...) /* implemented */
+ GCC_SCANFLIKE(2,3);
+extern NCURSES_EXPORT(int) wscrl (WINDOW *,int); /* implemented */
+extern NCURSES_EXPORT(int) wsetscrreg (WINDOW *,int,int); /* implemented */
+extern NCURSES_EXPORT(int) wstandout (WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) wstandend (WINDOW *); /* generated */
+extern NCURSES_EXPORT(void) wsyncdown (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(void) wsyncup (WINDOW *); /* implemented */
+extern NCURSES_EXPORT(void) wtimeout (WINDOW *,int); /* implemented */
+extern NCURSES_EXPORT(int) wtouchln (WINDOW *,int,int,int); /* implemented */
+extern NCURSES_EXPORT(int) wvline (WINDOW *,chtype,int); /* implemented */
+
+/*
+ * These are also declared in <term.h>:
+ */
+extern NCURSES_EXPORT(int) tigetflag (const char *); /* implemented */
+extern NCURSES_EXPORT(int) tigetnum (const char *); /* implemented */
+extern NCURSES_EXPORT(char *) tigetstr (const char *); /* implemented */
+extern NCURSES_EXPORT(int) putp (const char *); /* implemented */
+
+#if NCURSES_TPARM_VARARGS
+extern NCURSES_EXPORT(char *) tparm (const char *, ...); /* special */
+#else
+extern NCURSES_EXPORT(char *) tparm (const char *, NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG); /* special */
+#endif
+
+extern NCURSES_EXPORT(char *) tiparm (const char *, ...); /* special */
+
+/*
+ * These functions are not in X/Open, but we use them in macro definitions:
+ */
+extern NCURSES_EXPORT(int) getattrs (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) getcurx (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) getcury (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) getbegx (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) getbegy (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) getmaxx (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) getmaxy (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) getparx (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) getpary (const WINDOW *); /* generated */
+
+/*
+ * vid_attr() was implemented originally based on a draft of X/Open curses.
+ */
+#if !NCURSES_WIDECHAR
+#define vid_attr(a,pair,opts) vidattr(a)
+#endif
+
+/*
+ * These functions are extensions - not in X/Open Curses.
+ */
+#if 1
+#undef NCURSES_EXT_FUNCS
+#define NCURSES_EXT_FUNCS 20201024
+typedef int (*NCURSES_WINDOW_CB)(WINDOW *, void *);
+typedef int (*NCURSES_SCREEN_CB)(SCREEN *, void *);
+extern NCURSES_EXPORT(bool) is_term_resized (int, int);
+extern NCURSES_EXPORT(char *) keybound (int, int);
+extern NCURSES_EXPORT(const char *) curses_version (void);
+extern NCURSES_EXPORT(int) alloc_pair (int, int);
+extern NCURSES_EXPORT(int) assume_default_colors (int, int);
+extern NCURSES_EXPORT(int) define_key (const char *, int);
+extern NCURSES_EXPORT(int) extended_color_content(int, int *, int *, int *);
+extern NCURSES_EXPORT(int) extended_pair_content(int, int *, int *);
+extern NCURSES_EXPORT(int) extended_slk_color(int);
+extern NCURSES_EXPORT(int) find_pair (int, int);
+extern NCURSES_EXPORT(int) free_pair (int);
+extern NCURSES_EXPORT(int) get_escdelay (void);
+extern NCURSES_EXPORT(int) init_extended_color(int, int, int, int);
+extern NCURSES_EXPORT(int) init_extended_pair(int, int, int);
+extern NCURSES_EXPORT(int) key_defined (const char *);
+extern NCURSES_EXPORT(int) keyok (int, bool);
+extern NCURSES_EXPORT(void) reset_color_pairs (void);
+extern NCURSES_EXPORT(int) resize_term (int, int);
+extern NCURSES_EXPORT(int) resizeterm (int, int);
+extern NCURSES_EXPORT(int) set_escdelay (int);
+extern NCURSES_EXPORT(int) set_tabsize (int);
+extern NCURSES_EXPORT(int) use_default_colors (void);
+extern NCURSES_EXPORT(int) use_extended_names (bool);
+extern NCURSES_EXPORT(int) use_legacy_coding (int);
+extern NCURSES_EXPORT(int) use_screen (SCREEN *, NCURSES_SCREEN_CB, void *);
+extern NCURSES_EXPORT(int) use_window (WINDOW *, NCURSES_WINDOW_CB, void *);
+extern NCURSES_EXPORT(int) wresize (WINDOW *, int, int);
+extern NCURSES_EXPORT(void) nofilter(void);
+
+/*
+ * These extensions provide access to information stored in the WINDOW even
+ * when NCURSES_OPAQUE is set:
+ */
+extern NCURSES_EXPORT(WINDOW *) wgetparent (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_cleared (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_idcok (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_idlok (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_immedok (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_keypad (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_leaveok (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_nodelay (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_notimeout (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_pad (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_scrollok (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_subwin (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(bool) is_syncok (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) wgetdelay (const WINDOW *); /* generated */
+extern NCURSES_EXPORT(int) wgetscrreg (const WINDOW *, int *, int *); /* generated */
+
+#else
+#define curses_version() NCURSES_VERSION
+#endif
+
+/*
+ * Extra extension-functions, which pass a SCREEN pointer rather than using
+ * a global variable SP.
+ */
+#if 1
+#undef NCURSES_SP_FUNCS
+#define NCURSES_SP_FUNCS 20201024
+#define NCURSES_SP_NAME(name) name##_sp
+
+/* Define the sp-funcs helper function */
+#define NCURSES_SP_OUTC NCURSES_SP_NAME(NCURSES_OUTC)
+typedef int (*NCURSES_SP_OUTC)(SCREEN*, int);
+
+extern NCURSES_EXPORT(SCREEN *) new_prescr (void); /* implemented:SP_FUNC */
+
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(baudrate) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(beep) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(can_change_color) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(cbreak) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(curs_set) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(color_content) (SCREEN*, NCURSES_PAIRS_T, NCURSES_COLOR_T*, NCURSES_COLOR_T*, NCURSES_COLOR_T*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(def_prog_mode) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(def_shell_mode) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(delay_output) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(doupdate) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(echo) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(endwin) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char) NCURSES_SP_NAME(erasechar) (SCREEN*);/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(filter) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(flash) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(flushinp) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(getwin) (SCREEN*, FILE *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(halfdelay) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_colors) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_ic) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_il) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_color) (SCREEN*, NCURSES_COLOR_T, NCURSES_COLOR_T, NCURSES_COLOR_T, NCURSES_COLOR_T); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_pair) (SCREEN*, NCURSES_PAIRS_T, NCURSES_COLOR_T, NCURSES_COLOR_T); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(intrflush) (SCREEN*, WINDOW*, bool); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(isendwin) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(NCURSES_CONST char *) NCURSES_SP_NAME(keyname) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char) NCURSES_SP_NAME(killchar) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(longname) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(mvcur) (SCREEN*, int, int, int, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(napms) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(newpad) (SCREEN*, int, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(SCREEN *) NCURSES_SP_NAME(newterm) (SCREEN*, const char *, FILE *, FILE *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(newwin) (SCREEN*, int, int, int, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(nl) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(nocbreak) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(noecho) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(nonl) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(noqiflush) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(noraw) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(pair_content) (SCREEN*, NCURSES_PAIRS_T, NCURSES_COLOR_T*, NCURSES_COLOR_T*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(qiflush) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(raw) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(reset_prog_mode) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(reset_shell_mode) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(resetty) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(ripoffline) (SCREEN*, int, int (*)(WINDOW *, int)); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(savetty) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_init) (SCREEN*, const char *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_restore) (SCREEN*, const char *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_set) (SCREEN*, const char *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attroff) (SCREEN*, const chtype); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attron) (SCREEN*, const chtype); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attrset) (SCREEN*, const chtype); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(attr_t) NCURSES_SP_NAME(slk_attr) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attr_set) (SCREEN*, const attr_t, NCURSES_PAIRS_T, void*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_clear) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_color) (SCREEN*, NCURSES_PAIRS_T); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_init) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(slk_label) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_noutrefresh) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_refresh) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_restore) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_set) (SCREEN*, int, const char *, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_touch) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(start_color) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(chtype) NCURSES_SP_NAME(termattrs) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(termname) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(typeahead) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(ungetch) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(use_env) (SCREEN*, bool); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(use_tioctl) (SCREEN*, bool); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vidattr) (SCREEN*, chtype); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vidputs) (SCREEN*, chtype, NCURSES_SP_OUTC); /* implemented:SP_FUNC */
+#if 1
+extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(keybound) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(alloc_pair) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(assume_default_colors) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(define_key) (SCREEN*, const char *, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_color_content) (SCREEN*, int, int *, int *, int *); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_pair_content) (SCREEN*, int, int *, int *); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_slk_color) (SCREEN*, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(get_escdelay) (SCREEN*); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(find_pair) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(free_pair) (SCREEN*, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_extended_color) (SCREEN*, int, int, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_extended_pair) (SCREEN*, int, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(is_term_resized) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(key_defined) (SCREEN*, const char *); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(keyok) (SCREEN*, int, bool); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(nofilter) (SCREEN*); /* implemented */ /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(reset_color_pairs) (SCREEN*); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(resize_term) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(resizeterm) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(set_escdelay) (SCREEN*, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(set_tabsize) (SCREEN*, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(use_default_colors) (SCREEN*); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(use_legacy_coding) (SCREEN*, int); /* implemented:EXT_SP_FUNC */
+#endif
+#else
+#undef NCURSES_SP_FUNCS
+#define NCURSES_SP_FUNCS 0
+#define NCURSES_SP_NAME(name) name
+#define NCURSES_SP_OUTC NCURSES_OUTC
+#endif
+
+/* attributes */
+
+#define NCURSES_ATTR_SHIFT 8
+#define NCURSES_BITS(mask,shift) (NCURSES_CAST(chtype,(mask)) << ((shift) + NCURSES_ATTR_SHIFT))
+
+#define A_NORMAL (1UL - 1UL)
+#define A_ATTRIBUTES NCURSES_BITS(~(1UL - 1UL),0)
+#define A_CHARTEXT (NCURSES_BITS(1UL,0) - 1UL)
+#define A_COLOR NCURSES_BITS(((1UL) << 8) - 1UL,0)
+#define A_STANDOUT NCURSES_BITS(1UL,8)
+#define A_UNDERLINE NCURSES_BITS(1UL,9)
+#define A_REVERSE NCURSES_BITS(1UL,10)
+#define A_BLINK NCURSES_BITS(1UL,11)
+#define A_DIM NCURSES_BITS(1UL,12)
+#define A_BOLD NCURSES_BITS(1UL,13)
+#define A_ALTCHARSET NCURSES_BITS(1UL,14)
+#define A_INVIS NCURSES_BITS(1UL,15)
+#define A_PROTECT NCURSES_BITS(1UL,16)
+#define A_HORIZONTAL NCURSES_BITS(1UL,17)
+#define A_LEFT NCURSES_BITS(1UL,18)
+#define A_LOW NCURSES_BITS(1UL,19)
+#define A_RIGHT NCURSES_BITS(1UL,20)
+#define A_TOP NCURSES_BITS(1UL,21)
+#define A_VERTICAL NCURSES_BITS(1UL,22)
+
+#if 1
+#define A_ITALIC NCURSES_BITS(1UL,23) /* ncurses extension */
+#endif
+
+/*
+ * Most of the pseudo functions are macros that either provide compatibility
+ * with older versions of curses, or provide inline functionality to improve
+ * performance.
+ */
+
+/*
+ * These pseudo functions are always implemented as macros:
+ */
+
+#define getyx(win,y,x) (y = getcury(win), x = getcurx(win))
+#define getbegyx(win,y,x) (y = getbegy(win), x = getbegx(win))
+#define getmaxyx(win,y,x) (y = getmaxy(win), x = getmaxx(win))
+#define getparyx(win,y,x) (y = getpary(win), x = getparx(win))
+
+#define getsyx(y,x) do { if (newscr) { \
+ if (is_leaveok(newscr)) \
+ (y) = (x) = -1; \
+ else \
+ getyx(newscr,(y), (x)); \
+ } \
+ } while(0)
+
+#define setsyx(y,x) do { if (newscr) { \
+ if ((y) == -1 && (x) == -1) \
+ leaveok(newscr, TRUE); \
+ else { \
+ leaveok(newscr, FALSE); \
+ wmove(newscr, (y), (x)); \
+ } \
+ } \
+ } while(0)
+
+#ifndef NCURSES_NOMACROS
+
+/*
+ * These miscellaneous pseudo functions are provided for compatibility:
+ */
+
+#define wgetstr(w, s) wgetnstr(w, s, -1)
+#define getnstr(s, n) wgetnstr(stdscr, s, (n))
+
+#define setterm(term) setupterm(term, 1, (int *)0)
+
+#define fixterm() reset_prog_mode()
+#define resetterm() reset_shell_mode()
+#define saveterm() def_prog_mode()
+#define crmode() cbreak()
+#define nocrmode() nocbreak()
+#define gettmode()
+
+/* It seems older SYSV curses versions define these */
+#if !NCURSES_OPAQUE
+#define getattrs(win) NCURSES_CAST(int, NCURSES_OK_ADDR(win) ? (win)->_attrs : A_NORMAL)
+#define getcurx(win) (NCURSES_OK_ADDR(win) ? (win)->_curx : ERR)
+#define getcury(win) (NCURSES_OK_ADDR(win) ? (win)->_cury : ERR)
+#define getbegx(win) (NCURSES_OK_ADDR(win) ? (win)->_begx : ERR)
+#define getbegy(win) (NCURSES_OK_ADDR(win) ? (win)->_begy : ERR)
+#define getmaxx(win) (NCURSES_OK_ADDR(win) ? ((win)->_maxx + 1) : ERR)
+#define getmaxy(win) (NCURSES_OK_ADDR(win) ? ((win)->_maxy + 1) : ERR)
+#define getparx(win) (NCURSES_OK_ADDR(win) ? (win)->_parx : ERR)
+#define getpary(win) (NCURSES_OK_ADDR(win) ? (win)->_pary : ERR)
+#endif /* NCURSES_OPAQUE */
+
+#define wstandout(win) (wattrset(win,A_STANDOUT))
+#define wstandend(win) (wattrset(win,A_NORMAL))
+
+#define wattron(win,at) wattr_on(win, NCURSES_CAST(attr_t, at), NULL)
+#define wattroff(win,at) wattr_off(win, NCURSES_CAST(attr_t, at), NULL)
+
+#if !NCURSES_OPAQUE
+#if NCURSES_WATTR_MACROS
+#if NCURSES_WIDECHAR && 1
+#define wattrset(win,at) \
+ (NCURSES_OK_ADDR(win) \
+ ? ((win)->_color = NCURSES_CAST(int, PAIR_NUMBER(at)), \
+ (win)->_attrs = NCURSES_CAST(attr_t, at), \
+ OK) \
+ : ERR)
+#else
+#define wattrset(win,at) \
+ (NCURSES_OK_ADDR(win) \
+ ? ((win)->_attrs = NCURSES_CAST(attr_t, at), \
+ OK) \
+ : ERR)
+#endif
+#endif /* NCURSES_WATTR_MACROS */
+#endif /* NCURSES_OPAQUE */
+
+#define scroll(win) wscrl(win,1)
+
+#define touchwin(win) wtouchln((win), 0, getmaxy(win), 1)
+#define touchline(win, s, c) wtouchln((win), s, c, 1)
+#define untouchwin(win) wtouchln((win), 0, getmaxy(win), 0)
+
+#define box(win, v, h) wborder(win, v, v, h, h, 0, 0, 0, 0)
+#define border(ls, rs, ts, bs, tl, tr, bl, br) wborder(stdscr, ls, rs, ts, bs, tl, tr, bl, br)
+#define hline(ch, n) whline(stdscr, ch, (n))
+#define vline(ch, n) wvline(stdscr, ch, (n))
+
+#define winstr(w, s) winnstr(w, s, -1)
+#define winchstr(w, s) winchnstr(w, s, -1)
+#define winsstr(w, s) winsnstr(w, s, -1)
+
+#if !NCURSES_OPAQUE
+#define redrawwin(win) wredrawln(win, 0, (NCURSES_OK_ADDR(win) ? (win)->_maxy+1 : -1))
+#endif /* NCURSES_OPAQUE */
+
+#define waddstr(win,str) waddnstr(win,str,-1)
+#define waddchstr(win,str) waddchnstr(win,str,-1)
+
+/*
+ * These apply to the first 256 color pairs.
+ */
+#define COLOR_PAIR(n) (NCURSES_BITS((n), 0) & A_COLOR)
+#define PAIR_NUMBER(a) (NCURSES_CAST(int,((NCURSES_CAST(unsigned long,(a)) & A_COLOR) >> NCURSES_ATTR_SHIFT)))
+
+/*
+ * pseudo functions for standard screen
+ */
+
+#define addch(ch) waddch(stdscr,(ch))
+#define addchnstr(str,n) waddchnstr(stdscr,(str),(n))
+#define addchstr(str) waddchstr(stdscr,(str))
+#define addnstr(str,n) waddnstr(stdscr,(str),(n))
+#define addstr(str) waddnstr(stdscr,(str),-1)
+#define attr_get(ap,cp,o) wattr_get(stdscr,(ap),(cp),(o))
+#define attr_off(a,o) wattr_off(stdscr,(a),(o))
+#define attr_on(a,o) wattr_on(stdscr,(a),(o))
+#define attr_set(a,c,o) wattr_set(stdscr,(a),(c),(o))
+#define attroff(at) wattroff(stdscr,(at))
+#define attron(at) wattron(stdscr,(at))
+#define attrset(at) wattrset(stdscr,(at))
+#define bkgd(ch) wbkgd(stdscr,(ch))
+#define bkgdset(ch) wbkgdset(stdscr,(ch))
+#define chgat(n,a,c,o) wchgat(stdscr,(n),(a),(c),(o))
+#define clear() wclear(stdscr)
+#define clrtobot() wclrtobot(stdscr)
+#define clrtoeol() wclrtoeol(stdscr)
+#define color_set(c,o) wcolor_set(stdscr,(c),(o))
+#define delch() wdelch(stdscr)
+#define deleteln() winsdelln(stdscr,-1)
+#define echochar(c) wechochar(stdscr,(c))
+#define erase() werase(stdscr)
+#define getch() wgetch(stdscr)
+#define getstr(str) wgetstr(stdscr,(str))
+#define inch() winch(stdscr)
+#define inchnstr(s,n) winchnstr(stdscr,(s),(n))
+#define inchstr(s) winchstr(stdscr,(s))
+#define innstr(s,n) winnstr(stdscr,(s),(n))
+#define insch(c) winsch(stdscr,(c))
+#define insdelln(n) winsdelln(stdscr,(n))
+#define insertln() winsdelln(stdscr,1)
+#define insnstr(s,n) winsnstr(stdscr,(s),(n))
+#define insstr(s) winsstr(stdscr,(s))
+#define instr(s) winstr(stdscr,(s))
+#define move(y,x) wmove(stdscr,(y),(x))
+#define refresh() wrefresh(stdscr)
+#define scrl(n) wscrl(stdscr,(n))
+#define setscrreg(t,b) wsetscrreg(stdscr,(t),(b))
+#define standend() wstandend(stdscr)
+#define standout() wstandout(stdscr)
+#define timeout(delay) wtimeout(stdscr,(delay))
+#define wdeleteln(win) winsdelln(win,-1)
+#define winsertln(win) winsdelln(win,1)
+
+/*
+ * mv functions
+ */
+
+#define mvwaddch(win,y,x,ch) (wmove((win),(y),(x)) == ERR ? ERR : waddch((win),(ch)))
+#define mvwaddchnstr(win,y,x,str,n) (wmove((win),(y),(x)) == ERR ? ERR : waddchnstr((win),(str),(n)))
+#define mvwaddchstr(win,y,x,str) (wmove((win),(y),(x)) == ERR ? ERR : waddchnstr((win),(str),-1))
+#define mvwaddnstr(win,y,x,str,n) (wmove((win),(y),(x)) == ERR ? ERR : waddnstr((win),(str),(n)))
+#define mvwaddstr(win,y,x,str) (wmove((win),(y),(x)) == ERR ? ERR : waddnstr((win),(str),-1))
+#define mvwchgat(win,y,x,n,a,c,o) (wmove((win),(y),(x)) == ERR ? ERR : wchgat((win),(n),(a),(c),(o)))
+#define mvwdelch(win,y,x) (wmove((win),(y),(x)) == ERR ? ERR : wdelch(win))
+#define mvwgetch(win,y,x) (wmove((win),(y),(x)) == ERR ? ERR : wgetch(win))
+#define mvwgetnstr(win,y,x,str,n) (wmove((win),(y),(x)) == ERR ? ERR : wgetnstr((win),(str),(n)))
+#define mvwgetstr(win,y,x,str) (wmove((win),(y),(x)) == ERR ? ERR : wgetstr((win),(str)))
+#define mvwhline(win,y,x,c,n) (wmove((win),(y),(x)) == ERR ? ERR : whline((win),(c),(n)))
+#define mvwinch(win,y,x) (wmove((win),(y),(x)) == ERR ? NCURSES_CAST(chtype, ERR) : winch(win))
+#define mvwinchnstr(win,y,x,s,n) (wmove((win),(y),(x)) == ERR ? ERR : winchnstr((win),(s),(n)))
+#define mvwinchstr(win,y,x,s) (wmove((win),(y),(x)) == ERR ? ERR : winchstr((win),(s)))
+#define mvwinnstr(win,y,x,s,n) (wmove((win),(y),(x)) == ERR ? ERR : winnstr((win),(s),(n)))
+#define mvwinsch(win,y,x,c) (wmove((win),(y),(x)) == ERR ? ERR : winsch((win),(c)))
+#define mvwinsnstr(win,y,x,s,n) (wmove((win),(y),(x)) == ERR ? ERR : winsnstr((win),(s),(n)))
+#define mvwinsstr(win,y,x,s) (wmove((win),(y),(x)) == ERR ? ERR : winsstr((win),(s)))
+#define mvwinstr(win,y,x,s) (wmove((win),(y),(x)) == ERR ? ERR : winstr((win),(s)))
+#define mvwvline(win,y,x,c,n) (wmove((win),(y),(x)) == ERR ? ERR : wvline((win),(c),(n)))
+
+#define mvaddch(y,x,ch) mvwaddch(stdscr,(y),(x),(ch))
+#define mvaddchnstr(y,x,str,n) mvwaddchnstr(stdscr,(y),(x),(str),(n))
+#define mvaddchstr(y,x,str) mvwaddchstr(stdscr,(y),(x),(str))
+#define mvaddnstr(y,x,str,n) mvwaddnstr(stdscr,(y),(x),(str),(n))
+#define mvaddstr(y,x,str) mvwaddstr(stdscr,(y),(x),(str))
+#define mvchgat(y,x,n,a,c,o) mvwchgat(stdscr,(y),(x),(n),(a),(c),(o))
+#define mvdelch(y,x) mvwdelch(stdscr,(y),(x))
+#define mvgetch(y,x) mvwgetch(stdscr,(y),(x))
+#define mvgetnstr(y,x,str,n) mvwgetnstr(stdscr,(y),(x),(str),(n))
+#define mvgetstr(y,x,str) mvwgetstr(stdscr,(y),(x),(str))
+#define mvhline(y,x,c,n) mvwhline(stdscr,(y),(x),(c),(n))
+#define mvinch(y,x) mvwinch(stdscr,(y),(x))
+#define mvinchnstr(y,x,s,n) mvwinchnstr(stdscr,(y),(x),(s),(n))
+#define mvinchstr(y,x,s) mvwinchstr(stdscr,(y),(x),(s))
+#define mvinnstr(y,x,s,n) mvwinnstr(stdscr,(y),(x),(s),(n))
+#define mvinsch(y,x,c) mvwinsch(stdscr,(y),(x),(c))
+#define mvinsnstr(y,x,s,n) mvwinsnstr(stdscr,(y),(x),(s),(n))
+#define mvinsstr(y,x,s) mvwinsstr(stdscr,(y),(x),(s))
+#define mvinstr(y,x,s) mvwinstr(stdscr,(y),(x),(s))
+#define mvvline(y,x,c,n) mvwvline(stdscr,(y),(x),(c),(n))
+
+/*
+ * Some wide-character functions can be implemented without the extensions.
+ */
+#if !NCURSES_OPAQUE
+#define getbkgd(win) (NCURSES_OK_ADDR(win) ? ((win)->_bkgd) : 0)
+#endif /* NCURSES_OPAQUE */
+
+#define slk_attr_off(a,v) ((v) ? ERR : slk_attroff(a))
+#define slk_attr_on(a,v) ((v) ? ERR : slk_attron(a))
+
+#if !NCURSES_OPAQUE
+#if NCURSES_WATTR_MACROS
+#if NCURSES_WIDECHAR && 1
+#define wattr_set(win,a,p,opts) \
+ (NCURSES_OK_ADDR(win) \
+ ? ((void)((win)->_attrs = ((a) & ~A_COLOR), \
+ (win)->_color = (opts) ? *(int *)(opts) : (p)), \
+ OK) \
+ : ERR)
+#define wattr_get(win,a,p,opts) \
+ (NCURSES_OK_ADDR(win) \
+ ? ((void)(NCURSES_OK_ADDR(a) \
+ ? (*(a) = (win)->_attrs) \
+ : OK), \
+ (void)(NCURSES_OK_ADDR(p) \
+ ? (*(p) = (NCURSES_PAIRS_T) (win)->_color) \
+ : OK), \
+ (void)(NCURSES_OK_ADDR(opts) \
+ ? (*(int *)(opts) = (win)->_color) \
+ : OK), \
+ OK) \
+ : ERR)
+#else /* !(NCURSES_WIDECHAR && NCURSES_EXE_COLORS) */
+#define wattr_set(win,a,p,opts) \
+ (NCURSES_OK_ADDR(win) \
+ ? ((void)((win)->_attrs = (((a) & ~A_COLOR) | \
+ (attr_t)COLOR_PAIR(p))), \
+ OK) \
+ : ERR)
+#define wattr_get(win,a,p,opts) \
+ (NCURSES_OK_ADDR(win) \
+ ? ((void)(NCURSES_OK_ADDR(a) \
+ ? (*(a) = (win)->_attrs) \
+ : OK), \
+ (void)(NCURSES_OK_ADDR(p) \
+ ? (*(p) = (NCURSES_PAIRS_T) PAIR_NUMBER((win)->_attrs)) \
+ : OK), \
+ OK) \
+ : ERR)
+#endif /* (NCURSES_WIDECHAR && NCURSES_EXE_COLORS) */
+#endif /* NCURSES_WATTR_MACROS */
+#endif /* NCURSES_OPAQUE */
+
+/*
+ * X/Open curses deprecates SVr4 vwprintw/vwscanw, which are supposed to use
+ * varargs.h. It adds new calls vw_printw/vw_scanw, which are supposed to
+ * use POSIX stdarg.h. The ncurses versions of vwprintw/vwscanw already
+ * use stdarg.h, so...
+ */
+/* define vw_printw vwprintw */
+/* define vw_scanw vwscanw */
+
+/*
+ * Export fallback function for use in C++ binding.
+ */
+#if !1
+#define vsscanf(a,b,c) _nc_vsscanf(a,b,c)
+NCURSES_EXPORT(int) vsscanf(const char *, const char *, va_list);
+#endif
+
+/*
+ * These macros are extensions - not in X/Open Curses.
+ */
+#if 1
+#if !NCURSES_OPAQUE
+#define is_cleared(win) (NCURSES_OK_ADDR(win) ? (win)->_clear : FALSE)
+#define is_idcok(win) (NCURSES_OK_ADDR(win) ? (win)->_idcok : FALSE)
+#define is_idlok(win) (NCURSES_OK_ADDR(win) ? (win)->_idlok : FALSE)
+#define is_immedok(win) (NCURSES_OK_ADDR(win) ? (win)->_immed : FALSE)
+#define is_keypad(win) (NCURSES_OK_ADDR(win) ? (win)->_use_keypad : FALSE)
+#define is_leaveok(win) (NCURSES_OK_ADDR(win) ? (win)->_leaveok : FALSE)
+#define is_nodelay(win) (NCURSES_OK_ADDR(win) ? ((win)->_delay == 0) : FALSE)
+#define is_notimeout(win) (NCURSES_OK_ADDR(win) ? (win)->_notimeout : FALSE)
+#define is_pad(win) (NCURSES_OK_ADDR(win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
+#define is_scrollok(win) (NCURSES_OK_ADDR(win) ? (win)->_scroll : FALSE)
+#define is_subwin(win) (NCURSES_OK_ADDR(win) ? ((win)->_flags & _SUBWIN) != 0 : FALSE)
+#define is_syncok(win) (NCURSES_OK_ADDR(win) ? (win)->_sync : FALSE)
+#define wgetdelay(win) (NCURSES_OK_ADDR(win) ? (win)->_delay : 0)
+#define wgetparent(win) (NCURSES_OK_ADDR(win) ? (win)->_parent : 0)
+#define wgetscrreg(win,t,b) (NCURSES_OK_ADDR(win) ? (*(t) = (win)->_regtop, *(b) = (win)->_regbottom, OK) : ERR)
+#endif
+#endif
+
+/*
+ * X/Open says this returns a bool; SVr4 also checked for out-of-range line.
+ * The macro provides compatibility:
+ */
+#define is_linetouched(w,l) ((!(w) || ((l) > getmaxy(w)) || ((l) < 0)) ? ERR : (is_linetouched)((w),(l)))
+
+#endif /* NCURSES_NOMACROS */
+
+/*
+ * Public variables.
+ *
+ * Notes:
+ * a. ESCDELAY was an undocumented feature under AIX curses.
+ * It gives the ESC expire time in milliseconds.
+ * b. ttytype is needed for backward compatibility
+ */
+#if NCURSES_REENTRANT
+
+NCURSES_WRAPPED_VAR(WINDOW *, curscr);
+NCURSES_WRAPPED_VAR(WINDOW *, newscr);
+NCURSES_WRAPPED_VAR(WINDOW *, stdscr);
+NCURSES_WRAPPED_VAR(char *, ttytype);
+NCURSES_WRAPPED_VAR(int, COLORS);
+NCURSES_WRAPPED_VAR(int, COLOR_PAIRS);
+NCURSES_WRAPPED_VAR(int, COLS);
+NCURSES_WRAPPED_VAR(int, ESCDELAY);
+NCURSES_WRAPPED_VAR(int, LINES);
+NCURSES_WRAPPED_VAR(int, TABSIZE);
+
+#define curscr NCURSES_PUBLIC_VAR(curscr())
+#define newscr NCURSES_PUBLIC_VAR(newscr())
+#define stdscr NCURSES_PUBLIC_VAR(stdscr())
+#define ttytype NCURSES_PUBLIC_VAR(ttytype())
+#define COLORS NCURSES_PUBLIC_VAR(COLORS())
+#define COLOR_PAIRS NCURSES_PUBLIC_VAR(COLOR_PAIRS())
+#define COLS NCURSES_PUBLIC_VAR(COLS())
+#define ESCDELAY NCURSES_PUBLIC_VAR(ESCDELAY())
+#define LINES NCURSES_PUBLIC_VAR(LINES())
+#define TABSIZE NCURSES_PUBLIC_VAR(TABSIZE())
+
+#else
+
+extern NCURSES_EXPORT_VAR(WINDOW *) curscr;
+extern NCURSES_EXPORT_VAR(WINDOW *) newscr;
+extern NCURSES_EXPORT_VAR(WINDOW *) stdscr;
+extern NCURSES_EXPORT_VAR(char) ttytype[];
+extern NCURSES_EXPORT_VAR(int) COLORS;
+extern NCURSES_EXPORT_VAR(int) COLOR_PAIRS;
+extern NCURSES_EXPORT_VAR(int) COLS;
+extern NCURSES_EXPORT_VAR(int) ESCDELAY;
+extern NCURSES_EXPORT_VAR(int) LINES;
+extern NCURSES_EXPORT_VAR(int) TABSIZE;
+
+#endif
+
+/*
+ * Pseudo-character tokens outside ASCII range. The curses wgetch() function
+ * will return any given one of these only if the corresponding k- capability
+ * is defined in your terminal's terminfo entry.
+ *
+ * Some keys (KEY_A1, etc) are arranged like this:
+ * a1 up a3
+ * left b2 right
+ * c1 down c3
+ *
+ * A few key codes do not depend upon the terminfo entry.
+ */
+#define KEY_CODE_YES 0400 /* A wchar_t contains a key code */
+#define KEY_MIN 0401 /* Minimum curses key */
+#define KEY_BREAK 0401 /* Break key (unreliable) */
+#define KEY_SRESET 0530 /* Soft (partial) reset (unreliable) */
+#define KEY_RESET 0531 /* Reset or hard reset (unreliable) */
+/*
+ * These definitions were generated by ./MKkey_defs.sh ./Caps ./Caps-ncurses
+ */
+#define KEY_DOWN 0402 /* down-arrow key */
+#define KEY_UP 0403 /* up-arrow key */
+#define KEY_LEFT 0404 /* left-arrow key */
+#define KEY_RIGHT 0405 /* right-arrow key */
+#define KEY_HOME 0406 /* home key */
+#define KEY_BACKSPACE 0407 /* backspace key */
+#define KEY_F0 0410 /* Function keys. Space for 64 */
+#define KEY_F(n) (KEY_F0+(n)) /* Value of function key n */
+#define KEY_DL 0510 /* delete-line key */
+#define KEY_IL 0511 /* insert-line key */
+#define KEY_DC 0512 /* delete-character key */
+#define KEY_IC 0513 /* insert-character key */
+#define KEY_EIC 0514 /* sent by rmir or smir in insert mode */
+#define KEY_CLEAR 0515 /* clear-screen or erase key */
+#define KEY_EOS 0516 /* clear-to-end-of-screen key */
+#define KEY_EOL 0517 /* clear-to-end-of-line key */
+#define KEY_SF 0520 /* scroll-forward key */
+#define KEY_SR 0521 /* scroll-backward key */
+#define KEY_NPAGE 0522 /* next-page key */
+#define KEY_PPAGE 0523 /* previous-page key */
+#define KEY_STAB 0524 /* set-tab key */
+#define KEY_CTAB 0525 /* clear-tab key */
+#define KEY_CATAB 0526 /* clear-all-tabs key */
+#define KEY_ENTER 0527 /* enter/send key */
+#define KEY_PRINT 0532 /* print key */
+#define KEY_LL 0533 /* lower-left key (home down) */
+#define KEY_A1 0534 /* upper left of keypad */
+#define KEY_A3 0535 /* upper right of keypad */
+#define KEY_B2 0536 /* center of keypad */
+#define KEY_C1 0537 /* lower left of keypad */
+#define KEY_C3 0540 /* lower right of keypad */
+#define KEY_BTAB 0541 /* back-tab key */
+#define KEY_BEG 0542 /* begin key */
+#define KEY_CANCEL 0543 /* cancel key */
+#define KEY_CLOSE 0544 /* close key */
+#define KEY_COMMAND 0545 /* command key */
+#define KEY_COPY 0546 /* copy key */
+#define KEY_CREATE 0547 /* create key */
+#define KEY_END 0550 /* end key */
+#define KEY_EXIT 0551 /* exit key */
+#define KEY_FIND 0552 /* find key */
+#define KEY_HELP 0553 /* help key */
+#define KEY_MARK 0554 /* mark key */
+#define KEY_MESSAGE 0555 /* message key */
+#define KEY_MOVE 0556 /* move key */
+#define KEY_NEXT 0557 /* next key */
+#define KEY_OPEN 0560 /* open key */
+#define KEY_OPTIONS 0561 /* options key */
+#define KEY_PREVIOUS 0562 /* previous key */
+#define KEY_REDO 0563 /* redo key */
+#define KEY_REFERENCE 0564 /* reference key */
+#define KEY_REFRESH 0565 /* refresh key */
+#define KEY_REPLACE 0566 /* replace key */
+#define KEY_RESTART 0567 /* restart key */
+#define KEY_RESUME 0570 /* resume key */
+#define KEY_SAVE 0571 /* save key */
+#define KEY_SBEG 0572 /* shifted begin key */
+#define KEY_SCANCEL 0573 /* shifted cancel key */
+#define KEY_SCOMMAND 0574 /* shifted command key */
+#define KEY_SCOPY 0575 /* shifted copy key */
+#define KEY_SCREATE 0576 /* shifted create key */
+#define KEY_SDC 0577 /* shifted delete-character key */
+#define KEY_SDL 0600 /* shifted delete-line key */
+#define KEY_SELECT 0601 /* select key */
+#define KEY_SEND 0602 /* shifted end key */
+#define KEY_SEOL 0603 /* shifted clear-to-end-of-line key */
+#define KEY_SEXIT 0604 /* shifted exit key */
+#define KEY_SFIND 0605 /* shifted find key */
+#define KEY_SHELP 0606 /* shifted help key */
+#define KEY_SHOME 0607 /* shifted home key */
+#define KEY_SIC 0610 /* shifted insert-character key */
+#define KEY_SLEFT 0611 /* shifted left-arrow key */
+#define KEY_SMESSAGE 0612 /* shifted message key */
+#define KEY_SMOVE 0613 /* shifted move key */
+#define KEY_SNEXT 0614 /* shifted next key */
+#define KEY_SOPTIONS 0615 /* shifted options key */
+#define KEY_SPREVIOUS 0616 /* shifted previous key */
+#define KEY_SPRINT 0617 /* shifted print key */
+#define KEY_SREDO 0620 /* shifted redo key */
+#define KEY_SREPLACE 0621 /* shifted replace key */
+#define KEY_SRIGHT 0622 /* shifted right-arrow key */
+#define KEY_SRSUME 0623 /* shifted resume key */
+#define KEY_SSAVE 0624 /* shifted save key */
+#define KEY_SSUSPEND 0625 /* shifted suspend key */
+#define KEY_SUNDO 0626 /* shifted undo key */
+#define KEY_SUSPEND 0627 /* suspend key */
+#define KEY_UNDO 0630 /* undo key */
+#define KEY_MOUSE 0631 /* Mouse event has occurred */
+
+#ifdef NCURSES_EXT_FUNCS
+#define KEY_RESIZE 0632 /* Terminal resize event */
+#endif
+
+#define KEY_MAX 0777 /* Maximum key value is 0632 */
+/* $Id: curses.wide,v 1.50 2017/03/26 16:05:21 tom Exp $ */
+/*
+ * vile:cmode:
+ * This file is part of ncurses, designed to be appended after curses.h.in
+ * (see that file for the relevant copyright).
+ */
+#define _XOPEN_CURSES 1
+
+#if NCURSES_WIDECHAR
+
+extern NCURSES_EXPORT_VAR(cchar_t *) _nc_wacs;
+
+#define NCURSES_WACS(c) (&_nc_wacs[NCURSES_CAST(unsigned char,(c))])
+
+#define WACS_BSSB NCURSES_WACS('l')
+#define WACS_SSBB NCURSES_WACS('m')
+#define WACS_BBSS NCURSES_WACS('k')
+#define WACS_SBBS NCURSES_WACS('j')
+#define WACS_SBSS NCURSES_WACS('u')
+#define WACS_SSSB NCURSES_WACS('t')
+#define WACS_SSBS NCURSES_WACS('v')
+#define WACS_BSSS NCURSES_WACS('w')
+#define WACS_BSBS NCURSES_WACS('q')
+#define WACS_SBSB NCURSES_WACS('x')
+#define WACS_SSSS NCURSES_WACS('n')
+
+#define WACS_ULCORNER WACS_BSSB
+#define WACS_LLCORNER WACS_SSBB
+#define WACS_URCORNER WACS_BBSS
+#define WACS_LRCORNER WACS_SBBS
+#define WACS_RTEE WACS_SBSS
+#define WACS_LTEE WACS_SSSB
+#define WACS_BTEE WACS_SSBS
+#define WACS_TTEE WACS_BSSS
+#define WACS_HLINE WACS_BSBS
+#define WACS_VLINE WACS_SBSB
+#define WACS_PLUS WACS_SSSS
+
+#define WACS_S1 NCURSES_WACS('o') /* scan line 1 */
+#define WACS_S9 NCURSES_WACS('s') /* scan line 9 */
+#define WACS_DIAMOND NCURSES_WACS('`') /* diamond */
+#define WACS_CKBOARD NCURSES_WACS('a') /* checker board */
+#define WACS_DEGREE NCURSES_WACS('f') /* degree symbol */
+#define WACS_PLMINUS NCURSES_WACS('g') /* plus/minus */
+#define WACS_BULLET NCURSES_WACS('~') /* bullet */
+
+ /* Teletype 5410v1 symbols */
+#define WACS_LARROW NCURSES_WACS(',') /* arrow left */
+#define WACS_RARROW NCURSES_WACS('+') /* arrow right */
+#define WACS_DARROW NCURSES_WACS('.') /* arrow down */
+#define WACS_UARROW NCURSES_WACS('-') /* arrow up */
+#define WACS_BOARD NCURSES_WACS('h') /* board of squares */
+#define WACS_LANTERN NCURSES_WACS('i') /* lantern symbol */
+#define WACS_BLOCK NCURSES_WACS('0') /* solid square block */
+
+ /* ncurses extensions */
+#define WACS_S3 NCURSES_WACS('p') /* scan line 3 */
+#define WACS_S7 NCURSES_WACS('r') /* scan line 7 */
+#define WACS_LEQUAL NCURSES_WACS('y') /* less/equal */
+#define WACS_GEQUAL NCURSES_WACS('z') /* greater/equal */
+#define WACS_PI NCURSES_WACS('{') /* Pi */
+#define WACS_NEQUAL NCURSES_WACS('|') /* not equal */
+#define WACS_STERLING NCURSES_WACS('}') /* UK pound sign */
+
+ /* double lines */
+#define WACS_BDDB NCURSES_WACS('C')
+#define WACS_DDBB NCURSES_WACS('D')
+#define WACS_BBDD NCURSES_WACS('B')
+#define WACS_DBBD NCURSES_WACS('A')
+#define WACS_DBDD NCURSES_WACS('G')
+#define WACS_DDDB NCURSES_WACS('F')
+#define WACS_DDBD NCURSES_WACS('H')
+#define WACS_BDDD NCURSES_WACS('I')
+#define WACS_BDBD NCURSES_WACS('R')
+#define WACS_DBDB NCURSES_WACS('Y')
+#define WACS_DDDD NCURSES_WACS('E')
+
+#define WACS_D_ULCORNER WACS_BDDB
+#define WACS_D_LLCORNER WACS_DDBB
+#define WACS_D_URCORNER WACS_BBDD
+#define WACS_D_LRCORNER WACS_DBBD
+#define WACS_D_RTEE WACS_DBDD
+#define WACS_D_LTEE WACS_DDDB
+#define WACS_D_BTEE WACS_DDBD
+#define WACS_D_TTEE WACS_BDDD
+#define WACS_D_HLINE WACS_BDBD
+#define WACS_D_VLINE WACS_DBDB
+#define WACS_D_PLUS WACS_DDDD
+
+ /* thick lines */
+#define WACS_BTTB NCURSES_WACS('L')
+#define WACS_TTBB NCURSES_WACS('M')
+#define WACS_BBTT NCURSES_WACS('K')
+#define WACS_TBBT NCURSES_WACS('J')
+#define WACS_TBTT NCURSES_WACS('U')
+#define WACS_TTTB NCURSES_WACS('T')
+#define WACS_TTBT NCURSES_WACS('V')
+#define WACS_BTTT NCURSES_WACS('W')
+#define WACS_BTBT NCURSES_WACS('Q')
+#define WACS_TBTB NCURSES_WACS('X')
+#define WACS_TTTT NCURSES_WACS('N')
+
+#define WACS_T_ULCORNER WACS_BTTB
+#define WACS_T_LLCORNER WACS_TTBB
+#define WACS_T_URCORNER WACS_BBTT
+#define WACS_T_LRCORNER WACS_TBBT
+#define WACS_T_RTEE WACS_TBTT
+#define WACS_T_LTEE WACS_TTTB
+#define WACS_T_BTEE WACS_TTBT
+#define WACS_T_TTEE WACS_BTTT
+#define WACS_T_HLINE WACS_BTBT
+#define WACS_T_VLINE WACS_TBTB
+#define WACS_T_PLUS WACS_TTTT
+
+/*
+ * Function prototypes for wide-character operations.
+ *
+ * "generated" comments should include ":WIDEC" to make the corresponding
+ * functions ifdef'd in lib_gen.c
+ *
+ * "implemented" comments do not need this marker.
+ */
+
+extern NCURSES_EXPORT(int) add_wch (const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) add_wchnstr (const cchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) add_wchstr (const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) addnwstr (const wchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) addwstr (const wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) bkgrnd (const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(void) bkgrndset (const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) border_set (const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) box_set (WINDOW *, const cchar_t *, const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) echo_wchar (const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) erasewchar (wchar_t*); /* implemented */
+extern NCURSES_EXPORT(int) get_wch (wint_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) get_wstr (wint_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) getbkgrnd (cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) getcchar (const cchar_t *, wchar_t*, attr_t*, NCURSES_PAIRS_T*, void*); /* implemented */
+extern NCURSES_EXPORT(int) getn_wstr (wint_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) hline_set (const cchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) in_wch (cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) in_wchnstr (cchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) in_wchstr (cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) innwstr (wchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) ins_nwstr (const wchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) ins_wch (const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) ins_wstr (const wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) inwstr (wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(NCURSES_CONST char*) key_name (wchar_t); /* implemented */
+extern NCURSES_EXPORT(int) killwchar (wchar_t *); /* implemented */
+extern NCURSES_EXPORT(int) mvadd_wch (int, int, const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvadd_wchnstr (int, int, const cchar_t *, int);/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvadd_wchstr (int, int, const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvaddnwstr (int, int, const wchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvaddwstr (int, int, const wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvget_wch (int, int, wint_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvget_wstr (int, int, wint_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvgetn_wstr (int, int, wint_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvhline_set (int, int, const cchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvin_wch (int, int, cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvin_wchnstr (int, int, cchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvin_wchstr (int, int, cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvinnwstr (int, int, wchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvins_nwstr (int, int, const wchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvins_wch (int, int, const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvins_wstr (int, int, const wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvinwstr (int, int, wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvvline_set (int, int, const cchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwadd_wch (WINDOW *, int, int, const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwadd_wchnstr (WINDOW *, int, int, const cchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwadd_wchstr (WINDOW *, int, int, const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwaddnwstr (WINDOW *, int, int, const wchar_t *, int);/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwaddwstr (WINDOW *, int, int, const wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwget_wch (WINDOW *, int, int, wint_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwget_wstr (WINDOW *, int, int, wint_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwgetn_wstr (WINDOW *, int, int, wint_t *, int);/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwhline_set (WINDOW *, int, int, const cchar_t *, int);/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwin_wch (WINDOW *, int, int, cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwin_wchnstr (WINDOW *, int,int, cchar_t *,int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwin_wchstr (WINDOW *, int, int, cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwinnwstr (WINDOW *, int, int, wchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwins_nwstr (WINDOW *, int,int, const wchar_t *,int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwins_wch (WINDOW *, int, int, const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwins_wstr (WINDOW *, int, int, const wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwinwstr (WINDOW *, int, int, wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwvline_set (WINDOW *, int,int, const cchar_t *,int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) pecho_wchar (WINDOW *, const cchar_t *); /* implemented */
+extern NCURSES_EXPORT(int) setcchar (cchar_t *, const wchar_t *, const attr_t, NCURSES_PAIRS_T, const void *); /* implemented */
+extern NCURSES_EXPORT(int) slk_wset (int, const wchar_t *, int); /* implemented */
+extern NCURSES_EXPORT(attr_t) term_attrs (void); /* implemented */
+extern NCURSES_EXPORT(int) unget_wch (const wchar_t); /* implemented */
+extern NCURSES_EXPORT(int) vid_attr (attr_t, NCURSES_PAIRS_T, void *); /* implemented */
+extern NCURSES_EXPORT(int) vid_puts (attr_t, NCURSES_PAIRS_T, void *, NCURSES_OUTC); /* implemented */
+extern NCURSES_EXPORT(int) vline_set (const cchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) wadd_wch (WINDOW *,const cchar_t *); /* implemented */
+extern NCURSES_EXPORT(int) wadd_wchnstr (WINDOW *,const cchar_t *,int); /* implemented */
+extern NCURSES_EXPORT(int) wadd_wchstr (WINDOW *,const cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) waddnwstr (WINDOW *,const wchar_t *,int); /* implemented */
+extern NCURSES_EXPORT(int) waddwstr (WINDOW *,const wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) wbkgrnd (WINDOW *,const cchar_t *); /* implemented */
+extern NCURSES_EXPORT(void) wbkgrndset (WINDOW *,const cchar_t *); /* implemented */
+extern NCURSES_EXPORT(int) wborder_set (WINDOW *,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*); /* implemented */
+extern NCURSES_EXPORT(int) wecho_wchar (WINDOW *, const cchar_t *); /* implemented */
+extern NCURSES_EXPORT(int) wget_wch (WINDOW *, wint_t *); /* implemented */
+extern NCURSES_EXPORT(int) wget_wstr (WINDOW *, wint_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) wgetbkgrnd (WINDOW *, cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) wgetn_wstr (WINDOW *, wint_t *, int); /* implemented */
+extern NCURSES_EXPORT(int) whline_set (WINDOW *, const cchar_t *, int); /* implemented */
+extern NCURSES_EXPORT(int) win_wch (WINDOW *, cchar_t *); /* implemented */
+extern NCURSES_EXPORT(int) win_wchnstr (WINDOW *, cchar_t *, int); /* implemented */
+extern NCURSES_EXPORT(int) win_wchstr (WINDOW *, cchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) winnwstr (WINDOW *, wchar_t *, int); /* implemented */
+extern NCURSES_EXPORT(int) wins_nwstr (WINDOW *, const wchar_t *, int); /* implemented */
+extern NCURSES_EXPORT(int) wins_wch (WINDOW *, const cchar_t *); /* implemented */
+extern NCURSES_EXPORT(int) wins_wstr (WINDOW *, const wchar_t *); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) winwstr (WINDOW *, wchar_t *); /* implemented */
+extern NCURSES_EXPORT(wchar_t*) wunctrl (cchar_t *); /* implemented */
+extern NCURSES_EXPORT(int) wvline_set (WINDOW *, const cchar_t *, int); /* implemented */
+
+#if NCURSES_SP_FUNCS
+extern NCURSES_EXPORT(attr_t) NCURSES_SP_NAME(term_attrs) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(unget_wch) (SCREEN*, const wchar_t); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(wchar_t*) NCURSES_SP_NAME(wunctrl) (SCREEN*, cchar_t *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vid_attr) (SCREEN*, attr_t, NCURSES_PAIRS_T, void *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vid_puts) (SCREEN*, attr_t, NCURSES_PAIRS_T, void *, NCURSES_SP_OUTC); /* implemented:SP_FUNC */
+#endif
+
+#ifndef NCURSES_NOMACROS
+
+/*
+ * XSI curses macros for XPG4 conformance.
+ */
+#define add_wch(c) wadd_wch(stdscr,(c))
+#define add_wchnstr(str,n) wadd_wchnstr(stdscr,(str),(n))
+#define add_wchstr(str) wadd_wchstr(stdscr,(str))
+#define addnwstr(wstr,n) waddnwstr(stdscr,(wstr),(n))
+#define addwstr(wstr) waddwstr(stdscr,(wstr))
+#define bkgrnd(c) wbkgrnd(stdscr,(c))
+#define bkgrndset(c) wbkgrndset(stdscr,(c))
+#define border_set(l,r,t,b,tl,tr,bl,br) wborder_set(stdscr,(l),(r),(t),(b),tl,tr,bl,br)
+#define box_set(w,v,h) wborder_set((w),(v),(v),(h),(h),0,0,0,0)
+#define echo_wchar(c) wecho_wchar(stdscr,(c))
+#define get_wch(c) wget_wch(stdscr,(c))
+#define get_wstr(t) wget_wstr(stdscr,(t))
+#define getbkgrnd(wch) wgetbkgrnd(stdscr,(wch))
+#define getn_wstr(t,n) wgetn_wstr(stdscr,(t),(n))
+#define hline_set(c,n) whline_set(stdscr,(c),(n))
+#define in_wch(c) win_wch(stdscr,(c))
+#define in_wchnstr(c,n) win_wchnstr(stdscr,(c),(n))
+#define in_wchstr(c) win_wchstr(stdscr,(c))
+#define innwstr(c,n) winnwstr(stdscr,(c),(n))
+#define ins_nwstr(t,n) wins_nwstr(stdscr,(t),(n))
+#define ins_wch(c) wins_wch(stdscr,(c))
+#define ins_wstr(t) wins_wstr(stdscr,(t))
+#define inwstr(c) winwstr(stdscr,(c))
+#define vline_set(c,n) wvline_set(stdscr,(c),(n))
+#define wadd_wchstr(win,str) wadd_wchnstr((win),(str),-1)
+#define waddwstr(win,wstr) waddnwstr((win),(wstr),-1)
+#define wget_wstr(w,t) wgetn_wstr((w),(t),-1)
+#define win_wchstr(w,c) win_wchnstr((w),(c),-1)
+#define wins_wstr(w,t) wins_nwstr((w),(t),-1)
+
+#if !NCURSES_OPAQUE
+#define wgetbkgrnd(win,wch) (NCURSES_OK_ADDR(wch) ? ((win) ? (*(wch) = (win)->_bkgrnd) : *(wch), OK) : ERR)
+#endif
+
+#define mvadd_wch(y,x,c) mvwadd_wch(stdscr,(y),(x),(c))
+#define mvadd_wchnstr(y,x,s,n) mvwadd_wchnstr(stdscr,(y),(x),(s),(n))
+#define mvadd_wchstr(y,x,s) mvwadd_wchstr(stdscr,(y),(x),(s))
+#define mvaddnwstr(y,x,wstr,n) mvwaddnwstr(stdscr,(y),(x),(wstr),(n))
+#define mvaddwstr(y,x,wstr) mvwaddwstr(stdscr,(y),(x),(wstr))
+#define mvget_wch(y,x,c) mvwget_wch(stdscr,(y),(x),(c))
+#define mvget_wstr(y,x,t) mvwget_wstr(stdscr,(y),(x),(t))
+#define mvgetn_wstr(y,x,t,n) mvwgetn_wstr(stdscr,(y),(x),(t),(n))
+#define mvhline_set(y,x,c,n) mvwhline_set(stdscr,(y),(x),(c),(n))
+#define mvin_wch(y,x,c) mvwin_wch(stdscr,(y),(x),(c))
+#define mvin_wchnstr(y,x,c,n) mvwin_wchnstr(stdscr,(y),(x),(c),(n))
+#define mvin_wchstr(y,x,c) mvwin_wchstr(stdscr,(y),(x),(c))
+#define mvinnwstr(y,x,c,n) mvwinnwstr(stdscr,(y),(x),(c),(n))
+#define mvins_nwstr(y,x,t,n) mvwins_nwstr(stdscr,(y),(x),(t),(n))
+#define mvins_wch(y,x,c) mvwins_wch(stdscr,(y),(x),(c))
+#define mvins_wstr(y,x,t) mvwins_wstr(stdscr,(y),(x),(t))
+#define mvinwstr(y,x,c) mvwinwstr(stdscr,(y),(x),(c))
+#define mvvline_set(y,x,c,n) mvwvline_set(stdscr,(y),(x),(c),(n))
+
+#define mvwadd_wch(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : wadd_wch((win),(c)))
+#define mvwadd_wchnstr(win,y,x,s,n) (wmove(win,(y),(x)) == ERR ? ERR : wadd_wchnstr((win),(s),(n)))
+#define mvwadd_wchstr(win,y,x,s) (wmove(win,(y),(x)) == ERR ? ERR : wadd_wchstr((win),(s)))
+#define mvwaddnwstr(win,y,x,wstr,n) (wmove(win,(y),(x)) == ERR ? ERR : waddnwstr((win),(wstr),(n)))
+#define mvwaddwstr(win,y,x,wstr) (wmove(win,(y),(x)) == ERR ? ERR : waddwstr((win),(wstr)))
+#define mvwget_wch(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : wget_wch((win),(c)))
+#define mvwget_wstr(win,y,x,t) (wmove(win,(y),(x)) == ERR ? ERR : wget_wstr((win),(t)))
+#define mvwgetn_wstr(win,y,x,t,n) (wmove(win,(y),(x)) == ERR ? ERR : wgetn_wstr((win),(t),(n)))
+#define mvwhline_set(win,y,x,c,n) (wmove(win,(y),(x)) == ERR ? ERR : whline_set((win),(c),(n)))
+#define mvwin_wch(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : win_wch((win),(c)))
+#define mvwin_wchnstr(win,y,x,c,n) (wmove(win,(y),(x)) == ERR ? ERR : win_wchnstr((win),(c),(n)))
+#define mvwin_wchstr(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : win_wchstr((win),(c)))
+#define mvwinnwstr(win,y,x,c,n) (wmove(win,(y),(x)) == ERR ? ERR : winnwstr((win),(c),(n)))
+#define mvwins_nwstr(win,y,x,t,n) (wmove(win,(y),(x)) == ERR ? ERR : wins_nwstr((win),(t),(n)))
+#define mvwins_wch(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : wins_wch((win),(c)))
+#define mvwins_wstr(win,y,x,t) (wmove(win,(y),(x)) == ERR ? ERR : wins_wstr((win),(t)))
+#define mvwinwstr(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : winwstr((win),(c)))
+#define mvwvline_set(win,y,x,c,n) (wmove(win,(y),(x)) == ERR ? ERR : wvline_set((win),(c),(n)))
+
+#endif /* NCURSES_NOMACROS */
+
+#if defined(TRACE) || defined(NCURSES_TEST)
+extern NCURSES_EXPORT(const char *) _nc_viswbuf(const wchar_t *);
+extern NCURSES_EXPORT(const char *) _nc_viswibuf(const wint_t *);
+#endif
+
+#endif /* NCURSES_WIDECHAR */
+/* $Id: curses.tail,v 1.25 2019/12/14 22:28:39 tom Exp $ */
+/*
+ * vile:cmode:
+ * This file is part of ncurses, designed to be appended after curses.h.in
+ * (see that file for the relevant copyright).
+ */
+
+/* mouse interface */
+
+#if NCURSES_MOUSE_VERSION > 1
+#define NCURSES_MOUSE_MASK(b,m) ((m) << (((b) - 1) * 5))
+#else
+#define NCURSES_MOUSE_MASK(b,m) ((m) << (((b) - 1) * 6))
+#endif
+
+#define NCURSES_BUTTON_RELEASED 001L
+#define NCURSES_BUTTON_PRESSED 002L
+#define NCURSES_BUTTON_CLICKED 004L
+#define NCURSES_DOUBLE_CLICKED 010L
+#define NCURSES_TRIPLE_CLICKED 020L
+#define NCURSES_RESERVED_EVENT 040L
+
+/* event masks */
+#define BUTTON1_RELEASED NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_RELEASED)
+#define BUTTON1_PRESSED NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_PRESSED)
+#define BUTTON1_CLICKED NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_CLICKED)
+#define BUTTON1_DOUBLE_CLICKED NCURSES_MOUSE_MASK(1, NCURSES_DOUBLE_CLICKED)
+#define BUTTON1_TRIPLE_CLICKED NCURSES_MOUSE_MASK(1, NCURSES_TRIPLE_CLICKED)
+
+#define BUTTON2_RELEASED NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_RELEASED)
+#define BUTTON2_PRESSED NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_PRESSED)
+#define BUTTON2_CLICKED NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_CLICKED)
+#define BUTTON2_DOUBLE_CLICKED NCURSES_MOUSE_MASK(2, NCURSES_DOUBLE_CLICKED)
+#define BUTTON2_TRIPLE_CLICKED NCURSES_MOUSE_MASK(2, NCURSES_TRIPLE_CLICKED)
+
+#define BUTTON3_RELEASED NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_RELEASED)
+#define BUTTON3_PRESSED NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_PRESSED)
+#define BUTTON3_CLICKED NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_CLICKED)
+#define BUTTON3_DOUBLE_CLICKED NCURSES_MOUSE_MASK(3, NCURSES_DOUBLE_CLICKED)
+#define BUTTON3_TRIPLE_CLICKED NCURSES_MOUSE_MASK(3, NCURSES_TRIPLE_CLICKED)
+
+#define BUTTON4_RELEASED NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_RELEASED)
+#define BUTTON4_PRESSED NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_PRESSED)
+#define BUTTON4_CLICKED NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_CLICKED)
+#define BUTTON4_DOUBLE_CLICKED NCURSES_MOUSE_MASK(4, NCURSES_DOUBLE_CLICKED)
+#define BUTTON4_TRIPLE_CLICKED NCURSES_MOUSE_MASK(4, NCURSES_TRIPLE_CLICKED)
+
+/*
+ * In 32 bits the version-1 scheme does not provide enough space for a 5th
+ * button, unless we choose to change the ABI by omitting the reserved-events.
+ */
+#if NCURSES_MOUSE_VERSION > 1
+
+#define BUTTON5_RELEASED NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_RELEASED)
+#define BUTTON5_PRESSED NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_PRESSED)
+#define BUTTON5_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_CLICKED)
+#define BUTTON5_DOUBLE_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_DOUBLE_CLICKED)
+#define BUTTON5_TRIPLE_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_TRIPLE_CLICKED)
+
+#define BUTTON_CTRL NCURSES_MOUSE_MASK(6, 0001L)
+#define BUTTON_SHIFT NCURSES_MOUSE_MASK(6, 0002L)
+#define BUTTON_ALT NCURSES_MOUSE_MASK(6, 0004L)
+#define REPORT_MOUSE_POSITION NCURSES_MOUSE_MASK(6, 0010L)
+
+#else
+
+#define BUTTON1_RESERVED_EVENT NCURSES_MOUSE_MASK(1, NCURSES_RESERVED_EVENT)
+#define BUTTON2_RESERVED_EVENT NCURSES_MOUSE_MASK(2, NCURSES_RESERVED_EVENT)
+#define BUTTON3_RESERVED_EVENT NCURSES_MOUSE_MASK(3, NCURSES_RESERVED_EVENT)
+#define BUTTON4_RESERVED_EVENT NCURSES_MOUSE_MASK(4, NCURSES_RESERVED_EVENT)
+
+#define BUTTON_CTRL NCURSES_MOUSE_MASK(5, 0001L)
+#define BUTTON_SHIFT NCURSES_MOUSE_MASK(5, 0002L)
+#define BUTTON_ALT NCURSES_MOUSE_MASK(5, 0004L)
+#define REPORT_MOUSE_POSITION NCURSES_MOUSE_MASK(5, 0010L)
+
+#endif
+
+#define ALL_MOUSE_EVENTS (REPORT_MOUSE_POSITION - 1)
+
+/* macros to extract single event-bits from masks */
+#define BUTTON_RELEASE(e, x) ((e) & NCURSES_MOUSE_MASK(x, 001))
+#define BUTTON_PRESS(e, x) ((e) & NCURSES_MOUSE_MASK(x, 002))
+#define BUTTON_CLICK(e, x) ((e) & NCURSES_MOUSE_MASK(x, 004))
+#define BUTTON_DOUBLE_CLICK(e, x) ((e) & NCURSES_MOUSE_MASK(x, 010))
+#define BUTTON_TRIPLE_CLICK(e, x) ((e) & NCURSES_MOUSE_MASK(x, 020))
+#define BUTTON_RESERVED_EVENT(e, x) ((e) & NCURSES_MOUSE_MASK(x, 040))
+
+typedef struct
+{
+ short id; /* ID to distinguish multiple devices */
+ int x, y, z; /* event coordinates (character-cell) */
+ mmask_t bstate; /* button state bits */
+}
+MEVENT;
+
+extern NCURSES_EXPORT(bool) has_mouse(void);
+extern NCURSES_EXPORT(int) getmouse (MEVENT *);
+extern NCURSES_EXPORT(int) ungetmouse (MEVENT *);
+extern NCURSES_EXPORT(mmask_t) mousemask (mmask_t, mmask_t *);
+extern NCURSES_EXPORT(bool) wenclose (const WINDOW *, int, int);
+extern NCURSES_EXPORT(int) mouseinterval (int);
+extern NCURSES_EXPORT(bool) wmouse_trafo (const WINDOW*, int*, int*, bool);
+extern NCURSES_EXPORT(bool) mouse_trafo (int*, int*, bool); /* generated */
+
+#if NCURSES_SP_FUNCS
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_mouse) (SCREEN*);
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(getmouse) (SCREEN*, MEVENT *);
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(ungetmouse) (SCREEN*,MEVENT *);
+extern NCURSES_EXPORT(mmask_t) NCURSES_SP_NAME(mousemask) (SCREEN*, mmask_t, mmask_t *);
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(mouseinterval) (SCREEN*, int);
+#endif
+
+#ifndef NCURSES_NOMACROS
+#define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)
+#endif
+
+/* other non-XSI functions */
+
+extern NCURSES_EXPORT(int) mcprint (char *, int); /* direct data to printer */
+extern NCURSES_EXPORT(int) has_key (int); /* do we have given key? */
+
+#if NCURSES_SP_FUNCS
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(has_key) (SCREEN*, int); /* do we have given key? */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(mcprint) (SCREEN*, char *, int); /* direct data to printer */
+#endif
+
+/* Debugging : use with libncurses_g.a */
+
+extern NCURSES_EXPORT(void) _tracef (const char *, ...) GCC_PRINTFLIKE(1,2);
+extern NCURSES_EXPORT(char *) _traceattr (attr_t);
+extern NCURSES_EXPORT(char *) _traceattr2 (int, chtype);
+extern NCURSES_EXPORT(char *) _tracechar (int);
+extern NCURSES_EXPORT(char *) _tracechtype (chtype);
+extern NCURSES_EXPORT(char *) _tracechtype2 (int, chtype);
+#if NCURSES_WIDECHAR
+#define _tracech_t _tracecchar_t
+extern NCURSES_EXPORT(char *) _tracecchar_t (const cchar_t *);
+#define _tracech_t2 _tracecchar_t2
+extern NCURSES_EXPORT(char *) _tracecchar_t2 (int, const cchar_t *);
+#else
+#define _tracech_t _tracechtype
+#define _tracech_t2 _tracechtype2
+#endif
+extern NCURSES_EXPORT(void) trace (const unsigned) GCC_DEPRECATED("use curses_trace");
+extern NCURSES_EXPORT(unsigned) curses_trace (const unsigned);
+
+/* trace masks */
+#define TRACE_DISABLE 0x0000 /* turn off tracing */
+#define TRACE_TIMES 0x0001 /* trace user and system times of updates */
+#define TRACE_TPUTS 0x0002 /* trace tputs calls */
+#define TRACE_UPDATE 0x0004 /* trace update actions, old & new screens */
+#define TRACE_MOVE 0x0008 /* trace cursor moves and scrolls */
+#define TRACE_CHARPUT 0x0010 /* trace all character outputs */
+#define TRACE_ORDINARY 0x001F /* trace all update actions */
+#define TRACE_CALLS 0x0020 /* trace all curses calls */
+#define TRACE_VIRTPUT 0x0040 /* trace virtual character puts */
+#define TRACE_IEVENT 0x0080 /* trace low-level input processing */
+#define TRACE_BITS 0x0100 /* trace state of TTY control bits */
+#define TRACE_ICALLS 0x0200 /* trace internal/nested calls */
+#define TRACE_CCALLS 0x0400 /* trace per-character calls */
+#define TRACE_DATABASE 0x0800 /* trace read/write of terminfo/termcap data */
+#define TRACE_ATTRS 0x1000 /* trace attribute updates */
+
+#define TRACE_SHIFT 13 /* number of bits in the trace masks */
+#define TRACE_MAXIMUM ((1 << TRACE_SHIFT) - 1) /* maximum trace level */
+
+#if defined(TRACE) || defined(NCURSES_TEST)
+extern NCURSES_EXPORT_VAR(int) _nc_optimize_enable; /* enable optimizations */
+extern NCURSES_EXPORT(const char *) _nc_visbuf (const char *);
+#define OPTIMIZE_MVCUR 0x01 /* cursor movement optimization */
+#define OPTIMIZE_HASHMAP 0x02 /* diff hashing to detect scrolls */
+#define OPTIMIZE_SCROLL 0x04 /* scroll optimization */
+#define OPTIMIZE_ALL 0xff /* enable all optimizations (dflt) */
+#endif
+
+extern NCURSES_EXPORT(void) exit_curses (int) GCC_NORETURN;
+
+#include <unctrl.h>
+
+#ifdef __cplusplus
+
+#ifndef NCURSES_NOMACROS
+
+/* these names conflict with STL */
+#undef box
+#undef clear
+#undef erase
+#undef move
+#undef refresh
+
+#endif /* NCURSES_NOMACROS */
+
+}
+#endif
+
+#endif /* __NCURSES_H */
Index: lib/ncurses/ncurses_dll.h
===================================================================
--- lib/ncurses/ncurses_dll.h (nonexistent)
+++ lib/ncurses/ncurses_dll.h (revision 5)
@@ -0,0 +1,99 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey *
+ * Copyright 2009,2014 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders shall not be used in advertising or otherwise to promote the *
+ * sale, use or other dealings in this Software without prior written *
+ * authorization. *
+ ****************************************************************************/
+/* $Id: ncurses_dll.h.in,v 1.17 2020/09/05 17:58:47 juergen Exp $ */
+
+#ifndef NCURSES_DLL_H_incl
+#define NCURSES_DLL_H_incl 1
+
+/*
+ * MinGW gcc (unlike MSYS2 and Cygwin) should define _WIN32 and possibly _WIN64.
+ */
+#if defined(__MINGW64__)
+
+#ifndef _WIN64
+#define _WIN64 1
+#endif
+
+#elif defined(__MINGW32__)
+
+#ifndef _WIN32
+#define _WIN32 1
+#endif
+
+/* 2014-08-02 workaround for broken MinGW compiler.
+ * Oddly, only TRACE is mapped to trace - the other -D's are okay.
+ * suggest TDM as an alternative.
+ */
+#if (__GNUC__ == 4) && (__GNUC_MINOR__ == 8)
+
+#ifdef trace
+#undef trace
+#define TRACE
+#endif
+
+#endif /* broken compiler */
+
+#endif /* MingW */
+
+/*
+ * For reentrant code, we map the various global variables into SCREEN by
+ * using functions to access them.
+ */
+#define NCURSES_PUBLIC_VAR(name) _nc_##name
+
+#if defined(BUILDING_NCURSES)
+# define NCURSES_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT
+#else
+# define NCURSES_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT
+#endif
+
+#define NCURSES_WRAPPED_VAR(type,name) extern NCURSES_IMPEXP type NCURSES_PUBLIC_VAR(name)(void)
+
+#define NCURSES_EXPORT(type) NCURSES_IMPEXP type NCURSES_API
+#define NCURSES_EXPORT_VAR(type) NCURSES_IMPEXP type
+
+/*
+ * These symbols hide dllimport/dllexport, for compilers which care about it.
+ */
+#if defined(__CYGWIN__) || (defined(_WIN32) || defined(_WIN64))
+# if defined(NCURSES_STATIC) /* "static" here only implies "not-a-DLL" */
+# define NCURSES_EXPORT_GENERAL_IMPORT
+# define NCURSES_EXPORT_GENERAL_EXPORT
+# else
+# define NCURSES_EXPORT_GENERAL_IMPORT __declspec(dllimport)
+# define NCURSES_EXPORT_GENERAL_EXPORT __declspec(dllexport)
+# endif
+# define NCURSES_API __cdecl
+#else
+# define NCURSES_EXPORT_GENERAL_IMPORT
+# define NCURSES_EXPORT_GENERAL_EXPORT
+# define NCURSES_API /* FIXME: __attribute__ ((cdecl)) is only available on x86 */
+#endif
+
+#endif /* NCURSES_DLL_H_incl */
Index: lib/ncurses/unctrl.h
===================================================================
--- lib/ncurses/unctrl.h (nonexistent)
+++ lib/ncurses/unctrl.h (revision 5)
@@ -0,0 +1,68 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey *
+ * Copyright 1998-2001,2009 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders shall not be used in advertising or otherwise to promote the *
+ * sale, use or other dealings in this Software without prior written *
+ * authorization. *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * unctrl.h
+ *
+ * Display a printable version of a control character.
+ * Control characters are displayed in caret notation (^x), DELETE is displayed
+ * as ^?. Printable characters are displayed as is.
+ */
+
+/* $Id: unctrl.h.in,v 1.12 2020/02/02 23:34:34 tom Exp $ */
+
+#ifndef NCURSES_UNCTRL_H_incl
+#define NCURSES_UNCTRL_H_incl 1
+
+#undef NCURSES_VERSION
+#define NCURSES_VERSION "6.2"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <curses.h>
+
+#undef unctrl
+NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype);
+
+#if 1
+NCURSES_EXPORT(NCURSES_CONST char *) NCURSES_SP_NAME(unctrl) (SCREEN*, chtype);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NCURSES_UNCTRL_H_incl */
Index: lib/ncurses
===================================================================
--- lib/ncurses (nonexistent)
+++ lib/ncurses (revision 5)
Property changes on: lib/ncurses
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: lib/report-lib.c
===================================================================
--- lib/report-lib.c (nonexistent)
+++ lib/report-lib.c (revision 5)
@@ -0,0 +1,67 @@
+/*
+ * report-lib.c: the exported version of gpm_report. used in Gpm_Open and co.
+ *
+ * Copyright (c) 2001 Nico Schottelius <nico@schottelius.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdio.h> /* NULL */
+#include <stdarg.h> /* va_arg/start/... */
+#include <stdlib.h> /* exit() */
+
+#include "headers/message.h"
+
+static int gpm_silent()
+{
+ if ( getenv( "GPM_VERBOSE" ) == NULL ) return 1;
+ return 0;
+}
+
+void gpm_report(int line, char *file, int stat, char *text, ... )
+{
+ char *string = NULL;
+ int log_level;
+ va_list ap;
+
+ if ( gpm_silent() && stat != GPM_STAT_OOPS ) return;
+
+ if (stat == GPM_STAT_DEBUG) return;
+
+ va_start(ap,text);
+
+ switch(stat) {
+ case GPM_STAT_INFO : string = GPM_TEXT_INFO ;
+ log_level = LOG_INFO; break;
+ case GPM_STAT_WARN : string = GPM_TEXT_WARN ;
+ log_level = LOG_WARNING; break;
+ case GPM_STAT_ERR : string = GPM_TEXT_ERR ;
+ log_level = LOG_ERR; break;
+ case GPM_STAT_DEBUG: string = GPM_TEXT_DEBUG;
+ log_level = LOG_DEBUG; break;
+ case GPM_STAT_OOPS : string = GPM_TEXT_OOPS;
+ log_level = LOG_CRIT; break;
+ }
+#ifdef HAVE_VSYSLOG
+ syslog(log_level, string);
+ vsyslog(log_level, text, ap);
+#else
+ fprintf(stderr,"%s[%s(%d)]:\n",string,file,line);
+ vfprintf(stderr,text,ap);
+ fprintf(stderr,"\n");
+#endif
+
+ if(stat == GPM_STAT_OOPS) exit(1); /* may a lib function call exit ???? */
+}
Index: lib
===================================================================
--- lib (nonexistent)
+++ lib (revision 5)
Property changes on: lib
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: prog/gpm-root.y
===================================================================
--- prog/gpm-root.y (nonexistent)
+++ prog/gpm-root.y (revision 5)
@@ -0,0 +1,1392 @@
+/*
+ * gpm-root.y - a default-handler for mouse events (gpm-Linux)
+ *
+ * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini)
+ * Copyright (C) 1998 Ian Zimmerman <itz@rahul.net>
+ *
+ * Tue, 5 Jan 1999 23:16:45 +0000, modified by James Troup <james@nocrew.org>:
+ * (get_winsize): use /dev/tty0 not /dev/console.
+ * gpm-root.y (f.debug): disable undocumented f.debug function because it uses a
+ * file in /tmp in a fashion which invites symlink abuse.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ********/
+
+%{
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/syslog.h>
+#include <signal.h> /* sigaction() */
+#include <pwd.h> /* pwd entries */
+#include <grp.h> /* initgroups() */
+#include <sys/kd.h> /* KDGETMODE */
+#include <sys/stat.h> /* fstat() */
+#include <sys/utsname.h> /* uname() */
+#include <termios.h> /* winsize */
+#include <linux/vt.h> /* VT_ACTIVATE */
+#include <linux/keyboard.h> /* K_SHIFT */
+#include <utmp.h>
+#include <endian.h>
+
+#ifdef HAVE_SYS_SYSMACROS_H
+#include <sys/sysmacros.h>
+#else
+#define major(dev) (((unsigned) (dev))>>8)
+#define minor(dev) ((dev)&0xff)
+#endif
+
+
+#define GPM_NULL_DEV "/dev/null"
+
+#ifdef HAVE_LINUX_MAJOR_H
+#include <linux/major.h>
+#else
+#define VCS_MAJOR 7
+#endif
+
+#define MAX_NR_USER_CONSOLES 63 /* <linux/tty.h> needs __KERNEL__ */
+
+#include "headers/message.h"
+#include "headers/gpm.h"
+
+#ifdef DEBUG
+#define YYDEBUG 1
+#else
+#undef YYDEBUG
+#endif
+
+#define USER_CFG ".gpm-root"
+#define SYSTEM_CFG SYSCONFDIR "/gpm-root.conf"
+
+#define DEFAULT_FORE 7
+#define DEFAULT_BACK 0
+#define DEFAULT_BORD 7
+#define DEFAULT_HEAD 7
+
+/* These macros are useful to avoid curses. The program is unportable anyway */
+#define GOTOXY(f,x,y) fprintf(f,"\x1B[%03i;%03iH",y,x)
+#define FORECOLOR(f,c) fprintf(f,"\x1B[%i;3%cm",(c)&8?1:22,colLut[(c)&7]+'0')
+#define BACKCOLOR(f,c) fprintf(f,"\x1B[4%cm",colLut[(c)&7]+'0')
+
+/* These defines are ugly hacks but work */
+#define ULCORNER 0xc9
+#define URCORNER 0xbb
+#define LLCORNER 0xc8
+#define LRCORNER 0xbc
+#define HORLINE 0xcd
+#define VERLINE 0xba
+
+int colLut[]={0,4,2,6,1,5,3,7};
+
+char *prgname;
+char *consolename;
+int run_status = GPM_RUN_STARTUP;
+struct winsize win;
+int disallocFlag=0;
+struct node {char *name; int flag;};
+
+struct node tableMod[]= {
+ {"shift", 1<<KG_SHIFT},
+ {"anyAlt", 1<<KG_ALT | 1<<KG_ALTGR},
+ {"leftAlt", 1<<KG_ALT},
+ {"rightAlt", 1<<KG_ALTGR},
+ {"control", 1<<KG_CTRL},
+ {NULL,0}
+};
+
+ /* provide defaults */
+int opt_mod = 4; /* control */
+int opt_buf = 0; /* ask the kernel about it */
+int opt_user = 1; /* allow user cfg files */
+
+
+
+typedef struct DrawItem {
+ short type;
+ short pad;
+ char *name;
+ char *arg; /* a cmd string */
+ void *clientdata; /* a (Draw *) for menus or whatever */
+ int (*fun)();
+ struct DrawItem *next;
+} DrawItem;
+
+typedef struct Draw {
+ short width; /* length of longest item */
+ short height; /* the number of items */
+ short uid; /* owner */
+ short buttons; /* which button */
+ short fore,back,bord,head; /* colors */
+ char *title; /* name */
+ time_t mtime; /* timestamp of source file */
+ DrawItem *menu; /* the list of items */
+ struct Draw *next; /* chain */
+} Draw;
+
+typedef struct Posted {
+ short x,y,X,Y;
+ Draw *draw;
+ unsigned char *dump;
+ short colorcell;
+ struct Posted *prev;
+} Posted;
+
+Draw *drawList=NULL;
+
+/* support functions and vars */
+int yyerror(char *s);
+int yylex(void);
+
+DrawItem *cfg_cat(DrawItem *, DrawItem *);
+DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(), void *detail);
+
+
+/*===================================================================*
+ * This part of the source is devoted to reading the cfg file
+ */
+
+char cfgname[256];
+FILE *cfgfile=NULL;
+int cfglineno=0;
+Draw *cfgcurrent, *cfgall;
+
+Draw *cfg_alloc(void);
+
+/* prototypes for predefined functions */
+
+enum F_call {F_CREATE, F_POST, F_INVOKE, F_DONE};
+int f_debug(int mode, DrawItem *self, int uid);
+int f_bgcmd(int mode, DrawItem *self, int uid);
+int f_fgcmd(int mode, DrawItem *self, int uid);
+int f_jptty(int mode, DrawItem *self, int uid);
+int f_mktty(int mode, DrawItem *self, int uid);
+int f_menu(int mode, DrawItem *self, int uid);
+int f_lock(int mode, DrawItem *self, int uid);
+int f_load(int mode, DrawItem *self, int uid);
+int f_free(int mode, DrawItem *self, int uid);
+int f_time(int mode, DrawItem *self, int uid);
+int f_pipe(int mode, DrawItem *self, int uid);
+
+%} /* and this starts yacc definitions */
+
+%union {
+ int silly;
+ char *string;
+ Draw *draw;
+ DrawItem *item;
+ int (*fun)();
+ }
+
+%token <string> T_STRING
+%token <silly> T_BACK T_FORE T_BORD T_HEAD
+%token <silly> T_BRIGHT T_COLOR T_NAME
+
+%token T_BUTTON
+%token <fun> T_FUNC T_FUN2
+%type <silly> bright button
+%type <draw> menu file
+%type <item> item items itemlist
+%% /* begin grammar #########################################################*/
+
+file: /* empty */ {$$=cfgall=NULL;}
+ | file button menu {$3->buttons=$2; $3->next=$1; $$=cfgall=$3;}
+ ;
+
+button: T_BUTTON '1' {$$=GPM_B_LEFT;}
+ | T_BUTTON '2' {$$=GPM_B_MIDDLE;}
+ | T_BUTTON '3' {$$=GPM_B_RIGHT;}
+ ;
+
+menu: '{' {$<draw>$=cfgcurrent=cfg_alloc();}
+ configs itemlist '}' {$$=$<draw>2; $$->menu=$4;}
+ ;
+
+configs: /* empty */ | configs cfgpair ;
+
+cfgpair: T_NAME T_STRING {cfgcurrent->title=$2;}
+ | T_BACK T_COLOR {cfgcurrent->back=$2;}
+ | T_FORE bright T_COLOR {cfgcurrent->fore=$3|$2;}
+ | T_BORD bright T_COLOR {cfgcurrent->bord=$3|$2;}
+ | T_HEAD bright T_COLOR {cfgcurrent->head=$3|$2;}
+ ;
+
+bright: /* empty */ {$$=0;} | T_BRIGHT {$$=8;} ;
+
+itemlist: item items {$$=cfg_cat($1,$2);} ;
+
+items: /* empty */ {$$=NULL;}
+ | items item {$$= $1 ? cfg_cat($1,$2) : $2;}
+ ;
+
+item: T_STRING T_FUNC {$$=cfg_makeitem('F',$1,$2, NULL);}
+ | T_STRING T_FUN2 T_STRING {$$=cfg_makeitem('2',$1,$2, $3);}
+ | T_STRING menu {$$=cfg_makeitem('M',$1,NULL,$2);}
+ ;
+
+%% /* end grammar ###########################################################*/
+
+int yyerror(char *s)
+{
+ fprintf(stderr,"%s:%s(%i): %s\n",prgname,cfgname,cfglineno,s);
+ return 1;
+}
+
+int yywrap()
+{
+ return 1;
+}
+
+struct tokenName {
+ char *name;
+ int token;
+ int value;
+ };
+struct tokenName tokenList[] = {
+ {"foreground",T_FORE,0},
+ {"background",T_BACK,0},
+ {"border", T_BORD,0},
+ {"head", T_HEAD,0},
+ {"name", T_NAME,0},
+ {"button", T_BUTTON,0},
+ {"black", T_COLOR,0},
+ {"blue", T_COLOR,1},
+ {"green", T_COLOR,2},
+ {"cyan", T_COLOR,3},
+ {"red", T_COLOR,4},
+ {"magenta", T_COLOR,5},
+ {"yellow", T_COLOR,6},
+ {"white", T_COLOR,7},
+ {"bright", T_BRIGHT,0},
+ {NULL,0,0}
+ };
+
+struct funcName {
+ char *name;
+ int token;
+ int (*fun)();
+ };
+struct funcName funcList[] = {
+ {"f.debug",T_FUNC,f_debug},
+ {"f.fgcmd",T_FUN2,f_fgcmd},
+ {"f.bgcmd",T_FUN2,f_bgcmd},
+ {"f.jptty",T_FUN2,f_jptty},
+ {"f.mktty",T_FUNC,f_mktty},
+ {"f.menu",T_FUNC,f_menu},
+ {"f.lock",T_FUN2,f_lock}, /* "lock one", "lock all" */
+ {"f.load",T_FUNC,f_load},
+ {"f.free",T_FUNC,f_free},
+ {"f.time",T_FUNC,f_time},
+ {"f.pipe",T_FUN2,f_pipe},
+ {"f.nop",T_FUNC,NULL},
+ {NULL,0,NULL}
+};
+
+/*---------------------------------------------------------------------*/
+int yylex(void)
+{
+ int c,i;
+ char s[80];
+ struct tokenName *tn;
+ struct funcName *fn;
+
+ while(1) {
+ i=0;
+ switch(c=getc(cfgfile)) {
+ case EOF: fclose(cfgfile); return 0;
+ case '\"':
+ do {
+ s[i]=getc(cfgfile);
+ if ((s[i])=='\n') {
+ yyerror("unterminated string");
+ cfglineno++;
+ }
+ if (s[i]=='\\') s[i]=getc(cfgfile);
+ } /* get '"' as '\"' */ while (s[i++]!='\"' && s[i-2] !='\\') ;
+ s[i-1]=0;
+ yylval.string=(char *)strdup(s);
+ return T_STRING;
+
+ case '#': while ( (c=getc(cfgfile)!='\n') && c!=EOF) ;
+ case '\n': cfglineno++;
+ case ' ': /* fall through */
+ case '\t': continue;
+ default: if (!isalpha(c)) return(c);
+ }
+ /* get a single word and convert it */
+ do {
+ s[i++]=c;
+ } while (isalnum(c=getc(cfgfile)) || c=='.');
+ ungetc(c,cfgfile);
+ s[i]=0;
+ for (tn=tokenList; tn->name; tn++)
+ if (tn->name[0]==s[0] && !strcmp(tn->name,s)) {
+ yylval.silly=tn->value;
+ return tn->token;
+ }
+ for (fn=funcList; fn->name; fn++)
+ if (fn->name[0]==s[0] && !strcmp(fn->name,s)) {
+ yylval.fun=fn->fun;
+ return fn->token;
+ }
+ yylval.string=(char *)strdup(s); return T_STRING;
+ }
+}
+
+/*---------------------------------------------------------------------*/
+void cfg_free(Draw *what)
+{
+ Draw *ptr;
+ DrawItem *item;
+
+ for (ptr=what; ptr; ptr=ptr->next) {
+ if (ptr->title) free(ptr->title);
+ for (item=ptr->menu; item; item=item->next) {
+ if (item->name) free(item->name);
+ if (item->arg) free(item->arg);
+ if (item->type=='M' && item->clientdata) {
+ ((Draw *)(item->clientdata))->next=NULL; /* redundant */
+ cfg_free(item->clientdata);
+ }
+ if (item->clientdata) free(item->clientdata);
+ }
+ }
+}
+
+/*---------------------------------------------------------------------*/
+/* malloc an empty Draw */
+Draw *cfg_alloc(void)
+{
+ Draw *new=calloc(1,sizeof(Draw));
+
+ if (!new) return NULL;
+ new->back=DEFAULT_BACK;
+ new->fore=DEFAULT_FORE;
+ new->bord=DEFAULT_BORD;
+ new->head=DEFAULT_HEAD;
+
+ return new;
+}
+
+/*---------------------------------------------------------------------*/
+/* malloc an empty DrawItem and fill it */
+DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(), void *detail)
+{
+ DrawItem *new=calloc(1,sizeof(DrawItem));
+
+ if (!new) return NULL;
+
+ new->name=(char *)strdup(msg);
+ new->type=mode;
+ switch(mode) {
+ case '2': /* a function with one arg */
+ new->arg=(char *)strdup(detail);
+ /* fall through */
+
+ case 'F': /* a function without args */
+ new->fun=fun;
+ if (fun) fun(F_CREATE,new);
+ break;
+
+ case 'M':
+ new->clientdata=detail;
+ new->fun=f_menu;
+ break;
+
+ default: fprintf(stderr,"%s: unknown item type (can't happen)\n",prgname);
+ }
+
+ return new;
+}
+
+/*---------------------------------------------------------------------*/
+/* concatenate two item lists */
+DrawItem *cfg_cat(DrawItem *d1, DrawItem *d2)
+{
+ DrawItem *tmp;
+
+ for (tmp=d1; tmp->next; tmp=tmp->next) ;
+ tmp->next=d2;
+ return d1;
+}
+
+/*====================================================================*/
+void f__fix(struct passwd *pass)
+{
+ if (setgid(pass->pw_gid) < 0 ||
+ initgroups(pass->pw_name, pass->pw_gid) < 0 ||
+ setuid(pass->pw_uid) < 0)
+ exit(1);
+ setenv("HOME", pass->pw_dir, 1);
+ setenv("LOGNAME", pass->pw_name,1);
+ setenv("USER", pass->pw_name,1);
+}
+
+/*---------------------------------------------------------------------*/
+static int f_debug_one(FILE *f, Draw *draw)
+{
+ DrawItem *ip;
+ static int tc=0;
+ int i;
+
+#define LINE(args) for(i=0;i<tc;i++) putc('\t',f); fprintf args
+
+ LINE((f,"BUTT %i - %ix%i\n",draw->buttons,draw->width,draw->height));
+ LINE((f,"UID %i\n",draw->uid));
+ LINE((f,"fore %i - back %i\n",draw->fore,draw->back));
+ LINE((f,"bord %i - head %i\n",draw->bord,draw->head));
+ LINE((f,"---> \"%s\" %li\n",draw->title,(long)(draw->mtime)));
+ for (ip=draw->menu; ip; ip=ip->next) {
+ LINE((f," %i \"%s\" (%p)\n",ip->type,ip->name,ip->fun));
+ if (ip->fun == f_menu) {
+ tc++; f_debug_one(f,(Draw *)ip->clientdata); tc--;
+ }
+ }
+#undef LINE
+ return 0;
+}
+
+int f_debug(int mode, DrawItem *self, int uid)
+{
+#if 0 /* Disabled on account of security concerns; the way
+ * "/tmp/root-debug" is used is gratuitously
+ * open to symlink abuse */
+
+ FILE *f;
+ Draw *dp;
+
+ switch (mode) {
+ case F_POST:
+ if (!(f=fopen("/tmp/root-debug","a"))) return 1;
+ for(dp=drawList; dp; dp=dp->next)
+ f_debug_one(f,dp);
+ fprintf(f,"\n\n");
+ fclose(f);
+
+ case F_CREATE:
+ case F_INVOKE:
+ break;
+ }
+#endif /* 0 */
+ return 0;
+}
+
+
+/*---------------------------------------------------------------------*/
+int f_fgcmd(int mode, DrawItem *self, int uid)
+{
+ switch (mode) {
+ case F_CREATE:
+ case F_POST: break;
+ case F_INVOKE: ; /* MISS */
+ }
+ return 0;
+}
+
+/*---------------------------------------------------------------------*/
+int f_bgcmd(int mode, DrawItem *self, int uid)
+{
+ int i;
+ struct passwd *pass;
+
+ switch (mode) {
+ case F_CREATE:
+ case F_POST: break;
+ case F_INVOKE:
+ switch(fork()) {
+ case -1:
+ gpm_report(GPM_PR_ERR, "fork(): %s", strerror(errno));
+ return 1;
+ case 0:
+ pass=getpwuid(uid);
+ if (!pass) exit(1);
+ f__fix(pass); /* setgid(), setuid(), setenv(), ... */
+ close(0); close(1); close(2);
+ open("/dev/null",O_RDONLY); /* stdin */
+ open(consolename,O_WRONLY); /* stdout */
+ dup(1); /* stderr */
+ int open_max = sysconf(_SC_OPEN_MAX);
+ if (open_max == -1) open_max = 1024;
+ for (i=3;i<open_max; i++) close(i);
+ execl("/bin/sh","sh","-c",self->arg,(char *)NULL);
+ exit(1); /* shouldn't happen */
+ default: return 0;
+
+ }
+ }
+ return 0;
+}
+/*---------------------------------------------------------------------*/
+int f_jptty(int mode, DrawItem *self, int uid)
+{
+ int i,fd;
+
+ switch (mode) {
+ case F_CREATE:
+ case F_POST: break;
+ case F_INVOKE:
+ i=atoi(self->arg);
+ fd=open(consolename,O_RDWR);
+ if (fd<0) {
+ gpm_report(GPM_PR_ERR, "%s: %s",consolename, strerror(errno));
+ return 1;
+ } /*if*/
+ if (ioctl(fd, VT_ACTIVATE, i)<0) {
+ gpm_report(GPM_PR_ERR, "%s: %s", consolename,strerror(errno));
+ return 1;
+ } /*if*/
+ if (ioctl(fd, VT_WAITACTIVE, i)<0) {
+ gpm_report(GPM_PR_ERR, "%s: %s", consolename,strerror(errno));
+ return 1;
+ }
+ default: return 0;
+ }
+ return 0; /* silly gcc -Wall */
+}
+
+/*---------------------------------------------------------------------*/
+/* This array registers spawned consoles */
+static int consolepids[1+MAX_NR_USER_CONSOLES];
+
+int f_mktty(int mode, DrawItem *self, int uid)
+{
+ int fd, pid;
+ int vc;
+ char name[10];
+ switch (mode) {
+ case F_CREATE: self->arg=malloc(8);
+ case F_POST: break;
+ case F_INVOKE:
+ fd=open(consolename,O_RDWR);
+ if (fd<0) {
+ gpm_report(GPM_PR_ERR,"%s: %s",consolename, strerror(errno));
+ return 1;
+ } /*if*/
+ if (ioctl(fd, VT_OPENQRY, &vc)<0) {
+ gpm_report(GPM_PR_ERR, "%s: %s",consolename, strerror(errno));
+ return 1;
+ } /*if*/
+ switch(pid=fork()) {
+ case -1:
+ gpm_report(GPM_PR_ERR, "fork(): %s", strerror(errno));
+ return 1;
+ case 0: /* child: exec getty */
+ sprintf(name,"tty%i",vc);
+ execl("/sbin/mingetty","mingetty",name,(char *)NULL);
+ exit(1); /* shouldn't happen */
+ default: /* father: jump to the tty */
+ gpm_report(GPM_PR_INFO,"Registering child %i on console %i"
+ ,pid,vc);
+ consolepids[vc]=pid;
+ sprintf(self->arg,"%i",vc);
+ return f_jptty(mode,self,uid);
+ }
+ default: return 0;
+ }
+ return 0;
+}
+
+/*---------------------------------------------------------------------*/
+int f_menu(int mode, DrawItem *self, int uid)
+{
+ return 0; /* just a placeholder, recursion is performed in main() */
+}
+
+/*---------------------------------------------------------------------*/
+int f_lock(int mode, DrawItem *self, int uid)
+{
+#if 0 /* some kind of interesting ...: if never */
+ int all;
+ static DrawItem msg = {
+ 0,
+ 10,
+ "Enter your password to unlock",
+ NULL, NULL, NULL, NULL
+ };
+ static Draw
+
+
+ switch (mode) {
+ case F_CREATE: /* either "one" or anything else */
+ if (strcmp(self->arg,"one")) self->arg[0]='a';
+ case F_POST: break;
+ case F_INVOKE: /* the biggest of all... */
+ }
+
+#endif
+ return 0;
+}
+
+/*---------------------------------------------------------------------*/
+int f_load(int mode, DrawItem *self, int uid)
+{
+ FILE *f;
+ double l1,l2,l3;
+
+ l1=l2=l3=0.0;
+
+ switch (mode) {
+ case F_CREATE: /* modify name, just to fake its length */
+ self->clientdata=malloc(strlen(self->name)+20);
+ self->name=realloc(self->name,strlen(self->name)+20);
+ strcpy(self->clientdata,self->name);
+ strcat(self->clientdata," %5.2f %5.2f %5.2f");
+ sprintf(self->name,self->clientdata,l1,l2,l3);
+ break;
+
+ case F_POST:
+ if (!(f=fopen("/proc/loadavg","r"))) return 1;
+ fscanf(f,"%lf %lf %lf",&l1,&l2,&l3);
+ sprintf(self->name,self->clientdata,l1,l2,l3);
+ fclose(f);
+
+ case F_INVOKE: break;
+ }
+ return 0;
+}
+
+/*---------------------------------------------------------------------*/
+int f_free(int mode, DrawItem *self, int uid)
+{
+ FILE *f;
+ long l1,l2;
+ char s[80];
+
+ l1=l2=0;
+ switch (mode) {
+ case F_CREATE: /* modify name, just to fake its length */
+ self->clientdata=malloc(strlen(self->name)+30);
+ self->name=realloc(self->name,strlen(self->name)+30);
+ strcpy(self->clientdata,self->name);
+ strcat(self->clientdata," %5.2fM mem + %5.2fM swap");
+ sprintf(self->name,self->clientdata,(double)l1,(double)l2);
+ break;
+
+ case F_POST:
+ if (!(f=fopen("/proc/meminfo","r"))) return 1;
+ fgets(s,80,f);
+ fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l1);
+ fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l2);
+ sprintf(self->name,self->clientdata,
+ (double)l1/1024/1024,(double)l2/1024/1024);
+ fclose(f);
+
+ case F_INVOKE: break;
+ }
+ return 0;
+}
+
+/*---------------------------------------------------------------------*/
+int f_time(int mode, DrawItem *self, int uid) {
+ char s[128];
+ struct tm *broken;
+ time_t t;
+
+ time(&t); broken=localtime(&t);
+ switch (mode) {
+ case F_CREATE: /* modify name, just to fake its length */
+ self->clientdata=self->name;
+ strftime(s,110,self->clientdata,broken);
+ strcat(s,"1234567890"); /* names can change length */
+ self->name=(char *)strdup(s);
+ /* rewrite the right string */
+ strftime(self->name,110,self->clientdata,broken);
+ break;
+
+ case F_POST: strftime(self->name,120,self->clientdata,broken);
+ case F_INVOKE: break;
+ }
+ return 0;
+}
+
+/*---------------------------------------------------------------------*/
+int f_pipe(int mode, DrawItem *self, int uid)
+{
+ return 0;
+}
+
+/*====================================================================*/
+int fixone(Draw *ptr, int uid)
+{
+ int hei,wid;
+ DrawItem *item;
+
+ ptr->uid=uid;
+ hei=0; wid= ptr->title? strlen(ptr->title)+2 : 0;
+
+ /* calculate width and height */
+ for (item=ptr->menu; item; item=item->next) {
+ hei++;
+ wid= wid > strlen(item->name) ? wid : strlen(item->name);
+ }
+ ptr->height=hei+2;
+ ptr->width=wid+2;
+
+ /* fix paddings and recurse */
+ for (item=ptr->menu; item; item=item->next) {
+ item->pad=(ptr->width-strlen(item->name ? item->name : ""))/2;
+ if (item->fun==f_menu) fixone((Draw *)item->clientdata,uid);
+ }
+ return 0;
+}
+
+
+/* read menus from a file, and return a list or NULL */
+Draw *cfg_read(int uid)
+{
+ Draw *ptr;
+
+ if (!(cfgfile=fopen(cfgname,"r"))) {
+ gpm_report(GPM_PR_ERR, "%s: %s", cfgname, strerror(errno));
+ return NULL;
+ }
+ gpm_report(GPM_PR_INFO,"Reading file %s",cfgname);
+ cfglineno=1;
+ if (yyparse()) {
+ cfg_free(cfgall);
+ cfgall=NULL;
+ return NULL;
+ }
+
+ /* handle recursion */
+ for (ptr=cfgall; ptr; ptr=ptr->next) {
+ fixone(ptr,uid);
+ }
+
+ return cfgall;
+}
+
+
+/*---------------------------------------------------------------------*/
+/* the return value tells whether it has been newly loaded or not */
+int getdraw(int uid, int buttons, time_t mtime1, time_t mtime2)
+{
+ struct passwd *pass;
+ struct stat buf;
+ Draw *new, *np, *op, *pp;
+ int retval=0;
+ time_t mtime;
+
+ gpm_report(GPM_PR_DEBUG,"getdraw: %i %i %li %li",uid,buttons,mtime1,mtime2);
+ pass=getpwuid(uid);
+
+ /* deny personal cfg to root for security reasons */
+ if (pass==NULL || !uid || !opt_user) {
+ mtime=mtime2; uid=-1;
+ strcpy(cfgname,SYSTEM_CFG);
+ } else {
+ mtime=mtime1;
+ strcpy(cfgname,pass->pw_dir);
+ strcat(cfgname,"/" USER_CFG);
+ }
+
+ if (stat(cfgname,&buf)==-1) {
+ gpm_report(GPM_PR_DEBUG,"stat (%s) failed",cfgname);
+ /* try the system wide */
+ mtime=mtime2; uid = -1;
+ strcpy(cfgname,SYSTEM_CFG);
+ if (stat(cfgname,&buf)==-1) {
+ gpm_report(GPM_PR_ERR,"stat (%s) failed",cfgname);
+ return 0;
+ }
+ }
+
+ if (buf.st_mtime <= mtime) return 0;
+
+ /* else, read the new drawing tree */
+ new=cfg_read(uid);
+ if (!new) return 0;
+
+ /* scan old data to remove duplicates */
+ for (np=pp=new; np; pp=np, np=np->next) {
+ np->mtime=buf.st_mtime;
+ if (np->buttons==buttons) retval++;
+ for (op=drawList; op; op=op->next)
+ if (op->uid==np->uid && op->buttons==np->buttons)
+ op->buttons=0; /* mark for deletion */
+ }
+
+ /* chain in */
+ pp->next=drawList; drawList=new;
+
+ /* actually remove fake entries */
+ for (np=drawList; np; pp=np, np=np->next)
+ if (!np->buttons) {
+ pp->next=np->next;
+ np->next=NULL;
+ cfg_free(np);
+ np=pp;
+ }
+ return retval; /* found or not */
+}
+
+
+/*---------------------------------------------------------------------*/
+Draw *retrievedraw(int uid, int buttons)
+{
+ Draw *drawPtr, *genericPtr=NULL;
+
+ /* retrieve a drawing by scanning the list */
+ do {
+ for (drawPtr=drawList; drawPtr; drawPtr=drawPtr->next) {
+ if (drawPtr->uid==uid && drawPtr->buttons==buttons) break;
+ if (drawPtr->uid==-1 && drawPtr->buttons==buttons) genericPtr=drawPtr;
+ }
+ } while (getdraw(uid,buttons,
+ drawPtr ? drawPtr->mtime : 0,
+ genericPtr ? genericPtr->mtime :0));
+
+
+ return drawPtr ? drawPtr : genericPtr;
+}
+
+
+/*=====================================================================*/
+int usage(void)
+{
+ printf( GPM_MESS_VERSION "\n"
+ "Usage: %s [options]\n",prgname);
+ printf(" Valid options are\n"
+ " -m <number-or-name> modifier to use\n"
+ " -u inhibit user configuration files\n"
+ " -D don't auto-background and run as daemon\n"
+ " -V <verbosity-delta> increase amount of logged messages\n"
+ );
+
+ return 1;
+}
+
+/*------------*/
+int getmask(char *arg, struct node *table)
+{
+ int last=0, value=0;
+ char *cur;
+ struct node *n;
+
+ if (isdigit(arg[0])) return atoi(arg);
+
+ while (1) {
+ while (*arg && !isalnum(*arg)) arg++; /* skip delimiters */
+ cur=arg;
+ while(isalnum(*cur)) cur++; /* scan the word */
+ if (!*cur) last++;
+ *cur=0;
+
+ for (n=table;n->name;n++)
+ if (!strcmp(n->name,arg)) {
+ value |= n->flag;
+ break;
+ }
+ if(!n->name) fprintf(stderr,"%s: Incorrect flag \"%s\"\n",prgname,arg);
+ if (last) break;
+ cur++; arg=cur;
+ }
+
+ return value;
+}
+
+/*------------*/
+int cmdline(int argc, char **argv)
+{
+ int opt;
+
+ run_status = GPM_RUN_STARTUP;
+ while ((opt = getopt(argc, argv,"m:uDV::")) != -1) {
+ switch (opt) {
+ case 'm': opt_mod=getmask(optarg, tableMod); break;
+ case 'u': opt_user=0; break;
+ case 'D': run_status = GPM_RUN_DEBUG; break;
+ case 'V':
+ /*gpm_debug_level += (0==optarg ? 1 : strtol(optarg,0,0)); */
+ break;
+ default: return 1;
+ }
+
+ }
+ return 0;
+}
+
+
+
+/*------------*
+ * This buffer is passed to set_selection, and the only meaningful value
+ * is the last one, which is the mode: 4 means "clear_selection".
+ * however, the byte just before the 1th short must be 2 which denotes
+ * the selection-related stuff in ioctl(TIOCLINUX).
+ */
+
+static unsigned short clear_sel_args[6]={0, 0,0, 0,0, 4};
+static unsigned char *clear_sel_arg= (unsigned char *)clear_sel_args+1;
+
+/*------------*/
+static inline void scr_dump(int fd, FILE *f, unsigned char *buffer, int vc)
+{
+ int dumpfd;
+ char dumpname[20];
+
+ sprintf(dumpname,"/dev/vcsa%i",vc);
+ dumpfd=open(dumpname,O_RDONLY);
+ if (dumpfd<0) {
+ gpm_report(GPM_PR_ERR,"%s: %s", dumpname, strerror(errno));
+ return;
+ } /*if*/
+ clear_sel_arg[0]=2; /* clear_selection */
+ ioctl(fd,TIOCLINUX,clear_sel_arg);
+ read(dumpfd,buffer,4);
+ read(dumpfd,buffer+4,2*buffer[0]*buffer[1]);
+ close(dumpfd);
+}
+
+/*------------*/
+static inline void scr_restore(int fd, FILE *f, unsigned char *buffer, int vc)
+{
+ int x,y, dumpfd;
+ char dumpname[20];
+
+ x=buffer[2]; y=buffer[3];
+
+ /* WILL NOT WORK WITH DEVFS! FIXME! */
+ sprintf(dumpname,"/dev/vcsa%i",vc);
+ dumpfd=open(dumpname,O_WRONLY);
+ if (dumpfd<0) {
+ gpm_report(GPM_PR_ERR,"%s: %s", dumpname, strerror(errno));
+ return;
+ } /*if*/
+ clear_sel_arg[0]=2; /* clear_selection */
+ ioctl(fd,TIOCLINUX,clear_sel_arg);
+ write(dumpfd,buffer,4+2*buffer[0]*buffer[1]);
+ close(dumpfd);
+}
+
+/*===================================================================*/
+/* post and unpost menus from the screen */
+static int postcount;
+static Posted *activemenu;
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define bigendian 1
+#else
+#define bigendian 0
+#endif
+
+Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int y, int console)
+{
+ Posted *new;
+ DrawItem *item;
+ unsigned char *dump;
+ unsigned char *curr, *curr2;
+ int i;
+ short lines,columns;
+
+ new=calloc(1,sizeof(Posted));
+ if (!new) return NULL;
+ new->draw=draw;
+ new->dump=dump=malloc(opt_buf);
+ scr_dump(fd,f,dump,console);
+ lines=dump[0]; columns=dump[1];
+ i=(columns*dump[3]+dump[2])*2+1; /* where to get it */
+ if (i<0) i=1;
+ new->colorcell=dump[4+i-bigendian];
+ gpm_report(GPM_PR_DEBUG,"Colorcell=%02x (at %i,%i = %i)",
+ new->colorcell,dump[2],dump[3],i-bigendian);
+
+ /* place the box relative to the mouse */
+ if (!postcount) x -= draw->width/2; else x+=2;
+ y++;
+
+ /* fit inside the screen */
+ if (x<1) x=1;
+ if (x+draw->width >= columns) x=columns-1-draw->width;
+ if (y+draw->height > lines+1) y=lines+1-draw->height;
+ new->x=x; new->X=x+draw->width-1;
+ new->y=y; new->Y=y+draw->height-1;
+
+ /* these definitions are dirty hacks, but they help in writing to the screen */
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define PUTC(c,f,b) (*(curr++)=((b)<<4)+(f),*(curr++)=(c))
+#else
+#define PUTC(c,f,b) (*(curr++)=(c),*(curr++)=((b)<<4)+(f))
+#endif
+#define PUTS(s,f,b) for(curr2=s;*curr2;PUTC(*(curr2++),f,b))
+#define GOTO(x,y) (curr=dump+4+2*((y)*columns+(x)))
+
+ x--; y--; /* /dev/vcs is zero based */
+ ioctl(fd,TCXONC,TCOOFF); /* inhibit further prints */
+ dump=malloc(opt_buf);
+ memcpy(dump,new->dump,opt_buf); /* dup the buffer */
+ /* top border */
+ GOTO(x,y);
+ PUTC(ULCORNER,draw->bord,draw->back);
+ for (i=0; i<draw->width; i++) PUTC(HORLINE,draw->bord,draw->back);
+ PUTC(URCORNER,draw->bord,draw->back);
+ if (draw->title) {
+ GOTO(x+(draw->width-strlen(draw->title))/2,y);
+ PUTC(' ',draw->head,draw->back);
+ PUTS(draw->title,draw->head,draw->back);
+ PUTC(' ',draw->head,draw->back);
+ }
+ /* sides and items */
+ for (item=draw->menu; y++, item; item=item->next) {
+ if (item->fun) (*(item->fun))(F_POST,item);
+ GOTO(x,y); PUTC(VERLINE,draw->bord,draw->back);
+ for (i=0;i<item->pad;i++) PUTC(' ',draw->fore,draw->back);
+ PUTS(item->name,draw->fore,draw->back); i+=strlen(item->name);
+ while (i++<draw->width) PUTC(' ',draw->fore,draw->back);
+ PUTC(VERLINE,draw->bord,draw->back);
+ }
+ /* bottom border */
+ GOTO(x,y);
+ PUTC(LLCORNER,draw->bord,draw->back);
+ for (i=0; i<draw->width; i++) PUTC(HORLINE,draw->bord,draw->back);
+ PUTC(LRCORNER,draw->bord,draw->back);
+
+ scr_restore(fd,f,dump,console);
+ free(dump);
+
+#undef PUTC
+#undef PUTS
+#undef GOTO
+
+ new->prev=activemenu;
+ activemenu=new;
+ postcount++;
+ return new;
+}
+
+Posted *unpostmenu(int fd, FILE *f, Posted *which, int vc)
+{
+ Posted *prev=which->prev;
+
+ scr_restore(fd,f,which->dump, vc);
+ ioctl(fd,TCXONC,TCOON); /* activate the console */
+ free(which->dump);
+ free(which);
+ activemenu=prev;
+ postcount--;
+ return prev;
+}
+
+
+void reap_children(int signo)
+{
+ int i, pid;
+ pid=wait(&i);
+ gpm_report(GPM_PR_INFO,"pid %i exited %i",pid,i);
+
+ if (disallocFlag)
+ gpm_report(GPM_PR_INFO,"Warning, overriding logout from %i",disallocFlag);
+ for (i=1;i<=MAX_NR_USER_CONSOLES; i++)
+ if (consolepids[i]==pid) {
+ disallocFlag=i;
+ consolepids[i]=0;
+ gpm_report(GPM_PR_INFO,"Registering disallocation of console %i",i);
+ break;
+ }
+}
+
+
+void get_winsize(void)
+{
+ int fd;
+
+ if ((fd=open(consolename,O_RDONLY))<0) {
+ fprintf(stderr,"%s: ",prgname); perror(consolename);
+ exit(1);
+ }
+ ioctl(fd, TIOCGWINSZ, &win);
+ opt_buf=win.ws_col*win.ws_row;
+ close(fd);
+
+ opt_buf +=4; /* 2:size, 1:terminator, 1:alignment */
+ opt_buf*=2; /* the new scrdump and /dev/vcsa returns color info as well */
+}
+
+
+/*===================================================================*/
+static int do_resize=0;
+#if defined(__GLIBC__)
+__sighandler_t winchHandler(int errno);
+#else /* __GLIBC__ */
+void winchHandler(int errno);
+#endif /* __GLIBC__ */
+
+int main(int argc, char **argv)
+{
+ Gpm_Connect conn;
+ Gpm_Event ev;
+ int vc, fd=-1 ,uid=-1;
+ FILE *f=NULL;
+ struct stat stbuf;
+ Draw *draw=NULL;
+ DrawItem *item;
+ char s[80];
+ int posty = 0, postx, postX;
+ struct sigaction childaction;
+ int evflag;
+ int recursenow=0; /* not on first iteration */
+
+ prgname=argv[0];
+ consolename = Gpm_get_console();
+ setuid(0); /* if we're setuid, force it */
+
+ if (getuid()) {
+ fprintf(stderr,"%s: Must be root\n", prgname);
+ exit(1);
+ }
+
+ /*
+ * Now, first of all we need to check that /dev/vcs is there.
+ * But only if the kernel is new enough. vcs appeared in 1.1.82.
+ * If an actual open fails, a message on syslog will be issued.
+ */
+ {
+ struct utsname linux_info;
+ int v1,v2,v3;
+ struct stat sbuf;
+
+ if (uname(&linux_info)) {
+ fprintf(stderr,"%s: uname(): %s\n",prgname,strerror(errno));
+ exit(1);
+ }
+ sscanf(linux_info.release,"%d.%d.%d",&v1,&v2,&v3);
+ if (v1*1000000 + v2*1000 +v3 < 1001082) {
+ fprintf(stderr,"%s: can't run with linux < 1.1.82\n",prgname);
+ exit(1);
+ }
+
+ /* problems with devfs! FIXME! */
+ if (stat("/dev/vcs0",&sbuf)<0 && stat("/dev/vcs",&sbuf)<0) {
+ fprintf(stderr,"%s: /dev/vcs0: %s\n",prgname,strerror(errno));
+ fprintf(stderr,"%s: do you have vcs devices? Refer to the manpage\n",
+ prgname);
+ exit(1);
+ } else if (!S_ISCHR(sbuf.st_mode) ||
+ VCS_MAJOR != major(sbuf.st_rdev) ||
+ 0 != minor(sbuf.st_rdev)) {
+ fprintf(stderr,"Your /dev/vcs device looks funny\n");
+ fprintf(stderr,"Refer to the manpage and possibly run the"
+ "create_vcs script in gpm source directory\n");
+ exit(1);
+ }
+ }
+
+ if (cmdline(argc,argv)) exit(usage());
+
+ openlog(prgname, LOG_PID|LOG_CONS, run_status == GPM_RUN_DAEMON ?
+ LOG_DAEMON : LOG_USER);
+ /* reap your zombies */
+ childaction.sa_handler=reap_children;
+ sigemptyset(&childaction.sa_mask);
+ childaction.sa_flags=SA_INTERRUPT; /* need to break the select() call */
+ sigaction(SIGCHLD,&childaction,NULL);
+
+ /*....................................... Connect and get your buffer */
+
+ conn.eventMask=GPM_DOWN;
+ conn.defaultMask=GPM_MOVE; /* only ctrl-move gets the default */
+ conn.maxMod=conn.minMod=opt_mod;
+
+ gpm_zerobased=1;
+
+ for (vc=4; vc-->0;)
+ {
+ extern int gpm_tried; /* liblow.c */
+ gpm_tried=0; /* to enable retryings */
+ if (Gpm_Open(&conn,-1)!=-1)
+ break;
+ if (vc)
+ sleep(2);
+ }
+ if (!vc)
+ {
+ gpm_report(GPM_PR_OOPS,"can't open mouse connection");
+ }
+
+ conn.eventMask=~0; /* grab everything away form selection */
+ conn.defaultMask=GPM_MOVE & GPM_HARD;
+ conn.minMod=0;
+ conn.maxMod=~0;
+
+ chdir("/");
+
+
+ get_winsize();
+
+ /*....................................... Go to background */
+
+ if (run_status != GPM_RUN_DEBUG) {
+ switch(fork()) {
+ case -1: gpm_report(GPM_PR_OOPS,"fork()"); /* error */
+ case 0: run_status = GPM_RUN_DAEMON; break; /* child */
+ default: _exit(0); /* parent */
+ }
+
+ /* redirect stderr to /dev/console -- avoided now.
+ we should really cleans this more up! */
+ fclose(stdin); fclose(stdout);
+ if (!freopen(GPM_NULL_DEV,"w",stderr)) {
+ gpm_report(GPM_PR_OOPS,"freopen(stderr)");
+ }
+ if (setsid()<0)
+ gpm_report(GPM_PR_OOPS,"setsid()");
+
+ } /*if*/
+
+ /*....................................... Loop */
+
+ while((evflag=Gpm_GetEvent(&ev))!=0)
+ {
+ if (do_resize) {get_winsize(); do_resize--;}
+
+ if (disallocFlag)
+ {
+ struct utmp *uu;
+ struct utmp u;
+ char s[8];
+ int i=0;
+
+ gpm_report(GPM_PR_INFO,"Disallocating %i",disallocFlag);
+ ioctl(fileno(stdin),VT_DISALLOCATE,&i); /* all of them */
+
+ sprintf(s,"tty%i",disallocFlag);
+ setutent();
+ strncpy(u.ut_line, s, sizeof(u.ut_line));
+ if ((uu = getutline(&u)) != 0)
+ {
+ uu->ut_type = DEAD_PROCESS ;
+ pututline(uu);
+ }
+ disallocFlag=0;
+ }
+
+ if (evflag==-1) continue; /* no real event */
+
+ /* get rid of spurious events */
+ if (ev.type&GPM_MOVE) continue;
+
+ vc=ev.vc;
+ gpm_report(GPM_PR_DEBUG,"%s: event on console %i at %i, %i",
+ prgname,ev.vc,ev.x,ev.y);
+
+ if (!recursenow) /* don't open on recursion */
+ {
+ sprintf(s,"/dev/tty%i",ev.vc);
+ if (stat(s,&stbuf)==-1) continue;
+ uid = stbuf.st_uid;
+ gpm_report(GPM_PR_DEBUG,"uid = %i",uid);
+
+ draw=retrievedraw(uid,ev.buttons);
+ if (!draw) continue;
+
+ if (stat(s,&stbuf)==-1 || !(f=fopen(s,"r+"))) /* used to draw */
+ {
+ gpm_report(GPM_PR_ERR, "%s: %s", s, strerror(errno));
+ continue;
+ }
+
+ if ((fd=open(s,O_RDWR))<0) /* will O_RDONLY be enough? */
+ {
+ gpm_report(GPM_PR_ERR, "%s: %s", s, strerror(errno));
+ exit(1);
+ }
+
+ /* now change your connection information and manage the console */
+ Gpm_Open(&conn,-1);
+ uid=stbuf.st_uid;
+ }
+
+ /* the task now is drawing the box from user data */
+ if (!draw)
+ {
+ /* itz Thu Jul 2 00:02:53 PDT 1998 this cannot happen, see
+ continue statement above?!? */
+ gpm_report(GPM_PR_ERR,"NULL menu ptr while drawing");
+ continue;
+ }
+ postmenu(fd,f,draw,ev.x,ev.y,vc);
+
+ while(Gpm_GetEvent(&ev)>0 && ev.vc==vc)
+ {
+ Gpm_FitEvent(&ev);
+ if (ev.type&GPM_DOWN)
+ break; /* we're done */
+ Gpm_DrawPointer(ev.x,ev.y,fd);
+ }
+ gpm_report(GPM_PR_DEBUG,"%i - %i",posty,ev.y);
+
+ /* ok, redraw, close and return waiting */
+ gpm_report(GPM_PR_DEBUG,"Active is %p",activemenu->draw);
+ posty=activemenu->y;
+ postx=activemenu->x;
+ postX=activemenu->X;
+
+ recursenow=0; item=NULL; /* by default */
+ posty=ev.y-posty;
+ if (postx<=ev.x && ev.x<=postX) /* look for it */
+ {
+ for (item=draw->menu; posty-- && item; item=item->next)
+ gpm_report(GPM_PR_DEBUG,"item %s (%p)",item->name, item->fun);
+ if (item && item->fun && item->fun==f_menu)
+ {
+ recursenow++;
+ draw=item->clientdata;
+ continue;
+ }
+ }
+
+ /* unpost them all */
+ while (unpostmenu(fd,f,activemenu,vc))
+ ;
+ close(fd);
+ fclose(f);
+ Gpm_Close();
+ recursenow=0; /* just in case... */
+
+ /* invoke the item */
+ if (item && item->fun)
+ (*(item->fun))(F_INVOKE,item,uid);
+ }
+
+ /*....................................... Done */
+
+ while (Gpm_Close()) ; /* close all the stack */
+ exit(0);
+}
+
+/* developers chat:
+ * author1 (possibly alessandro):
+ "This is because Linus uses 4-wide tabstops, forcing me to use the same
+ default to manage kernel sources"
+ * ian zimmermann (alias itz) on Wed Jul 1 23:28:13 PDT 1998:
+ "I don't mind what anybody's physical tab size is, but when I load it into
+ the editor I don't want any wrapping lines."
+ * nico schottelius (january 2002):
+ "Although Linux document /usr/src/linux/Documentation/CodingStyle is mostly
+ correct, I agree with itz to avoid wrapping lines. Merging 4(alessandro)
+ /2(itz) spaces makes 3 which is the current standard."
+ */
+
+/* Local Variables: */
+/* tab-width:3 */
+/* c-indent-level: 3 */
+/* End: */
Index: prog
===================================================================
--- prog (nonexistent)
+++ prog (revision 5)
Property changes on: prog
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: .
===================================================================
--- . (nonexistent)
+++ . (revision 5)
Property changes on: .
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~