1
0
Fork 0
screen/window.h
Daniel Baumann e88291c4cd
Adding upstream version 4.9.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 15:19:57 +02:00

357 lines
11 KiB
C

/* 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 */