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

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

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

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

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

The pros/cons are:

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

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

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

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

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

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

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

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

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

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

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

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

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

References:

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

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

File Contents

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