*** empty log message ***
[dana/urxvt.git] / src / rxvtlib.h.in
1 /*
2  * $Id: rxvtlib.h.in,v 1.4 2003-11-27 10:12:10 pcg Exp $
3  */
4
5 #ifndef _RXVTLIB_H_             /* include once only */
6 #define _RXVTLIB_H_
7
8 /*
9  * section 1 generated by GNU autoconf for @build@
10  * this section may be changed as appropriate _before_ building
11  */
12 /*****************************************************************************
13  *                                 SECTION 1                                 *
14  *****************************************************************************/
15
16 /*
17  * The following line MUST not be changed without also changing
18  * config.h in the main directory before building
19  */
20 // none anymore
21
22 /*****************************************************************************
23  *                                 INCLUDES                                  *
24  *****************************************************************************/
25
26 #include <stdio.h>
27 #include <ctype.h>
28 #include <errno.h>
29 @include_stdarg_h@
30 @include_stdlib_h@
31 @include_stdint_h@
32 #include <sys/types.h>
33 @include_unistd_h@
34 @include_string_h@
35 @include_fcntl_h@
36 @include_util_h@
37 @include_assert_h@
38 @include_sys_ioctl_h@
39 @include_sys_time_h@
40 @include_time_h@
41 @include_sys_select_h@
42 @include_sys_strredir_h@
43
44 #include <sys/wait.h>
45 #include <sys/stat.h>
46
47 extern "C" {
48 #include <X11/Intrinsic.h>      /* Xlib, Xutil, Xresource, Xfuncproto */
49 }
50
51 /*
52  * If we haven't pulled in typedef's like  int16_t  then do them ourself
53  * type of (normal and unsigned) basic sizes
54  */
55 @rxvt_int16_typedef@
56 @rxvt_uint16_typedef@
57 @rxvt_int32_typedef@
58 @rxvt_uint32_typedef@
59
60 /* whatever normal size corresponds to a integer pointer */
61 @rxvt_intp_define@
62 /* whatever normal size corresponds to a unsigned integer pointer */
63 @rxvt_u_intp_define@
64
65 /*****************************************************************************
66  *                                 SECTION 2                                 *
67  *                      DO NOT TOUCH ANYTHING BELOW HERE                     *
68  *****************************************************************************/
69
70 struct rxvt_fontset;
71 struct rxvt_color;
72 struct rxvt_vars;               /* defined later on */
73 struct rxvt_term;
74
75 typedef struct rxvt_term *rxvt_t;
76
77 extern rxvt_t rxvt_current_term;
78
79 #define EXPLICIT_CONTEXT 1
80
81 #if EXPLICIT_CONTEXT
82
83 # define pR rxvt_t rxvt_term
84 # define aR rxvt_term
85 # define pR_ pR,
86 # define aR_ aR,
87
88 # define R rxvt_term
89
90 # define SET_R(r) rxvt_current_term = (r)
91 # define GET_R rxvt_current_term
92
93 #else
94
95 # define pR
96 # define pR_
97 # define aR
98 # define aR_
99
100 # define R rxvt_current_term
101
102 # define SET_R(r) rxvt_current_term = (r)
103 # define GET_R R
104
105 #endif
106
107 #define dR rxvt_t rxvt_term = GET_R
108
109 #define scrollbar_visible(rxvtvars)     ((rxvtvars)->scrollBar.state)
110 #define menubar_visible(rxvtvars)       ((rxvtvars)->menuBar.state)
111
112 typedef struct {
113   int32_t         row;
114   int32_t         col;
115 } row_col_t;
116
117 #if UNICODE3
118 typedef uint32_t text_t;
119 #else
120 typedef uint16_t text_t; // saves lots of memory
121 #endif
122 typedef uint32_t rend_t;
123
124 /*
125  * TermWin elements limits
126  *  width     : 1 <= width
127  *  height    : 1 <= height
128  *  ncol      : 1 <= ncol       <= MAX(int16_t)
129  *  nrow      : 1 <= nrow       <= MAX(int16_t)
130  *  saveLines : 0 <= saveLines  <= MAX(int16_t)
131  *  nscrolled : 0 <= nscrolled  <= saveLines
132  *  view_start: 0 <= view_start <= nscrolled
133  */
134
135 typedef struct {
136   uint16_t       width; /* window width                    [pixels] */
137   uint16_t       height;        /* window height                   [pixels] */
138   uint16_t       fwidth;        /* font width                      [pixels] */
139   uint16_t       fheight;       /* font height                     [pixels] */
140   uint16_t       fbase;      /* font ascent (baseline)          [pixels] */
141   uint16_t       propfont;      /* font proportional flags                  */
142   uint16_t       ncol;  /* window columns              [characters] */
143   uint16_t       nrow;  /* window rows                 [characters] */
144   uint16_t       focus; /* window has focus                         */
145   uint16_t       mapped;        /* window state mapped?                     */
146   uint16_t       int_bwidth; /* internal border width                    */
147   uint16_t       ext_bwidth; /* external border width                    */
148   uint16_t       lineSpace;     /* number of extra pixels between rows      */
149   uint16_t       saveLines;     /* number of lines that fit in scrollback   */
150   uint16_t       nscrolled;     /* number of line actually scrolled         */
151   uint16_t       view_start;    /* scrollback view starts here              */
152   Window         parent[6];     /* parent identifiers - we're parent[0]     */
153   Window         vt;            /* vt100 window                             */
154   GC             gc;            /* GC for drawing                           */
155   Pixmap         pixmap;
156   rxvt_fontset  *fontset;
157 } TermWin_t;
158
159 /*
160  * screen accounting:
161  * screen_t elements
162  *   text:      Contains all text information including the scrollback buffer.
163  *              Each line is length TermWin.ncol
164  *   tlen:      The length of the line or -1 for wrapped lines.
165  *   rend:      Contains rendition information: font, bold, colour, etc.
166  * * Note: Each line for both text and rend are only allocated on demand, and
167  *         text[x] is allocated <=> rend[x] is allocated  for all x.
168  *   row:       Cursor row position                   : 0 <= row < TermWin.nrow
169  *   col:       Cursor column position                : 0 <= col < TermWin.ncol
170  *   tscroll:   Scrolling region top row inclusive    : 0 <= row < TermWin.nrow
171  *   bscroll:   Scrolling region bottom row inclusive : 0 <= row < TermWin.nrow
172  *
173  * selection_t elements
174  *   clicks:    1, 2 or 3 clicks - 4 indicates a special condition of 1 where
175  *              nothing is selected
176  *   beg:       row/column of beginning of selection  : never past mark
177  *   mark:      row/column of initial click           : never past end
178  *   end:       row/column of one character past end of selection
179  * * Note: -TermWin.nscrolled <= beg.row <= mark.row <= end.row < TermWin.nrow
180  * * Note: col == -1 ==> we're left of screen
181  *
182  * Layout of text/rend information in the screen_t text/rend structures:
183  *   Rows [0] ... [TermWin.saveLines - 1]
184  *     scrollback region : we're only here if TermWin.view_start != 0
185  *   Rows [TermWin.saveLines] ... [TermWin.saveLines + TermWin.nrow - 1]
186  *     normal `unscrolled' screen region
187  */
188 typedef struct {
189   text_t        **text; /* _all_ the text                            */
190   int16_t        *tlen; /* length of each text line                  */
191   rend_t        **rend; /* rendition, uses RS_ flags                 */
192   row_col_t       cur;  /* cursor position on the screen             */
193   uint16_t        tscroll;      /* top of settable scroll region             */
194   uint16_t        bscroll;      /* bottom of settable scroll region          */
195   uint16_t        charset;      /* character set number [0..3]               */
196   unsigned int    flags;        /* see below                                 */
197   row_col_t       s_cur;        /* saved cursor position                     */
198   uint16_t        s_charset;    /* saved character set number [0..3]         */
199   char            s_charset_char;
200   rend_t          s_rstyle;     /* saved rendition style                     */
201 } screen_t;
202
203 enum selection_op_t {
204   SELECTION_CLEAR = 0,  /* nothing selected                          */
205   SELECTION_INIT,       /* marked a point                            */
206   SELECTION_BEGIN,      /* started a selection                       */
207   SELECTION_CONT,       /* continued selection                       */
208   SELECTION_DONE        /* selection put in CUT_BUFFER0              */
209 };
210
211 typedef struct {
212   unsigned char  *text;       /* selected text                             */
213   uint32_t        len;        /* length of selected text                   */
214   short           screen;     /* screen being used                         */
215   short           clicks;     /* number of clicks                          */
216   selection_op_t  op;         /* current operation                         */
217   row_col_t       beg;        /* beginning of selection   <= mark          */
218   row_col_t       mark;       /* point of initial click   <= end           */
219   row_col_t       end;        /* one character past end point              */
220 } selection_t;
221
222 typedef enum {
223     OLD_SELECT, OLD_WORD_SELECT, NEW_SELECT
224 } sstyle_t;
225
226 /* ------------------------------------------------------------------------- */
227
228 /* screen_t flags */
229 #define Screen_Relative         (1<<0)  /* relative origin mode flag         */
230 #define Screen_VisibleCursor    (1<<1)  /* cursor visible?                   */
231 #define Screen_Autowrap         (1<<2)  /* auto-wrap flag                    */
232 #define Screen_Insert           (1<<3)  /* insert mode (vs. overstrike)      */
233 #define Screen_WrapNext         (1<<4)  /* need to wrap for next char?       */
234 #define Screen_DefaultFlags     (Screen_VisibleCursor|Screen_Autowrap)
235
236 /* rxvt_vars.Options */
237 #define Opt_console             (1LU<<0)
238 #define Opt_loginShell          (1LU<<1)
239 #define Opt_iconic              (1LU<<2)
240 #define Opt_visualBell          (1LU<<3)
241 #define Opt_mapAlert            (1LU<<4)
242 #define Opt_reverseVideo        (1LU<<5)
243 #define Opt_utmpInhibit         (1LU<<6)
244 #define Opt_scrollBar           (1LU<<7)
245 #define Opt_scrollBar_right     (1LU<<8)
246 #define Opt_scrollBar_floating  (1LU<<9)
247 #define Opt_meta8               (1LU<<10)
248 #define Opt_scrollTtyOutput     (1LU<<11)
249 #define Opt_scrollTtyKeypress   (1LU<<12)
250 #define Opt_transparent         (1LU<<13)
251 #define Opt_transparent_all     (1LU<<14)
252 #define Opt_mc_hack             (1LU<<15)
253 #define Opt_tripleclickwords    (1LU<<16)
254 #define Opt_scrollWithBuffer    (1LU<<17)
255 #define Opt_jumpScroll          (1LU<<18)
256 #define Opt_mouseWheelScrollPage (1LU<<19)
257 #define Opt_pointerBlank        (1LU<<20)
258 #define Opt_cursorBlink         (1LU<<21)
259 /* place holder used for parsing command-line options */
260 #define Opt_Reverse             (1LU<<30)
261 #define Opt_Boolean             (1LU<<31)
262
263 #define DEFAULT_OPTIONS         (Opt_scrollBar | Opt_scrollTtyOutput \
264                                  | Opt_jumpScroll)
265
266 /* ------------------------------------------------------------------------- */
267
268 typedef struct {
269   short           state;
270   Window          win;
271 } menuBar_t;
272
273 typedef struct {
274   char            state;        /* scrollbar state                          */
275   char            init;         /* scrollbar has been initialised           */
276   short           beg;          /* slider sub-window begin height           */
277   short           end;          /* slider sub-window end height             */
278   short           top;          /* slider top position                      */
279   short           bot;          /* slider bottom position                   */
280   short           style;        /* style: rxvt, xterm, next                 */
281   short           width;        /* scrollbar width                          */
282   Window          win;
283   int             (*update)(pR_ int, int, int, int);
284 } scrollBar_t;
285
286 struct rxvt_vars {
287   TermWin_t       TermWin;
288   scrollBar_t     scrollBar;
289   menuBar_t       menuBar;
290   Display        *Xdisplay;
291   unsigned long   Options;
292   XSizeHints      szHint;
293   Colormap        Xcmap;
294   rxvt_color     *PixColors;
295   short           numPixColors;
296   Cursor          TermWin_cursor;       /* cursor for vt window */
297   int             Xdepth;
298   int             sb_shadow;    /* scrollbar shadow width                    */
299   int             Xfd;          /* file descriptor of X server connection    */
300   int             cmd_fd;       /* pty file descriptor; connected to command */
301   int             tty_fd;       /* tty file descriptor; connected to child   */
302   int             num_fds;      /* number of file descriptors being used     */
303   int             numlock_state;
304   text_t        **drawn_text;   /* text drawn on screen (characters)         */
305   rend_t        **drawn_rend;   /* text drawn on screen (rendition)          */
306   text_t        **buf_text;
307   rend_t        **buf_rend;
308   char           *tabs;         /* per location: 1 == tab-stop               */
309   screen_t        screen;
310   screen_t        swap;
311   selection_t     selection;
312   sstyle_t        selection_style;
313 };
314
315 void rxvt_init_signals ();
316 rxvt_t rxvt_init (int argc, const char *const *argv);
317
318 #endif                          /* _RXVTLIB_H_ */
319