ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/rxvt-unicode/src/rxvt.h
Revision: 1.549
Committed: Thu Jun 30 11:33:43 2016 UTC (8 years ago) by sf-exg
Content type: text/plain
Branch: MAIN
Changes since 1.548: +7 -1 lines
Log Message:
24-bit color cube collision avoidance (patch by Fengguang Wu)

When the color cube slot is found to be already occupied by a similar
24-bit color, search through the -1, 0, +1 R/G/B indices trying to find
an empty slot, or the oldest used one (which hopefully is no longer in
active use).

This effectively reduces random collisions, hence make it pretty hard to
hit a vim GUI color scheme that cannot be correctly showed in urxvt.

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