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