*** empty log message ***
[dana/urxvt.git] / src / rxvt.h
1 #ifndef RXVT_H_                /* include once only */
2 #define RXVT_H_
3
4 #include "rxvtlib.h"
5
6 #include "feature.h"
7
8 #include <limits.h>
9
10 #include <X11/cursorfont.h>
11 #include <X11/keysym.h>
12 #include <X11/keysymdef.h>
13 #include <X11/Xatom.h>
14 #ifndef NO_FRILLS
15 #include <X11/Xmd.h>
16 #endif
17
18 #include "encoding.h"
19 #include "defaultfont.h"
20 #include "rxvtcolor.h"
21 #include "iom.h"
22 #include "salloc.h"
23
24 /*
25  *****************************************************************************
26  * SYSTEM HACKS
27  *****************************************************************************
28  */
29 /* Consistent defines - please report on the necessity
30  * @ Unixware: defines (__svr4__)
31  */
32 #if defined (SVR4) && !defined (__svr4__)
33 # define __svr4__
34 #endif
35 #if defined (sun) && !defined (__sun__)
36 # define __sun__
37 #endif
38
39 #ifndef HAVE_XPOINTER
40 typedef char   *XPointer;
41 #endif
42
43 #ifdef HAVE_TERMIOS_H
44 # include <termios.h>
45 typedef struct termios ttymode_t;
46 #else
47 # include <sgtty.h>
48 typedef struct {
49   struct sgttyb   sg;
50   struct tchars   tc;
51   struct ltchars  lc;
52   int             line;
53   int             local;
54 } ttymode_t;
55 #endif
56
57 #ifdef XPM_BACKGROUND
58 # ifdef XPM_INC_X11
59 #  include <X11/xpm.h>
60 # else
61 #  include <xpm.h>
62 # endif
63 #endif
64
65 #ifndef STDIN_FILENO
66 # define STDIN_FILENO   0
67 # define STDOUT_FILENO  1
68 # define STDERR_FILENO  2
69 #endif
70
71 #if defined(HAVE_GRANTPT) && defined(HAVE_UNLOCKPT)
72 # if defined(PTYS_ARE_GETPT) || defined(PTYS_ARE_PTMX)
73 #  define NO_SETOWNER_TTYDEV
74 # endif
75 #endif
76 #if defined(__CYGWIN32__) || defined(PTYS_ARE_OPENPTY)
77 # define NO_SETOWNER_TTYDEV
78 #endif
79
80 /*
81  *****************************************************************************
82  * STRUCTURES AND TYPEDEFS
83  *****************************************************************************
84  */
85 struct grwin_t;
86
87 /* Sanitize menubar info */
88 #ifndef MENUBAR
89 # undef MENUBAR_MAX
90 #endif
91 #ifndef MENUBAR_MAX
92 # define MENUBAR_MAX    0
93 #endif
94
95 /* If we're using either the rxvt scrollbar or menu bars, keep the
96  * scrollColor resource.
97  */
98 #if defined(RXVT_SCROLLBAR) || defined(MENUBAR)
99 # define KEEP_SCROLLCOLOR 1
100 #else
101 # undef KEEP_SCROLLCOLOR
102 #endif
103
104 #ifdef XPM_BACKGROUND
105 typedef struct {
106   short           w, h, x, y;
107   Pixmap          pixmap;
108 } bgPixmap_t;
109 #endif
110
111 /*
112  * the 'essential' information for reporting Mouse Events
113  * pared down from XButtonEvent
114  */
115 struct mouse_event {
116   int             clicks;
117   Time            time;       /* milliseconds */
118   unsigned int    state;      /* key or button mask */
119   unsigned int    button;     /* detail */
120 };
121
122 #ifndef min
123 # define min(a,b)       (((a) < (b)) ? (a) : (b))
124 # define max(a,b)       (((a) > (b)) ? (a) : (b))
125 #endif
126
127 #define MAX_IT(current, other)  if ((other) > (current)) (current) = (other)
128 #define MIN_IT(current, other)  if ((other) < (current)) (current) = (other)
129 #define SWAP_IT(one, two, typeof)                                       \
130     do {                                                                \
131         typeof          swapittmp;                                      \
132         (swapittmp) = (one); (one) = (two); (two) = (swapittmp);        \
133     } while (/* CONSTCOND */ 0)
134 #define BOUND_POSITIVE_INT16(val)                       \
135     (int16_t) ((val) <= 0                                \
136               ? 0                                       \
137               : min ((val), (((uint16_t)-1)>>1)))
138
139 #ifndef NO_FRILLS
140 typedef struct _mwmhints {
141   CARD32 flags;
142   CARD32 functions;
143   CARD32 decorations;
144   INT32  input_mode;
145   CARD32 status;
146 } MWMHints;
147 #endif
148
149 /*
150  *****************************************************************************
151  * NORMAL DEFINES
152  *****************************************************************************
153  */
154
155 /* COLORTERM, TERM environment variables */
156 #define COLORTERMENV    "rxvt"
157 #ifdef XPM_BACKGROUND
158 # define COLORTERMENVFULL COLORTERMENV "-xpm"
159 #else
160 # define COLORTERMENVFULL COLORTERMENV
161 #endif
162 #ifndef TERMENV
163 # define TERMENV        "rxvt"
164 #endif
165
166 #if defined (NO_MOUSE_REPORT) && !defined (NO_MOUSE_REPORT_SCROLLBAR)
167 # define NO_MOUSE_REPORT_SCROLLBAR
168 #endif
169
170 #ifdef NO_RESOURCES
171 # undef USE_XGETDEFAULT
172 #endif
173
174 /* now look for other badly set stuff */
175
176 #if !defined (EACCESS) && defined(EAGAIN)
177 # define EACCESS EAGAIN
178 #endif
179
180 #ifndef EXIT_SUCCESS            /* missing from <stdlib.h> */
181 # define EXIT_SUCCESS           0       /* exit function success */
182 # define EXIT_FAILURE           1       /* exit function failure */
183 #endif
184
185 #define menuBar_esc             10
186 #define scrollBar_esc           30
187 #define menuBar_margin          2       /* margin below text */
188
189 #if defined(RXVT_SCROLLBAR) || defined(NEXT_SCROLLBAR) || defined(XTERM_SCROLLBAR) || defined(PLAIN_SCROLLBAR)
190 # define HAVE_SCROLLBARS
191 #endif
192
193 /* width of scrollBar, menuBar shadow, must be 1 or 2 */
194 #ifdef HALFSHADOW
195 # define SHADOW 1
196 #else
197 # define SHADOW 2
198 #endif
199
200 #define R_SB_ALIGN_CENTRE       0
201 #define R_SB_ALIGN_TOP          1
202 #define R_SB_ALIGN_BOTTOM       2
203
204 #define R_SB_RXVT               0
205 #define R_SB_NEXT               1
206 #define R_SB_XTERM              2
207 #define R_SB_PLAIN              4
208
209 #define SB_WIDTH_NEXT           19
210 #define SB_WIDTH_XTERM          15
211 #define SB_WIDTH_PLAIN          7
212 #ifndef SB_WIDTH_RXVT
213 # define SB_WIDTH_RXVT          10
214 #endif
215
216 /*
217  * NeXT scrollbar defines
218  */
219 #define SB_PADDING              1
220 #define SB_BORDER_WIDTH         1
221 #define SB_BEVEL_WIDTH_UPPER_LEFT       1
222 #define SB_BEVEL_WIDTH_LOWER_RIGHT      2
223 #define SB_LEFT_PADDING         (SB_PADDING + SB_BORDER_WIDTH)
224 #define SB_MARGIN_SPACE         (SB_PADDING * 2)
225 #define SB_BUTTON_WIDTH         (SB_WIDTH_NEXT - SB_MARGIN_SPACE - SB_BORDER_WIDTH)
226 #define SB_BUTTON_HEIGHT        (SB_BUTTON_WIDTH)
227 #define SB_BUTTON_SINGLE_HEIGHT (SB_BUTTON_HEIGHT + SB_PADDING)
228 #define SB_BUTTON_BOTH_HEIGHT   (SB_BUTTON_SINGLE_HEIGHT * 2)
229 #define SB_BUTTON_TOTAL_HEIGHT  (SB_BUTTON_BOTH_HEIGHT + SB_PADDING)
230 #define SB_BUTTON_BEVEL_X       (SB_LEFT_PADDING)
231 #define SB_BUTTON_FACE_X        (SB_BUTTON_BEVEL_X + SB_BEVEL_WIDTH_UPPER_LEFT)
232 #define SB_THUMB_MIN_HEIGHT     (SB_BUTTON_WIDTH - (SB_PADDING * 2))
233  /*
234   *    +-------------+
235   *    |             | <---< SB_PADDING
236   *    | ::::::::::: |
237   *    | ::::::::::: |
238   *   '''''''''''''''''
239   *   ,,,,,,,,,,,,,,,,,
240   *    | ::::::::::: |
241   *    | ::::::::::: |
242   *    |  +---------------< SB_BEVEL_WIDTH_UPPER_LEFT
243   *    |  | :::::::: |
244   *    |  V :::: vv-------< SB_BEVEL_WIDTH_LOWER_RIGHT
245   *    | +---------+ |
246   *    | | ......%%| |
247   *    | | ......%%| |
248   *    | | .. ()..%%| |
249   *    | | ......%%| |
250   *    | | %%%%%%%%| |
251   *    | +---------+ | <.........................
252   *    |             | <---< SB_PADDING         :
253   *    | +---------+ | <-+..........            :---< SB_BUTTON_TOTAL_HEIGHT
254   *    | | ......%%| |   |         :            :
255   *    | | ../\..%%| |   |---< SB_BUTTON_HEIGHT :
256   *    | | %%%%%%%%| |   |         :            :
257   *    | +---------+ | <-+         :            :
258   *    |             |             :            :
259   *    | +---------+ | <-+         :---< SB_BUTTON_BOTH_HEIGHT
260   *    | | ......%%| |   |         :            :
261   *    | | ..\/..%%| |   |         :            :
262   *    | | %%%%%%%%| |   |---< SB_BUTTON_SINGLE_HEIGHT
263   *    | +---------+ |   |         :            :
264   *    |             |   |         :            :
265   *    +-------------+ <-+.........:............:
266   *    ^^|_________| :
267   *    ||     |      :
268   *    ||     +---< SB_BUTTON_WIDTH
269   *    ||            :
270   *    |+------< SB_PADDING
271   *    |:            :
272   *    +----< SB_BORDER_WIDTH
273   *     :            :
274   *     :............:
275   *           |
276   *           +---< SB_WIDTH_NEXT
277   */
278
279 enum {
280   NO_REFRESH       = 0   ,  /* Window not visible at all!        */
281   FAST_REFRESH     = 1<<0,  /* Fully exposed window              */
282   SLOW_REFRESH     = 1<<1,  /* Partially exposed window          */
283   SMOOTH_REFRESH   = 1<<2,  /* Do sync'ing to make it smooth     */
284 #if 0
285   REFRESH_BOUNDS   = 1<<3
286 #endif
287   REFRESH_BOUNDS   = 0      /* only required for old int_bwidth code. */ //TODO: remove this and all depending code
288 };
289
290 #ifdef NO_SECONDARY_SCREEN
291 # define NSCREENS               0
292 #else
293 # define NSCREENS               1
294 #endif
295
296 #define IGNORE                  0
297 #define SAVE                    's'
298 #define RESTORE                 'r'
299
300 /* special (internal) prefix for font commands */
301 #define FONT_CMD                '#'
302 #define FONT_DN                 "#-"
303 #define FONT_UP                 "#+"
304
305 /* flags for rxvt_scr_gotorc () */
306 enum {
307   C_RELATIVE = 1    ,       /* col movement is relative */
308   R_RELATIVE =     2,       /* row movement is relative */
309   RELATIVE   = 1 | 2,
310 };
311
312 /* modes for rxvt_scr_insdel_chars (), rxvt_scr_insdel_lines () */
313 enum {
314   INSERT = -1,                          /* don't change these values */
315   DELETE = +1,
316   ERASE  = +2,
317 };
318
319 /* modes for rxvt_scr_page () - scroll page. used by scrollbar window */
320 enum page_dirn {
321   UP,
322   DN,
323   NO_DIR,
324 };
325
326 /* arguments for rxvt_scr_change_screen () */
327 enum {
328   PRIMARY = 0,
329   SECONDARY,
330 };
331
332 #define RS_None                 0               /* Normal */
333
334 #define RS_fgMask               0x000001FFu     /* 512 colors */
335 #define RS_bgMask               0x0003FE00u     /* 512 colors */
336 #define RS_Bold                 0x00040000u     /* bold */
337 #define RS_Blink                0x00080000u     /* blink */
338 #define RS_RVid                 0x00100000u     /* reverse video */
339 #define RS_Uline                0x00200000u     /* underline */
340
341 #define RS_fontMask             0xffc00000u     /* plenty(?) of fonts */
342 #define RS_fontShift            22
343
344 #define RS_baseattrMask         (RS_Bold|RS_Blink|RS_RVid|RS_Uline)
345 #define RS_attrMask             (RS_baseattrMask|RS_fontMask)
346
347 #define Sel_none                0       /* Not waiting */
348 #define Sel_normal              0x01    /* normal selection */
349 #define Sel_incr                0x02    /* incremental selection */
350 #define Sel_direct              0x00
351 #define Sel_Primary             0x01
352 #define Sel_Secondary           0x02
353 #define Sel_Clipboard           0x03
354 #define Sel_whereMask           0x0f
355 #define Sel_CompoundText        0x10    /* last request was COMPOUND_TEXT */
356 #define Sel_UTF8String          0x20    /* last request was UTF8_STRING */
357
358 enum {
359   C0_NUL = 0x00,
360           C0_SOH, C0_STX, C0_ETX, C0_EOT, C0_ENQ, C0_ACK, C0_BEL,
361   C0_BS , C0_HT , C0_LF , C0_VT , C0_FF , C0_CR , C0_SO , C0_SI ,
362   C0_DLE, C0_DC1, C0_DC2, D0_DC3, C0_DC4, C0_NAK, C0_SYN, C0_ETB,
363   C0_CAN, C0_EM , C0_SUB, C0_ESC, C0_IS4, C0_IS3, C0_IS2, C0_IS1,
364 }; 
365 #define CHAR_ST                 0x9c    /* 0234 */
366
367 /*
368  * XTerm Operating System Commands: ESC ] Ps;Pt (ST|BEL)
369  * colour extensions by Christian W. Zuckschwerdt <zany@triq.net>
370  */
371 enum {
372   XTerm_name             =  0,
373   XTerm_iconName         =  1,
374   XTerm_title            =  2,
375   XTerm_property         =  3,      // change X property
376   XTerm_Color            =  4,      // change colors
377   XTerm_Color00          = 10,      // not implemented, CLASH!
378   XTerm_Color01          = 11,      // not implemented
379   XTerm_Color_cursor     = 12,      // change actual 'Cursor' color
380   XTerm_Color_pointer_fg = 13,      // change actual 'Pointer' color
381   XTerm_Color_pointer_bg = 14,      // not implemented
382   XTerm_Color05          = 15,      // not implemented
383   XTerm_Color06          = 16,      // not implemented
384   XTerm_Color_RV         = 17,      // change actual 'Highlight' color
385   XTerm_logfile          = 46,      // not implemented
386   XTerm_font             = 50,
387
388   XTerm_konsole30        = 30,      // reserved for konsole
389   XTerm_konsole31        = 31,      // reserved for konsole
390   XTerm_emacs51          = 51,      // reserved for emacs shell
391   /*
392    * rxvt extensions of XTerm OSCs: ESC ] Ps;Pt (ST|BEL)
393    */
394   XTerm_Color_BD         = 18,      // change actual 'Bold' color
395   XTerm_Color_UL         = 19,      // change actual 'Underline' color
396   XTerm_Pixmap           = 20,      // new bg pixmap
397   XTerm_restoreFG        = 39,      // change default fg color
398   XTerm_restoreBG        = 49,      // change default bg color
399   XTerm_dumpscreen       = 55,      // dump scrollback and all of screen
400   XTerm_locale           = 701,     // change locale
401   XTerm_findfont         = 702,     // find font of given character (in decimal)
402   XTerm_Menu             = 703,     // set menu item
403 };
404
405 /* Words starting with `Color_' are colours.  Others are counts */
406 /*
407  * The following comment is mostly obsolete since pixcolor_set was expanded:
408  * We're currently upto 29 colours.  Only 3 more available.  The
409  * PixColor and rendition colour usage should probably be decoupled
410  * on the unnecessary items, e.g. Color_pointer, but won't bother
411  * until we need to.  Also, be aware of usage in pixcolor_set
412  */
413
414 enum colour_list {
415   Color_fg = 0,
416   Color_bg,
417   minCOLOR,                   /* 2 */
418   Color_Black = minCOLOR,
419   Color_Red3,
420   Color_Green3,
421   Color_Yellow3,
422   Color_Blue3,
423   Color_Magenta3,
424   Color_Cyan3,
425   maxCOLOR,                   /* minCOLOR + 7 */
426 #ifndef NO_BRIGHTCOLOR
427   Color_AntiqueWhite = maxCOLOR,
428   minBrightCOLOR,             /* maxCOLOR + 1 */
429   Color_Grey25 = minBrightCOLOR,
430   Color_Red,
431   Color_Green,
432   Color_Yellow,
433   Color_Blue,
434   Color_Magenta,
435   Color_Cyan,
436   maxBrightCOLOR,             /* minBrightCOLOR + 7 */
437   Color_White = maxBrightCOLOR,
438 #else
439   Color_White = maxCOLOR,
440 #endif
441 #ifdef TTY_256COLOR
442   min256COLOR = Color_White + 1,
443   max256COLOR = minCOLOR + 255,
444 #endif
445 #ifndef NO_CURSORCOLOR
446   Color_cursor,
447   Color_cursor2,
448 #endif
449   Color_pointer_fg,
450   Color_pointer_bg,
451   Color_border,
452 #ifndef NO_BOLD_UNDERLINE_REVERSE
453   Color_BD,
454   Color_UL,
455   Color_RV,
456 #endif
457 #ifdef OPTION_HC
458   Color_HC,
459 #endif
460 #ifdef KEEP_SCROLLCOLOR
461   Color_scroll,
462   Color_trough,
463 #endif
464 #if TINTING
465   Color_tint,
466 #endif
467   NRS_COLORS,                 /* */
468 #ifdef KEEP_SCROLLCOLOR
469   Color_topShadow = NRS_COLORS,
470   Color_bottomShadow,
471   TOTAL_COLORS                /* upto 30 */
472 #else
473   TOTAL_COLORS = NRS_COLORS   /* */
474 #endif
475 };
476
477 #define Color_Bits      9
478 #define NPIXCLR_SETS    ((TOTAL_COLORS + 31) / 32)
479 #define NPIXCLR_BITS    32
480
481 #define DEFAULT_RSTYLE  (RS_None | (Color_fg) | (Color_bg<<Color_Bits))
482
483 /*
484  * Resource list
485  */
486 enum {
487   Rs_display_name = 0,
488   Rs_term_name,
489   Rs_iconName,
490   Rs_geometry,
491   Rs_reverseVideo,
492   Rs_color,
493   _Rs_color = Rs_color + NRS_COLORS - 1,
494   Rs_font,
495   Rs_name,
496   Rs_title,
497 #if defined (XPM_BACKGROUND) || (MENUBAR_MAX)
498   Rs_path,
499 #endif
500 #ifdef XPM_BACKGROUND
501   Rs_backgroundPixmap,
502 #endif
503 #if (MENUBAR_MAX)
504   Rs_menu,
505 #endif
506   Rs_loginShell,
507   Rs_jumpScroll,
508 #ifdef HAVE_SCROLLBARS
509   Rs_scrollBar,
510   Rs_scrollBar_right,
511   Rs_scrollBar_floating,
512   Rs_scrollBar_align,
513 #endif
514   Rs_scrollstyle,     /* Rs_scrollBar_style */
515   Rs_scrollTtyOutput,
516   Rs_scrollTtyKeypress,
517   Rs_scrollWithBuffer,
518   Rs_saveLines,
519   Rs_utmpInhibit,
520   Rs_visualBell,
521 #if ! defined(NO_MAPALERT) && defined(MAPALERT_OPTION)
522   Rs_mapAlert,
523 #endif
524 #ifdef META8_OPTION
525   Rs_meta8,
526 #endif
527 #ifdef MOUSE_WHEEL
528   Rs_mouseWheelScrollPage,
529 #endif
530 #ifndef NO_BACKSPACE_KEY
531   Rs_backspace_key,
532 #endif
533 #ifndef NO_DELETE_KEY
534   Rs_delete_key,
535 #endif
536   Rs_selectstyle,
537 #ifdef PRINTPIPE
538   Rs_print_pipe,
539 #endif
540 #ifdef USE_XIM
541   Rs_preeditType,
542   Rs_inputMethod,
543 #endif
544 #ifdef TRANSPARENT
545   Rs_transparent,
546   Rs_transparent_all,
547 #endif
548 #ifndef NO_FRILLS
549   Rs_ext_bwidth,
550   Rs_int_bwidth,
551   Rs_borderLess,
552 #endif
553   Rs_scrollBar_thickness,
554 #ifndef NO_LINESPACE
555   Rs_lineSpace,
556 #endif
557   Rs_cutchars,
558   Rs_modifier,
559   Rs_answerbackstring,
560   Rs_tripleclickwords,
561   Rs_insecure,
562   Rs_cursorBlink,
563   Rs_pointerBlank,
564   Rs_pointerBlankDelay,
565   Rs_imLocale,
566 #ifndef NO_SECONDARY_SCREEN
567   Rs_secondaryScreen,
568   Rs_secondaryScroll,
569 #endif
570 #ifndef NO_BOLD_UNDERLINE_REVERSE
571   Rs_realBold,
572 #endif
573 #ifdef OFF_FOCUS_FADING
574   Rs_fade,
575 #endif
576 #ifdef TINTING
577   Rs_shade,
578 #endif
579   NUM_RESOURCES
580 };
581
582 // see init.C:xa_names, which must be kept in sync
583 enum {
584   XA_TEXT = 0,
585   XA_COMPOUND_TEXT,
586   XA_UTF8_STRING,
587   XA_MULTIPLE,
588   XA_TARGETS,
589   XA_TIMESTAMP,
590   XA_VT_SELECTION,
591   XA_INCR,
592   XA_WMDELETEWINDOW,
593 #ifdef TRANSPARENT
594   XA_XROOTPMAPID,
595   XA_XSETROOTID,
596 #endif
597 #ifdef OFFIX_DND                /* OffiX Dnd (drag 'n' drop) support */
598   XA_DNDPROTOCOL,
599   XA_DNDSELECTION,
600 #endif                          /* OFFIX_DND */
601   XA_CLIPBOARD,
602   NUM_XA
603 };
604
605 /* DEC private modes */
606 #define PrivMode_132            (1LU<<0)
607 #define PrivMode_132OK          (1LU<<1)
608 #define PrivMode_rVideo         (1LU<<2)
609 #define PrivMode_relOrigin      (1LU<<3)
610 #define PrivMode_Screen         (1LU<<4)
611 #define PrivMode_Autowrap       (1LU<<5)
612 #define PrivMode_aplCUR         (1LU<<6)
613 #define PrivMode_aplKP          (1LU<<7)
614 #define PrivMode_HaveBackSpace  (1LU<<8)
615 #define PrivMode_BackSpace      (1LU<<9)
616 #define PrivMode_ShiftKeys      (1LU<<10)
617 #define PrivMode_VisibleCursor  (1LU<<11)
618 #define PrivMode_MouseX10       (1LU<<12)
619 #define PrivMode_MouseX11       (1LU<<13)
620 #define PrivMode_scrollBar      (1LU<<14)
621 #define PrivMode_menuBar        (1LU<<15)
622 #define PrivMode_TtyOutputInh   (1LU<<16)
623 #define PrivMode_Keypress       (1LU<<17)
624 #define PrivMode_smoothScroll   (1LU<<18)
625 #define PrivMode_vt52           (1LU<<19)
626 /* too annoying to implement X11 highlight tracking */
627 /* #define PrivMode_MouseX11Track       (1LU<<20) */
628
629 #define PrivMode_mouse_report   (PrivMode_MouseX10|PrivMode_MouseX11)
630 #define PrivMode(test,bit)              \
631     if (test)                           \
632         PrivateModes |= (bit);          \
633     else                                \
634         PrivateModes &= ~(bit)
635
636 #ifdef ALLOW_132_MODE
637 # define PrivMode_Default (PrivMode_Autowrap|PrivMode_aplKP|PrivMode_ShiftKeys|PrivMode_VisibleCursor|PrivMode_132OK)
638 #else
639 # define PrivMode_Default (PrivMode_Autowrap|PrivMode_aplKP|PrivMode_ShiftKeys|PrivMode_VisibleCursor)
640 #endif
641
642 // do not change these constants lightly, there are many interdependencies
643 #define IMBUFSIZ               128     // input modifier buffer sizes
644 #define KBUFSZ                 512     // size of keyboard mapping buffer
645 #define CBUFSIZ                4096    // size of command buffer
646 #define UBUFSIZ                4096    // character buffer
647
648 #ifndef PATH_MAX
649 # define PATH_MAX 16384
650 #endif
651
652 /* Motif window hints */
653 #define MWM_HINTS_FUNCTIONS     (1L << 0)
654 #define MWM_HINTS_DECORATIONS   (1L << 1)
655 #define MWM_HINTS_INPUT_MODE    (1L << 2)
656 #define MWM_HINTS_STATUS        (1L << 3)
657 /* bit definitions for MwmHints.functions */
658 #define MWM_FUNC_ALL            (1L << 0)
659 #define MWM_FUNC_RESIZE         (1L << 1)
660 #define MWM_FUNC_MOVE           (1L << 2)
661 #define MWM_FUNC_MINIMIZE       (1L << 3)
662 #define MWM_FUNC_MAXIMIZE       (1L << 4)
663 #define MWM_FUNC_CLOSE          (1L << 5)
664 /* bit definitions for MwmHints.decorations */
665 #define MWM_DECOR_ALL           (1L << 0)
666 #define MWM_DECOR_BORDER        (1L << 1)
667 #define MWM_DECOR_RESIZEH       (1L << 2)
668 #define MWM_DECOR_TITLE         (1L << 3)
669 #define MWM_DECOR_MENU          (1L << 4)
670 #define MWM_DECOR_MINIMIZE      (1L << 5)
671 #define MWM_DECOR_MAXIMIZE      (1L << 6)
672 /* bit definitions for MwmHints.inputMode */
673 #define MWM_INPUT_MODELESS                  0
674 #define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1
675 #define MWM_INPUT_SYSTEM_MODAL              2
676 #define MWM_INPUT_FULL_APPLICATION_MODAL    3
677 #define PROP_MWM_HINTS_ELEMENTS             5
678
679 /*
680  *****************************************************************************
681  * MACRO DEFINES
682  *****************************************************************************
683  */
684 #define MEMSET(x, y, z)         memset((x), (y), (size_t)(z))
685 #define MEMCPY(x, y, z)         memcpy((void *)(x), (const void *)(y), (z))
686 #define MEMMOVE(x, y, z)        memmove((void *)(x), (const void *)(y), (z))
687 #define STRCASECMP(x, y)        strcasecmp((x), (y))
688 #define STRNCASECMP(x, y, z)    strncasecmp((x), (y), (z))
689 #define STRCPY(x, y)            strcpy((char *)(x), (const char *)(y))
690 #define STRNCPY(x, y, z)        strncpy((char *)(x), (const char *)(y), (z))
691 #define STRCMP(x, y)            strcmp((const char *)(x), (const char *)(y))
692 #define STRNCMP(x, y, z)        strncmp((const char *)(x), (const char *)(y), (z))
693 #define STRCAT(x, y)            strcat((char *)(x), (const char *)(y))
694 #define STRNCAT(x, y, z)        strncat((char *)(x), (const char *)(y), (z))
695 #define STRDUP(x)               strdup((const char *)(x))
696 #define STRLEN(x)               strlen((const char *)(x))
697 #define STRCHR(x, y)            strchr((const char *)(x), (int)(y))
698 #define STRRCHR(x, y)           strrchr((const char *)(x), (int)(y))
699
700 /* convert pixel dimensions to row/column values.  Everything as int32_t */
701 #define Pixel2Col(x)            Pixel2Width((int32_t)(x))
702 #define Pixel2Row(y)            Pixel2Height((int32_t)(y))
703 #define Pixel2Width(x)          ((int32_t)(x) / (int32_t)TermWin.fwidth)
704 #define Pixel2Height(y)         ((int32_t)(y) / (int32_t)TermWin.fheight)
705 #define Col2Pixel(col)          ((int32_t)Width2Pixel(col))
706 #define Row2Pixel(row)          ((int32_t)Height2Pixel(row))
707 #define Width2Pixel(n)          ((int32_t)(n) * (int32_t)TermWin.fwidth)
708 #define Height2Pixel(n)         ((int32_t)(n) * (int32_t)TermWin.fheight)
709
710 #define TermWin_TotalWidth()    ((int32_t)TermWin.width)
711 #define TermWin_TotalHeight()   ((int32_t)TermWin.height)
712
713 /* how to build & extract colors and attributes */
714 #define GET_BASEFG(x)           (((x) & RS_fgMask))
715 #define GET_BASEBG(x)           (((x) & RS_bgMask)>>Color_Bits)
716 #ifndef NO_BRIGHTCOLOR
717 # define GET_FGCOLOR(x)                                         \
718     ((((x) & RS_Bold) == 0                                      \
719       || GET_BASEFG (x) < minCOLOR                               \
720       || GET_BASEFG (x) >= minBrightCOLOR)                       \
721      ? GET_BASEFG (x)                                            \
722      : (GET_BASEFG (x) + (minBrightCOLOR - minCOLOR)))
723 # define GET_BGCOLOR(x)                                         \
724     ((((x) & RS_Blink) == 0                                     \
725       || GET_BASEBG (x) < minCOLOR                               \
726       || GET_BASEBG (x) >= minBrightCOLOR)                       \
727      ? GET_BASEBG (x)                                            \
728      : (GET_BASEBG (x) + (minBrightCOLOR - minCOLOR)))
729 #else
730 # define GET_FGCOLOR(x)         GET_BASEFG(x)
731 # define GET_BGCOLOR(x)         GET_BASEBG(x)
732 #endif
733
734 #define GET_FONT(x)             (((x) & RS_fontMask) >> RS_fontShift)
735 #define SET_FONT(x,fid)         ((x) & ~RS_fontMask) | ((fid) << RS_fontShift)
736
737 #define GET_ATTR(x)             (((x) & RS_attrMask))
738 #define GET_BGATTR(x)                                                   \
739     (((x) & RS_RVid) ? (((x) & (RS_attrMask & ~RS_RVid))                \
740                         | (((x) & RS_fgMask)<<Color_Bits))              \
741                      : ((x) & (RS_attrMask | RS_bgMask)))
742 #define SET_FGCOLOR(x,fg)       (((x) & ~RS_fgMask)  | (fg))
743 #define SET_BGCOLOR(x,bg)       (((x) & ~RS_bgMask)  | ((bg)<<Color_Bits))
744 #define SET_ATTR(x,a)           (((x) & ~RS_attrMask)| (a))
745
746 #define SET_PIXCOLOR(x)         (pixcolor_set[(x) / NPIXCLR_BITS] |= (1 << ((x) % NPIXCLR_BITS)))
747 #define ISSET_PIXCOLOR(x)       (pixcolor_set[(x) / NPIXCLR_BITS] &  (1 << ((x) % NPIXCLR_BITS)))
748
749 #ifdef HAVE_SCROLLBARS
750 # define scrollbar_TotalWidth() (scrollBar.width + sb_shadow * 2)
751 #else
752 # define scrollbar_TotalWidth() (0)
753 #endif
754 #define scrollbar_isMotion()    (scrollBar.state == 'm')
755 #define scrollbar_isUp()        (scrollBar.state == 'U')
756 #define scrollbar_isDn()        (scrollBar.state == 'D')
757 #define scrollbar_isUpDn()      isupper (scrollBar.state)
758 #define isScrollbarWindow(w)    (scrollBar.state && (w) == scrollBar.win)
759
760 #define scrollbarnext_dnval()   (scrollBar.end + (scrollBar.width + 1))
761 #define scrollbarnext_upButton(y)       ((y) > scrollBar.end \
762                                          && (y) <= scrollbarnext_dnval ())
763 #define scrollbarnext_dnButton(y)       ((y) > scrollbarnext_dnval())
764 #define SCROLLNEXT_MINHEIGHT    SB_THUMB_MIN_HEIGHT
765 #define scrollbarrxvt_upButton(y)       ((y) < scrollBar.beg)
766 #define scrollbarrxvt_dnButton(y)       ((y) > scrollBar.end)
767 #define SCROLLRXVT_MINHEIGHT    10
768 #define SCROLLXTERM_MINHEIGHT   10
769
770 #define scrollbar_minheight()   (scrollBar.style == R_SB_NEXT        \
771                                  ? SCROLLNEXT_MINHEIGHT                 \
772                                  : SCROLLRXVT_MINHEIGHT)
773 #define scrollbar_above_slider(y)       ((y) < scrollBar.top)
774 #define scrollbar_below_slider(y)       ((y) > scrollBar.bot)
775 #define scrollbar_position(y)           ((y) - scrollBar.beg)
776 #define scrollbar_size()                (scrollBar.end - scrollBar.beg \
777                                          - scrollbar_minheight ())
778
779 #if (MENUBAR_MAX > 1)
780 /* rendition style flags */
781 # define menuBar_height()       (TermWin.fheight + SHADOW)
782 # define menuBar_TotalHeight()  (menuBar_height() + SHADOW + menuBar_margin)
783 # define isMenuBarWindow(w)     ((w) == menuBar.win)
784 #else
785 # define menuBar_height()       (0)
786 # define menuBar_TotalHeight()  (0)
787 # define isMenuBarWindow(w)     (0)
788 #endif
789
790 #ifdef XPM_BACKGROUND
791 # define XPMClearArea(a, b, c, d, e, f, g)      XClearArea((a), (b), (c), (d), (e), (f), (g))
792 #else
793 # define XPMClearArea(a, b, c, d, e, f, g)
794 #endif
795
796 #ifndef STRICT_FONT_CHECKING
797 # define rxvt_get_fontwidest(font)      ((font)->max_bounds.width)
798 #endif
799
800 #define rxvt_Gr_ButtonPress(x,y)        rxvt_Gr_ButtonReport (R, 'P',(x),(y))
801 #define rxvt_Gr_ButtonRelease(x,y)      rxvt_Gr_ButtonReport (R, 'R',(x),(y))
802
803 #ifdef UTMP_SUPPORT
804 # if !defined(RXVT_UTMPX_FILE) || !defined(HAVE_STRUCT_UTMPX)
805 #  undef HAVE_UTMPX_H
806 #  undef HAVE_STRUCT_UTMPX
807 # endif
808 # if !defined(RXVT_UTMP_FILE) || !defined(HAVE_STRUCT_UTMP)
809 #  undef HAVE_UTMP_H
810 #  undef HAVE_STRUCT_UTMP
811 # endif
812
813 # ifdef HAVE_UTMPX_H
814 #  include <utmpx.h>
815 # endif
816 # ifdef HAVE_UTMP_H
817 #  include <utmp.h>
818 # endif
819 #endif
820
821 #ifdef DEBUG_CMD
822 # define D_CMD(x)               fprintf x ; fputc('\n', stderr)
823 #else
824 # define D_CMD(x)
825 #endif
826 #ifdef DEBUG_INIT
827 # define D_INIT(x)              fprintf x ; fputc('\n', stderr)
828 #else
829 # define D_INIT(x)
830 #endif
831 #ifdef DEBUG_MAIN
832 # define D_MAIN(x)              fprintf x ; fputc('\n', stderr)
833 #else
834 # define D_MAIN(x)
835 #endif
836 #ifdef DEBUG_SCREEN
837 # define D_SCREEN(x)            fprintf x ; fputc('\n', stderr)
838 #else
839 # define D_SCREEN(x)
840 #endif
841 #ifdef DEBUG_SELECT
842 # define D_SELECT(x)            fprintf x ; fputc('\n', stderr)
843 #else
844 # define D_SELECT(x)
845 #endif
846 #ifdef DEBUG_SIZE
847 # define D_SIZE(x)              fprintf x ; fputc('\n', stderr)
848 #else
849 # define D_SIZE(x)
850 #endif
851 #ifdef DEBUG_X
852 # define D_X(x)                 fprintf x ; fputc('\n', stderr)
853 #else
854 # define D_X(x)
855 #endif
856
857 extern class rxvt_failure_exception { } rxvt_failure_exception;
858
859 typedef callback1<void, const char *> log_callback;
860
861 extern void rxvt_vlog (const char *fmt, va_list arg_ptr);
862 extern void rxvt_log (const char *fmt, ...);
863 extern void rxvt_warn (const char *fmt, ...);
864 extern void rxvt_fatal (const char *fmt, ...) __attribute__ ((noreturn));
865 extern void rxvt_exit_failure () __attribute__ ((noreturn));
866
867 #define SET_LOCALE(locale) rxvt_set_locale (locale)
868 extern bool rxvt_set_locale (const char *locale);
869
870 /*
871  *****************************************************************************
872  * VARIABLES
873  *****************************************************************************
874  */
875 #ifdef MENUBAR
876 # include "menubar.h"
877 #endif
878
879 #define BLINK_INTERVAL 0.5
880 #define TEXT_BLINK_INTERVAL 0.5
881
882 #ifndef __attribute__
883 # ifdef __GNUC__
884 #  if (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || (__GNUC__ < 2)
885 #   define __attribute__(x)
886 #  endif
887 # endif
888 # define __attribute__(x)
889 #endif
890
891 // primivite wrapper around mbstate_t to ensure initialisation
892 struct mbstate {
893   mbstate_t mbs;
894
895   operator mbstate_t *() { return &mbs; }
896   void reset () { MEMSET (&mbs, 0, sizeof (mbs)); }
897   mbstate () { reset (); }
898 };
899
900 #if UNICODE3
901 # define COMPOSE_LO 0x40000000UL
902 # define COMPOSE_HI 0x400fffffUL
903 # define IS_COMPOSE(n) ((int32_t)(n) >= COMPOSE_LO)
904 #else
905 # define COMPOSE_LO 0xd800UL
906 # define COMPOSE_HI 0xf8ffUL // dfff should be safer, but...
907 # define IS_COMPOSE(n) (COMPOSE_LO <= (n) && (n) <= COMPOSE_HI)
908 #endif
909
910 #if ENABLE_COMBINING
911 // compose chars are used to represent composite characters
912 // that are not representable in unicode, as well as characters
913 // not fitting in the BMP.
914 struct compose_char {
915   unicode_t c1, c2; // any chars != NOCHAR are valid
916   compose_char (unicode_t c1, unicode_t c2)
917   : c1(c1), c2(c2)
918   { }
919 };
920
921 class rxvt_composite_vec {
922   vector<compose_char> v;
923 public:
924   text_t compose (unicode_t c1, unicode_t c2 = NOCHAR);
925   int expand (unicode_t c, wchar_t *r);
926   compose_char *operator [](text_t c)
927   {
928     return c >= COMPOSE_LO && c < COMPOSE_LO + v.size ()
929            ? &v[c - COMPOSE_LO]
930            : 0;
931   }
932 };
933
934 extern class rxvt_composite_vec rxvt_composite;
935 #endif
936
937
938 struct rxvt_term : rxvt_vars {
939   log_callback *log_hook;               // log error messages through this hook, if != 0
940
941   struct mbstate  mbstate;              // current input multibyte state
942
943   unsigned char   want_refresh:1,
944 #ifdef TRANSPARENT
945                   want_full_refresh:1,  /* awaiting full screen refresh      */
946 #endif
947 #if defined(XPM_BACKGROUND) || defined(TRANSPARENT)
948                   am_transparent:1,     /* is a transparent term             */
949                   am_pixmap_trans:1,    /* transparency w/known root pixmap  */
950 #endif
951                   current_screen:1,     /* primary or secondary              */
952                   hate_those_clicks:1,  /* a.k.a. keep mark position         */
953                   num_scr_allow:1,
954                   bypass_keystate:1,
955 #ifdef CURSOR_BLINK
956                   hidden_cursor:1,
957 #endif
958 #ifdef TEXT_BLINK
959                   hidden_text:1,
960 #endif
961 #ifdef POINTER_BLANK
962                   hidden_pointer:1,
963 #endif
964 //                  enc_utf8:1,         /* wether terminal reads/writes utf-8 */
965                   parsed_geometry:1;
966
967   unsigned char   refresh_type,
968 #ifdef UTMP_SUPPORT
969                   next_utmp_action,
970 #endif
971 #ifndef NO_SETOWNER_TTYDEV
972                   next_tty_action,
973 #endif
974 #ifdef META8_OPTION
975                   meta_char,            /* Alt-key prefix */
976 #endif
977                   scrollbar_align,
978                   selection_wait,
979                   selection_type;
980 /* ---------- */
981   short           rvideo;
982   int16_t         num_scr;              /* screen: number lines scrolled */
983   unsigned int    prev_ncol,            /* screen: previous number of columns */
984                   prev_nrow;            /* screen: previous number of rows */
985 /* ---------- */
986   rend_t          rstyle;
987 /* ---------- */
988   uint32_t        pixcolor_set[NPIXCLR_SETS];
989 /* ---------- */
990 #ifdef SELECTION_SCROLLING
991   int             scroll_selection_lines;
992   enum page_dirn  scroll_selection_dir;
993   int             selection_save_x,
994                   selection_save_y,
995                   selection_save_state;
996 #endif
997 /* ---------- */
998   int             csrO,       /* Hops - csr offset in thumb/slider to      */
999                               /*   give proper Scroll behaviour            */
1000 #if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
1001                   mouse_slip_wheel_speed,
1002 #endif
1003                   refresh_count,
1004                   refresh_limit,
1005                   last_bot,   /* scrollbar last bottom position            */
1006                   last_top,   /* scrollbar last top position               */
1007                   last_state, /* scrollbar last state                      */
1008                   scrollbar_len,
1009 #ifdef MENUBAR
1010                   menu_readonly,      /* okay to alter menu? */
1011                   Arrows_x,
1012 #endif
1013 #if MENUBAR_MAX > 1
1014                   Nbars,
1015 #endif
1016                   window_vt_x,
1017                   window_vt_y,
1018                   window_sb_x,
1019 # ifdef POINTER_BLANK
1020                   pointerBlankDelay,
1021 # endif
1022                   allowedxerror;
1023 /* ---------- */
1024   unsigned int    ModMetaMask,
1025                   ModNumLockMask,
1026                   old_width,  /* last used width in screen resize          */
1027                   old_height, /* last used height in screen resize         */
1028 #ifndef NO_BRIGHTCOLOR
1029                   colorfgbg,
1030 #endif
1031                   ttymode;
1032   unsigned long   PrivateModes,
1033                   SavedModes;
1034 /* ---------- */
1035   Atom            xa[NUM_XA];
1036 /* ---------- */
1037 #ifdef MENUBAR
1038   GC              menubarGC;
1039 #endif
1040 #if defined(MENUBAR) || defined(RXVT_SCROLLBAR)
1041   GC              scrollbarGC,
1042                   topShadowGC,
1043                   botShadowGC;
1044 #endif
1045 #ifdef XTERM_SCROLLBAR
1046   GC              xscrollbarGC,
1047                   ShadowGC;
1048 #endif
1049 #ifdef PLAIN_SCROLLBAR
1050   GC              pscrollbarGC;
1051 #endif
1052 #ifdef NEXT_SCROLLBAR
1053   GC              blackGC,
1054                   whiteGC,
1055                   grayGC,
1056                   darkGC,
1057                   stippleGC;
1058   Pixmap          dimple,
1059                   upArrow,
1060                   downArrow,
1061                   upArrowHi,
1062                   downArrowHi;
1063 #endif
1064 /* ---------- */
1065   Time            selection_time,
1066                   selection_request_time;
1067   pid_t           cmd_pid;    /* process id of child */
1068   gid_t           ttygid;
1069 #if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__)
1070   uid_t           euid;
1071   gid_t           egid;
1072 #endif
1073 /* ---------- */
1074   Cursor          leftptr_cursor;
1075 #ifdef POINTER_BLANK
1076   Cursor          blank_cursor;
1077 #endif
1078 /* ---------- */
1079   const char     *ttydev;     /* pty/tty name */
1080 #ifndef NO_BACKSPACE_KEY
1081   const char     *key_backspace;
1082 #endif
1083 #ifndef NO_DELETE_KEY
1084   const char     *key_delete;
1085 #endif
1086 #ifdef USE_XIM
1087   rxvt_xim       *input_method;
1088   XIC             Input_Context;
1089   XIMStyle        input_style;
1090   int             event_type;
1091 #endif
1092   struct mouse_event MEvent;
1093   XComposeStatus  compose;
1094   ttymode_t       tio;
1095 #ifdef UTMP_SUPPORT
1096 # ifdef HAVE_STRUCT_UTMP
1097   struct utmp     ut;
1098 # endif
1099 # ifdef HAVE_STRUCT_UTMPX
1100   struct utmpx    utx;
1101 # endif
1102 # if (defined(HAVE_STRUCT_UTMP) && defined(HAVE_UTMP_PID)) || defined(HAVE_STRUCT_UTMPX)
1103   char            ut_id[5];
1104 # endif
1105   int             utmp_pos;
1106 #endif
1107   row_col_t       oldcursor;
1108 #ifdef XPM_BACKGROUND
1109   bgPixmap_t      bgPixmap;
1110   XpmAttributes   xpmAttr;    /* originally loaded pixmap and its scaling */
1111 #endif
1112 #ifndef RESET_TTY_TO_COMMON_DEFAULTS
1113   struct stat     ttyfd_stat; /* original status of our tty */
1114 #endif
1115 #ifdef MENUBAR
1116   menu_t         *ActiveMenu,         /* currently active menu */
1117                  *BuildMenu;          /* the menu currently being built */
1118   bar_t          *CurrentBar;
1119 # if ! (MENUBAR_MAX > 1)
1120   bar_t           BarList;
1121 # endif                         /* (MENUBAR_MAX > 1) */
1122 #endif
1123 #ifdef CURSOR_BLINK
1124   struct timeval  lastcursorchange;
1125 #endif
1126 #ifdef POINTER_BLANK
1127   struct timeval  lastmotion;
1128 #endif
1129
1130   vector<void *> allocated;           // free these memory blocks with free()
1131
1132   char           *env_windowid;       /* environmental variable WINDOWID */
1133   char           *env_display;        /* environmental variable DISPLAY  */
1134   char           *env_term;           /* environmental variable TERM     */
1135   char           *env_colorfgbg;
1136   char           *locale;
1137 #if 0
1138   char           *codeset;
1139 #endif
1140   char            charsets[4];
1141   unsigned char  *v_buffer;           /* pointer to physical buffer */
1142   unsigned int    v_buflen;           /* size of area to write */
1143   stringvec      *argv, *envv;        /* if != 0, will be freed on destroy time */
1144 #ifdef KEYSYM_RESOURCE
1145   const unsigned char *Keysym_map[256];
1146 #endif
1147   const char     *rs[NUM_RESOURCES];
1148   /* command input buffering */
1149   unsigned char  *cmdbuf_ptr, *cmdbuf_endp;
1150   unsigned char   cmdbuf_base[CBUFSIZ];
1151
1152   rxvt_salloc    *talloc;             // text line allocator
1153   rxvt_salloc    *ralloc;             // rend line allocator
1154
1155   static vector<rxvt_term *> termlist; // a vector of all running rxvt_term's
1156
1157   void paste (const unsigned char *data, unsigned int len);
1158
1159   void flush ();
1160
1161   void rootwin_cb (XEvent &xev);
1162   xevent_watcher rootwin_ev;
1163
1164   void x_cb (XEvent &xev);
1165   xevent_watcher termwin_ev;
1166   xevent_watcher vt_ev;
1167 #ifdef HAVE_SCROLLBARS
1168   xevent_watcher scrollbar_ev;
1169 #endif
1170 #ifdef MENUBAR
1171   xevent_watcher menubar_ev;
1172 #endif
1173
1174   void check_cb (check_watcher &w); check_watcher check_ev;
1175   void destroy_cb (time_watcher &w); time_watcher destroy_ev;
1176   void flush_cb (time_watcher &w); time_watcher flush_ev;
1177
1178   void pty_cb (io_watcher &w, short revents); io_watcher pty_ev;
1179
1180   void incr_cb (time_watcher &w); time_watcher incr_ev;
1181
1182 #ifdef CURSOR_BLINK
1183   void cursor_blink_cb (time_watcher &w); time_watcher cursor_blink_ev;
1184 #endif
1185 #ifdef TEXT_BLINK
1186   void text_blink_cb (time_watcher &w); time_watcher text_blink_ev;
1187 #endif
1188
1189 #ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING
1190   void cont_scroll_cb (time_watcher &w); time_watcher cont_scroll_ev;
1191 #endif
1192 #ifdef SELECTION_SCROLLING
1193   void sel_scroll_cb (time_watcher &w); time_watcher sel_scroll_ev;
1194 #endif
1195 #if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
1196   void slip_wheel_cb (time_watcher &w); time_watcher slip_wheel_ev;
1197 #endif
1198
1199 #ifdef POINTER_BLANK
1200   void pointer_cb (time_watcher &w); time_watcher pointer_ev;
1201   void pointer_blank ();
1202 #endif
1203   void pointer_unblank ();
1204
1205   void tt_printf (const char *fmt,...);
1206   void tt_write (const unsigned char *data, unsigned int len);
1207
1208   void tt_winch ();
1209
1210   rxvt_term ();
1211   ~rxvt_term ();
1212   void destroy ();
1213
1214   bool init (int argc, const char *const *argv);
1215   bool init_vars ();
1216
1217   bool pty_fill ();
1218
1219   void *operator new (size_t s);
1220   void operator delete (void *p, size_t s);
1221
1222   void init_secondary ();
1223   const char **init_resources (int argc, const char *const *argv);
1224   void init_env ();
1225   void set_locale (const char *locale);
1226   void init_xlocale ();
1227   void init_command (const char *const *argv);
1228   int run_command (const char *const *argv);
1229   int run_child (const char *const *argv);
1230   static void child_exited (int pid);
1231
1232   void color_aliases (int idx);
1233   void recolour_cursor ();
1234   void create_windows (int argc, const char *const *argv);
1235   void resize_all_windows (unsigned int width, unsigned int height, int ignoreparent);
1236   void window_calc (unsigned int width, unsigned int height);
1237
1238 #if USE_XIM
1239   void im_destroy ();
1240   void im_cb (); im_watcher im_ev;
1241   void im_set_size (XRectangle *size);
1242   void im_set_position (XPoint *pos);
1243   void im_set_color (unsigned long *fg, unsigned long *bg);
1244   void im_set_preedit_area (XRectangle * preedit_rect, XRectangle * status_rect, XRectangle * needed_rect);
1245
1246   bool IMisRunning ();
1247   void IMSendSpot ();
1248   bool IM_get_IC (const char *modifiers);
1249   void IMSetStatusPosition ();
1250 #endif
1251
1252   void resize_scrollbar ();
1253
1254   void pixel_position (int *x, int *y);
1255
1256   void selection_click (int clicks, int x, int y);
1257   void selection_extend (int x, int y, int flag);
1258   void selection_rotate (int x, int y);
1259
1260   /* screen (!) */
1261   void scr_blank_line (text_t *et, rend_t *er, unsigned int width, rend_t efs);
1262   void scr_blank_screen_mem (text_t **tp, rend_t **rp, unsigned int row, rend_t efs);
1263   int scr_scroll_text (int row1, int row2, int count, int spec);
1264   void scr_reset ();
1265   void scr_reset_realloc ();
1266   void scr_release ();
1267   void scr_clear (bool really = false);
1268   void scr_refresh (unsigned char refresh_type);
1269   bool scr_refresh_rend (rend_t mask, rend_t value);
1270   void scr_erase_screen (int mode);
1271   void scr_touch (bool refresh);
1272   void scr_expose (int x, int y, int width, int height, bool refresh);
1273   void scr_remap_chars ();
1274   void scr_remap_chars (text_t *tp, rend_t *rp);
1275
1276   /* autoconvert */
1277
1278   // command.C
1279   void lookup_key (XKeyEvent &ev);
1280   unsigned int cmd_write (const unsigned char *str, unsigned int count);
1281
1282   unicode_t next_char ();
1283   unicode_t cmd_getc ();
1284   unicode_t next_octet ();
1285   unicode_t cmd_get8 ();
1286
1287   bool cmd_parse ();
1288   void mouse_report (XButtonEvent &ev);
1289   void button_press (XButtonEvent &ev);
1290   void button_release (XButtonEvent &ev);
1291   int check_our_parents ();
1292 #ifdef PRINTPIPE
1293   FILE *popen_printer ();
1294   int pclose_printer (FILE *stream);
1295 #endif
1296   void process_print_pipe ();
1297   void process_nonprinting (unicode_t ch);
1298   void process_escape_vt52 (unicode_t ch);
1299   void process_escape_seq ();
1300   void process_csi_seq ();
1301   void process_window_ops (const int *args, unsigned int nargs);
1302   unsigned char *get_to_st (unicode_t &ends_how);
1303   void process_dcs_seq ();
1304   void process_osc_seq ();
1305   void process_color_seq (int report, int color, const char *str, unsigned char resp);
1306   void process_xterm_seq (int op, const char *str, unsigned char resp);
1307   int privcases (int mode, unsigned long bit);
1308   void process_terminal_mode (int mode, int priv, unsigned int nargs, const int *arg);
1309   void process_sgr_mode (unsigned int nargs, const int *arg);
1310   void process_graphics ();
1311   // init.C
1312   void Get_Colours ();
1313   void get_ourmods ();
1314   // logging.C
1315   void makeutent (const char *pty, const char *hostname);
1316   void cleanutent ();
1317   // main.C;
1318   void privileges (int mode);
1319   void privileged_utmp (char action);
1320   void privileged_ttydev (char action);
1321   bool change_font (const char *fontname);
1322   bool font_up_down (int n, int direction);
1323   void set_title (const char *str);
1324   void set_icon_name (const char *str);
1325   void set_window_color (int idx, const char *color);
1326   void set_colorfgbg ();
1327   int rXParseAllocColor (rxvt_color * screen_in_out, const char *colour);
1328   void set_widthheight (unsigned int width, unsigned int height);
1329
1330 #ifdef MENUBAR
1331   // menubar.C
1332   void menuitem_free (menu_t *menu, menuitem_t *item);
1333   int action_dispatch (action_t *action);
1334   void menuarrow_free (char name);
1335   void menuarrow_add (char *string);
1336   char *menu_find_base (menu_t **menu, char *path);
1337   menu_t *menu_delete (menu_t *menu);
1338   menu_t *menu_add (menu_t *parent, char *path);
1339   void drawbox_menubar (int x, int len, int state);
1340   void drawtriangle (int x, int y, int state);
1341   void drawbox_menuitem (int y, int state);
1342   void menu_show ();
1343   void menu_display (void (rxvt_term::*update) ());
1344   void menu_hide_all ();
1345   void menu_hide ();
1346   void menu_clear (menu_t *menu);
1347   void menubar_clear ();
1348   bar_t *menubar_find (const char *name);
1349   int menubar_push (const char *name);
1350   void menubar_remove (const char *name);
1351   void menubar_dump (FILE *fp);
1352   void menubar_read (const char *filename);
1353   void menubar_dispatch (char *str);
1354   void draw_Arrows (int name, int state);
1355   void menubar_expose ();
1356   int menubar_mapping (int map);
1357   int menu_select (XButtonEvent &ev);
1358   void menubar_select (XButtonEvent &ev);
1359   void menubar_control (XButtonEvent &ev);
1360   void map_menuBar (int map);
1361 #endif
1362
1363   // screen.C
1364   void scr_poweron ();
1365   void scr_cursor (int mode);
1366   int scr_change_screen (int scrn);
1367   void scr_color (unsigned int color, int fgbg);
1368   void scr_rendition (int set, int style);
1369   void scr_add_lines (const unicode_t *str, int nlines, int len);
1370   void scr_backspace ();
1371   void scr_tab (int count);
1372   void scr_backindex ();
1373   void scr_forwardindex ();
1374   void scr_gotorc (int row, int col, int relative);
1375   void scr_index (enum page_dirn direction);
1376   void scr_erase_line (int mode);
1377   void scr_E ();
1378   void scr_insdel_lines (int count, int insdel);
1379   void scr_insdel_chars (int count, int insdel);
1380   void scr_scroll_region (int top, int bot);
1381   void scr_cursor_visible (int mode);
1382   void scr_autowrap (int mode);
1383   void scr_relative_origin (int mode);
1384   void scr_insert_mode (int mode);
1385   void scr_set_tab (int mode);
1386   void scr_rvideo_mode (int mode);
1387   void scr_report_position ();
1388   void set_font_style ();
1389   void scr_charset_choose (int set);
1390   void scr_charset_set (int set, unsigned int ch);
1391   int scr_move_to (int y, int len);
1392   int scr_page (enum page_dirn direction, int nlines);
1393   int scr_changeview (uint16_t oldviewstart);
1394   void scr_bell ();
1395   void scr_printscreen (int fullhist);
1396   void scr_reverse_selection ();
1397   void scr_dump (int fd);
1398   void selection_check (int check_more);
1399   int selection_paste (Window win, Atom prop, bool delete_prop);
1400   void selection_property (Window win, Atom prop);
1401   void selection_request (Time tm, int x, int y);
1402   int selection_request_other (Atom target, int selnum);
1403   void selection_clear ();
1404   void selection_make (Time tm);
1405   void selection_start_colrow (int col, int row);
1406   void selection_delimit_word (enum page_dirn dirn, const row_col_t *mark, row_col_t *ret);
1407   void selection_extend_colrow (int32_t col, int32_t row, int button3, int buttonpress, int clickchange);
1408   void selection_remove_trailing_spaces ();
1409   void selection_send (const XSelectionRequestEvent &rq);
1410
1411 #if defined(NEXT_SCROLLBAR)
1412   // scrollbar-next.C
1413   Pixmap renderPixmap (const char *const *data, int width, int height);
1414   void init_scrollbar_stuff ();
1415   void drawBevel (Drawable d, int x1, int y1, int w, int h);
1416   int scrollbar_show_next (int update, int last_top, int last_bot, int scrollbar_len);
1417 #endif
1418
1419 #if defined(RXVT_SCROLLBAR)
1420   // scrollbar-rxvt.C
1421   void Draw_button (int x, int y, int state, int dirn);
1422   int scrollbar_show_rxvt (int update, int last_top, int last_bot, int scrollbar_len);
1423 #endif
1424
1425 #if defined(XTERM_SCROLLBAR)
1426   // scrollbar-xterm.C
1427   int scrollbar_show_xterm (int update, int last_top, int last_bot, int scrollbar_len);
1428 #endif
1429
1430 #if defined(PLAIN_SCROLLBAR)
1431   // scrollbar-plain.C
1432   int scrollbar_show_plain (int update, int last_top, int last_bot, int scrollbar_len);
1433 #endif
1434
1435   // scrollbar.C
1436   int scrollbar_mapping (int map);
1437   int scrollbar_show (int update);
1438   void setup_scrollbar (const char *scrollalign, const char *scrollstyle, const char *thickness);
1439
1440   // xdefaults.C
1441   void get_options (int argc, const char *const *argv);
1442   int parse_keysym (const char *str, const char *arg);
1443   void get_xdefaults (FILE *stream, const char *name);
1444   void extract_resources (Display *display, const char *name);
1445   // xpm.C
1446   int scale_pixmap (const char *geom);
1447   void resize_pixmap ();
1448   Pixmap set_bgPixmap (const char *file);
1449 };
1450
1451 /*
1452  *****************************************************************************
1453  * PROTOTYPES
1454  *****************************************************************************
1455  */
1456 #ifdef PROTOTYPES
1457 # define __PROTO(p)     p
1458 #else
1459 # define __PROTO(p)     ()
1460 #endif
1461 #include "protos.h"
1462
1463 #ifdef DEBUG_malloc
1464 # include "dmalloc.h"           /* This comes last */
1465 #endif
1466
1467 #endif                          /* _RXVT_H_ */
1468