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