ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvt.h
Revision: 1.270
Committed: Fri Jun 8 20:04:12 2007 UTC (17 years ago) by sasha
Content type: text/plain
Branch: MAIN
Changes since 1.269: +14 -1 lines
Log Message:
added preliminary support to use libAfterImage for background pixmap loading and rendering of transparency effects including blending of pixmap over background using several methods, and gaussian blurr of the transparency background

File Contents

# Content
1 #ifndef RXVT_H_ /* include once only */
2 #define RXVT_H_
3
4 #include "rxvtlib.h"
5
6 #include "feature.h"
7
8 #if defined (ISO_14755) || defined (ENABLE_PERL)
9 # define ENABLE_OVERLAY 1
10 #endif
11
12 #if ENABLE_PERL
13 # define ENABLE_FRILLS 1
14 # define ENABLE_COMBINING 1
15 #endif
16
17 #if ENABLE_FRILLS
18 # define ENABLE_XEMBED 1
19 # define ENABLE_EWMH 1
20 # define ENABLE_XIM_ONTHESPOT 1
21 # define CURSOR_BLINK 1
22 # define OPTION_HC 1
23 #else
24 # define ENABLE_MINIMAL 1
25 #endif
26
27 #include <limits.h>
28
29 #include <X11/cursorfont.h>
30 #include <X11/keysym.h>
31 #include <X11/keysymdef.h>
32 #include <X11/Xatom.h>
33 #if ENABLE_FRILLS
34 # include <X11/Xmd.h>
35 #endif
36
37 #include "encoding.h"
38 #include "rxvtutil.h"
39 #include "rxvtfont.h"
40 #include "rxvttoolkit.h"
41 #include "iom.h"
42 #include "salloc.h"
43 #include "libptytty.h"
44
45 #include "rxvtperl.h"
46
47 // try to avoid some macros to decrease code size, on some systems
48 #if ENABLE_MINIMAL
49 # define strcmp(a,b) (strcmp)(a,b)
50 # define strlen(a) (strlen)(a)
51 # define strcpy(a,b) (strcpy)(a,b)
52 # define memset(a,c,l) (memset)(a,c,l)
53 # define memcpy(a,b,l) (memcpy)(a,b,l)
54 #endif
55
56 /*
57 *****************************************************************************
58 * SYSTEM HACKS
59 *****************************************************************************
60 */
61 /* Consistent defines - please report on the necessity
62 * @ Unixware: defines (__svr4__)
63 */
64 #if defined (SVR4) && !defined (__svr4__)
65 # define __svr4__ 1
66 #endif
67 #if defined (sun) && !defined (__sun__)
68 # define __sun__ 1
69 #endif
70
71 #ifndef HAVE_XPOINTER
72 typedef char *XPointer;
73 #endif
74
75 #include <termios.h>
76 typedef struct termios ttymode_t;
77
78 #ifdef HAVE_AFTERIMAGE
79 # include <afterimage.h>
80 #undef min
81 #undef max
82 #elif defined(XPM_BACKGROUND)
83 # ifdef XPM_INC_X11
84 # include <X11/xpm.h>
85 # else
86 # include <xpm.h>
87 # endif
88 #endif
89
90 #ifndef STDIN_FILENO
91 # define STDIN_FILENO 0
92 # define STDOUT_FILENO 1
93 # define STDERR_FILENO 2
94 #endif
95
96 /****************************************************************************/
97
98 // exception thrown on fatal (per-instance) errors
99 class rxvt_failure_exception { };
100
101 // exception thrown when the command parser runs out of input data
102 class out_of_input { };
103
104 /*
105 *****************************************************************************
106 * PROTOTYPES
107 *****************************************************************************
108 */
109 // main.C
110 RETSIGTYPE rxvt_Child_signal (int sig) NOTHROW;
111 RETSIGTYPE rxvt_Exit_signal (int sig) NOTHROW;
112 void rxvt_clean_exit () NOTHROW;
113 void * rxvt_malloc (size_t size);
114 void * rxvt_calloc (size_t number, size_t size);
115 void * rxvt_realloc (void *ptr, size_t size);
116
117 // misc.C
118 char * rxvt_wcstombs (const wchar_t *str, int len = -1);
119 wchar_t * rxvt_mbstowcs (const char *str, int len = -1);
120 char * rxvt_wcstoutf8 (const wchar_t *str, int len = -1);
121 wchar_t * rxvt_utf8towcs (const char *str, int len = -1);
122 char * rxvt_strdup_cpp (const char *str);
123
124 #define rxvt_strdup(s) ((s) ? strdup(s) : 0)
125
126 char * rxvt_r_basename (const char *str) NOTHROW;
127 void rxvt_vlog (const char *fmt, va_list arg_ptr) NOTHROW;
128 void rxvt_log (const char *fmt,...) NOTHROW;
129 void rxvt_warn (const char *fmt,...) NOTHROW;
130 void rxvt_fatal (const char *fmt, ...) THROW ((class rxvt_failure_exception)) NORETURN;
131 void rxvt_exit_failure () THROW ((class rxvt_failure_exception)) NORETURN;
132
133 int rxvt_Str_match (const char *s1, const char *s2) NOTHROW;
134 const char * rxvt_Str_skip_space (const char *str) NOTHROW;
135 char * rxvt_Str_trim (char *str) NOTHROW;
136 int rxvt_Str_escaped (char *str) NOTHROW;
137 char ** rxvt_splitcommastring (const char *cs) NOTHROW;
138 void rxvt_freecommastring (char **cs) NOTHROW;
139 char * rxvt_File_find (const char *file, const char *ext, const char *path) NOTHROW;
140
141 /////////////////////////////////////////////////////////////////////////////
142
143 // temporarily replace the process environment
144 extern char **environ;
145 extern char **rxvt_environ; // the original environ pointer
146
147 inline void set_environ (stringvec *envv)
148 {
149 #if ENABLE_PERL
150 assert (envv);
151 #else
152 if (envv)
153 #endif
154 environ = (char **)envv->begin ();
155 }
156
157 inline void set_environ (char **envv)
158 {
159 #if ENABLE_PERL
160 assert (envv);
161 #else
162 if (envv)
163 #endif
164 environ = envv;
165 }
166
167 /*
168 *****************************************************************************
169 * STRUCTURES AND TYPEDEFS
170 *****************************************************************************
171 */
172 struct grwin_t;
173
174 /* If we're using either the rxvt scrollbar, keep the
175 * scrollColor resource.
176 */
177 #if defined(RXVT_SCROLLBAR) || defined(NEXT_SCROLLBAR) || defined(PLAIN_SCROLLBAR)
178 # define KEEP_SCROLLCOLOR 1
179 #else
180 # undef KEEP_SCROLLCOLOR
181 #endif
182
183 #ifdef XPM_BACKGROUND
184 typedef struct {
185 short w, h, x, y;
186 bool auto_resize ;
187 Pixmap pixmap;
188 } bgPixmap_t;
189 #endif
190
191 /*
192 * the 'essential' information for reporting Mouse Events
193 * pared down from XButtonEvent
194 */
195 struct mouse_event {
196 int clicks;
197 Time time; /* milliseconds */
198 unsigned int state; /* key or button mask */
199 unsigned int button; /* detail */
200 };
201
202 #if ENABLE_FRILLS
203 typedef struct _mwmhints {
204 CARD32 flags;
205 CARD32 functions;
206 CARD32 decorations;
207 INT32 input_mode;
208 CARD32 status;
209 } MWMHints;
210 #endif
211
212 #if ENABLE_XEMBED
213 // XEMBED messages
214 # define XEMBED_EMBEDDED_NOTIFY 0
215 # define XEMBED_WINDOW_ACTIVATE 1
216 # define XEMBED_WINDOW_DEACTIVATE 2
217 # define XEMBED_REQUEST_FOCUS 3
218 # define XEMBED_FOCUS_IN 4
219 # define XEMBED_FOCUS_OUT 5
220 # define XEMBED_FOCUS_NEXT 6
221 # define XEMBED_FOCUS_PREV 7
222
223 # define XEMBED_MODALITY_ON 10
224 # define XEMBED_MODALITY_OFF 11
225 # define XEMBED_REGISTER_ACCELERATOR 12
226 # define XEMBED_UNREGISTER_ACCELERATOR 13
227 # define XEMBED_ACTIVATE_ACCELERATOR 14
228
229 // XEMBED detail code
230 # define XEMBED_FOCUS_CURRENT 0
231 # define XEMBED_FOCUS_FIRST 1
232 # define XEMBED_FOCUS_LAST 2
233
234 # define XEMBED_MAPPED (1 << 0)
235 #endif
236
237 /*
238 *****************************************************************************
239 * NORMAL DEFINES
240 *****************************************************************************
241 */
242
243 /* COLORTERM, TERM environment variables */
244 #define COLORTERMENV "rxvt"
245 #ifdef XPM_BACKGROUND
246 # define COLORTERMENVFULL COLORTERMENV "-xpm"
247 #else
248 # define COLORTERMENVFULL COLORTERMENV
249 #endif
250 #ifndef TERMENV
251 # define TERMENV "rxvt-unicode"
252 #endif
253
254 #if defined (NO_MOUSE_REPORT) && !defined (NO_MOUSE_REPORT_SCROLLBAR)
255 # define NO_MOUSE_REPORT_SCROLLBAR 1
256 #endif
257
258 /* now look for other badly set stuff */
259
260 #if !defined (EACCESS) && defined(EAGAIN)
261 # define EACCESS EAGAIN
262 #endif
263
264 #ifndef EXIT_SUCCESS /* missing from <stdlib.h> */
265 # define EXIT_SUCCESS 0 /* exit function success */
266 # define EXIT_FAILURE 1 /* exit function failure */
267 #endif
268
269 #define scrollBar_esc 30
270
271 #if defined(RXVT_SCROLLBAR) || defined(NEXT_SCROLLBAR) || defined(XTERM_SCROLLBAR) || defined(PLAIN_SCROLLBAR)
272 # define HAVE_SCROLLBARS 1
273 #endif
274
275 #define R_SB_ALIGN_CENTRE 0
276 #define R_SB_ALIGN_TOP 1
277 #define R_SB_ALIGN_BOTTOM 2
278
279 #define R_SB_NEXT 1
280 #define R_SB_XTERM 2
281 #define R_SB_PLAIN 4
282 #define R_SB_RXVT 8
283
284 #define SB_WIDTH_NEXT 19
285 #define SB_WIDTH_XTERM 15
286 #define SB_WIDTH_PLAIN 7
287 #ifndef SB_WIDTH_RXVT
288 # define SB_WIDTH_RXVT 10
289 #endif
290
291 /*
292 * NeXT scrollbar defines
293 */
294 #define SB_PADDING 1
295 #define SB_BORDER_WIDTH 1
296 #define SB_BEVEL_WIDTH_UPPER_LEFT 1
297 #define SB_BEVEL_WIDTH_LOWER_RIGHT 2
298 #define SB_LEFT_PADDING (SB_PADDING + SB_BORDER_WIDTH)
299 #define SB_MARGIN_SPACE (SB_PADDING * 2)
300 #define SB_BUTTON_WIDTH (SB_WIDTH_NEXT - SB_MARGIN_SPACE - SB_BORDER_WIDTH)
301 #define SB_BUTTON_HEIGHT (SB_BUTTON_WIDTH)
302 #define SB_BUTTON_SINGLE_HEIGHT (SB_BUTTON_HEIGHT + SB_PADDING)
303 #define SB_BUTTON_BOTH_HEIGHT (SB_BUTTON_SINGLE_HEIGHT * 2)
304 #define SB_BUTTON_TOTAL_HEIGHT (SB_BUTTON_BOTH_HEIGHT + SB_PADDING)
305 #define SB_BUTTON_BEVEL_X (SB_LEFT_PADDING)
306 #define SB_BUTTON_FACE_X (SB_BUTTON_BEVEL_X + SB_BEVEL_WIDTH_UPPER_LEFT)
307 #define SB_THUMB_MIN_HEIGHT (SB_BUTTON_WIDTH - (SB_PADDING * 2))
308 /*
309 * +-------------+
310 * | | <---< SB_PADDING
311 * | ::::::::::: |
312 * | ::::::::::: |
313 * '''''''''''''''''
314 * ,,,,,,,,,,,,,,,,,
315 * | ::::::::::: |
316 * | ::::::::::: |
317 * | +---------------< SB_BEVEL_WIDTH_UPPER_LEFT
318 * | | :::::::: |
319 * | V :::: vv-------< SB_BEVEL_WIDTH_LOWER_RIGHT
320 * | +---------+ |
321 * | | ......%%| |
322 * | | ......%%| |
323 * | | .. ()..%%| |
324 * | | ......%%| |
325 * | | %%%%%%%%| |
326 * | +---------+ | <.........................
327 * | | <---< SB_PADDING :
328 * | +---------+ | <-+.......... :---< SB_BUTTON_TOTAL_HEIGHT
329 * | | ......%%| | | : :
330 * | | ../\..%%| | |---< SB_BUTTON_HEIGHT :
331 * | | %%%%%%%%| | | : :
332 * | +---------+ | <-+ : :
333 * | | : :
334 * | +---------+ | <-+ :---< SB_BUTTON_BOTH_HEIGHT
335 * | | ......%%| | | : :
336 * | | ..\/..%%| | | : :
337 * | | %%%%%%%%| | |---< SB_BUTTON_SINGLE_HEIGHT
338 * | +---------+ | | : :
339 * | | | : :
340 * +-------------+ <-+.........:............:
341 * ^^|_________| :
342 * || | :
343 * || +---< SB_BUTTON_WIDTH
344 * || :
345 * |+------< SB_PADDING
346 * |: :
347 * +----< SB_BORDER_WIDTH
348 * : :
349 * :............:
350 * |
351 * +---< SB_WIDTH_NEXT
352 */
353
354 enum {
355 NO_REFRESH = 0, /* Window not visible at all! */
356 FAST_REFRESH = 1, /* Fully exposed window */
357 SLOW_REFRESH = 2, /* Partially exposed window */
358 };
359
360 #ifdef NO_SECONDARY_SCREEN
361 # define NSCREENS 0
362 #else
363 # define NSCREENS 1
364 #endif
365
366 /* special (internal) prefix for font commands */
367 #define FONT_CMD '#'
368 #define FONT_DN "#-"
369 #define FONT_UP "#+"
370
371 /* flags for rxvt_scr_gotorc () */
372 enum {
373 C_RELATIVE = 1, /* col movement is relative */
374 R_RELATIVE = 2, /* row movement is relative */
375 RELATIVE = C_RELATIVE | R_RELATIVE,
376 };
377
378 /* modes for rxvt_scr_insdel_chars (), rxvt_scr_insdel_lines () */
379 enum {
380 INSERT = -1, /* don't change these values */
381 DELETE = +1,
382 ERASE = +2,
383 };
384
385 /* modes for rxvt_scr_page () - scroll page. used by scrollbar window */
386 enum page_dirn {
387 UP,
388 DN,
389 NO_DIR,
390 };
391
392 /* arguments for rxvt_scr_change_screen () */
393 enum {
394 PRIMARY = 0,
395 SECONDARY,
396 };
397
398 #define RS_None 0
399
400 #define RS_fgMask 0x0000007fUL // 128 colors
401 #define RS_bgMask 0x00003f80UL // 128 colors
402
403 // font styles
404 #define RS_Bold 0x00004000UL // value 1
405 #define RS_Italic 0x00008000UL // value 2
406
407 // fake styles
408 #define RS_Blink 0x00010000UL // blink
409 #define RS_RVid 0x00020000UL // reverse video
410 #define RS_Uline 0x00040000UL // underline
411
412 // toggle this to force redraw, must be != RS_Careful
413 #define RS_redraw 0x01000000UL
414
415 // 5 custom bits for extensions
416 #define RS_customCount 32
417 #define RS_customMask 0x00f80000UL
418 #define RS_customShift 19
419
420 // other flags
421 #define RS_Careful 0x80000000UL /* be careful when drawing these */
422
423 #define RS_styleCount 4
424 #define RS_styleMask (RS_Bold | RS_Italic)
425 #define RS_styleShift 14
426
427 #define RS_baseattrMask (RS_Italic | RS_Bold | RS_Blink | RS_RVid | RS_Uline)
428 #define RS_attrMask (RS_baseattrMask | RS_fontMask)
429
430 #define RS_fontCount 127 // not 127 or 256, see rxvtfont.h
431 #define RS_fontMask 0xff000000UL // plenty(?) of fonts, includes RS_Careful
432 #define RS_fontShift 24
433
434 #define DEFAULT_RSTYLE (RS_None | Color_fg | (Color_bg << Color_Bits))
435 #define OVERLAY_RSTYLE (RS_None | Color_Black | (Color_Yellow << Color_Bits))
436
437 #define Sel_none 0 /* Not waiting */
438 #define Sel_normal 0x01 /* normal selection */
439 #define Sel_incr 0x02 /* incremental selection */
440 #define Sel_direct 0x00
441 #define Sel_Primary 0x01
442 #define Sel_Secondary 0x02
443 #define Sel_Clipboard 0x03
444 #define Sel_whereMask 0x0f
445 #define Sel_CompoundText 0x10 /* last request was COMPOUND_TEXT */
446 #define Sel_UTF8String 0x20 /* last request was UTF8_STRING */
447
448 enum {
449 C0_NUL = 0x00,
450 C0_SOH, C0_STX, C0_ETX, C0_EOT, C0_ENQ, C0_ACK, C0_BEL,
451 C0_BS , C0_HT , C0_LF , C0_VT , C0_FF , C0_CR , C0_SO , C0_SI ,
452 C0_DLE, C0_DC1, C0_DC2, D0_DC3, C0_DC4, C0_NAK, C0_SYN, C0_ETB,
453 C0_CAN, C0_EM , C0_SUB, C0_ESC, C0_IS4, C0_IS3, C0_IS2, C0_IS1,
454 };
455 #define CHAR_ST 0x9c /* 0234 */
456
457 /*
458 * XTerm Operating System Commands: ESC ] Ps;Pt (ST|BEL)
459 * colour extensions by Christian W. Zuckschwerdt <zany@triq.net>
460 */
461 enum {
462 XTerm_name = 0,
463 XTerm_iconName = 1,
464 XTerm_title = 2,
465 XTerm_property = 3, // change X property
466 XTerm_Color = 4, // change colors
467 XTerm_Color00 = 10, // not implemented, CLASH!
468 XTerm_Color01 = 11, // not implemented
469 XTerm_Color_cursor = 12, // change actual 'Cursor' color
470 XTerm_Color_pointer_fg = 13, // change actual 'Pointer' fg color
471 XTerm_Color_pointer_bg = 14, // change actual 'Pointer' bg color
472 XTerm_Color05 = 15, // not implemented (tektronix fg)
473 XTerm_Color06 = 16, // not implemented (tektronix bg)
474 XTerm_Color_RV = 17, // change actual 'Highlight' color
475 XTerm_logfile = 46, // not implemented
476 XTerm_font = 50,
477
478 XTerm_konsole30 = 30, // reserved for konsole
479 XTerm_konsole31 = 31, // reserved for konsole
480 XTerm_emacs51 = 51, // reserved for emacs shell
481 /*
482 * rxvt extensions of XTerm OSCs: ESC ] Ps;Pt (ST|BEL)
483 * at least Rxvt_Color_BD and Rxvt_Color_UL clash with xterm
484 */
485 Rxvt_Color_BD = 18, // change actual 'Bold' color
486 Rxvt_Color_UL = 19, // change actual 'Underline' color
487 Rxvt_Pixmap = 20, // new bg pixmap
488 Rxvt_restoreFG = 39, // change default fg color
489 Rxvt_restoreBG = 49, // change default bg color
490 Rxvt_dumpscreen = 55, // dump scrollback and all of screen
491
492 URxvt_locale = 701, // change locale
493 URxvt_version = 702, // request version
494
495 URxvt_Color_IT = 704, // change actual 'Italic' colour
496 URxvt_Color_tint = 705, // change actual tint colour
497 URxvt_Color_BD = 706,
498 URxvt_Color_UL = 707,
499
500 URxvt_font = 710,
501 URxvt_boldFont = 711,
502 URxvt_italicFont = 712,
503 URxvt_boldItalicFont = 713,
504
505 URxvt_view_up = 720,
506 URxvt_view_down = 721,
507
508 URxvt_perl = 777,
509 };
510
511 /* Words starting with `Color_' are colours. Others are counts */
512 /*
513 * The PixColor and rendition colour usage should probably be decoupled
514 * on the unnecessary items, e.g. Color_pointer, but won't bother
515 * until we need to. Also, be aware of usage in pixcolor_set
516 */
517
518 enum colour_list {
519 Color_none = -2,
520 Color_transparent = -1,
521 Color_fg = 0,
522 Color_bg,
523 minCOLOR, /* 2 */
524 Color_Black = minCOLOR,
525 Color_Red3,
526 Color_Green3,
527 Color_Yellow3,
528 Color_Blue3,
529 Color_Magenta3,
530 Color_Cyan3,
531 maxCOLOR, /* minCOLOR + 7 */
532 #ifndef NO_BRIGHTCOLOR
533 Color_AntiqueWhite = maxCOLOR,
534 minBrightCOLOR, /* maxCOLOR + 1 */
535 Color_Grey25 = minBrightCOLOR,
536 Color_Red,
537 Color_Green,
538 Color_Yellow,
539 Color_Blue,
540 Color_Magenta,
541 Color_Cyan,
542 maxBrightCOLOR, /* minBrightCOLOR + 7 */
543 Color_White = maxBrightCOLOR,
544 #else
545 Color_White = maxCOLOR,
546 #endif
547 minTermCOLOR = Color_White + 1,
548 maxTermCOLOR = Color_White + 72,
549 #ifndef NO_CURSORCOLOR
550 Color_cursor,
551 Color_cursor2,
552 #endif
553 Color_pointer_fg,
554 Color_pointer_bg,
555 Color_border,
556 #ifndef NO_BOLD_UNDERLINE_REVERSE
557 Color_BD,
558 Color_IT,
559 Color_UL,
560 Color_RV,
561 #endif
562 #if ENABLE_FRILLS
563 Color_underline,
564 #endif
565 #ifdef OPTION_HC
566 Color_HC,
567 #endif
568 #ifdef KEEP_SCROLLCOLOR
569 Color_scroll,
570 Color_trough,
571 #endif
572 #if TINTING
573 Color_tint,
574 #endif
575 #if OFF_FOCUS_FADING
576 Color_fade,
577 #endif
578 NRS_COLORS, /* */
579 #ifdef KEEP_SCROLLCOLOR
580 Color_topShadow = NRS_COLORS,
581 Color_bottomShadow,
582 TOTAL_COLORS
583 #else
584 TOTAL_COLORS = NRS_COLORS
585 #endif
586 };
587
588 #define Color_Bits 7 // 0 .. maxTermCOLOR
589
590 /*
591 * Resource list
592 */
593 enum {
594 # define def(name) Rs_ ## name,
595 # define reserve(name,count) Rs_ ## name ## _ = Rs_ ## name + (count) - 1,
596 # include "rsinc.h"
597 # undef def
598 # undef reserve
599 NUM_RESOURCES
600 };
601
602 /* DEC private modes */
603 #define PrivMode_132 (1UL<<0)
604 #define PrivMode_132OK (1UL<<1)
605 #define PrivMode_rVideo (1UL<<2)
606 #define PrivMode_relOrigin (1UL<<3)
607 #define PrivMode_Screen (1UL<<4)
608 #define PrivMode_Autowrap (1UL<<5)
609 #define PrivMode_aplCUR (1UL<<6)
610 #define PrivMode_aplKP (1UL<<7)
611 #define PrivMode_HaveBackSpace (1UL<<8)
612 #define PrivMode_BackSpace (1UL<<9)
613 #define PrivMode_ShiftKeys (1UL<<10)
614 #define PrivMode_VisibleCursor (1UL<<11)
615 #define PrivMode_MouseX10 (1UL<<12)
616 #define PrivMode_MouseX11 (1UL<<13)
617 #define PrivMode_scrollBar (1UL<<14)
618 #define PrivMode_TtyOutputInh (1UL<<15)
619 #define PrivMode_Keypress (1UL<<16)
620 #define PrivMode_smoothScroll (1UL<<17)
621 #define PrivMode_vt52 (1UL<<18)
622 #define PrivMode_LFNL (1UL<<19)
623 /* too annoying to implement X11 highlight tracking */
624 /* #define PrivMode_MouseX11Track (1LU<<20) */
625
626 #define PrivMode_mouse_report (PrivMode_MouseX10|PrivMode_MouseX11)
627 #define PrivMode(test,bit) \
628 if (test) \
629 priv_modes |= (bit); \
630 else \
631 priv_modes &= ~(bit)
632
633 #ifdef ALLOW_132_MODE
634 # define PrivMode_Default (PrivMode_Autowrap|PrivMode_ShiftKeys|PrivMode_VisibleCursor|PrivMode_132OK)
635 #else
636 # define PrivMode_Default (PrivMode_Autowrap|PrivMode_ShiftKeys|PrivMode_VisibleCursor)
637 #endif
638
639 // do not change these constants lightly, there are many interdependencies
640 #define IMBUFSIZ 128 // input modifier buffer sizes
641 #define KBUFSZ 512 // size of keyboard mapping buffer
642 #define CBUFSIZ 2048 // size of command buffer
643 #define UBUFSIZ 2048 // character buffer
644
645 #ifndef PATH_MAX
646 # define PATH_MAX 16384
647 #endif
648
649 /* Motif window hints */
650 #define MWM_HINTS_FUNCTIONS (1L << 0)
651 #define MWM_HINTS_DECORATIONS (1L << 1)
652 #define MWM_HINTS_INPUT_MODE (1L << 2)
653 #define MWM_HINTS_STATUS (1L << 3)
654 /* bit definitions for MwmHints.functions */
655 #define MWM_FUNC_ALL (1L << 0)
656 #define MWM_FUNC_RESIZE (1L << 1)
657 #define MWM_FUNC_MOVE (1L << 2)
658 #define MWM_FUNC_MINIMIZE (1L << 3)
659 #define MWM_FUNC_MAXIMIZE (1L << 4)
660 #define MWM_FUNC_CLOSE (1L << 5)
661 /* bit definitions for MwmHints.decorations */
662 #define MWM_DECOR_ALL (1L << 0)
663 #define MWM_DECOR_BORDER (1L << 1)
664 #define MWM_DECOR_RESIZEH (1L << 2)
665 #define MWM_DECOR_TITLE (1L << 3)
666 #define MWM_DECOR_MENU (1L << 4)
667 #define MWM_DECOR_MINIMIZE (1L << 5)
668 #define MWM_DECOR_MAXIMIZE (1L << 6)
669 /* bit definitions for MwmHints.inputMode */
670 #define MWM_INPUT_MODELESS 0
671 #define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1
672 #define MWM_INPUT_SYSTEM_MODAL 2
673 #define MWM_INPUT_FULL_APPLICATION_MODAL 3
674 #define PROP_MWM_HINTS_ELEMENTS 5
675
676 /*
677 *****************************************************************************
678 * MACRO DEFINES
679 *****************************************************************************
680 */
681 #define dLocal(type,name) type const name = this->name
682
683 // for speed reasons, we assume that all codepoints 32 to 126 are
684 // single-width.
685 #define WCWIDTH(c) (IN_RANGE_INC (c, 0x20, 0x7e) ? 1 : wcwidth (c))
686
687 /* convert pixel dimensions to row/column values. Everything as int32_t */
688 #define Pixel2Col(x) Pixel2Width((int32_t)(x))
689 #define Pixel2Row(y) Pixel2Height((int32_t)(y))
690 #define Pixel2Width(x) ((int32_t)(x) / (int32_t)fwidth)
691 #define Pixel2Height(y) ((int32_t)(y) / (int32_t)fheight)
692 #define Col2Pixel(col) ((int32_t)Width2Pixel(col))
693 #define Row2Pixel(row) ((int32_t)Height2Pixel(row))
694 #define Width2Pixel(n) ((int32_t)(n) * (int32_t)fwidth)
695 #define Height2Pixel(n) ((int32_t)(n) * (int32_t)fheight)
696
697 // for m >= -n, ensure remainder lies between 0..n-1
698 #define MOD(m,n) (((m) + (n)) % (n))
699
700 #define LINENO(n) MOD (term_start + int(n), total_rows)
701 #define ROW(n) row_buf [LINENO (n)]
702
703 /* how to build & extract colors and attributes */
704 #define GET_BASEFG(x) (((x) & RS_fgMask))
705 #define GET_BASEBG(x) (((x) & RS_bgMask)>>Color_Bits)
706
707 #define GET_FONT(x) (((x) & RS_fontMask) >> RS_fontShift)
708 #define SET_FONT(x,fid) (((x) & ~RS_fontMask) | ((fid) << RS_fontShift))
709
710 #define GET_STYLE(x) (((x) & RS_styleMask) >> RS_styleShift)
711 #define SET_STYLE(x,style) (((x) & ~RS_styleMask) | ((style) << RS_styleShift))
712
713 #define GET_ATTR(x) (((x) & RS_attrMask))
714 #define GET_BGATTR(x) \
715 (((x) & RS_RVid) ? (((x) & (RS_attrMask & ~RS_RVid)) \
716 | (((x) & RS_fgMask)<<Color_Bits)) \
717 : ((x) & (RS_attrMask | RS_bgMask)))
718 #define SET_FGCOLOR(x,fg) (((x) & ~RS_fgMask) | (fg))
719 #define SET_BGCOLOR(x,bg) (((x) & ~RS_bgMask) | ((bg)<<Color_Bits))
720 #define SET_ATTR(x,a) (((x) & ~RS_attrMask) | (a))
721
722 #define RS_SAME(a,b) (!(((a) ^ (b)) & ~RS_Careful))
723
724 #define PIXCOLOR_NAME(idx) rs[Rs_color + (idx)]
725 #define ISSET_PIXCOLOR(idx) (!!rs[Rs_color + (idx)])
726
727 #if ENABLE_STYLES
728 # define FONTSET(style) fontset[GET_STYLE (style)]
729 #else
730 # define FONTSET(style) fontset[0]
731 #endif
732
733 #ifdef HAVE_SCROLLBARS
734 # define scrollbar_TotalWidth() (scrollBar.width + sb_shadow * 2)
735 #else
736 # define scrollbar_TotalWidth() (0)
737 #endif
738 #define scrollbar_isMotion() (scrollBar.state == 'm')
739 #define scrollbar_isUp() (scrollBar.state == 'U')
740 #define scrollbar_isDn() (scrollBar.state == 'D')
741 #define scrollbar_isUpDn() isupper (scrollBar.state)
742 #define isScrollbarWindow(w) (scrollBar.state && (w) == scrollBar.win)
743
744 #define scrollbarnext_dnval() (scrollBar.end + (scrollBar.width + 1))
745 #define scrollbarnext_upButton(y) ((y) > scrollBar.end \
746 && (y) <= scrollbarnext_dnval ())
747 #define scrollbarnext_dnButton(y) ((y) > scrollbarnext_dnval())
748 #define SCROLLNEXT_MINHEIGHT SB_THUMB_MIN_HEIGHT
749 #define scrollbarrxvt_upButton(y) ((y) < scrollBar.beg)
750 #define scrollbarrxvt_dnButton(y) ((y) > scrollBar.end)
751 #define SCROLLRXVT_MINHEIGHT 10
752 #define SCROLLXTERM_MINHEIGHT 10
753
754 #define scrollbar_minheight() (scrollBar.style == R_SB_NEXT \
755 ? SCROLLNEXT_MINHEIGHT \
756 : SCROLLRXVT_MINHEIGHT)
757 #define scrollbar_above_slider(y) ((y) < scrollBar.top)
758 #define scrollbar_below_slider(y) ((y) > scrollBar.bot)
759 #define scrollbar_position(y) ((y) - scrollBar.beg)
760 #define scrollbar_size() (scrollBar.end - scrollBar.beg \
761 - scrollbar_minheight ())
762
763 #ifdef XPM_BACKGROUND
764 # define XPMClearArea(a, b, c, d, e, f, g) XClearArea((a), (b), (c), (d), (e), (f), (g))
765 #else
766 # define XPMClearArea(a, b, c, d, e, f, g)
767 #endif
768
769 typedef callback<void (const char *)> log_callback;
770 typedef callback<int (int)> getfd_callback;
771
772 #define SET_LOCALE(locale) rxvt_set_locale (locale)
773 extern bool rxvt_set_locale (const char *locale) NOTHROW;
774 extern void rxvt_push_locale (const char *locale) NOTHROW;
775 extern void rxvt_pop_locale () NOTHROW;
776
777 /****************************************************************************/
778
779 #define LINE_LONGER 0x0001 // line is continued on the next row
780 #define LINE_FILTERED 0x0002 // line has been filtered
781 #define LINE_COMPRESSED 0x0004 // line has been compressed (NYI)
782 #define LINE_FILTER 0x0008 // line needs to be filtered before display (NYI)
783 #define LINE_BIDI 0x0010 // line needs bidi (NYI)
784
785 struct line_t {
786 text_t *t; // terminal the text
787 rend_t *r; // rendition, uses RS_ flags
788 tlen_t_ l; // length of each text line, LINE_CONT == continued on next line
789 uint32_t f; // flags
790
791 bool is_longer ()
792 {
793 return f & LINE_LONGER;
794 }
795
796 void is_longer (int set)
797 {
798 if (set)
799 f |= LINE_LONGER;
800 else
801 f &= ~LINE_LONGER;
802 }
803
804 void clear ()
805 {
806 t = 0;
807 r = 0;
808 l = 0;
809 f = 0;
810 }
811
812 void touch () // call whenever a line is changed/touched/updated
813 {
814 #if ENABLE_PERL
815 f &= ~LINE_FILTERED;
816 #endif
817 }
818
819 void touch (int col)
820 {
821 max_it (l, col);
822 touch ();
823 }
824 };
825
826 /****************************************************************************/
827
828 // primivite wrapper around mbstate_t to ensure initialisation
829 struct mbstate {
830 mbstate_t mbs;
831
832 operator mbstate_t *() { return &mbs; }
833 void reset () { memset (&mbs, 0, sizeof (mbs)); }
834 mbstate () { reset (); }
835 };
836
837 /****************************************************************************/
838
839 #define UNICODE_MASK 0x1fffffUL
840
841 #if UNICODE3
842 # define COMPOSE_LO 0x40000000UL
843 # define COMPOSE_HI 0x400fffffUL
844 # define IS_COMPOSE(n) ((int32_t)(n) >= COMPOSE_LO)
845 #else
846 # if ENABLE_PERL
847 # define COMPOSE_LO 0xe000UL // our _own_ functions don't like (illegal) surrogates
848 # define COMPOSE_HI 0xf8ffUL // in utf-8, so use private use area only
849 # else
850 # define COMPOSE_LO 0xd800UL
851 # define COMPOSE_HI 0xf8ffUL
852 # endif
853 # define IS_COMPOSE(n) IN_RANGE_INC ((n), COMPOSE_LO, COMPOSE_HI)
854 #endif
855
856 #if ENABLE_COMBINING
857 // compose chars are used to represent composite characters
858 // that are not representable in unicode, as well as characters
859 // not fitting in the BMP.
860 struct compose_char {
861 unicode_t c1, c2; // any chars != NOCHAR are valid
862 compose_char (unicode_t c1, unicode_t c2)
863 : c1(c1), c2(c2)
864 { }
865 };
866
867 class rxvt_composite_vec {
868 vector<compose_char> v;
869 public:
870 text_t compose (unicode_t c1, unicode_t c2 = NOCHAR);
871 int expand (unicode_t c, wchar_t *r);
872 compose_char *operator [](text_t c)
873 {
874 return c >= COMPOSE_LO && c < COMPOSE_LO + v.size ()
875 ? &v[c - COMPOSE_LO]
876 : 0;
877 }
878 };
879
880 extern class rxvt_composite_vec rxvt_composite;
881 #endif
882
883 /****************************************************************************/
884
885 #ifdef KEYSYM_RESOURCE
886 class keyboard_manager;
887 #endif
888
889 struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen {
890
891 // special markers with magic addresses
892 static const char resval_undef []; // options specifically unset
893 static const char resval_on []; // boolean options switched on
894 static const char resval_off []; // or off
895
896 log_callback *log_hook; // log error messages through this hook, if != 0
897 getfd_callback *getfd_hook; // convert remote to local fd, if != 0
898 #if ENABLE_PERL
899 rxvt_perl_term perl;
900 #endif
901 struct mbstate mbstate; // current input multibyte state
902
903 unsigned char want_refresh:1,
904 #ifdef TRANSPARENT
905 want_full_refresh:1, /* awaiting full screen refresh */
906 am_transparent:1, /* is a transparent term */
907 am_pixmap_trans:1, /* transparency w/known root pixmap */
908 #endif
909 current_screen:1, /* primary or secondary */
910 num_scr_allow:1,
911 bypass_keystate:1,
912 #ifdef CURSOR_BLINK
913 hidden_cursor:1,
914 #endif
915 #ifdef TEXT_BLINK
916 hidden_text:1,
917 #endif
918 #ifdef POINTER_BLANK
919 hidden_pointer:1,
920 #endif
921 enc_utf8:1, /* wether locale uses utf-8 */
922 seen_input:1, /* wether we have seen some program output yet */
923 seen_resize:1, /* wether we had a resize event */
924 parsed_geometry:1;
925
926 unsigned char refresh_type,
927 #ifdef META8_OPTION
928 meta_char, /* Alt-key prefix */
929 #endif
930 scrollbar_align,
931 selection_wait,
932 selection_type;
933 /* ---------- */
934 bool rvideo_state, rvideo_mode;
935 #ifndef NO_BELL
936 bool rvideo_bell;
937 #endif
938 int num_scr; /* screen: number lines scrolled */
939 int prev_ncol, /* screen: previous number of columns */
940 prev_nrow; /* screen: previous number of rows */
941 /* ---------- */
942 rend_t rstyle;
943 /* ---------- */
944 #ifdef SELECTION_SCROLLING
945 int scroll_selection_lines;
946 enum page_dirn scroll_selection_dir;
947 int selection_save_x,
948 selection_save_y,
949 selection_save_state;
950 #endif
951 /* ---------- */
952 int csrO, /* Hops - csr offset in thumb/slider to */
953 /* give proper Scroll behaviour */
954 #if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
955 mouse_slip_wheel_speed,
956 #endif
957 refresh_count,
958 refresh_limit,
959 last_bot, /* scrollbar last bottom position */
960 last_top, /* scrollbar last top position */
961 last_state, /* scrollbar last state */
962 scrollbar_len,
963 window_vt_x,
964 window_vt_y,
965 window_sb_x,
966 # ifdef POINTER_BLANK
967 pointerBlankDelay,
968 # endif
969 allowedxerror;
970 /* ---------- */
971 unsigned int ModLevel3Mask,
972 ModMetaMask,
973 ModNumLockMask;
974 int old_width, /* last used width in screen resize */
975 old_height; /* last used height in screen resize */
976 unsigned long priv_modes,
977 SavedModes;
978 /* ---------- */
979 Atom *xa;
980 /* ---------- */
981 #ifdef RXVT_SCROLLBAR
982 GC scrollbarGC,
983 topShadowGC,
984 botShadowGC;
985 #endif
986 #ifdef XTERM_SCROLLBAR
987 GC xscrollbarGC,
988 ShadowGC;
989 #endif
990 #ifdef PLAIN_SCROLLBAR
991 GC pscrollbarGC;
992 #endif
993 #ifdef NEXT_SCROLLBAR
994 GC blackGC,
995 whiteGC,
996 grayGC,
997 darkGC,
998 stippleGC;
999 Pixmap dimple,
1000 upArrow,
1001 downArrow,
1002 upArrowHi,
1003 downArrowHi;
1004 #endif
1005 /* ---------- */
1006 Time selection_time,
1007 selection_request_time;
1008 pid_t cmd_pid; /* process id of child */
1009 char * incr_buf;
1010 size_t incr_buf_size, incr_buf_fill;
1011 /* ---------- */
1012 Cursor leftptr_cursor;
1013 /* ---------- */
1014 #ifndef NO_BACKSPACE_KEY
1015 const char *key_backspace;
1016 #endif
1017 #ifndef NO_DELETE_KEY
1018 const char *key_delete;
1019 #endif
1020 struct mouse_event MEvent;
1021 XComposeStatus compose;
1022 ttymode_t tio;
1023 row_col_t oldcursor;
1024 #ifdef XPM_BACKGROUND
1025 bgPixmap_t bgPixmap;
1026 #ifdef HAVE_AFTERIMAGE
1027 ASImageManager *asimman;
1028 ASImage *original_asim;
1029 struct { unsigned int width, height; } xpmAttr; /* all we need is width/height */
1030 #else
1031 XpmAttributes xpmAttr; /* originally loaded pixmap and its scaling */
1032 #endif
1033 #endif
1034
1035 #if ENABLE_OVERLAY
1036 int ov_x, ov_y, ov_w, ov_h; // overlay dimensions
1037 text_t **ov_text;
1038 rend_t **ov_rend;
1039
1040 void scr_swap_overlay () NOTHROW;
1041 void scr_overlay_new (int x, int y, int w, int h) NOTHROW;
1042 void scr_overlay_off () NOTHROW;
1043 void scr_overlay_set (int x, int y,
1044 text_t text,
1045 rend_t rend = OVERLAY_RSTYLE) NOTHROW;
1046 void scr_overlay_set (int x, int y, const char *s) NOTHROW;
1047 void scr_overlay_set (int x, int y, const wchar_t *s) NOTHROW;
1048 #endif
1049
1050 vector<void *> allocated; // free these memory blocks with free()
1051
1052 char env_windowid[21]; /* environmental variable WINDOWID */
1053 char env_colorfgbg[sizeof ("COLORFGBG=default;default;bg") + 1];
1054 char *env_display; /* environmental variable DISPLAY */
1055 char *env_term; /* environmental variable TERM */
1056
1057 char *locale;
1058 char charsets[4];
1059 char *v_buffer; /* pointer to physical buffer */
1060 unsigned int v_buflen; /* size of area to write */
1061 stringvec *argv, *envv; /* if != 0, will be freed at destroy time */
1062
1063 #ifdef KEYSYM_RESOURCE
1064 keyboard_manager *keyboard;
1065 #endif
1066
1067 const char *rs[NUM_RESOURCES];
1068 /* command input buffering */
1069 char *cmdbuf_ptr, *cmdbuf_endp;
1070 char cmdbuf_base[CBUFSIZ];
1071
1072 ptytty *pty;
1073
1074 rxvt_salloc *talloc; // text line allocator
1075 rxvt_salloc *ralloc; // rend line allocator
1076
1077 static vector<rxvt_term *> termlist; // a vector of all running rxvt_term's
1078
1079 #if ENABLE_FRILLS || ISO_14755
1080 // ISO 14755 entry support
1081 unicode_t iso14755buf;
1082 void commit_iso14755 ();
1083 int hex_keyval (XKeyEvent &ev);
1084 # if ISO_14755
1085 void iso14755_51 (unicode_t ch, rend_t r = DEFAULT_RSTYLE, int x = 0, int y = -1);
1086 void iso14755_54 (int x, int y);
1087 # endif
1088 #endif
1089
1090 // modifies first argument(!)
1091 void paste (char *data, unsigned int len) NOTHROW;
1092
1093 long vt_emask, vt_emask_perl, vt_emask_xim;
1094
1095 void vt_select_input () const NOTHROW
1096 {
1097 XSelectInput (dpy, vt, vt_emask | vt_emask_perl | vt_emask_xim);
1098 }
1099
1100 #if TRANSPARENT || ENABLE_PERL
1101 void rootwin_cb (XEvent &xev);
1102 xevent_watcher rootwin_ev;
1103 void check_our_parents_cb (time_watcher &w);
1104 time_watcher check_our_aprents_ev;
1105 #endif
1106
1107 void x_cb (XEvent &xev);
1108 void flush ();
1109 xevent_watcher termwin_ev;
1110 xevent_watcher vt_ev;
1111 #ifdef HAVE_SCROLLBARS
1112 xevent_watcher scrollbar_ev;
1113 #endif
1114
1115 void child_cb (child_watcher &w, int status); child_watcher child_ev;
1116 void check_cb (check_watcher &w); check_watcher check_ev;
1117 void destroy_cb (time_watcher &w); time_watcher destroy_ev;
1118 void flush_cb (time_watcher &w); time_watcher flush_ev;
1119 void pty_cb (io_watcher &w, short revents); io_watcher pty_ev;
1120 void incr_cb (time_watcher &w) NOTHROW; time_watcher incr_ev;
1121
1122 #ifdef CURSOR_BLINK
1123 void cursor_blink_cb (time_watcher &w); time_watcher cursor_blink_ev;
1124 #endif
1125 #ifdef TEXT_BLINK
1126 void text_blink_cb (time_watcher &w); time_watcher text_blink_ev;
1127 #endif
1128 #ifndef NO_BELL
1129 void bell_cb (time_watcher &w); time_watcher bell_ev;
1130 #endif
1131
1132 #ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING
1133 void cont_scroll_cb (time_watcher &w); time_watcher cont_scroll_ev;
1134 #endif
1135 #ifdef SELECTION_SCROLLING
1136 void sel_scroll_cb (time_watcher &w); time_watcher sel_scroll_ev;
1137 #endif
1138 #if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
1139 void slip_wheel_cb (time_watcher &w); time_watcher slip_wheel_ev;
1140 #endif
1141
1142 #ifdef POINTER_BLANK
1143 void pointer_cb (time_watcher &w); time_watcher pointer_ev;
1144 void pointer_blank ();
1145 #endif
1146 void pointer_unblank ();
1147
1148 void tt_printf (const char *fmt,...);
1149 void tt_write (const char *data, unsigned int len);
1150 void pty_write ();
1151
1152 void tt_winch ();
1153
1154 rxvt_term ();
1155 ~rxvt_term ();
1156 void destroy ();
1157 void emergency_cleanup ();
1158
1159 bool init (int argc, const char *const *argv, stringvec *envv);
1160
1161 bool init (stringvec *argv, stringvec *envv)
1162 {
1163 this->argv = argv;
1164 return init (argv->size (), argv->begin (), envv);
1165 }
1166
1167 bool init_vars ();
1168
1169 bool pty_fill ();
1170
1171 void make_current () const // make this the "currently active" urxvt instance
1172 {
1173 SET_R (this);
1174 set_environ (envv);
1175 rxvt_set_locale (locale);
1176 }
1177
1178 void init_secondary ();
1179 const char **init_resources (int argc, const char *const *argv);
1180 const char *x_resource (const char *name);
1181 void init_env ();
1182 void set_locale (const char *locale);
1183 void init_xlocale ();
1184 void init_command (const char *const *argv);
1185 void run_command (const char *const *argv);
1186 int run_child (const char *const *argv);
1187
1188 void color_aliases (int idx);
1189 void recolour_cursor ();
1190 void create_windows (int argc, const char *const *argv);
1191 void resize_all_windows (unsigned int newwidth, unsigned int newheight, int ignoreparent);
1192 void window_calc (unsigned int newwidth, unsigned int newheight);
1193
1194 #if USE_XIM
1195 rxvt_xim *input_method;
1196 XIC Input_Context;
1197 XIMStyle input_style;
1198 XPoint spot; // most recently sent spot position
1199
1200 void im_destroy ();
1201 void im_cb (); im_watcher im_ev;
1202 void im_set_size (XRectangle &size);
1203 void im_set_position (XPoint &pos) NOTHROW;
1204 void im_set_color (unsigned long &fg, unsigned long &bg);
1205 void im_set_preedit_area (XRectangle &preedit_rect, XRectangle &status_rect, const XRectangle &needed_rect);
1206
1207 bool IMisRunning ();
1208 void IMSendSpot ();
1209 bool IM_get_IC (const char *modifiers);
1210 void IMSetPosition ();
1211 #endif
1212
1213 void resize_scrollbar ();
1214
1215 // command.C
1216 void key_press (XKeyEvent &ev);
1217 void key_release (XKeyEvent &ev);
1218 unsigned int cmd_write (const char *str, unsigned int count);
1219
1220 wchar_t next_char () NOTHROW;
1221 wchar_t cmd_getc () THROW ((class out_of_input));
1222 uint32_t next_octet () NOTHROW;
1223 uint32_t cmd_get8 () THROW ((class out_of_input));
1224
1225 bool cmd_parse ();
1226 void mouse_report (XButtonEvent &ev);
1227 void button_press (XButtonEvent &ev);
1228 void button_release (XButtonEvent &ev);
1229 void focus_in ();
1230 void focus_out ();
1231 void update_fade_color (unsigned int idx);
1232 int check_our_parents ();
1233 #ifdef PRINTPIPE
1234 FILE *popen_printer ();
1235 int pclose_printer (FILE *stream);
1236 #endif
1237 void process_print_pipe ();
1238 void process_nonprinting (unicode_t ch);
1239 void process_escape_vt52 (unicode_t ch);
1240 void process_escape_seq ();
1241 void process_csi_seq ();
1242 void process_window_ops (const int *args, unsigned int nargs);
1243 char *get_to_st (unicode_t &ends_how);
1244 void process_dcs_seq ();
1245 void process_osc_seq ();
1246 void process_color_seq (int report, int color, const char *str, char resp);
1247 void process_xterm_seq (int op, const char *str, char resp);
1248 int privcases (int mode, unsigned long bit);
1249 void process_terminal_mode (int mode, int priv, unsigned int nargs, const int *arg);
1250 void process_sgr_mode (unsigned int nargs, const int *arg);
1251 void process_graphics ();
1252 // init.C
1253 void Get_Colours ();
1254 void get_ourmods ();
1255 // main.C
1256 bool set_fonts ();
1257 void set_string_property (Atom prop, const char *str, int len = -1);
1258 void set_utf8_property (Atom prop, const char *str, int len = -1);
1259 void set_title (const char *str);
1260 void set_icon_name (const char *str);
1261 void set_window_color (int idx, const char *color);
1262 void set_colorfgbg ();
1263 bool set_color (rxvt_color &color, const char *name);
1264 void alias_color (int dst, int src);
1265 void set_widthheight (unsigned int newwidth, unsigned int newheight);
1266
1267 // screen.C
1268
1269 void lalloc (line_t &l) const
1270 {
1271 l.t = (text_t *)talloc->alloc ();
1272 l.r = (rend_t *)ralloc->alloc ();
1273 }
1274
1275 #if 0
1276 void lfree (line_t &l)
1277 {
1278 talloc->free (l.t);
1279 ralloc->free (l.r);
1280 }
1281 #endif
1282
1283 void lresize (line_t &l) const
1284 {
1285 if (!l.t)
1286 return;
1287
1288 l.t = (text_t *)talloc->alloc (l.t, prev_ncol * sizeof (text_t));
1289 l.r = (rend_t *)ralloc->alloc (l.r, prev_ncol * sizeof (rend_t));
1290
1291 l.l = min (l.l, ncol);
1292
1293 if (ncol > prev_ncol)
1294 scr_blank_line (l, prev_ncol, ncol - prev_ncol, DEFAULT_RSTYLE);
1295 }
1296
1297 int fgcolor_of (rend_t r) const NOTHROW
1298 {
1299 int base = GET_BASEFG (r);
1300 #ifndef NO_BRIGHTCOLOR
1301 if (r & RS_Bold
1302 # if ENABLE_STYLES
1303 && option (Opt_intensityStyles)
1304 # endif
1305 && IN_RANGE_INC (base, minCOLOR, minBrightCOLOR))
1306 base += minBrightCOLOR - minCOLOR;
1307 #endif
1308 return base;
1309 }
1310
1311 int bgcolor_of (rend_t r) const NOTHROW
1312 {
1313 int base = GET_BASEBG (r);
1314 #ifndef NO_BRIGHTCOLOR
1315 if (r & RS_Blink
1316 # if ENABLE_STYLES
1317 && option (Opt_intensityStyles)
1318 # endif
1319 && IN_RANGE_INC (base, minCOLOR, minBrightCOLOR))
1320 base += minBrightCOLOR - minCOLOR;
1321 #endif
1322 return base;
1323 }
1324
1325 bool option (uint8_t opt) const NOTHROW
1326 {
1327 return options[opt >> 3] & (1 << (opt & 7));
1328 }
1329
1330 void set_option (uint8_t opt, bool set = true) NOTHROW
1331 {
1332 if (set)
1333 options[opt >> 3] |= (1 << (opt & 7));
1334 else
1335 options[opt >> 3] &= ~(1 << (opt & 7));
1336 }
1337
1338 void scr_blank_line (line_t &l, unsigned int col, unsigned int width, rend_t efs) const NOTHROW;
1339 void scr_blank_screen_mem (line_t &l, rend_t efs) const NOTHROW;
1340 int scr_scroll_text (int row1, int row2, int count) NOTHROW;
1341 void scr_reset ();
1342 void scr_release () NOTHROW;
1343 void scr_clear (bool really = false) NOTHROW;
1344 void scr_refresh () NOTHROW;
1345 bool scr_refresh_rend (rend_t mask, rend_t value) NOTHROW;
1346 void scr_erase_screen (int mode) NOTHROW;
1347 #if ENABLE_FRILLS
1348 void scr_erase_savelines () NOTHROW;
1349 void scr_backindex () NOTHROW;
1350 void scr_forwardindex () NOTHROW;
1351 #endif
1352 void scr_touch (bool refresh) NOTHROW;
1353 void scr_expose (int x, int y, int width, int height, bool refresh) NOTHROW;
1354 rxvt_fontset *scr_find_fontset (rend_t r = DEFAULT_RSTYLE);
1355 void scr_recolour () NOTHROW;
1356 void scr_remap_chars () NOTHROW;
1357 void scr_remap_chars (line_t &l) NOTHROW;
1358
1359 enum cursor_mode { SAVE, RESTORE };
1360
1361 void scr_poweron ();
1362 void scr_cursor (cursor_mode mode) NOTHROW;
1363 void scr_do_wrap () NOTHROW;
1364 void scr_swap_screen () NOTHROW;
1365 void scr_change_screen (int scrn);
1366 void scr_color (unsigned int color, int fgbg) NOTHROW;
1367 void scr_rendition (int set, int style) NOTHROW;
1368 void scr_add_lines (const wchar_t *str, int len, int minlines = 0) NOTHROW;
1369 void scr_backspace () NOTHROW;
1370 void scr_tab (int count, bool ht = false) NOTHROW;
1371 void scr_gotorc (int row, int col, int relative) NOTHROW;
1372 void scr_index (enum page_dirn direction) NOTHROW;
1373 void scr_erase_line (int mode) NOTHROW;
1374 void scr_E () NOTHROW;
1375 void scr_insdel_lines (int count, int insdel) NOTHROW;
1376 void scr_insdel_chars (int count, int insdel) NOTHROW;
1377 void scr_scroll_region (int top, int bot) NOTHROW;
1378 void scr_cursor_visible (int mode) NOTHROW;
1379 void scr_autowrap (int mode) NOTHROW;
1380 void scr_relative_origin (int mode) NOTHROW;
1381 void scr_insert_mode (int mode) NOTHROW;
1382 void scr_set_tab (int mode) NOTHROW;
1383 void scr_rvideo_mode (bool on) NOTHROW;
1384 void scr_report_position () NOTHROW;
1385 void set_font_style () NOTHROW;
1386 void scr_charset_choose (int set) NOTHROW;
1387 void scr_charset_set (int set, unsigned int ch) NOTHROW;
1388 void scr_move_to (int y, int len) NOTHROW;
1389 bool scr_page (enum page_dirn direction, int nlines) NOTHROW;
1390 bool scr_changeview (int new_view_start) NOTHROW;
1391 void scr_bell () NOTHROW;
1392 void scr_printscreen (int fullhist) NOTHROW;
1393 void scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle1, rend_t rstyle2) NOTHROW;
1394 void scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle) NOTHROW;
1395 void scr_reverse_selection () NOTHROW;
1396 void scr_dump (int fd) NOTHROW;
1397
1398 void selection_check (int check_more) NOTHROW;
1399 void selection_paste (Window win, Atom prop, bool delete_prop) NOTHROW;
1400 void selection_property (Window win, Atom prop) NOTHROW;
1401 void selection_request (Time tm, int selnum = Sel_Primary) NOTHROW;
1402 int selection_request_other (Atom target, int selnum) NOTHROW;
1403 void selection_clear () NOTHROW;
1404 void selection_make (Time tm);
1405 bool selection_grab (Time tm) NOTHROW;
1406 void selection_start_colrow (int col, int row) NOTHROW;
1407 void selection_delimit_word (enum page_dirn dirn, const row_col_t *mark, row_col_t *ret) NOTHROW;
1408 void selection_extend_colrow (int32_t col, int32_t row, int button3, int buttonpress, int clickchange) NOTHROW;
1409 void selection_remove_trailing_spaces () NOTHROW;
1410 void selection_send (const XSelectionRequestEvent &rq) NOTHROW;
1411 void selection_click (int clicks, int x, int y) NOTHROW;
1412 void selection_extend (int x, int y, int flag) NOTHROW;
1413 void selection_rotate (int x, int y) NOTHROW;
1414
1415 void pixel_position (int *x, int *y) NOTHROW;
1416
1417 #if defined(NEXT_SCROLLBAR)
1418 // scrollbar-next.C
1419 Pixmap renderPixmap (const char *const *data, int width, int height);
1420 void init_scrollbar_stuff ();
1421 void drawBevel (Drawable d, int x1, int y1, int w, int h);
1422 int scrollbar_show_next (int update, int last_top, int last_bot, int scrollbar_len);
1423 #endif
1424
1425 #if defined(RXVT_SCROLLBAR)
1426 // scrollbar-rxvt.C
1427 int scrollbar_show_rxvt (int update, int last_top, int last_bot, int scrollbar_len);
1428 #endif
1429
1430 #if defined(XTERM_SCROLLBAR)
1431 // scrollbar-xterm.C
1432 int scrollbar_show_xterm (int update, int last_top, int last_bot, int scrollbar_len);
1433 #endif
1434
1435 #if defined(PLAIN_SCROLLBAR)
1436 // scrollbar-plain.C
1437 int scrollbar_show_plain (int update, int last_top, int last_bot, int scrollbar_len);
1438 #endif
1439
1440 // scrollbar.C
1441 int scrollbar_mapping (int map);
1442 int scrollbar_show (int update);
1443 void setup_scrollbar (const char *scrollalign, const char *scrollstyle, const char *thickness);
1444
1445 // xdefaults.C
1446 void get_options (int argc, const char *const *argv);
1447 int parse_keysym (const char *str, const char *arg);
1448 void get_xdefaults (FILE *stream, const char *name);
1449 void extract_resources ();
1450 // xpm.C
1451 int scale_pixmap (const char *geom);
1452 void resize_pixmap ();
1453 Pixmap set_bgPixmap (const char *file);
1454 };
1455
1456 /*
1457 *****************************************************************************
1458 * PROTOTYPES
1459 *****************************************************************************
1460 */
1461 #ifdef PROTOTYPES
1462 # define __PROTO(p) p
1463 #else
1464 # define __PROTO(p) ()
1465 #endif
1466
1467 #endif /* _RXVT_H_ */
1468