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

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

File Contents

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