ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/rxvt-unicode/src/rxvt.h
Revision: 1.403
Committed: Sat Apr 17 23:00:45 2010 UTC (16 years, 6 months ago) by sf-exg
Content type: text/plain
Branch: MAIN
Changes since 1.402: +3 -1 lines
Log Message:
Disable colorRV resource.
Make OSC 17 apply to highlightColor.
Make highlightColor apply also to selected cells with reverse video.
Add highlightTextColor resource to change the foreground colour of
highlighted characters.

File Contents

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