summaryrefslogtreecommitdiffstats
path: root/window.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--window.h357
1 files changed, 357 insertions, 0 deletions
diff --git a/window.h b/window.h
new file mode 100644
index 0000000..2d7e0f5
--- /dev/null
+++ b/window.h
@@ -0,0 +1,357 @@
+/* Copyright (c) 2010
+ * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net)
+ * Copyright (c) 2008, 2009
+ * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Micah Cowan (micah@cowan.name)
+ * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net)
+ * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007
+ * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * 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 3, 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 (see the file COPYING); if not, see
+ * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+ *
+ ****************************************************************
+ * $Id$ GNU
+ */
+
+#ifndef SCREEN_WINDOW_H
+#define SCREEN_WINDOW_H
+
+/* keep this in sync with the initialisations in window.c */
+struct NewWindow
+{
+ int StartAt; /* where to start the search for the slot */
+ char *aka; /* aka string */
+ char **args; /* argv vector */
+ char *dir; /* directory for chdir */
+ char *term; /* TERM to be set instead of "screen" */
+ int aflag;
+ int dynamicaka;
+ int flowflag;
+ int lflag;
+ int histheight;
+ int monitor;
+ int wlock; /* default writelock setting */
+ int silence;
+ int wrap;
+ int Lflag; /* logging */
+ int slow; /* inter character milliseconds */
+ int gr;
+ int c1;
+ int bce;
+ int encoding;
+ char *hstatus;
+ char *charset;
+ int poll_zombie_timeout;
+};
+
+#ifdef PSEUDOS
+
+struct pseudowin
+{
+ int p_fdpat;
+ int p_pid;
+ int p_ptyfd;
+ struct event p_readev;
+ struct event p_writeev;
+ char p_cmd[MAXSTR];
+ char p_tty[MAXSTR];
+ char p_inbuf[IOSIZE]; /* buffered writing to p_ptyfd */
+ int p_inlen;
+};
+
+/* bits for fdpat: */
+#define F_PMASK 0x0003
+#define F_PSHIFT 2
+#define F_PFRONT 0x0001 /* . */
+#define F_PBACK 0x0002 /* ! */
+#define F_PBOTH (F_PFRONT | F_PBACK) /* : */
+
+#define F_UWP 0x1000 /* | */
+
+/* The screen process ...)
+ * ... wants to write to pseudo */
+#define W_WP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & F_PFRONT))
+
+/* ... wants to write to window: user writes to window
+ * or stdout/stderr of pseudo are duplicated to window */
+#define W_WW(w) (!((w)->w_pwin) || \
+(((w)->w_pwin->p_fdpat & F_PMASK) == F_PBACK) || \
+((((w)->w_pwin->p_fdpat >> F_PSHIFT) & F_PMASK) == F_PBOTH) || \
+((((w)->w_pwin->p_fdpat >> (F_PSHIFT * 2)) & F_PMASK) == F_PBOTH))
+
+/* ... wants to read from pseudowin */
+#define W_RP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & \
+((F_PFRONT << (F_PSHIFT * 2)) | (F_PFRONT << F_PSHIFT)) ))
+
+/* ... wants to read from window */
+#define W_RW(w) (!((w)->w_pwin) || ((w)->w_pwin->p_fdpat & F_PFRONT))
+
+/* user input is written to pseudo */
+#define W_UWP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & F_UWP))
+
+/* pseudo output has to be stuffed in window */
+#define W_PTOW(w) (\
+((w)->w_pwin->p_fdpat & F_PMASK << F_PSHIFT) == F_PBOTH << F_PSHIFT || \
+((w)->w_pwin->p_fdpat & F_PMASK << F_PSHIFT * 2) == F_PBOTH << F_PSHIFT * 2 )
+
+/* window output has to be stuffed in pseudo */
+#define W_WTOP(w) (((w)->w_pwin->p_fdpat & F_PMASK) == F_PBOTH)
+
+#endif /* PSEUDOS */
+
+/* definitions for wlocktype */
+#define WLOCK_OFF 0 /* all in w_userbits can write */
+#define WLOCK_AUTO 1 /* who selects first, can write */
+#define WLOCK_ON 2 /* user writes even if deselected */
+
+
+#ifdef COPY_PASTE
+struct paster
+{
+ char *pa_pastebuf; /* this gets pasted in the window */
+ char *pa_pasteptr; /* pointer in pastebuf */
+ int pa_pastelen; /* bytes left to paste */
+ struct layer *pa_pastelayer; /* layer to paste into */
+ struct event pa_slowev; /* slowpaste event */
+};
+#else
+struct paster;
+#endif
+
+struct win
+{
+ struct win *w_next; /* next window */
+ int w_type; /* type of window */
+ void *w_data;
+ struct layer w_layer; /* our layer */
+ struct layer *w_savelayer; /* the layer to keep */
+ int w_blocked; /* block input */
+#ifdef PSEUDOS
+ struct pseudowin *w_pwin; /* ptr to pseudo */
+#endif
+ struct display *w_pdisplay; /* display for printer relay */
+ struct display *w_lastdisp; /* where the last input was made */
+ int w_number; /* window number */
+ struct event w_readev;
+ struct event w_writeev;
+ struct event w_silenceev; /* silence event */
+ struct event w_zombieev; /* event to try to resurrect window */
+ int w_poll_zombie_timeout;
+ int w_ptyfd; /* fd of the master pty */
+ char w_inbuf[IOSIZE];
+ int w_inlen;
+ char w_outbuf[IOSIZE];
+ int w_outlen;
+ int w_aflag; /* (-a option) */
+ int w_dynamicaka; /* should we change name */
+ char *w_title; /* name of the window */
+ char *w_akachange; /* autoaka hack */
+ char w_akabuf[MAXSTR]; /* aka buffer */
+ int w_autoaka; /* autoaka hack */
+ struct win *w_group; /* window group we belong to */
+ int w_intermediate; /* char used while parsing ESC-seq */
+ int w_args[MAXARGS]; /* emulator args */
+ int w_NumArgs;
+
+#ifdef MULTIUSER
+ int w_wlock; /* WLOCK_AUTO, WLOCK_OFF, WLOCK_ON */
+ struct acluser *w_wlockuser; /* NULL when unlocked or user who writes */
+ AclBits w_userbits[ACL_BITS_PER_WIN];
+ AclBits w_lio_notify; /* whom to tell when lastio+seconds < time() */
+ AclBits w_mon_notify; /* whom to tell monitor statis */
+#endif
+
+ enum state_t w_state; /* parser state */
+ enum string_t w_StringType;
+ struct mline *w_mlines;
+ struct mchar w_rend; /* current rendition */
+#ifdef FONT
+ char w_FontL; /* character font GL */
+ char w_FontR; /* character font GR */
+# ifdef ENCODINGS
+ char w_FontE; /* character font GR locked */
+# endif
+ int w_Charset; /* charset number GL */
+ int w_CharsetR; /* charset number GR */
+ int w_charsets[4]; /* Font = charsets[Charset] */
+#endif
+ int w_ss;
+ struct cursor {
+ int on;
+ int x, y;
+ struct mchar Rend;
+#ifdef FONT
+ int Charset;
+ int CharsetR;
+ int Charsets[4];
+#endif
+ } w_saved;
+ int w_top, w_bot; /* scrollregion */
+ int w_wrap; /* autowrap */
+ int w_origin; /* origin mode */
+ int w_insert; /* window is in insert mode */
+ int w_keypad; /* keypad mode */
+ int w_cursorkeys; /* appl. cursorkeys mode */
+ int w_revvid; /* reverse video */
+ int w_curinv; /* cursor invisible */
+ int w_curvvis; /* cursor very visible */
+ int w_autolf; /* automatic linefeed */
+ char *w_hstatus; /* hardstatus line */
+ int w_gr; /* enable GR flag */
+ int w_c1; /* enable C1 flag */
+ int w_bce; /* enable backcol erase */
+#if 0
+ int w_encoding; /* for input and paste */
+#endif
+ int w_decodestate; /* state of our input decoder */
+#ifdef DW_CHARS
+ int w_mbcs; /* saved char for multibytes charset */
+#endif
+ char w_string[MAXSTR];
+ char *w_stringp;
+ char *w_tabs; /* line with tabs */
+ int w_bell; /* bell status of this window */
+ int w_flow; /* flow flags */
+ struct logfile *w_log; /* log to file */
+ int w_logsilence; /* silence in secs */
+ int w_monitor; /* monitor status */
+ int w_silencewait; /* wait for silencewait secs */
+ int w_silence; /* silence status (Lloyd Zusman) */
+ char w_vbwait;
+ char w_norefresh; /* dont redisplay when switching to that win */
+#ifdef RXVT_OSC
+ char w_xtermosc[5][2560]; /* special xterm/rxvt escapes */
+#endif
+ int w_mouse; /* mouse mode 0,9,1000 */
+ int w_extmouse; /* extended mouse mode 0,1006 */
+#ifdef HAVE_BRAILLE
+ int w_bd_x, w_bd_y; /* Braille cursor position */
+#endif
+
+#ifdef COPY_PASTE
+ int w_slowpaste; /* do careful writes to the window */
+ int w_histheight; /* all histbases are malloced with width * histheight */
+ int w_histidx; /* 0 <= histidx < histheight; where we insert lines */
+ int w_scrollback_height; /* number of lines of output stored, to be updated with w_histidx, w_histheight */
+ struct mline *w_hlines; /* history buffer */
+ struct paster w_paster; /* paste info */
+#else
+ int w_histheight; /* always 0 */
+#endif
+ int w_pid; /* process at the other end of ptyfd */
+ int w_deadpid; /* saved w_pid of a process that closed the ptyfd to us */
+
+ char *w_cmdargs[MAXARGS]; /* command line argument vector */
+ char *w_dir; /* directory for chdir */
+ char *w_term; /* TERM to be set instead of "screen" */
+
+ int w_lflag; /* login flag */
+ slot_t w_slot; /* utmp slot */
+#if defined (UTMPOK)
+ struct utmp w_savut; /* utmp entry of this window */
+#endif
+
+ char w_tty[MAXSTR];
+
+ int w_zauto;
+#ifdef ZMODEM
+ struct display *w_zdisplay;
+#endif
+#ifdef BUILTIN_TELNET
+ struct sockaddr_storage w_telsa;
+ char w_telbuf[IOSIZE];
+ int w_telbufl;
+ char w_telmopts[256];
+ char w_telropts[256];
+ int w_telstate;
+ char w_telsubbuf[128];
+ int w_telsubidx;
+ struct event w_telconnev;
+#endif
+ struct {
+ int on; /* Is the alternate buffer currently being used? */
+ struct mline *mlines;
+ int width;
+ int height;
+#ifdef COPY_PASTE
+ int histheight;
+ struct mline *hlines;
+ int histidx;
+#else
+ int histheight; /* 0 */
+#endif
+ struct cursor cursor;
+ } w_alt;
+
+ struct event w_destroyev; /* window destroy event */
+#ifdef BSDWAIT
+ union wait w_exitstatus; /* window exit status */
+#else
+ int w_exitstatus;
+#endif
+};
+
+
+#define w_encoding w_layer.l_encoding
+#define w_width w_layer.l_width
+#define w_height w_layer.l_height
+#define w_x w_layer.l_x
+#define w_y w_layer.l_y
+
+/* definitions for w_type */
+#define W_TYPE_PTY 0
+#define W_TYPE_PLAIN 1
+#define W_TYPE_TELNET 2
+#define W_TYPE_GROUP 3
+
+
+/*
+ * Definitions for flow
+ * 000 -(-) flow off, auto would be off
+ * 001 +(-) flow on , auto would be off
+ * 010 -(+) flow off, auto would be on
+ * 011 +(+) flow on , auto would be on
+ * 100 - flow auto, currently off
+ * 111 + flow auto, currently on
+ * Application controls auto_flow via TIOCPKT, if available,
+ * else via application keypad mode.
+ */
+#define FLOW_NOW (1<<0)
+#define FLOW_AUTO (1<<1)
+#define FLOW_AUTOFLAG (1<<2)
+
+
+/*
+ * WIN gives us a reference to line y of the *whole* image
+ * where line 0 is the oldest line in our history.
+ * y must be in whole image coordinate system, not in display.
+ */
+
+#define WIN(y) ((y < fore->w_histheight) ? \
+ &fore->w_hlines[(fore->w_histidx + y) % fore->w_histheight] \
+ : &fore->w_mlines[y - fore->w_histheight])
+
+#define Layer2Window(l) ((struct win *)(l)->l_bottom->l_data)
+
+int WindowChangeNumber __P((int, int));
+int OpenDevice __P((char **, int, int *, char **));
+
+#endif /* SCREEN_WINDOW_H */
+