ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvt.h
Revision: 1.539
Committed: Thu Oct 30 09:53:05 2014 UTC (9 years, 8 months ago) by sf-exg
Content type: text/plain
Branch: MAIN
Changes since 1.538: +0 -7 lines
Log Message:
Fix optimization in refresh for cells containing a space.

scr_refresh skips refresh for cells containing a space and whose
rendition attributes defining the bg color have not changed. However,
the computation of such attributes erroneously assumes that, if reverse
video is set, the bg color is given by the fg color, which is not true
in the case where bg == fg. This causes cells with a space and bg == fg
not being refreshed also when the reverse video attribute has changed,
as observed in red hat bug #830236. Fix the bug by amending the
attributes test so that the refresh of such a cell is performed if the
reverse video attribute has changed.

File Contents

# User Rev Content
1 pcg 1.21 #ifndef RXVT_H_ /* include once only */
2     #define RXVT_H_
3 pcg 1.1
4 sf-exg 1.466 #include <stdio.h>
5     #include <ctype.h>
6     #include <errno.h>
7     #include <stdarg.h>
8     #include <stdlib.h>
9 ayin 1.340 #ifdef HAVE_STDINT_H
10     #include <stdint.h>
11     #endif
12     #include <sys/types.h>
13     #include <unistd.h>
14 sf-exg 1.466 #include <string.h>
15 ayin 1.340 #include <assert.h>
16     #ifdef HAVE_SYS_IOCTL_H
17     #include <sys/ioctl.h>
18     #endif
19     #ifdef HAVE_SYS_STRREDIR_H
20     #include <sys/strredir.h>
21     #endif
22    
23 sf-exg 1.466 #if HAVE_WCHAR_H
24 ayin 1.340 # include <wchar.h>
25     #else
26     // stdlib.h might provide it
27     #endif
28    
29 sf-exg 1.426 // we assume that Xlib.h defines XPointer, and it does since at least 1994...
30    
31 ayin 1.340 extern "C" {
32     #include <X11/Xlib.h>
33     #include <X11/Xutil.h>
34     #include <X11/Xresource.h>
35     }
36    
37     #if UNICODE_3
38     typedef uint32_t text_t;
39     #else
40     typedef uint16_t text_t; // saves lots of memory
41     #endif
42     typedef uint32_t rend_t;
43     typedef int32_t tlen_t; // was int16_t, but this results in smaller code and memory use
44     typedef int32_t tlen_t_; // specifically for use in the line_t structure
45 pcg 1.1
46     #include "feature.h"
47    
48 root 1.203 #if defined (ISO_14755) || defined (ENABLE_PERL)
49     # define ENABLE_OVERLAY 1
50 root 1.501 # undef NO_RESOURCES
51 root 1.203 #endif
52    
53     #if ENABLE_PERL
54 root 1.259 # define ENABLE_FRILLS 1
55 root 1.203 # define ENABLE_COMBINING 1
56     #endif
57    
58     #if ENABLE_FRILLS
59 root 1.259 # define ENABLE_XEMBED 1
60     # define ENABLE_EWMH 1
61 root 1.241 # define ENABLE_XIM_ONTHESPOT 1
62 root 1.259 # define CURSOR_BLINK 1
63     # define OPTION_HC 1
64 ayin 1.323 # define BUILTIN_GLYPHS 1
65 root 1.207 #else
66     # define ENABLE_MINIMAL 1
67 root 1.203 #endif
68    
69 pcg 1.69 #include <limits.h>
70    
71 pcg 1.1 #include <X11/cursorfont.h>
72     #include <X11/keysym.h>
73     #include <X11/keysymdef.h>
74     #include <X11/Xatom.h>
75    
76 root 1.498 #if HAVE_PIXBUF
77 sf-exg 1.429 # include <gdk-pixbuf/gdk-pixbuf.h>
78     #endif
79    
80 sf-exg 1.511 #if XRENDER && (HAVE_PIXBUF || ENABLE_TRANSPARENCY)
81 sf-exg 1.429 # define HAVE_BG_PIXMAP 1
82 sf-exg 1.525 # define HAVE_IMG 1
83 sf-exg 1.429 #endif
84    
85 sf-exg 1.511 #if HAVE_BG_PIXMAP
86     # if HAVE_PIXBUF
87     # define BG_IMAGE_FROM_FILE 1
88     # endif
89     # if ENABLE_TRANSPARENCY
90     # define BG_IMAGE_FROM_ROOT 1
91     # endif
92     #endif
93    
94 root 1.479 #include <ecb.h>
95 pcg 1.54 #include "encoding.h"
96 root 1.248 #include "rxvtutil.h"
97 root 1.102 #include "rxvtfont.h"
98     #include "rxvttoolkit.h"
99 root 1.495 #include "rxvtimg.h"
100 ayin 1.342 #include "scrollbar.h"
101 root 1.318 #include "ev_cpp.h"
102 root 1.234 #include "libptytty.h"
103 pcg 1.1
104 root 1.190 #include "rxvtperl.h"
105    
106 root 1.207 // try to avoid some macros to decrease code size, on some systems
107     #if ENABLE_MINIMAL
108     # define strcmp(a,b) (strcmp)(a,b)
109     # define strlen(a) (strlen)(a)
110     # define strcpy(a,b) (strcpy)(a,b)
111     # define memset(a,c,l) (memset)(a,c,l)
112     # define memcpy(a,b,l) (memcpy)(a,b,l)
113     #endif
114    
115 pcg 1.1 /*
116     *****************************************************************************
117     * SYSTEM HACKS
118     *****************************************************************************
119     */
120    
121 root 1.266 #include <termios.h>
122 pcg 1.1
123     #ifndef STDIN_FILENO
124 pcg 1.3 # define STDIN_FILENO 0
125     # define STDOUT_FILENO 1
126     # define STDERR_FILENO 2
127 pcg 1.1 #endif
128    
129 ayin 1.332 #ifndef EXIT_SUCCESS /* missing from <stdlib.h> */
130     # define EXIT_SUCCESS 0 /* exit function success */
131     # define EXIT_FAILURE 1 /* exit function failure */
132     #endif
133    
134 root 1.227 /****************************************************************************/
135    
136     // exception thrown on fatal (per-instance) errors
137     class rxvt_failure_exception { };
138    
139     // exception thrown when the command parser runs out of input data
140     class out_of_input { };
141    
142 pcg 1.1 /*
143     *****************************************************************************
144 ayin 1.316 * PROTOTYPES
145 root 1.102 *****************************************************************************
146     */
147 root 1.147 // main.C
148 ayin 1.337 #define SET_LOCALE(locale) rxvt_set_locale (locale)
149     extern bool rxvt_set_locale (const char *locale) NOTHROW;
150     extern void rxvt_push_locale (const char *locale) NOTHROW;
151     extern void rxvt_pop_locale () NOTHROW;
152 ayin 1.340 void rxvt_init ();
153 root 1.147
154 root 1.227 // misc.C
155 root 1.128 char * rxvt_wcstombs (const wchar_t *str, int len = -1);
156     wchar_t * rxvt_mbstowcs (const char *str, int len = -1);
157     char * rxvt_wcstoutf8 (const wchar_t *str, int len = -1);
158     wchar_t * rxvt_utf8towcs (const char *str, int len = -1);
159 root 1.147
160 root 1.376 const char * rxvt_basename (const char *str) NOTHROW;
161 root 1.227 void rxvt_vlog (const char *fmt, va_list arg_ptr) NOTHROW;
162     void rxvt_log (const char *fmt,...) NOTHROW;
163     void rxvt_warn (const char *fmt,...) NOTHROW;
164 root 1.489 void rxvt_fatal (const char *fmt, ...) THROW ((class rxvt_failure_exception)) ecb_noreturn ecb_cold;
165     void rxvt_exit_failure () THROW ((class rxvt_failure_exception)) ecb_noreturn ecb_cold;
166 root 1.227
167 ayin 1.302 char * rxvt_strtrim (char *str) NOTHROW;
168 sf-exg 1.427 char ** rxvt_strsplit (char delim, const char *str) NOTHROW;
169    
170     static inline void
171     rxvt_free_strsplit (char **ptr) NOTHROW
172     {
173     free (ptr[0]);
174     free (ptr);
175     }
176 root 1.102
177 ayin 1.337 void * rxvt_malloc (size_t size);
178     void * rxvt_calloc (size_t number, size_t size);
179     void * rxvt_realloc (void *ptr, size_t size);
180    
181 sf-exg 1.537 KeySym rxvt_XKeycodeToKeysym (Display *dpy, KeyCode keycode, int index);
182    
183 root 1.198 /////////////////////////////////////////////////////////////////////////////
184    
185     // temporarily replace the process environment
186     extern char **environ;
187     extern char **rxvt_environ; // the original environ pointer
188    
189 ayin 1.336 static inline void
190     set_environ (char **envv)
191 root 1.199 {
192 root 1.235 #if ENABLE_PERL
193     assert (envv);
194     #else
195 root 1.199 if (envv)
196 root 1.235 #endif
197 root 1.199 environ = envv;
198     }
199 root 1.198
200 root 1.422 struct localise_env
201     {
202     char **orig_env;
203    
204     localise_env (char **new_env)
205     {
206     orig_env = environ;
207     environ = new_env;
208     }
209    
210     ~localise_env ()
211     {
212     environ = orig_env;
213     }
214     };
215    
216 sf-exg 1.475 #ifdef HAVE_BG_PIXMAP
217 sf-exg 1.491 struct image_effects
218     {
219     bool tint_set;
220     rxvt_color tint;
221     int shade;
222     int h_blurRadius, v_blurRadius;
223    
224     image_effects ()
225     {
226     tint_set =
227     h_blurRadius =
228     v_blurRadius = 0;
229     shade = 100;
230     }
231    
232     bool need_tint ()
233     {
234     return shade != 100 || tint_set;
235     }
236    
237     bool need_blur ()
238     {
239     return h_blurRadius && v_blurRadius;
240     }
241    
242     bool set_tint (const rxvt_color &new_tint);
243     bool set_shade (const char *shade_str);
244     bool set_blur (const char *geom);
245     };
246    
247 root 1.498 # if BG_IMAGE_FROM_FILE
248 sf-exg 1.475 enum {
249     IM_IS_SIZE_SENSITIVE = 1 << 1,
250     IM_KEEP_ASPECT = 1 << 2,
251     IM_ROOT_ALIGN = 1 << 3,
252     IM_TILE = 1 << 4,
253     IM_GEOMETRY_FLAGS = IM_KEEP_ASPECT | IM_ROOT_ALIGN | IM_TILE,
254     };
255    
256     enum {
257     noScale = 0,
258     windowScale = 100,
259     defaultScale = windowScale,
260     centerAlign = 50,
261     defaultAlign = centerAlign,
262     };
263    
264 sf-exg 1.491 struct rxvt_image : image_effects
265 sf-exg 1.475 {
266 sf-exg 1.484 unsigned short alpha;
267 sf-exg 1.475 uint8_t flags;
268     unsigned int h_scale, v_scale; /* percents of the window size */
269     int h_align, v_align; /* percents of the window size:
270     0 - left align, 50 - center, 100 - right */
271    
272 sf-exg 1.490 bool is_size_sensitive ()
273     {
274     return (!(flags & IM_TILE)
275     || h_scale || v_scale
276     || (!(flags & IM_ROOT_ALIGN) && (h_align || v_align)));
277     }
278    
279 sf-exg 1.505 rxvt_img *img;
280 sf-exg 1.485
281     void destroy ()
282     {
283 sf-exg 1.505 delete img;
284 sf-exg 1.508 img = 0;
285 sf-exg 1.485 }
286 sf-exg 1.475
287 sf-exg 1.484 rxvt_image ();
288 sf-exg 1.507 void set_file_geometry (rxvt_screen *s, const char *file);
289     void set_file (rxvt_screen *s, const char *file);
290 sf-exg 1.475 bool set_geometry (const char *geom, bool update = false);
291     };
292     # endif
293     #endif
294    
295 root 1.102 /*
296     *****************************************************************************
297 pcg 1.1 * STRUCTURES AND TYPEDEFS
298     *****************************************************************************
299     */
300    
301     /*
302     * the 'essential' information for reporting Mouse Events
303     * pared down from XButtonEvent
304     */
305 root 1.372 struct mouse_event
306     {
307 root 1.128 int clicks;
308     Time time; /* milliseconds */
309     unsigned int state; /* key or button mask */
310     unsigned int button; /* detail */
311 pcg 1.1 };
312    
313 root 1.150 #if ENABLE_XEMBED
314     // XEMBED messages
315 ayin 1.316 # define XEMBED_EMBEDDED_NOTIFY 0
316     # define XEMBED_WINDOW_ACTIVATE 1
317     # define XEMBED_WINDOW_DEACTIVATE 2
318     # define XEMBED_REQUEST_FOCUS 3
319     # define XEMBED_FOCUS_IN 4
320     # define XEMBED_FOCUS_OUT 5
321     # define XEMBED_FOCUS_NEXT 6
322 root 1.150 # define XEMBED_FOCUS_PREV 7
323    
324 ayin 1.316 # define XEMBED_MODALITY_ON 10
325     # define XEMBED_MODALITY_OFF 11
326     # define XEMBED_REGISTER_ACCELERATOR 12
327     # define XEMBED_UNREGISTER_ACCELERATOR 13
328 root 1.150 # define XEMBED_ACTIVATE_ACCELERATOR 14
329    
330     // XEMBED detail code
331 ayin 1.316 # define XEMBED_FOCUS_CURRENT 0
332     # define XEMBED_FOCUS_FIRST 1
333 root 1.150 # define XEMBED_FOCUS_LAST 2
334 root 1.151
335     # define XEMBED_MAPPED (1 << 0)
336 root 1.150 #endif
337    
338 pcg 1.1 /*
339     *****************************************************************************
340     * NORMAL DEFINES
341     *****************************************************************************
342     */
343    
344     /* COLORTERM, TERM environment variables */
345 pcg 1.3 #define COLORTERMENV "rxvt"
346 root 1.498 #if BG_IMAGE_FROM_FILE
347 pcg 1.1 # define COLORTERMENVFULL COLORTERMENV "-xpm"
348     #else
349     # define COLORTERMENVFULL COLORTERMENV
350     #endif
351     #ifndef TERMENV
352 root 1.406 # if USE_256_COLORS
353 sf-exg 1.399 # define TERMENV "rxvt-unicode-256color"
354     # else
355     # define TERMENV "rxvt-unicode"
356 sf-exg 1.400 # endif
357 pcg 1.1 #endif
358    
359     #if defined (NO_MOUSE_REPORT) && !defined (NO_MOUSE_REPORT_SCROLLBAR)
360 root 1.102 # define NO_MOUSE_REPORT_SCROLLBAR 1
361 pcg 1.1 #endif
362    
363 pcg 1.3 #define scrollBar_esc 30
364 pcg 1.1
365 ayin 1.353 #if !defined (RXVT_SCROLLBAR) && !defined (NEXT_SCROLLBAR)
366     # define NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING 1
367     #endif
368    
369 pcg 1.39 enum {
370 root 1.212 NO_REFRESH = 0, /* Window not visible at all! */
371     FAST_REFRESH = 1, /* Fully exposed window */
372     SLOW_REFRESH = 2, /* Partially exposed window */
373 pcg 1.39 };
374 pcg 1.1
375     #ifdef NO_SECONDARY_SCREEN
376 pcg 1.3 # define NSCREENS 0
377 pcg 1.1 #else
378 pcg 1.3 # define NSCREENS 1
379 pcg 1.1 #endif
380    
381 sf-exg 1.440 /* flags for rxvt_term::scr_gotorc () */
382 pcg 1.39 enum {
383 root 1.167 C_RELATIVE = 1, /* col movement is relative */
384     R_RELATIVE = 2, /* row movement is relative */
385     RELATIVE = C_RELATIVE | R_RELATIVE,
386 pcg 1.39 };
387 pcg 1.1
388 sf-exg 1.440 /* modes for rxvt_term::scr_insdel_chars (), rxvt_term::scr_insdel_lines () */
389 pcg 1.39 enum {
390     INSERT = -1, /* don't change these values */
391     DELETE = +1,
392 pcg 1.41 ERASE = +2,
393 pcg 1.39 };
394 pcg 1.1
395 sf-exg 1.440 /* modes for rxvt_term::scr_page () - scroll page. used by scrollbar window */
396 pcg 1.1 enum page_dirn {
397 root 1.523 DN = -1,
398     NO_DIR = 0,
399     UP = 1,
400 pcg 1.1 };
401    
402 sf-exg 1.440 /* arguments for rxvt_term::scr_change_screen () */
403 pcg 1.1 enum {
404 pcg 1.3 PRIMARY = 0,
405 pcg 1.41 SECONDARY,
406 pcg 1.1 };
407    
408 root 1.398 // define various rendition bits and masks. the rendition word
409     // is 32 bits in size, and we should use it as efficiently as possible
410    
411 root 1.176 #define RS_None 0
412 pcg 1.1
413 root 1.396 // GET_BGATTR depends on RS_fgShift > RS_bgShift
414 root 1.392 #define RS_colorMask ((1UL << Color_Bits) - 1UL)
415 root 1.393 #define RS_bgShift 0
416 root 1.395 #define RS_fgShift (RS_bgShift + Color_Bits)
417     #define RS_bgMask (RS_colorMask << RS_bgShift)
418 root 1.387 #define RS_fgMask (RS_colorMask << RS_fgShift)
419 pcg 1.3
420 root 1.397 // must have space for rxvt_fontset::fontCount * 2 + 2 values
421     #define RS_fontShift (RS_fgShift + Color_Bits)
422     #define RS_Careful (1UL << RS_fontShift) /* be careful when drawing these */
423 root 1.407 #define RS_fontCount rxvt_fontset::fontCount
424     #define RS_fontMask ((RS_fontCount << (RS_fontShift + 1)) | RS_Careful) // includes RS_Careful
425 root 1.121
426 root 1.397 // toggle this to force redraw, must be != RS_Careful and otherwise "pretty neutral"
427     #define RS_redraw (2UL << RS_fontShift)
428 root 1.176
429 sf-exg 1.403 #define RS_Sel (1UL << 22)
430    
431 root 1.408 // 4 custom bits for extensions
432 root 1.395 #define RS_customCount 16UL
433 root 1.388 #define RS_customShift 23
434 root 1.395 #define RS_customMask ((RS_customCount - 1UL) << RS_customShift)
435 root 1.121
436 root 1.397 // font styles
437     #define RS_Bold (1UL << RS_styleShift)
438     #define RS_Italic (2UL << RS_styleShift)
439    
440     #define RS_styleCount 4
441     #define RS_styleShift 27
442     #define RS_styleMask (RS_Bold | RS_Italic)
443 root 1.121
444 root 1.397 // fake styles
445     #define RS_Blink (1UL << 29)
446     #define RS_RVid (1UL << 30) // reverse video
447     #define RS_Uline (1UL << 31) // underline
448 root 1.387
449 root 1.121 #define RS_baseattrMask (RS_Italic | RS_Bold | RS_Blink | RS_RVid | RS_Uline)
450     #define RS_attrMask (RS_baseattrMask | RS_fontMask)
451    
452 root 1.387 #define DEFAULT_RSTYLE (RS_None | (Color_fg << RS_fgShift) | (Color_bg << RS_bgShift))
453     #define OVERLAY_RSTYLE (RS_None | (Color_Black << RS_fgShift) | (Color_Yellow << RS_bgShift))
454 pcg 1.3
455 pcg 1.1 enum {
456 pcg 1.3 C0_NUL = 0x00,
457     C0_SOH, C0_STX, C0_ETX, C0_EOT, C0_ENQ, C0_ACK, C0_BEL,
458     C0_BS , C0_HT , C0_LF , C0_VT , C0_FF , C0_CR , C0_SO , C0_SI ,
459     C0_DLE, C0_DC1, C0_DC2, D0_DC3, C0_DC4, C0_NAK, C0_SYN, C0_ETB,
460 pcg 1.41 C0_CAN, C0_EM , C0_SUB, C0_ESC, C0_IS4, C0_IS3, C0_IS2, C0_IS1,
461 ayin 1.316 };
462 pcg 1.3 #define CHAR_ST 0x9c /* 0234 */
463 pcg 1.1
464     /*
465     * XTerm Operating System Commands: ESC ] Ps;Pt (ST|BEL)
466     * colour extensions by Christian W. Zuckschwerdt <zany@triq.net>
467     */
468 pcg 1.41 enum {
469     XTerm_name = 0,
470     XTerm_iconName = 1,
471     XTerm_title = 2,
472 pcg 1.69 XTerm_property = 3, // change X property
473 pcg 1.51 XTerm_Color = 4, // change colors
474 ayin 1.351 XTerm_Color00 = 10, // change fg color
475     XTerm_Color01 = 11, // change bg color
476 pcg 1.51 XTerm_Color_cursor = 12, // change actual 'Cursor' color
477 root 1.197 XTerm_Color_pointer_fg = 13, // change actual 'Pointer' fg color
478     XTerm_Color_pointer_bg = 14, // change actual 'Pointer' bg color
479     XTerm_Color05 = 15, // not implemented (tektronix fg)
480     XTerm_Color06 = 16, // not implemented (tektronix bg)
481 sf-exg 1.405 XTerm_Color_HC = 17, // change actual 'Highlight' bg color
482     XTerm_Color_HTC = 19, // change actual 'Highlight' fg color
483 pcg 1.51 XTerm_logfile = 46, // not implemented
484 pcg 1.41 XTerm_font = 50,
485    
486 pcg 1.51 XTerm_konsole30 = 30, // reserved for konsole
487     XTerm_konsole31 = 31, // reserved for konsole
488     XTerm_emacs51 = 51, // reserved for emacs shell
489 pcg 1.41 /*
490     * rxvt extensions of XTerm OSCs: ESC ] Ps;Pt (ST|BEL)
491     */
492 ayin 1.351
493     // deprecated
494     Rxvt_restoreFG = 39,
495     Rxvt_restoreBG = 49,
496    
497 root 1.197 Rxvt_Pixmap = 20, // new bg pixmap
498     Rxvt_dumpscreen = 55, // dump scrollback and all of screen
499 root 1.153
500     URxvt_locale = 701, // change locale
501 root 1.246 URxvt_version = 702, // request version
502 root 1.209
503 root 1.153 URxvt_Color_IT = 704, // change actual 'Italic' colour
504     URxvt_Color_tint = 705, // change actual tint colour
505 ayin 1.351 URxvt_Color_BD = 706, // change actual 'Bold' color
506     URxvt_Color_UL = 707, // change actual 'Underline' color
507 root 1.373 URxvt_Color_border = 708,
508 root 1.121
509     URxvt_font = 710,
510     URxvt_boldFont = 711,
511     URxvt_italicFont = 712,
512     URxvt_boldItalicFont = 713,
513 root 1.153
514     URxvt_view_up = 720,
515     URxvt_view_down = 721,
516 root 1.184
517 root 1.366 URxvt_perl = 777, // for use by perl extensions, starts with "extension-name;"
518 pcg 1.41 };
519 pcg 1.1
520     /* Words starting with `Color_' are colours. Others are counts */
521     /*
522 root 1.160 * The PixColor and rendition colour usage should probably be decoupled
523 pcg 1.1 * on the unnecessary items, e.g. Color_pointer, but won't bother
524     * until we need to. Also, be aware of usage in pixcolor_set
525     */
526    
527     enum colour_list {
528 root 1.263 Color_none = -2,
529     Color_transparent = -1,
530 pcg 1.3 Color_fg = 0,
531     Color_bg,
532     minCOLOR, /* 2 */
533     Color_Black = minCOLOR,
534     Color_Red3,
535     Color_Green3,
536     Color_Yellow3,
537     Color_Blue3,
538     Color_Magenta3,
539     Color_Cyan3,
540     maxCOLOR, /* minCOLOR + 7 */
541 pcg 1.1 #ifndef NO_BRIGHTCOLOR
542 pcg 1.3 Color_AntiqueWhite = maxCOLOR,
543     minBrightCOLOR, /* maxCOLOR + 1 */
544     Color_Grey25 = minBrightCOLOR,
545     Color_Red,
546     Color_Green,
547     Color_Yellow,
548     Color_Blue,
549     Color_Magenta,
550     Color_Cyan,
551     maxBrightCOLOR, /* minBrightCOLOR + 7 */
552     Color_White = maxBrightCOLOR,
553 pcg 1.1 #else
554 pcg 1.3 Color_White = maxCOLOR,
555 pcg 1.1 #endif
556 root 1.121 minTermCOLOR = Color_White + 1,
557 root 1.406 #if USE_256_COLORS
558     maxTermCOLOR = Color_White + 240,
559     #else
560 root 1.121 maxTermCOLOR = Color_White + 72,
561 root 1.388 #endif
562 pcg 1.1 #ifndef NO_CURSORCOLOR
563 pcg 1.3 Color_cursor,
564     Color_cursor2,
565 pcg 1.1 #endif
566 pcg 1.69 Color_pointer_fg,
567     Color_pointer_bg,
568 pcg 1.3 Color_border,
569 pcg 1.1 #ifndef NO_BOLD_UNDERLINE_REVERSE
570 pcg 1.3 Color_BD,
571 root 1.121 Color_IT,
572 pcg 1.3 Color_UL,
573     Color_RV,
574 pcg 1.1 #endif
575 root 1.133 #if ENABLE_FRILLS
576     Color_underline,
577     #endif
578 pcg 1.1 #ifdef OPTION_HC
579 pcg 1.3 Color_HC,
580 sf-exg 1.402 Color_HTC,
581 pcg 1.1 #endif
582 pcg 1.3 Color_scroll,
583 ayin 1.354 #ifdef RXVT_SCROLLBAR
584 pcg 1.3 Color_trough,
585 pcg 1.1 #endif
586 sf-exg 1.511 #if BG_IMAGE_FROM_ROOT
587 pcg 1.69 Color_tint,
588     #endif
589 root 1.160 #if OFF_FOCUS_FADING
590     Color_fade,
591     #endif
592 pcg 1.3 NRS_COLORS, /* */
593 ayin 1.354 #ifdef RXVT_SCROLLBAR
594 pcg 1.3 Color_topShadow = NRS_COLORS,
595     Color_bottomShadow,
596 root 1.121 TOTAL_COLORS
597 pcg 1.1 #else
598 root 1.121 TOTAL_COLORS = NRS_COLORS
599 pcg 1.1 #endif
600     };
601    
602 root 1.406 #if USE_256_COLORS
603     # define Color_Bits 9 // 0 .. maxTermCOLOR
604 root 1.388 #else
605 root 1.406 # define Color_Bits 7 // 0 .. maxTermCOLOR
606 root 1.388 #endif
607 root 1.121
608 pcg 1.1 /*
609     * Resource list
610     */
611     enum {
612 root 1.185 # define def(name) Rs_ ## name,
613     # define reserve(name,count) Rs_ ## name ## _ = Rs_ ## name + (count) - 1,
614     # include "rsinc.h"
615     # undef def
616     # undef reserve
617 pcg 1.3 NUM_RESOURCES
618     };
619 pcg 1.1
620     /* DEC private modes */
621 root 1.102 #define PrivMode_132 (1UL<<0)
622     #define PrivMode_132OK (1UL<<1)
623     #define PrivMode_rVideo (1UL<<2)
624     #define PrivMode_relOrigin (1UL<<3)
625     #define PrivMode_Screen (1UL<<4)
626     #define PrivMode_Autowrap (1UL<<5)
627     #define PrivMode_aplCUR (1UL<<6)
628     #define PrivMode_aplKP (1UL<<7)
629     #define PrivMode_HaveBackSpace (1UL<<8)
630     #define PrivMode_BackSpace (1UL<<9)
631     #define PrivMode_ShiftKeys (1UL<<10)
632     #define PrivMode_VisibleCursor (1UL<<11)
633     #define PrivMode_MouseX10 (1UL<<12)
634     #define PrivMode_MouseX11 (1UL<<13)
635     #define PrivMode_scrollBar (1UL<<14)
636 root 1.208 #define PrivMode_TtyOutputInh (1UL<<15)
637     #define PrivMode_Keypress (1UL<<16)
638     #define PrivMode_smoothScroll (1UL<<17)
639     #define PrivMode_vt52 (1UL<<18)
640     #define PrivMode_LFNL (1UL<<19)
641 ayin 1.313 #define PrivMode_MouseBtnEvent (1UL<<20)
642     #define PrivMode_MouseAnyEvent (1UL<<21)
643 ayin 1.352 #define PrivMode_BracketPaste (1UL<<22)
644 root 1.417 #define PrivMode_ExtModeMouse (1UL<<23) // xterm pseudo-utf-8 hack
645     #define PrivMode_ExtMouseRight (1UL<<24) // xterm pseudo-utf-8, but works in non-utf-8-locales
646 pcg 1.1
647 ayin 1.313 #define PrivMode_mouse_report (PrivMode_MouseX10|PrivMode_MouseX11|PrivMode_MouseBtnEvent|PrivMode_MouseAnyEvent)
648 pcg 1.1
649     #ifdef ALLOW_132_MODE
650 root 1.148 # define PrivMode_Default (PrivMode_Autowrap|PrivMode_ShiftKeys|PrivMode_VisibleCursor|PrivMode_132OK)
651 pcg 1.1 #else
652 root 1.148 # define PrivMode_Default (PrivMode_Autowrap|PrivMode_ShiftKeys|PrivMode_VisibleCursor)
653 pcg 1.1 #endif
654    
655 root 1.87 // do not change these constants lightly, there are many interdependencies
656 pcg 1.60 #define IMBUFSIZ 128 // input modifier buffer sizes
657     #define KBUFSZ 512 // size of keyboard mapping buffer
658 root 1.528 #define CBUFSIZ 32768 // size of command buffer (longest command sequence possible)
659 root 1.368 #define CBUFCNT 8 // never call pty_fill/cmd_parse more than this often in a row
660 root 1.177 #define UBUFSIZ 2048 // character buffer
661 pcg 1.1
662 ayin 1.327 #if ENABLE_FRILLS
663     # include <X11/Xmd.h>
664 root 1.372 typedef struct _mwmhints
665     {
666 ayin 1.327 CARD32 flags;
667     CARD32 functions;
668     CARD32 decorations;
669     INT32 input_mode;
670     CARD32 status;
671     } MWMHints;
672     #endif
673    
674 root 1.87 /* Motif window hints */
675     #define MWM_HINTS_FUNCTIONS (1L << 0)
676     #define MWM_HINTS_DECORATIONS (1L << 1)
677     #define MWM_HINTS_INPUT_MODE (1L << 2)
678     #define MWM_HINTS_STATUS (1L << 3)
679     /* bit definitions for MwmHints.functions */
680     #define MWM_FUNC_ALL (1L << 0)
681     #define MWM_FUNC_RESIZE (1L << 1)
682     #define MWM_FUNC_MOVE (1L << 2)
683     #define MWM_FUNC_MINIMIZE (1L << 3)
684     #define MWM_FUNC_MAXIMIZE (1L << 4)
685     #define MWM_FUNC_CLOSE (1L << 5)
686     /* bit definitions for MwmHints.decorations */
687     #define MWM_DECOR_ALL (1L << 0)
688     #define MWM_DECOR_BORDER (1L << 1)
689     #define MWM_DECOR_RESIZEH (1L << 2)
690     #define MWM_DECOR_TITLE (1L << 3)
691     #define MWM_DECOR_MENU (1L << 4)
692     #define MWM_DECOR_MINIMIZE (1L << 5)
693     #define MWM_DECOR_MAXIMIZE (1L << 6)
694     /* bit definitions for MwmHints.inputMode */
695     #define MWM_INPUT_MODELESS 0
696     #define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1
697     #define MWM_INPUT_SYSTEM_MODAL 2
698     #define MWM_INPUT_FULL_APPLICATION_MODAL 3
699     #define PROP_MWM_HINTS_ELEMENTS 5
700    
701 pcg 1.1 /*
702     *****************************************************************************
703     * MACRO DEFINES
704     *****************************************************************************
705     */
706 root 1.409
707     // speed hack, copy some member variable into a local variable of the same name
708 root 1.212 #define dLocal(type,name) type const name = this->name
709 root 1.145
710 root 1.265 // for speed reasons, we assume that all codepoints 32 to 126 are
711     // single-width.
712     #define WCWIDTH(c) (IN_RANGE_INC (c, 0x20, 0x7e) ? 1 : wcwidth (c))
713 root 1.241
714 pcg 1.1 /* convert pixel dimensions to row/column values. Everything as int32_t */
715 root 1.78 #define Pixel2Col(x) Pixel2Width((int32_t)(x))
716     #define Pixel2Row(y) Pixel2Height((int32_t)(y))
717 root 1.162 #define Pixel2Width(x) ((int32_t)(x) / (int32_t)fwidth)
718     #define Pixel2Height(y) ((int32_t)(y) / (int32_t)fheight)
719 root 1.78 #define Col2Pixel(col) ((int32_t)Width2Pixel(col))
720     #define Row2Pixel(row) ((int32_t)Height2Pixel(row))
721 root 1.162 #define Width2Pixel(n) ((int32_t)(n) * (int32_t)fwidth)
722     #define Height2Pixel(n) ((int32_t)(n) * (int32_t)fheight)
723 pcg 1.1
724 root 1.372 #define LINENO_of(t,n) MOD ((t)->term_start + int(n), (t)->total_rows)
725     #define ROW_of(t,n) (t)->row_buf [LINENO_of ((t), n)]
726    
727     #define LINENO(n) LINENO_of (this, n)
728     #define ROW(n) ROW_of (this, n)
729 pcg 1.1
730     /* how to build & extract colors and attributes */
731 root 1.387 #define GET_BASEFG(x) (((x) & RS_fgMask) >> RS_fgShift)
732     #define GET_BASEBG(x) (((x) & RS_bgMask) >> RS_bgShift)
733 pcg 1.1
734 pcg 1.3 #define GET_FONT(x) (((x) & RS_fontMask) >> RS_fontShift)
735 root 1.121 #define SET_FONT(x,fid) (((x) & ~RS_fontMask) | ((fid) << RS_fontShift))
736    
737     #define GET_STYLE(x) (((x) & RS_styleMask) >> RS_styleShift)
738     #define SET_STYLE(x,style) (((x) & ~RS_styleMask) | ((style) << RS_styleShift))
739 pcg 1.1
740 pcg 1.3 #define GET_ATTR(x) (((x) & RS_attrMask))
741 root 1.387 #define SET_FGCOLOR(x,fg) (((x) & ~RS_fgMask) | ((fg) << RS_fgShift))
742     #define SET_BGCOLOR(x,bg) (((x) & ~RS_bgMask) | ((bg) << RS_bgShift))
743 root 1.121 #define SET_ATTR(x,a) (((x) & ~RS_attrMask) | (a))
744    
745     #define RS_SAME(a,b) (!(((a) ^ (b)) & ~RS_Careful))
746 pcg 1.1
747 root 1.251 #define PIXCOLOR_NAME(idx) rs[Rs_color + (idx)]
748     #define ISSET_PIXCOLOR(idx) (!!rs[Rs_color + (idx)])
749 pcg 1.1
750 root 1.121 #if ENABLE_STYLES
751 root 1.372 # define FONTSET_of(t,style) (t)->fontset[GET_STYLE (style)]
752 root 1.121 #else
753 root 1.372 # define FONTSET_of(t,style) (t)->fontset[0]
754 root 1.121 #endif
755    
756 root 1.372 #define FONTSET(style) FONTSET_of (this, style)
757    
758 root 1.257 typedef callback<void (const char *)> log_callback;
759     typedef callback<int (int)> getfd_callback;
760 pcg 1.60
761 root 1.187 /****************************************************************************/
762    
763     #define LINE_LONGER 0x0001 // line is continued on the next row
764     #define LINE_FILTERED 0x0002 // line has been filtered
765     #define LINE_COMPRESSED 0x0004 // line has been compressed (NYI)
766 root 1.262 #define LINE_FILTER 0x0008 // line needs to be filtered before display (NYI)
767     #define LINE_BIDI 0x0010 // line needs bidi (NYI)
768 root 1.187
769 root 1.372 struct line_t
770     {
771 root 1.187 text_t *t; // terminal the text
772     rend_t *r; // rendition, uses RS_ flags
773 ayin 1.339 tlen_t_ l; // length of each text line
774 root 1.187 uint32_t f; // flags
775    
776 root 1.487 bool valid ()
777     {
778     return l >= 0;
779     }
780    
781     void alloc ()
782     {
783     l = 0;
784     }
785    
786 root 1.187 bool is_longer ()
787     {
788     return f & LINE_LONGER;
789     }
790    
791     void is_longer (int set)
792     {
793     if (set)
794     f |= LINE_LONGER;
795     else
796     f &= ~LINE_LONGER;
797     }
798    
799     void clear ()
800     {
801     t = 0;
802     r = 0;
803     l = 0;
804     f = 0;
805     }
806    
807     void touch () // call whenever a line is changed/touched/updated
808     {
809     #if ENABLE_PERL
810     f &= ~LINE_FILTERED;
811     #endif
812     }
813    
814     void touch (int col)
815     {
816     max_it (l, col);
817     touch ();
818     }
819     };
820    
821     /****************************************************************************/
822    
823 ayin 1.317 // primitive wrapper around mbstate_t to ensure initialisation
824 root 1.372 struct mbstate
825     {
826 pcg 1.17 mbstate_t mbs;
827 pcg 1.1
828 pcg 1.36 operator mbstate_t *() { return &mbs; }
829 root 1.102 void reset () { memset (&mbs, 0, sizeof (mbs)); }
830 pcg 1.36 mbstate () { reset (); }
831 pcg 1.1 };
832    
833 root 1.187 /****************************************************************************/
834    
835 root 1.135 #define UNICODE_MASK 0x1fffffUL
836    
837 ayin 1.338 #if UNICODE_3
838 pcg 1.51 # define COMPOSE_LO 0x40000000UL
839     # define COMPOSE_HI 0x400fffffUL
840     # define IS_COMPOSE(n) ((int32_t)(n) >= COMPOSE_LO)
841     #else
842 root 1.189 # if ENABLE_PERL
843 root 1.250 # define COMPOSE_LO 0xe000UL // our _own_ functions don't like (illegal) surrogates
844 root 1.189 # define COMPOSE_HI 0xf8ffUL // in utf-8, so use private use area only
845     # else
846     # define COMPOSE_LO 0xd800UL
847     # define COMPOSE_HI 0xf8ffUL
848     # endif
849     # define IS_COMPOSE(n) IN_RANGE_INC ((n), COMPOSE_LO, COMPOSE_HI)
850 pcg 1.51 #endif
851    
852 pcg 1.52 #if ENABLE_COMBINING
853 pcg 1.51 // compose chars are used to represent composite characters
854     // that are not representable in unicode, as well as characters
855     // not fitting in the BMP.
856 root 1.372 struct compose_char
857     {
858 pcg 1.54 unicode_t c1, c2; // any chars != NOCHAR are valid
859 root 1.479 #if __cplusplus >= 201103L || ECB_GCC_VERSION(4,4)
860 root 1.478 compose_char () = default;
861     #endif
862 pcg 1.54 compose_char (unicode_t c1, unicode_t c2)
863 pcg 1.51 : c1(c1), c2(c2)
864     { }
865     };
866    
867 root 1.372 class rxvt_composite_vec
868     {
869 pcg 1.51 vector<compose_char> v;
870     public:
871 pcg 1.54 text_t compose (unicode_t c1, unicode_t c2 = NOCHAR);
872     int expand (unicode_t c, wchar_t *r);
873 pcg 1.51 compose_char *operator [](text_t c)
874     {
875     return c >= COMPOSE_LO && c < COMPOSE_LO + v.size ()
876     ? &v[c - COMPOSE_LO]
877     : 0;
878     }
879     };
880    
881     extern class rxvt_composite_vec rxvt_composite;
882     #endif
883    
884 root 1.187 /****************************************************************************/
885 pcg 1.51
886 root 1.140 #ifdef KEYSYM_RESOURCE
887 root 1.252 class keyboard_manager;
888 root 1.140 #endif
889    
890 ayin 1.340 typedef struct rxvt_term *rxvt_t;
891    
892     extern rxvt_t rxvt_current_term;
893    
894     #define SET_R(r) rxvt_current_term = const_cast<rxvt_term *>(r)
895     #define GET_R rxvt_current_term
896    
897 root 1.372 /* ------------------------------------------------------------------------- */
898     struct overlay_base
899     {
900     int x, y, w, h; // overlay dimensions
901     text_t **text;
902     rend_t **rend;
903    
904 sf-exg 1.413 // while tempting to add swap() etc. here, it effectively only increases code size
905 root 1.372 };
906    
907     /* ------------------------------------------------------------------------- */
908    
909     typedef struct
910     {
911 ayin 1.340 int row;
912     int col;
913     } row_col_t;
914    
915     /*
916     * terminal limits:
917     *
918     * width : 1 <= width
919     * height : 1 <= height
920     * ncol : 1 <= ncol <= MAX(tlen_t)
921     * nrow : 1 <= nrow <= MAX(int)
922     * saveLines : 0 <= saveLines <= MAX(int)
923     * term_start : 0 <= term_start < saveLines
924     * total_rows : nrow + saveLines
925     *
926     * top_row : -saveLines <= top_row <= 0
927     * view_start : top_row <= view_start <= 0
928     *
929     * | most coordinates are stored relative to term_start,
930     * ROW_BUF | which is the first line of the terminal screen
931     * |························= row_buf[0]
932     * |························= row_buf[1]
933     * |························= row_buf[2] etc.
934     * |
935     * +------------+···········= term_start + top_row
936     * | scrollback |
937     * | scrollback +---------+·= term_start + view_start
938     * | scrollback | display |
939     * | scrollback | display |
940     * +------------+·display·+·= term_start
941     * | terminal | display |
942     * | terminal +---------+
943     * | terminal |
944     * | terminal |
945 ayin 1.364 * +------------+···········= term_start + nrow - 1
946 ayin 1.340 * |
947     * |
948     * END······················= total_rows
949     */
950    
951 root 1.372 struct TermWin_t
952     {
953 sf-exg 1.464 int vt_width; /* actual window width [pixels] */
954     int vt_height; /* actual window height [pixels] */
955 ayin 1.340 int width; /* window width [pixels] */
956     int height; /* window height [pixels] */
957     int fwidth; /* font width [pixels] */
958     int fheight; /* font height [pixels] */
959     int fbase; /* font ascent (baseline) [pixels] */
960     int ncol; /* window columns [characters] */
961     int nrow; /* window rows [characters] */
962 sf-exg 1.449 int focus; /* window has focus */
963     int mapped; /* window state mapped? */
964 ayin 1.340 int int_bwidth; /* internal border width */
965     int ext_bwidth; /* external border width */
966     int lineSpace; /* number of extra pixels between rows */
967 root 1.377 int letterSpace; /* number of extra pixels between columns */
968 ayin 1.340 int saveLines; /* number of lines that fit in scrollback */
969     int total_rows; /* total number of rows in this terminal */
970     int term_start; /* term lines start here */
971     int view_start; /* scrollback view starts here */
972     int top_row; /* topmost row index of scrollback */
973 sf-exg 1.439 Window parent; /* parent identifier */
974 ayin 1.340 Window vt; /* vt100 window */
975     GC gc; /* GC for drawing */
976     rxvt_drawable *drawable;
977     rxvt_fontset *fontset[4];
978     };
979    
980     /*
981     * screen accounting:
982     * screen_t elements
983     * row: Cursor row position : 0 <= row < nrow
984     * col: Cursor column position : 0 <= col < ncol
985     * tscroll: Scrolling region top row inclusive : 0 <= row < nrow
986     * bscroll: Scrolling region bottom row inclusive : 0 <= row < nrow
987     *
988     * selection_t elements
989     * clicks: 1, 2 or 3 clicks - 4 indicates a special condition of 1 where
990     * nothing is selected
991     * beg: row/column of beginning of selection : never past mark
992     * mark: row/column of initial click : never past end
993     * end: row/column of one character past end of selection
994 ayin 1.365 * * Note: top_row <= beg.row <= mark.row <= end.row < nrow
995 ayin 1.340 * * Note: col == -1 ==> we're left of screen
996     *
997     */
998 root 1.372 struct screen_t
999     {
1000 ayin 1.340 row_col_t cur; /* cursor position on the screen */
1001     int tscroll; /* top of settable scroll region */
1002     int bscroll; /* bottom of settable scroll region */
1003     unsigned int charset; /* character set number [0..3] */
1004     unsigned int flags; /* see below */
1005     row_col_t s_cur; /* saved cursor position */
1006     unsigned int s_charset; /* saved character set number [0..3] */
1007     char s_charset_char;
1008     rend_t s_rstyle; /* saved rendition style */
1009 root 1.372 };
1010 ayin 1.340
1011 root 1.372 enum selection_op_t
1012     {
1013 ayin 1.340 SELECTION_CLEAR = 0, /* nothing selected */
1014     SELECTION_INIT, /* marked a point */
1015     SELECTION_BEGIN, /* started a selection */
1016     SELECTION_CONT, /* continued selection */
1017     SELECTION_DONE /* selection put in CUT_BUFFER0 */
1018     };
1019    
1020 root 1.372 struct selection_t
1021     {
1022 ayin 1.340 wchar_t *text; /* selected text */
1023     unsigned int len; /* length of selected text */
1024     unsigned int screen; /* screen being used */
1025     unsigned int clicks; /* number of clicks */
1026     selection_op_t op; /* current operation */
1027     bool rect; /* rectangular selection? */
1028     row_col_t beg; /* beginning of selection <= mark */
1029     row_col_t mark; /* point of initial click <= end */
1030     row_col_t end; /* one character past end point */
1031 sf-exg 1.380 wchar_t *clip_text; /* text copied to the clipboard */
1032     unsigned int clip_len; /* length of clipboard text */
1033 root 1.372 };
1034 ayin 1.340
1035     /* ------------------------------------------------------------------------- */
1036    
1037     /* screen_t flags */
1038     #define Screen_Relative (1<<0) /* relative origin mode flag */
1039     #define Screen_VisibleCursor (1<<1) /* cursor visible? */
1040     #define Screen_Autowrap (1<<2) /* auto-wrap flag */
1041     #define Screen_Insert (1<<3) /* insert mode (vs. overstrike) */
1042     #define Screen_WrapNext (1<<4) /* need to wrap for next char? */
1043     #define Screen_DefaultFlags (Screen_VisibleCursor | Screen_Autowrap)
1044    
1045     /* rxvt_vars.options */
1046     enum {
1047 root 1.419 # define def(name) Opt_ ## name,
1048     # define nodef(name) Opt_prev_ ## name, Opt_ ## name = 0, Opt_next_ ## name = Opt_prev_ ## name - 1,
1049     Opt_0,
1050 ayin 1.340 # include "optinc.h"
1051     # undef nodef
1052     # undef def
1053 root 1.419 Opt_count
1054 ayin 1.340 };
1055    
1056     /* ------------------------------------------------------------------------- */
1057    
1058 root 1.372 struct rxvt_vars : TermWin_t
1059     {
1060 ayin 1.340 scrollBar_t scrollBar;
1061     uint8_t options[(Opt_count + 7) >> 3];
1062     XSizeHints szHint;
1063     rxvt_color *pix_colors;
1064     Cursor TermWin_cursor; /* cursor for vt window */
1065 root 1.487
1066 sf-exg 1.444 line_t *row_buf; // all lines, scrollback + terminal, circular
1067 ayin 1.340 line_t *drawn_buf; // text on screen
1068     line_t *swap_buf; // lines for swap buffer
1069     char *tabs; /* per location: 1 == tab-stop */
1070     screen_t screen;
1071     screen_t swap;
1072     selection_t selection;
1073 ayin 1.341 rxvt_color pix_colors_focused[TOTAL_COLORS];
1074     #ifdef OFF_FOCUS_FADING
1075     rxvt_color pix_colors_unfocused[TOTAL_COLORS];
1076     #endif
1077 ayin 1.340 };
1078    
1079 root 1.372 struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen
1080     {
1081 root 1.252
1082     // special markers with magic addresses
1083     static const char resval_undef []; // options specifically unset
1084     static const char resval_on []; // boolean options switched on
1085     static const char resval_off []; // or off
1086 ayin 1.316
1087 root 1.252 log_callback *log_hook; // log error messages through this hook, if != 0
1088 root 1.170 getfd_callback *getfd_hook; // convert remote to local fd, if != 0
1089 root 1.180 #if ENABLE_PERL
1090 root 1.190 rxvt_perl_term perl;
1091 root 1.180 #endif
1092 pcg 1.69 struct mbstate mbstate; // current input multibyte state
1093 pcg 1.10
1094 pcg 1.3 unsigned char want_refresh:1,
1095 pcg 1.10 current_screen:1, /* primary or secondary */
1096 pcg 1.3 num_scr_allow:1,
1097 pcg 1.10 bypass_keystate:1,
1098 root 1.374 #if ENABLE_FRILLS
1099 root 1.367 urgency_hint:1,
1100     #endif
1101 root 1.374 #if CURSOR_BLINK
1102 pcg 1.3 hidden_cursor:1,
1103 pcg 1.10 #endif
1104 root 1.374 #if TEXT_BLINK
1105 pcg 1.24 hidden_text:1,
1106     #endif
1107 root 1.374 #if POINTER_BLANK
1108 pcg 1.3 hidden_pointer:1,
1109 pcg 1.10 #endif
1110 sf-exg 1.383 enc_utf8:1, /* whether locale uses utf-8 */
1111     seen_input:1, /* whether we have seen some program output yet */
1112     seen_resize:1, /* whether we had a resize event */
1113 sf-exg 1.461 init_done:1,
1114 pcg 1.70 parsed_geometry:1;
1115 pcg 1.1
1116 pcg 1.3 unsigned char refresh_type,
1117 pcg 1.1 #ifdef META8_OPTION
1118 sf-exg 1.435 meta_char; /* Alt-key prefix */
1119 pcg 1.1 #endif
1120     /* ---------- */
1121 root 1.231 bool rvideo_state, rvideo_mode;
1122     #ifndef NO_BELL
1123     bool rvideo_bell;
1124     #endif
1125 sf-exg 1.379 int num_scr; /* screen: number of lines scrolled */
1126 root 1.124 int prev_ncol, /* screen: previous number of columns */
1127 pcg 1.69 prev_nrow; /* screen: previous number of rows */
1128 pcg 1.1 /* ---------- */
1129 pcg 1.3 rend_t rstyle;
1130 pcg 1.1 /* ---------- */
1131     #ifdef SELECTION_SCROLLING
1132 root 1.78 int scroll_selection_lines;
1133 pcg 1.3 int selection_save_x,
1134     selection_save_y,
1135 root 1.78 selection_save_state;
1136 pcg 1.1 #endif
1137     /* ---------- */
1138 pcg 1.3 int csrO, /* Hops - csr offset in thumb/slider to */
1139     /* give proper Scroll behaviour */
1140 pcg 1.1 #if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
1141 pcg 1.3 mouse_slip_wheel_speed,
1142 pcg 1.1 #endif
1143 pcg 1.3 refresh_count,
1144     window_vt_x,
1145     window_vt_y,
1146 ayin 1.313 mouse_row,
1147     mouse_col,
1148 pcg 1.1 # ifdef POINTER_BLANK
1149 pcg 1.3 pointerBlankDelay,
1150 pcg 1.1 # endif
1151 sf-exg 1.534 multiClickTime,
1152 sf-exg 1.535 cursor_type,
1153 pcg 1.3 allowedxerror;
1154 pcg 1.1 /* ---------- */
1155 root 1.140 unsigned int ModLevel3Mask,
1156     ModMetaMask,
1157 root 1.124 ModNumLockMask;
1158 root 1.102 unsigned long priv_modes,
1159 pcg 1.3 SavedModes;
1160 pcg 1.1 /* ---------- */
1161 root 1.242 Atom *xa;
1162 pcg 1.1 /* ---------- */
1163 pcg 1.3 Time selection_time,
1164 sf-exg 1.380 clipboard_time;
1165 sf-exg 1.436 rxvt_selection *selection_req;
1166 pcg 1.3 pid_t cmd_pid; /* process id of child */
1167 pcg 1.1 /* ---------- */
1168 pcg 1.3 struct mouse_event MEvent;
1169     XComposeStatus compose;
1170 sf-exg 1.414 static struct termios def_tio;
1171 pcg 1.3 row_col_t oldcursor;
1172 sf-exg 1.512
1173 sasha 1.283 #ifdef HAVE_BG_PIXMAP
1174 sf-exg 1.429 void bg_init ();
1175     void bg_destroy ();
1176    
1177 root 1.498 # if BG_IMAGE_FROM_FILE
1178 sf-exg 1.502 rxvt_image fimage;
1179 sf-exg 1.517 void render_image (rxvt_image &image);
1180 sf-exg 1.429 # endif
1181    
1182 sf-exg 1.511 # if BG_IMAGE_FROM_ROOT
1183 sf-exg 1.505 rxvt_img *root_img;
1184 sf-exg 1.491 image_effects root_effects;
1185 sf-exg 1.429
1186 sf-exg 1.517 void render_root_image ();
1187 sf-exg 1.429 # endif
1188    
1189 sf-exg 1.433 ev_tstamp bg_valid_since;
1190 sf-exg 1.429
1191     bool bg_window_size_sensitive ();
1192     bool bg_window_position_sensitive ();
1193    
1194 sf-exg 1.503 void bg_render ();
1195 sasha 1.283 #endif
1196 pcg 1.1
1197 sf-exg 1.512 #ifdef HAVE_IMG
1198     enum {
1199     BG_IS_TRANSPARENT = 1 << 1,
1200     BG_NEEDS_REFRESH = 1 << 2,
1201     BG_INHIBIT_RENDER = 1 << 3,
1202     };
1203    
1204     uint8_t bg_flags;
1205    
1206     rxvt_img *bg_img;
1207     #endif
1208    
1209 root 1.102 #if ENABLE_OVERLAY
1210 root 1.372 overlay_base ov;
1211 root 1.102
1212 root 1.227 void scr_swap_overlay () NOTHROW;
1213     void scr_overlay_new (int x, int y, int w, int h) NOTHROW;
1214     void scr_overlay_off () NOTHROW;
1215 root 1.102 void scr_overlay_set (int x, int y,
1216     text_t text,
1217 root 1.227 rend_t rend = OVERLAY_RSTYLE) NOTHROW;
1218     void scr_overlay_set (int x, int y, const char *s) NOTHROW;
1219     void scr_overlay_set (int x, int y, const wchar_t *s) NOTHROW;
1220 root 1.102 #endif
1221    
1222 pcg 1.69 vector<void *> allocated; // free these memory blocks with free()
1223 pcg 1.60
1224 root 1.499 int parent_x, parent_y; // parent window position relative to root, only updated on demand
1225    
1226 pcg 1.3 char *locale;
1227     char charsets[4];
1228 root 1.186 char *v_buffer; /* pointer to physical buffer */
1229 pcg 1.69 unsigned int v_buflen; /* size of area to write */
1230 root 1.243 stringvec *argv, *envv; /* if != 0, will be freed at destroy time */
1231 sf-exg 1.538 char **env;
1232 root 1.140
1233 pcg 1.1 #ifdef KEYSYM_RESOURCE
1234 root 1.140 keyboard_manager *keyboard;
1235 pcg 1.1 #endif
1236 ayin 1.322 #ifndef NO_RESOURCES
1237     XrmDatabase option_db;
1238     #endif
1239 root 1.140
1240 pcg 1.3 const char *rs[NUM_RESOURCES];
1241 pcg 1.60 /* command input buffering */
1242 root 1.186 char *cmdbuf_ptr, *cmdbuf_endp;
1243     char cmdbuf_base[CBUFSIZ];
1244 pcg 1.3
1245 root 1.234 ptytty *pty;
1246 root 1.213
1247 root 1.487 // chunk contains all line_t's as well as rend_t and text_t buffers
1248     // for drawn_buf, swap_buf and row_buf, in this order
1249     void *chunk;
1250     size_t chunk_size;
1251 pcg 1.69
1252     static vector<rxvt_term *> termlist; // a vector of all running rxvt_term's
1253 pcg 1.12
1254 root 1.102 #if ENABLE_FRILLS || ISO_14755
1255 root 1.91 // ISO 14755 entry support
1256     unicode_t iso14755buf;
1257     void commit_iso14755 ();
1258 root 1.102 # if ISO_14755
1259 root 1.501 void iso14755_51 (unicode_t ch, rend_t r = DEFAULT_RSTYLE, int x = 0, int y = -1, int y2 = -1);
1260 root 1.102 void iso14755_54 (int x, int y);
1261     # endif
1262 root 1.91 #endif
1263    
1264 ayin 1.313 long vt_emask, vt_emask_perl, vt_emask_xim, vt_emask_mouse;
1265 root 1.201
1266 root 1.227 void vt_select_input () const NOTHROW
1267 root 1.201 {
1268 ayin 1.313 XSelectInput (dpy, vt, vt_emask | vt_emask_perl | vt_emask_xim | vt_emask_mouse);
1269 root 1.201 }
1270 pcg 1.10
1271 sf-exg 1.511 #if BG_IMAGE_FROM_ROOT || ENABLE_PERL
1272 pcg 1.31 void rootwin_cb (XEvent &xev);
1273     xevent_watcher rootwin_ev;
1274 ayin 1.272 #endif
1275 sasha 1.293 #ifdef HAVE_BG_PIXMAP
1276 root 1.335 void update_background ();
1277 root 1.318 void update_background_cb (ev::timer &w, int revents);
1278     ev::timer update_background_ev;
1279 root 1.91 #endif
1280 pcg 1.31
1281     void x_cb (XEvent &xev);
1282     xevent_watcher termwin_ev;
1283     xevent_watcher vt_ev;
1284     xevent_watcher scrollbar_ev;
1285    
1286 root 1.318 void child_cb (ev::child &w, int revents); ev::child child_ev;
1287 root 1.321 void destroy_cb (ev::idle &w, int revents); ev::idle destroy_ev;
1288 root 1.333 void refresh_check ();
1289 ayin 1.311 void flush ();
1290 root 1.318 void flush_cb (ev::timer &w, int revents); ev::timer flush_ev;
1291 root 1.438 void cmdbuf_reify ();
1292     void cmdbuf_append (const char *str, size_t count);
1293 ayin 1.311 bool pty_fill ();
1294 root 1.318 void pty_cb (ev::io &w, int revents); ev::io pty_ev;
1295 pcg 1.3
1296 pcg 1.5 #ifdef CURSOR_BLINK
1297 sf-exg 1.471 void cursor_blink_reset ();
1298 root 1.318 void cursor_blink_cb (ev::timer &w, int revents); ev::timer cursor_blink_ev;
1299 pcg 1.25 #endif
1300     #ifdef TEXT_BLINK
1301 root 1.318 void text_blink_cb (ev::timer &w, int revents); ev::timer text_blink_ev;
1302 pcg 1.6 #endif
1303 ayin 1.316 #ifndef NO_BELL
1304 root 1.318 void bell_cb (ev::timer &w, int revents); ev::timer bell_ev;
1305 root 1.231 #endif
1306 pcg 1.6
1307 root 1.78 #ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING
1308 root 1.318 void cont_scroll_cb (ev::timer &w, int revents); ev::timer cont_scroll_ev;
1309 root 1.78 #endif
1310     #ifdef SELECTION_SCROLLING
1311 root 1.318 void sel_scroll_cb (ev::timer &w, int revents); ev::timer sel_scroll_ev;
1312 root 1.78 #endif
1313     #if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
1314 root 1.318 void slip_wheel_cb (ev::timer &w, int revents); ev::timer slip_wheel_ev;
1315 root 1.78 #endif
1316    
1317 pcg 1.6 #ifdef POINTER_BLANK
1318 root 1.318 void pointer_cb (ev::timer &w, int revents); ev::timer pointer_ev;
1319 pcg 1.6 void pointer_blank ();
1320 root 1.83 #endif
1321 pcg 1.6 void pointer_unblank ();
1322 pcg 1.9
1323     void tt_printf (const char *fmt,...);
1324 root 1.532 void tt_write_ (const char *data, unsigned int len);
1325     void tt_write (const char *data, unsigned int len);
1326 sf-exg 1.529 void tt_write_user_input (const char *data, unsigned int len);
1327 root 1.130 void pty_write ();
1328 pcg 1.5
1329 root 1.206 void make_current () const // make this the "currently active" urxvt instance
1330     {
1331     SET_R (this);
1332 sf-exg 1.538 set_environ (env);
1333 root 1.206 rxvt_set_locale (locale);
1334     }
1335 root 1.205
1336 pcg 1.18 #if USE_XIM
1337 root 1.236 rxvt_xim *input_method;
1338     XIC Input_Context;
1339     XIMStyle input_style;
1340     XPoint spot; // most recently sent spot position
1341 root 1.124
1342 pcg 1.33 void im_destroy ();
1343     void im_cb (); im_watcher im_ev;
1344 root 1.102 void im_set_size (XRectangle &size);
1345 root 1.227 void im_set_position (XPoint &pos) NOTHROW;
1346 root 1.102 void im_set_color (unsigned long &fg, unsigned long &bg);
1347     void im_set_preedit_area (XRectangle &preedit_rect, XRectangle &status_rect, const XRectangle &needed_rect);
1348 pcg 1.33
1349 sf-exg 1.445 bool im_is_running ();
1350     void im_send_spot ();
1351     bool im_get_ic (const char *modifiers);
1352     void im_set_position ();
1353 pcg 1.18 #endif
1354    
1355 pcg 1.27 // command.C
1356 root 1.255 void key_press (XKeyEvent &ev);
1357     void key_release (XKeyEvent &ev);
1358 root 1.78
1359 root 1.227 wchar_t next_char () NOTHROW;
1360     wchar_t cmd_getc () THROW ((class out_of_input));
1361     uint32_t next_octet () NOTHROW;
1362     uint32_t cmd_get8 () THROW ((class out_of_input));
1363 root 1.78
1364 root 1.368 void cmd_parse ();
1365 pcg 1.40 void mouse_report (XButtonEvent &ev);
1366     void button_press (XButtonEvent &ev);
1367     void button_release (XButtonEvent &ev);
1368 root 1.150 void focus_in ();
1369     void focus_out ();
1370 root 1.374 #if ENABLE_FRILLS
1371 root 1.367 void set_urgency (bool enable);
1372 root 1.374 #else
1373     void set_urgency (bool enable) { }
1374     #endif
1375 root 1.258 void update_fade_color (unsigned int idx);
1376 pcg 1.27 #ifdef PRINTPIPE
1377 pcg 1.39 FILE *popen_printer ();
1378 pcg 1.27 int pclose_printer (FILE *stream);
1379     #endif
1380     void process_print_pipe ();
1381 pcg 1.60 void process_nonprinting (unicode_t ch);
1382     void process_escape_vt52 (unicode_t ch);
1383 pcg 1.27 void process_escape_seq ();
1384     void process_csi_seq ();
1385     void process_window_ops (const int *args, unsigned int nargs);
1386 root 1.186 char *get_to_st (unicode_t &ends_how);
1387 pcg 1.27 void process_dcs_seq ();
1388     void process_osc_seq ();
1389 root 1.186 void process_color_seq (int report, int color, const char *str, char resp);
1390 sf-exg 1.425 void process_xterm_seq (int op, char *str, char resp);
1391 pcg 1.27 int privcases (int mode, unsigned long bit);
1392     void process_terminal_mode (int mode, int priv, unsigned int nargs, const int *arg);
1393     void process_sgr_mode (unsigned int nargs, const int *arg);
1394 sf-exg 1.522 void set_cursor_style (int style);
1395 pcg 1.27 // init.C
1396 root 1.454 void init (stringvec *argv, stringvec *envv);
1397     void init (int argc, const char *const *argv, const char *const *envv);
1398     void init2 (int argc, const char *const *argv);
1399 ayin 1.329 void init_vars ();
1400 ayin 1.311 const char **init_resources (int argc, const char *const *argv);
1401     void init_env ();
1402     void set_locale (const char *locale);
1403     void init_xlocale ();
1404     void init_command (const char *const *argv);
1405     void run_command (const char *const *argv);
1406     int run_child (const char *const *argv);
1407     void color_aliases (int idx);
1408     void create_windows (int argc, const char *const *argv);
1409 ayin 1.363 void get_colours ();
1410 pcg 1.27 void get_ourmods ();
1411 sf-exg 1.415 void set_icon (const char *file);
1412 root 1.102 // main.C
1413 ayin 1.311 void tt_winch ();
1414     rxvt_term ();
1415     ~rxvt_term ();
1416     void destroy ();
1417     void emergency_cleanup ();
1418     void recolour_cursor ();
1419     void resize_all_windows (unsigned int newwidth, unsigned int newheight, int ignoreparent);
1420     void window_calc (unsigned int newwidth, unsigned int newheight);
1421 root 1.121 bool set_fonts ();
1422 root 1.128 void set_string_property (Atom prop, const char *str, int len = -1);
1423 sf-exg 1.410 void set_mbstring_property (Atom prop, const char *str, int len = -1);
1424 root 1.128 void set_utf8_property (Atom prop, const char *str, int len = -1);
1425 pcg 1.27 void set_title (const char *str);
1426 pcg 1.60 void set_icon_name (const char *str);
1427 pcg 1.27 void set_window_color (int idx, const char *color);
1428 sf-exg 1.462 char *get_colorfgbg ();
1429 root 1.249 bool set_color (rxvt_color &color, const char *name);
1430 root 1.253 void alias_color (int dst, int src);
1431 root 1.162 void set_widthheight (unsigned int newwidth, unsigned int newheight);
1432 sasha 1.305 void get_window_origin (int &x, int &y);
1433 pcg 1.27
1434     // screen.C
1435 root 1.162
1436 root 1.510 bool option (uint8_t opt) const NOTHROW
1437     {
1438     return options[opt >> 3] & (1 << (opt & 7));
1439     }
1440    
1441     void set_option (uint8_t opt, bool set = true) NOTHROW;
1442    
1443 root 1.227 int fgcolor_of (rend_t r) const NOTHROW
1444 root 1.173 {
1445     int base = GET_BASEFG (r);
1446     #ifndef NO_BRIGHTCOLOR
1447     if (r & RS_Bold
1448 root 1.175 # if ENABLE_STYLES
1449 root 1.269 && option (Opt_intensityStyles)
1450 root 1.175 # endif
1451 sf-exg 1.450 && IN_RANGE_EXC (base, minCOLOR, minBrightCOLOR))
1452 root 1.173 base += minBrightCOLOR - minCOLOR;
1453     #endif
1454     return base;
1455     }
1456    
1457 root 1.227 int bgcolor_of (rend_t r) const NOTHROW
1458 root 1.173 {
1459     int base = GET_BASEBG (r);
1460     #ifndef NO_BRIGHTCOLOR
1461     if (r & RS_Blink
1462 root 1.175 # if ENABLE_STYLES
1463 root 1.269 && option (Opt_intensityStyles)
1464 root 1.175 # endif
1465 sf-exg 1.450 && IN_RANGE_EXC (base, minCOLOR, minBrightCOLOR))
1466 root 1.173 base += minBrightCOLOR - minCOLOR;
1467     #endif
1468     return base;
1469     }
1470    
1471 ayin 1.311 // modifies first argument(!)
1472 sf-exg 1.412 void tt_paste (char *data, unsigned int len) NOTHROW;
1473 ayin 1.311 void paste (char *data, unsigned int len) NOTHROW;
1474 root 1.487 void scr_alloc () NOTHROW;
1475 root 1.227 void scr_blank_line (line_t &l, unsigned int col, unsigned int width, rend_t efs) const NOTHROW;
1476     void scr_blank_screen_mem (line_t &l, rend_t efs) const NOTHROW;
1477 root 1.370 void scr_kill_char (line_t &l, int col) const NOTHROW;
1478 sf-exg 1.520 void scr_set_char_rend (line_t &l, int col, rend_t rend);
1479 root 1.227 int scr_scroll_text (int row1, int row2, int count) NOTHROW;
1480 sf-exg 1.518 void copy_line (line_t &dst, line_t &src);
1481 root 1.102 void scr_reset ();
1482 root 1.227 void scr_release () NOTHROW;
1483     void scr_clear (bool really = false) NOTHROW;
1484     void scr_refresh () NOTHROW;
1485     bool scr_refresh_rend (rend_t mask, rend_t value) NOTHROW;
1486     void scr_erase_screen (int mode) NOTHROW;
1487 root 1.154 #if ENABLE_FRILLS
1488 root 1.227 void scr_erase_savelines () NOTHROW;
1489     void scr_backindex () NOTHROW;
1490     void scr_forwardindex () NOTHROW;
1491 root 1.154 #endif
1492 root 1.227 void scr_touch (bool refresh) NOTHROW;
1493     void scr_expose (int x, int y, int width, int height, bool refresh) NOTHROW;
1494 sf-exg 1.428 void scr_recolour (bool refresh = true) NOTHROW;
1495 root 1.227 void scr_remap_chars () NOTHROW;
1496     void scr_remap_chars (line_t &l) NOTHROW;
1497 root 1.102
1498 root 1.224 enum cursor_mode { SAVE, RESTORE };
1499    
1500 root 1.237 void scr_poweron ();
1501 root 1.371 void scr_soft_reset () NOTHROW;
1502 root 1.227 void scr_cursor (cursor_mode mode) NOTHROW;
1503     void scr_do_wrap () NOTHROW;
1504 root 1.237 void scr_swap_screen () NOTHROW;
1505     void scr_change_screen (int scrn);
1506 root 1.227 void scr_color (unsigned int color, int fgbg) NOTHROW;
1507     void scr_rendition (int set, int style) NOTHROW;
1508     void scr_add_lines (const wchar_t *str, int len, int minlines = 0) NOTHROW;
1509     void scr_backspace () NOTHROW;
1510     void scr_tab (int count, bool ht = false) NOTHROW;
1511     void scr_gotorc (int row, int col, int relative) NOTHROW;
1512     void scr_index (enum page_dirn direction) NOTHROW;
1513     void scr_erase_line (int mode) NOTHROW;
1514     void scr_E () NOTHROW;
1515     void scr_insdel_lines (int count, int insdel) NOTHROW;
1516     void scr_insdel_chars (int count, int insdel) NOTHROW;
1517     void scr_scroll_region (int top, int bot) NOTHROW;
1518     void scr_cursor_visible (int mode) NOTHROW;
1519     void scr_autowrap (int mode) NOTHROW;
1520     void scr_relative_origin (int mode) NOTHROW;
1521     void scr_insert_mode (int mode) NOTHROW;
1522     void scr_set_tab (int mode) NOTHROW;
1523 root 1.231 void scr_rvideo_mode (bool on) NOTHROW;
1524 root 1.227 void scr_report_position () NOTHROW;
1525     void set_font_style () NOTHROW;
1526     void scr_charset_choose (int set) NOTHROW;
1527     void scr_charset_set (int set, unsigned int ch) NOTHROW;
1528     void scr_move_to (int y, int len) NOTHROW;
1529 root 1.523 bool scr_page (int nlines) NOTHROW;
1530     bool scr_page (enum page_dirn direction, int nlines) NOTHROW
1531     {
1532 sf-exg 1.526 return scr_page (direction * nlines);
1533 root 1.523 }
1534 root 1.227 bool scr_changeview (int new_view_start) NOTHROW;
1535     void scr_bell () NOTHROW;
1536     void scr_printscreen (int fullhist) NOTHROW;
1537     void scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle1, rend_t rstyle2) NOTHROW;
1538     void scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle) NOTHROW;
1539     void scr_reverse_selection () NOTHROW;
1540     void scr_dump (int fd) NOTHROW;
1541    
1542     void selection_check (int check_more) NOTHROW;
1543 root 1.521 void selection_changed () NOTHROW; /* sets want_refresh, corrects coordinates */
1544 root 1.228 void selection_request (Time tm, int selnum = Sel_Primary) NOTHROW;
1545 sf-exg 1.380 void selection_clear (bool clipboard = false) NOTHROW;
1546 pcg 1.27 void selection_make (Time tm);
1547 sf-exg 1.380 bool selection_grab (Time tm, bool clipboard = false) NOTHROW;
1548 root 1.227 void selection_start_colrow (int col, int row) NOTHROW;
1549     void selection_delimit_word (enum page_dirn dirn, const row_col_t *mark, row_col_t *ret) NOTHROW;
1550     void selection_extend_colrow (int32_t col, int32_t row, int button3, int buttonpress, int clickchange) NOTHROW;
1551     void selection_remove_trailing_spaces () NOTHROW;
1552     void selection_send (const XSelectionRequestEvent &rq) NOTHROW;
1553     void selection_click (int clicks, int x, int y) NOTHROW;
1554     void selection_extend (int x, int y, int flag) NOTHROW;
1555     void selection_rotate (int x, int y) NOTHROW;
1556    
1557 pcg 1.27 // xdefaults.C
1558 root 1.500 void rxvt_usage (int type);
1559 sf-exg 1.455 const char **get_options (int argc, const char *const *argv);
1560 sf-exg 1.536 int parse_keysym (const char *str, unsigned int &state);
1561 sf-exg 1.530 int bind_action (const char *str, const char *arg);
1562 ayin 1.311 const char *x_resource (const char *name);
1563 root 1.145 void extract_resources ();
1564 root 1.533 void enumerate_keysym_resources (void (*cb)(rxvt_term *, const char *, const char *));
1565 sf-exg 1.451 void extract_keysym_resources ();
1566 pcg 1.1 };
1567 pcg 1.16
1568 ayin 1.319 #endif /* _RXVT_H_ */
1569 pcg 1.5