*** empty log message ***
[dana/urxvt.git] / src / rxvt.h
1 /*
2  * $Id: rxvt.h,v 1.7 2003-11-26 10:42:34 pcg Exp $
3  */
4
5 #ifndef _RXVT_H_                /* include once only */
6 #define _RXVT_H_
7
8 #include "rxvtlib.h"
9
10 #include "feature.h"
11
12 #include <X11/cursorfont.h>
13 #include <X11/keysym.h>
14 #include <X11/keysymdef.h>
15 #include <X11/Xatom.h>
16
17 #include "defaultfont.h"
18 #include "rxvtcolor.h"
19 #include "iom.h"
20
21 /*
22  *****************************************************************************
23  * SYSTEM HACKS
24  *****************************************************************************
25  */
26 /* Consistent defines - please report on the necessity
27  * @ Unixware: defines (__svr4__)
28  */
29 #if defined (SVR4) && !defined (__svr4__)
30 # define __svr4__
31 #endif
32 #if defined (sun) && !defined (__sun__)
33 # define __sun__
34 #endif
35
36
37 #ifndef HAVE_XPOINTER
38 typedef char   *XPointer;
39 #endif
40
41 #ifdef HAVE_TERMIOS_H
42 # include <termios.h>
43 typedef struct termios ttymode_t;
44 #else
45 # include <sgtty.h>
46 typedef struct {
47   struct sgttyb   sg;
48   struct tchars   tc;
49   struct ltchars  lc;
50   int             line;
51   int             local;
52 } ttymode_t;
53 #endif
54
55 #ifdef GREEK_SUPPORT
56 # include "grkelot.h"
57 #endif
58 #ifdef XPM_BACKGROUND
59 # ifdef XPM_INC_X11
60 #  include <X11/xpm.h>
61 # else
62 #  include <xpm.h>
63 # endif
64 #endif
65
66 #ifndef STDIN_FILENO
67 # define STDIN_FILENO   0
68 # define STDOUT_FILENO  1
69 # define STDERR_FILENO  2
70 #endif
71
72 #if defined(HAVE_GRANTPT) && defined(HAVE_UNLOCKPT)
73 # if defined(PTYS_ARE_GETPT) || defined(PTYS_ARE_PTMX)
74 #  define NO_SETOWNER_TTYDEV
75 # endif
76 #endif
77 #if defined(__CYGWIN32__) || defined(PTYS_ARE_OPENPTY)
78 # define NO_SETOWNER_TTYDEV
79 #endif
80
81 /*
82  *****************************************************************************
83  * STRUCTURES AND TYPEDEFS
84  *****************************************************************************
85  */
86 struct grwin_t;
87
88 /* Sanitize menubar info */
89 #ifndef MENUBAR
90 # undef MENUBAR_MAX
91 #endif
92 #ifndef MENUBAR_MAX
93 # define MENUBAR_MAX    0
94 #endif
95
96 /* If we're using either the rxvt scrollbar or menu bars, keep the
97  * scrollColor resource.
98  */
99 #if defined(RXVT_SCROLLBAR) || defined(MENUBAR)
100 # define KEEP_SCROLLCOLOR 1
101 #else
102 # undef KEEP_SCROLLCOLOR
103 #endif
104
105 #ifdef XPM_BACKGROUND
106 typedef struct {
107   short           w, h, x, y;
108   Pixmap          pixmap;
109 } bgPixmap_t;
110 #endif
111
112 /*
113  * the 'essential' information for reporting Mouse Events
114  * pared down from XButtonEvent
115  */
116 struct mouse_event {
117   int             clicks;
118   Time            time;       /* milliseconds */
119   unsigned int    state;      /* key or button mask */
120   unsigned int    button;     /* detail */
121 };
122
123 #ifndef min
124 # define min(a,b)       (((a) < (b)) ? (a) : (b))
125 # define max(a,b)       (((a) > (b)) ? (a) : (b))
126 #endif
127
128 #define MAX_IT(current, other)  if ((other) > (current)) (current) = (other)
129 #define MIN_IT(current, other)  if ((other) < (current)) (current) = (other)
130 #define SWAP_IT(one, two, typeof)                                       \
131     do {                                                                \
132         typeof          swapittmp;                                      \
133         (swapittmp) = (one); (one) = (two); (two) = (swapittmp);        \
134     } while (/* CONSTCOND */ 0)
135 #define BOUND_POSITIVE_INT16(val)                       \
136     (int16_t)((val) <= 0                                \
137               ? 0                                       \
138               : min((val), (((uint16_t)-1)>>1)))
139
140 /*
141  *****************************************************************************
142  * NORMAL DEFINES
143  *****************************************************************************
144  */
145
146 #if defined (NO_OLD_SELECTION) && defined(NO_NEW_SELECTION)
147 # error if you disable both selection styles, how can you select, silly?
148 #endif
149
150 #define APL_CLASS       "XTerm" /* class name */
151 #define APL_SUBCLASS    "Rxvt"  /* also check resources under this name */
152 #define APL_NAME        "rxvt"  /* normal name */
153
154 /* COLORTERM, TERM environment variables */
155 #define COLORTERMENV    "rxvt"
156 #ifdef XPM_BACKGROUND
157 # define COLORTERMENVFULL COLORTERMENV "-xpm"
158 #else
159 # define COLORTERMENVFULL COLORTERMENV
160 #endif
161 #ifndef TERMENV
162 # define TERMENV        "xterm"
163 #endif
164
165 #if defined (NO_MOUSE_REPORT) && !defined (NO_MOUSE_REPORT_SCROLLBAR)
166 # define NO_MOUSE_REPORT_SCROLLBAR
167 #endif
168
169 #ifdef NO_RESOURCES
170 # undef USE_XGETDEFAULT
171 #endif
172
173 /* now look for other badly set stuff */
174
175 #if !defined (EACCESS) && defined(EAGAIN)
176 # define EACCESS EAGAIN
177 #endif
178
179 #ifndef EXIT_SUCCESS            /* missing from <stdlib.h> */
180 # define EXIT_SUCCESS           0       /* exit function success */
181 # define EXIT_FAILURE           1       /* exit function failure */
182 #endif
183
184 #define menuBar_esc             10
185 #define scrollBar_esc           30
186 #define menuBar_margin          2       /* margin below text */
187
188 #if defined(RXVT_SCROLLBAR) || defined(NEXT_SCROLLBAR) || defined(XTERM_SCROLLBAR)
189 # define HAVE_SCROLLBARS
190 #endif
191
192 /* width of scrollBar, menuBar shadow, must be 1 or 2 */
193 #ifdef HALFSHADOW
194 # define SHADOW 1
195 #else
196 # define SHADOW 2
197 #endif
198
199 #define R_SB_ALIGN_CENTRE       0
200 #define R_SB_ALIGN_TOP          1
201 #define R_SB_ALIGN_BOTTOM       2
202
203 #define R_SB_RXVT               0
204 #define R_SB_NEXT               1
205 #define R_SB_XTERM              2
206
207 #define SB_WIDTH_NEXT           19
208 #define SB_WIDTH_XTERM          7
209 #ifndef SB_WIDTH_RXVT
210 # define SB_WIDTH_RXVT          10
211 #endif
212
213 /*
214  * NeXT scrollbar defines
215  */
216 #define SB_PADDING              1
217 #define SB_BORDER_WIDTH         1
218 #define SB_BEVEL_WIDTH_UPPER_LEFT       1
219 #define SB_BEVEL_WIDTH_LOWER_RIGHT      2
220 #define SB_LEFT_PADDING         (SB_PADDING + SB_BORDER_WIDTH)
221 #define SB_MARGIN_SPACE         (SB_PADDING * 2)
222 #define SB_BUTTON_WIDTH         (SB_WIDTH_NEXT - SB_MARGIN_SPACE - SB_BORDER_WIDTH)
223 #define SB_BUTTON_HEIGHT        (SB_BUTTON_WIDTH)
224 #define SB_BUTTON_SINGLE_HEIGHT (SB_BUTTON_HEIGHT + SB_PADDING)
225 #define SB_BUTTON_BOTH_HEIGHT   (SB_BUTTON_SINGLE_HEIGHT * 2)
226 #define SB_BUTTON_TOTAL_HEIGHT  (SB_BUTTON_BOTH_HEIGHT + SB_PADDING)
227 #define SB_BUTTON_BEVEL_X       (SB_LEFT_PADDING)
228 #define SB_BUTTON_FACE_X        (SB_BUTTON_BEVEL_X + SB_BEVEL_WIDTH_UPPER_LEFT)
229 #define SB_THUMB_MIN_HEIGHT     (SB_BUTTON_WIDTH - (SB_PADDING * 2))
230  /*
231   *    +-------------+
232   *    |             | <---< SB_PADDING
233   *    | ::::::::::: |
234   *    | ::::::::::: |
235   *   '''''''''''''''''
236   *   ,,,,,,,,,,,,,,,,,
237   *    | ::::::::::: |
238   *    | ::::::::::: |
239   *    |  +---------------< SB_BEVEL_WIDTH_UPPER_LEFT
240   *    |  | :::::::: |
241   *    |  V :::: vv-------< SB_BEVEL_WIDTH_LOWER_RIGHT
242   *    | +---------+ |
243   *    | | ......%%| |
244   *    | | ......%%| |
245   *    | | ..()..%%| |
246   *    | | ......%%| |
247   *    | | %%%%%%%%| |
248   *    | +---------+ | <.........................
249   *    |             | <---< SB_PADDING         :
250   *    | +---------+ | <-+..........            :---< SB_BUTTON_TOTAL_HEIGHT
251   *    | | ......%%| |   |         :            :
252   *    | | ../\..%%| |   |---< SB_BUTTON_HEIGHT :
253   *    | | %%%%%%%%| |   |         :            :
254   *    | +---------+ | <-+         :            :
255   *    |             |             :            :
256   *    | +---------+ | <-+         :---< SB_BUTTON_BOTH_HEIGHT
257   *    | | ......%%| |   |         :            :
258   *    | | ..\/..%%| |   |         :            :
259   *    | | %%%%%%%%| |   |---< SB_BUTTON_SINGLE_HEIGHT
260   *    | +---------+ |   |         :            :
261   *    |             |   |         :            :
262   *    +-------------+ <-+.........:............:
263   *    ^^|_________| :
264   *    ||     |      :
265   *    ||     +---< SB_BUTTON_WIDTH
266   *    ||            :
267   *    |+------< SB_PADDING
268   *    |:            :
269   *    +----< SB_BORDER_WIDTH
270   *     :            :
271   *     :............:
272   *           |
273   *           +---< SB_WIDTH_NEXT
274   */
275
276 #define NO_REFRESH              0       /* Window not visible at all!        */
277 #define FAST_REFRESH            (1<<0)  /* Fully exposed window              */
278 #define SLOW_REFRESH            (1<<1)  /* Partially exposed window          */
279 #define SMOOTH_REFRESH          (1<<2)  /* Do sync'ing to make it smooth     */
280 #define REFRESH_BOUNDS          (1<<3)
281
282 #ifdef NO_SECONDARY_SCREEN
283 # define NSCREENS               0
284 #else
285 # define NSCREENS               1
286 #endif
287
288 #define IGNORE                  0
289 #define SAVE                    's'
290 #define RESTORE                 'r'
291
292 /* special (internal) prefix for font commands */
293 #define FONT_CMD                '#'
294 #define FONT_DN                 "#-"
295 #define FONT_UP                 "#+"
296
297 /* flags for rxvt_scr_gotorc() */
298 #define C_RELATIVE              1       /* col movement is relative */
299 #define R_RELATIVE              2       /* row movement is relative */
300 #define RELATIVE                (R_RELATIVE|C_RELATIVE)
301
302 /* modes for rxvt_scr_insdel_chars(), rxvt_scr_insdel_lines() */
303 #define INSERT                  -1      /* don't change these values */
304 #define DELETE                  +1
305 #define ERASE                   +2
306
307 /* modes for rxvt_scr_page() - scroll page. used by scrollbar window */
308 enum page_dirn {
309   UP,
310   DN,
311   NO_DIR
312 };
313
314 /* arguments for rxvt_scr_change_screen() */
315 enum {
316   PRIMARY = 0,
317   SECONDARY
318 };
319
320 enum {
321   SBYTE = 0,
322   WBYTE
323 };
324
325
326 #define RS_None                 0       /* Normal */
327
328 #define RS_fgMask               0x000001FFu     /* 512 colors */
329 #define RS_bgMask               0x0003FE00u     /* 512 colors */
330 #define RS_Bold                 0x00040000u     /* bold */
331 #define RS_Blink                0x00080000u     /* blink */
332 #define RS_RVid                 0x00100000u     /* reverse video */
333 #define RS_Uline                0x00200000u     /* underline */
334
335 #define RS_wide                 0x00400000u     /* only multibyte characters */
336 #define IS_WIDE(r)              ((r) & RS_wide)
337
338 #define RS_fontMask             0xff000000u     /* plenty(?) of fonts */
339 #define RS_fontShift            24
340
341 #define RS_baseattrMask         (RS_Bold|RS_Blink|RS_RVid|RS_Uline)
342 #define RS_attrMask             (RS_baseattrMask|RS_fontMask|RS_wide)
343
344 #define Sel_none                0       /* Not waiting */
345 #define Sel_normal              0x01    /* normal selection */
346 #define Sel_incr                0x02    /* incremental selection */
347 #define Sel_direct              0x00
348 #define Sel_Primary             0x01
349 #define Sel_Secondary           0x02
350 #define Sel_Clipboard           0x03
351 #define Sel_whereMask           0x0f
352 #define Sel_CompoundText        0x10    /* last request was Compound */
353
354 enum {
355   C0_NUL = 0x00,
356           C0_SOH, C0_STX, C0_ETX, C0_EOT, C0_ENQ, C0_ACK, C0_BEL,
357   C0_BS , C0_HT , C0_LF , C0_VT , C0_FF , C0_CR , C0_SO , C0_SI ,
358   C0_DLE, C0_DC1, C0_DC2, D0_DC3, C0_DC4, C0_NAK, C0_SYN, C0_ETB,
359   C0_CAN, C0_EM , C0_SUB, C0_ESC, C0_IS4, C0_IS3, C0_IS2, C0_IS1
360 }; 
361 #define CHAR_ST                 0x9c    /* 0234 */
362
363 /*
364  * XTerm Operating System Commands: ESC ] Ps;Pt (ST|BEL)
365  * colour extensions by Christian W. Zuckschwerdt <zany@triq.net>
366  */
367 #define XTerm_name              0
368 #define XTerm_iconName          1
369 #define XTerm_title             2
370 #define XTerm_Color             4       /* change colors */
371 #define XTerm_Color_cursor      12      /* change actual 'Cursor' color */
372 #define XTerm_Color_pointer     13      /* change actual 'Pointer' color */
373 #define XTerm_Color_RV          17      /* change actual 'Highlight' color */
374 #define XTerm_Color_BD          18      /* change actual 'Bold' color */
375 #define XTerm_Color_UL          19      /* change actual 'Underline' color */
376 #define XTerm_logfile           46      /* not implemented */
377 #define XTerm_font              50
378
379 /*
380  * rxvt extensions of XTerm OSCs: ESC ] Ps;Pt (ST|BEL)
381  */
382 #define XTerm_Menu              10      /* set menu item */
383 #define XTerm_Pixmap            20      /* new bg pixmap */
384 #define XTerm_restoreFG         39      /* change default fg color */
385 #define XTerm_restoreBG         49      /* change default bg color */
386 #define XTerm_dumpscreen        55      /* dump scrollback and all of screen */
387
388 /* Words starting with `Color_' are colours.  Others are counts */
389 /*
390  * The following comment is mostly obsolete since pixcolor_set was expanded:
391  * We're currently upto 29 colours.  Only 3 more available.  The
392  * PixColor and rendition colour usage should probably be decoupled
393  * on the unnecessary items, e.g. Color_pointer, but won't bother
394  * until we need to.  Also, be aware of usage in pixcolor_set
395  */
396
397 enum colour_list {
398   Color_fg = 0,
399   Color_bg,
400   minCOLOR,                   /* 2 */
401   Color_Black = minCOLOR,
402   Color_Red3,
403   Color_Green3,
404   Color_Yellow3,
405   Color_Blue3,
406   Color_Magenta3,
407   Color_Cyan3,
408   maxCOLOR,                   /* minCOLOR + 7 */
409 #ifndef NO_BRIGHTCOLOR
410   Color_AntiqueWhite = maxCOLOR,
411   minBrightCOLOR,             /* maxCOLOR + 1 */
412   Color_Grey25 = minBrightCOLOR,
413   Color_Red,
414   Color_Green,
415   Color_Yellow,
416   Color_Blue,
417   Color_Magenta,
418   Color_Cyan,
419   maxBrightCOLOR,             /* minBrightCOLOR + 7 */
420   Color_White = maxBrightCOLOR,
421 #else
422   Color_White = maxCOLOR,
423 #endif
424 #ifdef TTY_256COLOR
425   min256COLOR = Color_White + 1,
426   max256COLOR = minCOLOR + 255,
427 #endif
428 #ifndef NO_CURSORCOLOR
429   Color_cursor,
430   Color_cursor2,
431 #endif
432   Color_pointer,
433   Color_border,
434 #ifndef NO_BOLD_UNDERLINE_REVERSE
435   Color_BD,
436   Color_UL,
437   Color_RV,
438 #endif
439 #ifdef OPTION_HC
440   Color_HC,
441 #endif
442 #ifdef KEEP_SCROLLCOLOR
443   Color_scroll,
444   Color_trough,
445 #endif
446   NRS_COLORS,                 /* */
447 #ifdef KEEP_SCROLLCOLOR
448   Color_topShadow = NRS_COLORS,
449   Color_bottomShadow,
450   TOTAL_COLORS                /* upto 30 */
451 #else
452   TOTAL_COLORS = NRS_COLORS   /* */
453 #endif
454 };
455
456 #define Color_Bits      9
457 #define NPIXCLR_SETS    9       /* (256 + 14) bits / 32 bits */
458 #define NPIXCLR_BITS    32
459
460 #define DEFAULT_RSTYLE          (RS_None | (Color_fg) | (Color_bg<<Color_Bits))
461
462 /*
463  * Resource list
464  */
465 enum {
466   Rs_display_name = 0,
467   Rs_term_name,
468   Rs_iconName,
469   Rs_geometry,
470   Rs_reverseVideo,
471   Rs_color,
472   _Rs_color = Rs_color + NRS_COLORS - 1,
473   Rs_font,
474   Rs_name,
475   Rs_title,
476 #if defined (XPM_BACKGROUND) || (MENUBAR_MAX)
477   Rs_path,
478 #endif
479 #ifdef XPM_BACKGROUND
480   Rs_backgroundPixmap,
481 #endif
482 #if (MENUBAR_MAX)
483   Rs_menu,
484 #endif
485 #ifndef NO_BOLDFONT
486   Rs_boldFont,
487 #endif
488 #ifdef GREEK_SUPPORT
489   Rs_greek_keyboard,
490   Rs_greektoggle_key,
491 #endif
492   Rs_loginShell,
493   Rs_jumpScroll,
494 #ifdef HAVE_SCROLLBARS
495   Rs_scrollBar,
496   Rs_scrollBar_right,
497   Rs_scrollBar_floating,
498   Rs_scrollBar_align,
499 #endif
500   Rs_scrollstyle,     /* Rs_scrollBar_style */
501   Rs_scrollTtyOutput,
502   Rs_scrollTtyKeypress,
503   Rs_scrollWithBuffer,
504   Rs_saveLines,
505   Rs_utmpInhibit,
506   Rs_visualBell,
507 #if ! defined(NO_MAPALERT) && defined(MAPALERT_OPTION)
508   Rs_mapAlert,
509 #endif
510 #ifdef META8_OPTION
511   Rs_meta8,
512 #endif
513 #ifdef MOUSE_WHEEL
514   Rs_mouseWheelScrollPage,
515 #endif
516 #ifndef NO_BACKSPACE_KEY
517   Rs_backspace_key,
518 #endif
519 #ifndef NO_DELETE_KEY
520   Rs_delete_key,
521 #endif
522   Rs_selectstyle,
523 #ifdef PRINTPIPE
524   Rs_print_pipe,
525 #endif
526 #ifdef USE_XIM
527   Rs_preeditType,
528   Rs_inputMethod,
529 #endif
530 #if defined (HOTKEY_CTRL) || defined (HOTKEY_META)
531   Rs_bigfont_key,
532   Rs_smallfont_key,
533 #endif
534 #ifdef TRANSPARENT
535   Rs_transparent,
536   Rs_transparent_all,
537 #endif
538 #ifndef NO_FRILLS
539   Rs_ext_bwidth,
540   Rs_int_bwidth,
541 #endif
542   Rs_scrollBar_thickness,
543 #ifndef NO_LINESPACE
544   Rs_lineSpace,
545 #endif
546   Rs_cutchars,
547 #ifdef ACS_ASCII
548   Rs_acs_chars,
549 #endif
550   Rs_modifier,
551   Rs_answerbackstring,
552   Rs_tripleclickwords,
553   Rs_cursorBlink,
554   Rs_pointerBlank,
555   Rs_pointerBlankDelay,
556   NUM_RESOURCES
557 };
558
559 enum {
560   TIMEOUT_INCR = 0,
561   NUM_TIMEOUTS
562 };
563
564 enum {
565   XA_COMPOUND_TEXT = 0,
566   XA_MULTIPLE,
567   XA_TARGETS,
568   XA_TEXT,
569   XA_TIMESTAMP,
570   XA_VT_SELECTION,
571   XA_INCR,
572   XA_WMDELETEWINDOW,
573 #ifdef TRANSPARENT
574   XA_XROOTPMAPID,
575 #endif
576 #ifdef OFFIX_DND                /* OffiX Dnd (drag 'n' drop) support */
577   XA_DNDPROTOCOL,
578   XA_DNDSELECTION,
579 #endif                          /* OFFIX_DND */
580   XA_CLIPBOARD,
581   NUM_XA
582 };
583
584 /*
585  * number of graphics points
586  * divisible by 2 (num lines)
587  * divisible by 4 (num rect)
588  */
589 #define NGRX_PTS        1000
590
591 /* DEC private modes */
592 #define PrivMode_132            (1LU<<0)
593 #define PrivMode_132OK          (1LU<<1)
594 #define PrivMode_rVideo         (1LU<<2)
595 #define PrivMode_relOrigin      (1LU<<3)
596 #define PrivMode_Screen         (1LU<<4)
597 #define PrivMode_Autowrap       (1LU<<5)
598 #define PrivMode_aplCUR         (1LU<<6)
599 #define PrivMode_aplKP          (1LU<<7)
600 #define PrivMode_HaveBackSpace  (1LU<<8)
601 #define PrivMode_BackSpace      (1LU<<9)
602 #define PrivMode_ShiftKeys      (1LU<<10)
603 #define PrivMode_VisibleCursor  (1LU<<11)
604 #define PrivMode_MouseX10       (1LU<<12)
605 #define PrivMode_MouseX11       (1LU<<13)
606 #define PrivMode_scrollBar      (1LU<<14)
607 #define PrivMode_menuBar        (1LU<<15)
608 #define PrivMode_TtyOutputInh   (1LU<<16)
609 #define PrivMode_Keypress       (1LU<<17)
610 #define PrivMode_smoothScroll   (1LU<<18)
611 #define PrivMode_vt52           (1LU<<19)
612 /* too annoying to implement X11 highlight tracking */
613 /* #define PrivMode_MouseX11Track       (1LU<<18) */
614
615 #define PrivMode_mouse_report   (PrivMode_MouseX10|PrivMode_MouseX11)
616 #define PrivMode(test,bit)              \
617     if (test)                           \
618         R->PrivateModes |= (bit);       \
619     else                                \
620         R->PrivateModes &= ~(bit)
621
622 #ifdef ALLOW_132_MODE
623 # define PrivMode_Default                                                \
624 (PrivMode_Autowrap|PrivMode_aplKP|PrivMode_ShiftKeys|PrivMode_VisibleCursor|PrivMode_132OK)
625 #else
626 # define PrivMode_Default                                                \
627 (PrivMode_Autowrap|PrivMode_aplKP|PrivMode_ShiftKeys|PrivMode_VisibleCursor)
628 #endif
629
630 #ifdef PREFER_24BIT
631 # define XDEPTH                 R->Xdepth
632 # define XCMAP                  R->Xcmap
633 # define XVISUAL                R->Xvisual
634 #else
635 # ifdef DEBUG_DEPTH
636 #  define XDEPTH                DEBUG_DEPTH
637 # else
638 #  define XDEPTH                DefaultDepth(R->Xdisplay,Xscreen)
639 #  define XCMAP                 DefaultColormap(R->Xdisplay,Xscreen)
640 #  define XVISUAL               DefaultVisual(R->Xdisplay,Xscreen)
641 # endif
642 #endif
643 #define IMBUFSIZ                128     /* input modifier buffer sizes */
644 #ifndef BUFSIZ
645 # define BUFSIZ                 4096
646 #endif
647 #define KBUFSZ                  512     /* size of keyboard mapping buffer */
648
649 /*
650  *****************************************************************************
651  * MACRO DEFINES
652  *****************************************************************************
653  */
654 #define MEMSET(x, y, z)         memset((x), (y), (size_t)(z))
655 #define MEMCPY(x, y, z)         memcpy((void *)(x), (const void *)(y), (z))
656 #define MEMMOVE(x, y, z)        memmove((void *)(x), (const void *)(y), (z))
657 #define STRCASECMP(x, y)        strcasecmp((x), (y))
658 #define STRNCASECMP(x, y, z)    strncasecmp((x), (y), (z))
659 #define STRCPY(x, y)            strcpy((char *)(x), (const char *)(y))
660 #define STRNCPY(x, y, z)        strncpy((char *)(x), (const char *)(y), (z))
661 #define STRCMP(x, y)            strcmp((const char *)(x), (const char *)(y))
662 #define STRNCMP(x, y, z)        strncmp((const char *)(x), (const char *)(y), (z))
663 #define STRCAT(x, y)            strcat((char *)(x), (const char *)(y))
664 #define STRNCAT(x, y, z)        strncat((char *)(x), (const char *)(y), (z))
665 #define STRDUP(x)               strdup((const char *)(x))
666 #define STRLEN(x)               strlen((const char *)(x))
667 #define STRCHR(x, y)            strchr((const char *)(x), (int)(y))
668 #define STRRCHR(x, y)           strrchr((const char *)(x), (int)(y))
669
670 /* convert pixel dimensions to row/column values.  Everything as int32_t */
671 #define Pixel2Col(x)            Pixel2Width((int32_t)(x) - (int32_t)R->TermWin.int_bwidth)
672 #define Pixel2Row(y)            Pixel2Height((int32_t)(y) - (int32_t)R->TermWin.int_bwidth)
673 #define Pixel2Width(x)          ((int32_t)(x) / (int32_t)R->TermWin.fwidth)
674 #define Pixel2Height(y)         ((int32_t)(y) / (int32_t)R->TermWin.fheight)
675 #define Col2Pixel(col)          ((int32_t)Width2Pixel(col) + (int32_t)R->TermWin.int_bwidth)
676 #define Row2Pixel(row)          ((int32_t)Height2Pixel(row) + (int32_t)R->TermWin.int_bwidth)
677 #define Width2Pixel(n)          ((int32_t)(n) * (int32_t)R->TermWin.fwidth)
678 #define Height2Pixel(n)         ((int32_t)(n) * (int32_t)R->TermWin.fheight)
679
680 #define TermWin_TotalWidth()    ((int32_t)R->TermWin.width  + 2 * (int32_t)R->TermWin.int_bwidth)
681 #define TermWin_TotalHeight()   ((int32_t)R->TermWin.height + 2 * (int32_t)R->TermWin.int_bwidth)
682
683 #define Xscreen                 DefaultScreen(R->Xdisplay)
684 #define Xroot                   DefaultRootWindow(R->Xdisplay)
685
686 /* how to build & extract colors and attributes */
687 #define GET_BASEFG(x)           (((x) & RS_fgMask))
688 #define GET_BASEBG(x)           (((x) & RS_bgMask)>>Color_Bits)
689 #ifndef NO_BRIGHTCOLOR
690 # define GET_FGCOLOR(x)                                         \
691     ((((x) & RS_Bold) == 0                                      \
692       || GET_BASEFG(x) < minCOLOR                               \
693       || GET_BASEFG(x) >= minBrightCOLOR)                       \
694      ? GET_BASEFG(x)                                            \
695      : (GET_BASEFG(x) + (minBrightCOLOR - minCOLOR)))
696 # define GET_BGCOLOR(x)                                         \
697     ((((x) & RS_Blink) == 0                                     \
698       || GET_BASEBG(x) < minCOLOR                               \
699       || GET_BASEBG(x) >= minBrightCOLOR)                       \
700      ? GET_BASEBG(x)                                            \
701      : (GET_BASEBG(x) + (minBrightCOLOR - minCOLOR)))
702 #else
703 # define GET_FGCOLOR(x)         GET_BASEFG(x)
704 # define GET_BGCOLOR(x)         GET_BASEBG(x)
705 #endif
706
707 #define GET_FONT(x)             (((x) & RS_fontMask) >> RS_fontShift)
708 #define SET_FONT(x,fid)         ((x) & ~RS_fontMask) | ((fid) << RS_fontShift)
709
710 #define GET_ATTR(x)             (((x) & RS_attrMask))
711 #define GET_BGATTR(x)                                                   \
712     (((x) & RS_RVid) ? (((x) & (RS_attrMask & ~RS_RVid))                \
713                         | (((x) & RS_fgMask)<<Color_Bits))              \
714                      : ((x) & (RS_attrMask | RS_bgMask)))
715 #define SET_FGCOLOR(x,fg)       (((x) & ~RS_fgMask)  | (fg))
716 #define SET_BGCOLOR(x,bg)       (((x) & ~RS_bgMask)  | ((bg)<<Color_Bits))
717 #define SET_ATTR(x,a)           (((x) & ~RS_attrMask)| (a))
718
719 #define SET_PIXCOLOR(h, x)      ((h)->pixcolor_set[(x) / NPIXCLR_BITS] |= (1 << ((x) % NPIXCLR_BITS)))
720 #define ISSET_PIXCOLOR(h, x)    ((h)->pixcolor_set[(x) / NPIXCLR_BITS] & (1 << ((x) % NPIXCLR_BITS)))
721
722 #ifdef HAVE_SCROLLBARS
723 # define scrollbar_TotalWidth() (R->scrollBar.width + R->sb_shadow * 2)
724 #else
725 # define scrollbar_TotalWidth() (0)
726 #endif
727 #define scrollbar_isMotion()    (R->scrollBar.state == 'm')
728 #define scrollbar_isUp()        (R->scrollBar.state == 'U')
729 #define scrollbar_isDn()        (R->scrollBar.state == 'D')
730 #define scrollbar_isUpDn()      isupper (R->scrollBar.state)
731 #define isScrollbarWindow(w)    (R->scrollBar.state && (w) == R->scrollBar.win)
732
733 #define scrollbar_setIdle()     R->scrollBar.state = 1
734 #define scrollbar_setMotion()   R->scrollBar.state = 'm'
735 #define scrollbar_setUp()       R->scrollBar.state = 'U'
736 #define scrollbar_setDn()       R->scrollBar.state = 'D'
737
738 #define scrollbarnext_dnval()   (R->scrollBar.end + (R->scrollBar.width + 1))
739 #define scrollbarnext_upButton(y)       ((y) > R->scrollBar.end \
740                                          && (y) <= scrollbarnext_dnval())
741 #define scrollbarnext_dnButton(y)       ((y) > scrollbarnext_dnval())
742 #define SCROLLNEXT_MINHEIGHT    SB_THUMB_MIN_HEIGHT
743 #define scrollbarrxvt_upButton(y)       ((y) < R->scrollBar.beg)
744 #define scrollbarrxvt_dnButton(y)       ((y) > R->scrollBar.end)
745 #define SCROLLRXVT_MINHEIGHT    10
746 #define SCROLLXTERM_MINHEIGHT   10
747
748 #define scrollbar_minheight()   (R->scrollBar.style == R_SB_NEXT        \
749                                  ? SCROLLNEXT_MINHEIGHT                 \
750                                  : SCROLLRXVT_MINHEIGHT)
751 #define scrollbar_above_slider(y)       ((y) < R->scrollBar.top)
752 #define scrollbar_below_slider(y)       ((y) > R->scrollBar.bot)
753 #define scrollbar_position(y)           ((y) - R->scrollBar.beg)
754 #define scrollbar_size()                (R->scrollBar.end - R->scrollBar.beg \
755                                          - scrollbar_minheight())
756
757 #if (MENUBAR_MAX > 1)
758 /* rendition style flags */
759 # define menuBar_height()       (R->TermWin.fheight + SHADOW)
760 # define menuBar_TotalHeight()  (menuBar_height() + SHADOW + menuBar_margin)
761 # define isMenuBarWindow(w)     ((w) == R->menuBar.win)
762 #else
763 # define menuBar_height()       (0)
764 # define menuBar_TotalHeight()  (0)
765 # define isMenuBarWindow(w)     (0)
766 #endif
767
768 #ifdef XPM_BACKGROUND
769 # define XPMClearArea(a, b, c, d, e, f, g)      XClearArea((a), (b), (c), (d), (e), (f), (g))
770 #else
771 # define XPMClearArea(a, b, c, d, e, f, g)
772 #endif
773
774 #ifndef STRICT_FONT_CHECKING
775 # define rxvt_get_fontwidest(font)      ((font)->max_bounds.width)
776 #endif
777
778 #define rxvt_Gr_ButtonPress(x,y)        rxvt_Gr_ButtonReport (r, 'P',(x),(y))
779 #define rxvt_Gr_ButtonRelease(x,y)      rxvt_Gr_ButtonReport (r, 'R',(x),(y))
780
781 #ifdef UTMP_SUPPORT
782 # if !defined(RXVT_UTMPX_FILE) || !defined(HAVE_STRUCT_UTMPX)
783 #  undef HAVE_UTMPX_H
784 #  undef HAVE_STRUCT_UTMPX
785 # endif
786 # if !defined(RXVT_UTMP_FILE) || !defined(HAVE_STRUCT_UTMP)
787 #  undef HAVE_UTMP_H
788 #  undef HAVE_STRUCT_UTMP
789 # endif
790
791 # ifdef HAVE_UTMPX_H
792 #  include <utmpx.h>
793 # endif
794 # ifdef HAVE_UTMP_H
795 #  include <utmp.h>
796 # endif
797 #endif
798
799 #ifdef DEBUG_CMD
800 # define D_CMD(x)               fprintf x ; fputc('\n', stderr)
801 #else
802 # define D_CMD(x)
803 #endif
804 #ifdef DEBUG_INIT
805 # define D_INIT(x)              fprintf x ; fputc('\n', stderr)
806 #else
807 # define D_INIT(x)
808 #endif
809 #ifdef DEBUG_MAIN
810 # define D_MAIN(x)              fprintf x ; fputc('\n', stderr)
811 #else
812 # define D_MAIN(x)
813 #endif
814 #ifdef DEBUG_SCREEN
815 # define D_SCREEN(x)            fprintf x ; fputc('\n', stderr)
816 #else
817 # define D_SCREEN(x)
818 #endif
819 #ifdef DEBUG_SELECT
820 # define D_SELECT(x)            fprintf x ; fputc('\n', stderr)
821 #else
822 # define D_SELECT(x)
823 #endif
824 #ifdef DEBUG_SIZE
825 # define D_SIZE(x)              fprintf x ; fputc('\n', stderr)
826 #else
827 # define D_SIZE(x)
828 #endif
829 #ifdef DEBUG_X
830 # define D_X(x)                 fprintf x ; fputc('\n', stderr)
831 #else
832 # define D_X(x)
833 #endif
834
835 /*
836  *****************************************************************************
837  * VARIABLES
838  *****************************************************************************
839  */
840 #ifdef MENUBAR
841 # include "menubar.h"
842 #endif
843
844 #define BLINK_INTERVAL 0.5
845
846 struct mbstate {
847   unsigned char orig;
848   uint32_t reg;
849   int cnt;
850
851   mbstate ()
852   {
853     cnt = 0;
854   }
855 };
856
857 struct rxvt_term : rxvt_vars {
858   struct          mbstate mbstate;
859 #ifdef __GNUC__
860   unsigned char   want_refresh:1,
861                   want_full_refresh:1,
862                   am_transparent:1,
863                   am_pixmap_trans:1, 
864                   current_screen:1,
865                   hate_those_clicks:1,
866                   num_scr_allow:1,
867                   bypass_keystate:1;
868   unsigned char   chstat:1,
869                   lost_multi:1,
870                   multi_byte:1,
871                   hidden_cursor:1,
872                   hidden_pointer:1,
873                   parsed_geometry:1;
874 #else
875   unsigned char   want_refresh,
876 # ifdef TRANSPARENT
877                   want_full_refresh,  /* awaiting full screen refresh      */
878 # endif
879 # if defined(XPM_BACKGROUND) || defined(TRANSPARENT)
880                   am_transparent,     /* is a transparent term             */
881                   am_pixmap_trans,    /* transparency w/known root pixmap  */
882 # endif
883                   current_screen,     /* primary or secondary              */
884                   hate_those_clicks,  /* a.k.a. keep mark position         */
885                   num_scr_allow,
886                   bypass_keystate,
887 # ifdef MULTICHAR_SET
888                   chstat,
889                   lost_multi, /* set ==> we only got half a glyph */
890                   multi_byte, /* set ==> currently using 2 bytes per glyph */
891 # endif
892 # ifdef CURSOR_BLINK
893                   hidden_cursor,
894 # endif
895 # ifdef POINTER_BLANK
896                   hidden_pointer,
897 # endif
898                   parsed_geometry;
899 #endif  /* !__GNUC__ */
900
901   unsigned char   refresh_type,
902 #ifdef UTMP_SUPPORT
903                   next_utmp_action,
904 #endif
905 #ifndef NO_SETOWNER_TTYDEV
906                   next_tty_action,
907 #endif
908 #ifdef META8_OPTION
909                   meta_char,  /* Alt-key prefix                            */
910 #endif
911                   scrollbar_align,
912                   selection_wait,
913                   selection_type;
914 /* ---------- */
915 #ifdef GREEK_SUPPORT
916   short           greek_mode;         /* greek keyboard mode               */
917 #endif
918   short           rvideo;
919   int16_t         num_scr;    /* screen: number lines scrolled             */
920   uint16_t       prev_ncol,   /* screen: previous number of columns        */
921                   prev_nrow;  /* screen: previous number of rows           */
922 #ifdef RXVT_GRAPHICS
923   uint16_t       gr_prev_start;
924 #endif
925 /* ---------- */
926   rend_t          rstyle;
927 /* ---------- */
928   uint32_t       pixcolor_set[NPIXCLR_SETS];
929 /* ---------- */
930 #ifdef SELECTION_SCROLLING
931   int             scroll_selection_delay,
932                   scroll_selection_lines;
933   enum page_dirn  scroll_selection_dir;
934   int             selection_save_x,
935                   selection_save_y,
936                   selection_save_state,
937                   pending_scroll_selection;
938 #endif
939 /* ---------- */
940   int             csrO,       /* Hops - csr offset in thumb/slider to      */
941                               /*   give proper Scroll behaviour            */
942 #ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING
943                   scroll_arrow_delay,
944 #endif
945 #if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
946                   mouse_slip_wheel_delay,
947                   mouse_slip_wheel_speed,
948 #endif
949                   refresh_count,
950                   refresh_limit,
951                   fnum,       /* logical font number                       */
952                   last_bot,   /* scrollbar last bottom position            */
953                   last_top,   /* scrollbar last top position               */
954                   last_state, /* scrollbar last state                      */
955                   scrollbar_len,
956                   currmaxcol,
957 #ifdef MENUBAR
958                   menu_readonly,      /* okay to alter menu? */
959                   Arrows_x,
960 #endif
961 #if (MENUBAR_MAX > 1)
962                   Nbars,
963 #endif
964                   window_vt_x,
965                   window_vt_y,
966                   window_sb_x,
967 # ifdef POINTER_BLANK
968                   pointerBlankDelay,
969 # endif
970                   allowedxerror;
971 /* ---------- */
972   unsigned int    ModMetaMask,
973                   ModNumLockMask,
974                   old_width,  /* last used width in screen resize          */
975                   old_height, /* last used height in screen resize         */
976 #ifndef NO_BRIGHTCOLOR
977                   colorfgbg,
978 #endif
979                   ttymode;
980   unsigned long   PrivateModes,
981                   SavedModes;
982 /* ---------- */
983 #ifdef PREFER_24BIT
984   Visual         *Xvisual;
985 #endif
986 /* ---------- */
987   Atom            xa[NUM_XA];
988 /* ---------- */
989 #ifdef MENUBAR
990   GC              menubarGC;
991 #endif
992 #if defined(MENUBAR) || defined(RXVT_SCROLLBAR)
993   GC              scrollbarGC,
994                   topShadowGC,
995                   botShadowGC;
996 #endif
997 #ifdef XTERM_SCROLLBAR
998   GC              xscrollbarGC,
999                   ShadowGC;
1000 #endif
1001 #ifdef NEXT_SCROLLBAR
1002   GC              blackGC,
1003                   whiteGC,
1004                   grayGC,
1005                   darkGC,
1006                   stippleGC;
1007   Pixmap          dimple,
1008                   upArrow,
1009                   downArrow,
1010                   upArrowHi,
1011                   downArrowHi;
1012 #endif
1013 /* ---------- */
1014   Time            selection_time,
1015                   selection_request_time;
1016   pid_t           cmd_pid;    /* process id of child */
1017   gid_t           ttygid;
1018 #if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__)
1019   uid_t           euid;
1020   gid_t           egid;
1021 #endif
1022 /* ---------- */
1023   Cursor          leftptr_cursor;
1024 #ifdef POINTER_BLANK
1025   Cursor          blank_cursor;
1026 #endif
1027 /* ---------- */
1028   const char     *ttydev;     /* pty/tty name */
1029 #ifndef NO_BACKSPACE_KEY
1030   const char     *key_backspace;
1031 #endif
1032 #ifndef NO_DELETE_KEY
1033   const char     *key_delete;
1034 #endif
1035 #if defined (HOTKEY_CTRL) || defined (HOTKEY_META)
1036   KeySym          ks_bigfont, ks_smallfont;
1037 #endif
1038 #ifdef GREEK_SUPPORT
1039   KeySym          ks_greekmodeswith;
1040 #endif
1041 #ifdef USE_XIM
1042   XIC             Input_Context;
1043   XIMStyle        input_style;
1044   int             event_type;
1045 #endif
1046   struct mouse_event MEvent;
1047   XComposeStatus  compose;
1048 #ifdef RXVT_GRAPHICS
1049   int             graphics_up;
1050   struct grwin_t *gr_root;
1051 #endif
1052   ttymode_t       tio;
1053 #ifdef UTMP_SUPPORT
1054 # ifdef HAVE_STRUCT_UTMP
1055   struct utmp     ut;
1056 # endif
1057 # ifdef HAVE_STRUCT_UTMPX
1058   struct utmpx    utx;
1059 # endif
1060 # if (defined(HAVE_STRUCT_UTMP) && defined(HAVE_UTMP_PID)) || defined(HAVE_STRUCT_UTMPX)
1061   char            ut_id[5];
1062 # endif
1063   int             utmp_pos;
1064 #endif
1065   row_col_t       oldcursor;
1066 #ifdef XPM_BACKGROUND
1067   bgPixmap_t      bgPixmap;
1068   XpmAttributes   xpmAttr;    /* originally loaded pixmap and its scaling */
1069 #endif
1070 #ifdef MULTICHAR_SET
1071   int             oldcursormulti;
1072   void            (*multichar_decode)(unsigned char *str, int len);
1073 #endif
1074 #ifndef RESET_TTY_TO_COMMON_DEFAULTS
1075   struct stat     ttyfd_stat; /* original status of our tty */
1076 #endif
1077 #ifdef MENUBAR
1078   menu_t         *ActiveMenu,         /* currently active menu */
1079                  *BuildMenu;          /* the menu currently being built */
1080   bar_t          *CurrentBar;
1081 # if !(MENUBAR_MAX > 1)
1082   bar_t           BarList;
1083 # endif                         /* (MENUBAR_MAX > 1) */
1084 #endif
1085 #ifdef RXVT_GRAPHICS
1086   Window          gr_last_id;
1087 #endif
1088 #ifdef CURSOR_BLINK
1089   struct timeval  lastcursorchange;
1090 #endif
1091 #ifdef POINTER_BLANK
1092   struct timeval  lastmotion;
1093 #endif
1094   struct timeval  timeout[NUM_TIMEOUTS];
1095
1096 /* these three don't need to be kept but do so to placate some mem checkers */
1097   char           *env_windowid;       /* environmental variable WINDOWID */
1098   char           *env_display;        /* environmental variable DISPLAY  */
1099   char           *env_term;           /* environmental variable TERM     */
1100   char           *env_colorfgbg;
1101   char           *buffer;
1102   char           *locale;
1103   char            charsets[4];
1104   unsigned char  *v_buffer;   /* pointer to physical buffer */
1105   unsigned char  *v_bufstr;   /* beginning of area to write */
1106   unsigned char  *v_bufptr;   /* end of area to write */
1107   unsigned char  *v_bufend;   /* end of physical buffer */
1108   char           *newfont[MAX_NFONTS];
1109 #ifdef KEYSYM_RESOURCE
1110   const unsigned char *Keysym_map[256];
1111 #endif
1112   const char     *rs[NUM_RESOURCES];
1113 /* command input buffering */
1114   unsigned char  *cmdbuf_ptr, *cmdbuf_endp;
1115   unsigned char   cmdbuf_base[BUFSIZ];
1116   unsigned char   kbuf[KBUFSZ];
1117
1118   void pty_cb (io_watcher &w, short revents); io_watcher pty_ev;
1119   void x_cb   (io_watcher &w, short revents); io_watcher x_ev;
1120
1121 #ifdef CURSOR_BLINK
1122   void blink_cb (time_watcher &w); time_watcher blink_ev;
1123 #endif
1124
1125 #ifdef POINTER_BLANK
1126   void pointer_cb (time_watcher &w); time_watcher pointer_ev;
1127   void pointer_blank ();
1128   void pointer_unblank ();
1129 #endif
1130
1131   void flush ();
1132
1133   rxvt_term ();
1134   ~rxvt_term ();
1135
1136   bool init (int argc, const char *const *argv);
1137   bool init_vars ();
1138
1139   uint32_t next_char ();
1140
1141   bool pty_fill ();
1142   void process_x_events ();
1143
1144   void *operator new (size_t s);
1145   void operator delete (void *p, size_t s);
1146 };
1147
1148 #ifndef __attribute__
1149 # ifdef __GNUC__
1150 #  if (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || (__GNUC__ < 2)
1151 #   define __attribute__(x)
1152 #  endif
1153 # endif
1154 # define __attribute__(x)
1155 #endif
1156
1157 /*
1158  *****************************************************************************
1159  * PROTOTYPES
1160  *****************************************************************************
1161  */
1162 #ifdef PROTOTYPES
1163 # define __PROTO(p)     p
1164 #else
1165 # define __PROTO(p)     ()
1166 #endif
1167 #include "protos.h"
1168
1169 #ifdef DEBUG_malloc
1170 # include "dmalloc.h"           /* This comes last */
1171 #endif
1172
1173 #endif                          /* _RXVT_H_ */
1174