ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvt.h
Revision: 1.547
Committed: Tue Jun 21 12:03:56 2016 UTC (8 years ago) by sf-exg
Content type: text/plain
Branch: MAIN
Changes since 1.546: +25 -2 lines
Log Message:
24-bit direct color support (patch by Fengguang Wu)

Support directly setting RGB fg/bg colors via ISO-8613-3 24-bit
ANSI color escapes:

  ESC[38;2;<r>;<g>;<b>m Select RGB foreground color
  ESC[48;2;<r>;<g>;<b>m Select RGB background color

The killer applications for me are vim in tmux. It'll not only modernize
their look and feeling, but also bring more eye friendly color schemes.
Very helpful for long time programmers.

To avoid memory overheads and keep the patch non-intrusive, it takes the
approach to adapt the nearest color in an hidden 6x6x4 (88-color mode)
or 7x7x5 (256-color mode) color cube to the new 24-bit RGB color.

The pros/cons are:

+) least memory footprint (close to 0)
   comparing to konsole, gnome-terminal etc. real 24-bit arrays

+) exact colors and excellent user feelings
   comparing to xterm, mlterm, etc. approximating to 256 palette

+) usable in both the existing 88/256-color modes

   Most vim GUI color schemes show up the same as gvim in rxvt-unicode's
   88-color mode, not to mention the 256-color mode. Typical applications
   only use one or two dozens of colors at the same time.

-) may not be able to show 2+ close 24-bit colors

   RGB colors close to each other will likely fall into the same slot in
   the 6x6x4 or 7x7x5 color cube. If necessary, it could be improved
   effectively by implementing some collision avoidance logic, trying to
   find empty/eldest slot in the +1/-1 r/g/b indices (ie. 3-8 neighbors).

The CPU overheads of map_rgb24_color() look ignorable: I feel no
perceptible slow down when doing vim operations in 24-bit color mode.

A micro benchmark running a test script from [1]:

% time (for i in {1..100}; do 24-bit-color.sh; done)

vanilla rxvt-unicode
====================
  2.42s user 1.88s system 31% cpu 13.555 total
  2.59s user 1.74s system 31% cpu 13.615 total
  2.46s user 1.85s system 31% cpu 13.631 total

THIS PATCH (adapt hidden color cube to 24-bit)
==============================================
  2.33s user 1.97s system 31% cpu 13.598 total
  2.46s user 1.89s system 31% cpu 13.613 total
  2.51s user 1.82s system 31% cpu 13.556 total

https://github.com/spudowiar/rxvt-unicode (real 24-bit array)
=============================================================
  2.61s user 1.75s system 31% cpu 13.721 total
  2.48s user 1.82s system 31% cpu 13.566 total
  2.60s user 1.76s system 31% cpu 13.631 total

USE_256_COLORS is defined in all the above rxvt-unicode builds.

References:

[1] True Colour (16 million colours) support in various terminal
    applications and terminals
    https://gist.github.com/XVilka/8346728

[2] https://en.wikipedia.org/wiki/ANSI_escape_code#Colors

File Contents

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