ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/xdefaults.C
Revision: 1.102
Committed: Fri Jun 8 20:04:12 2007 UTC (16 years, 11 months ago) by sasha
Content type: text/plain
Branch: MAIN
Changes since 1.101: +5 -0 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 /*----------------------------------------------------------------------*
2 * File: xdefaults.C
3 *----------------------------------------------------------------------*
4 *
5 * All portions of code are copyright by their respective author/s.
6 * Copyright (c) 1994 Robert Nation <nation@rocket.sanders.lockheed.com>
7 * - original version
8 * Copyright (c) 1997,1998 mj olesen <olesen@me.queensu.ca>
9 * Copyright (c) 2003-2006 Marc Lehmann <pcg@goof.com>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *----------------------------------------------------------------------*/
25
26 #include "../config.h"
27 #include "rxvt.h"
28 #include "version.h"
29
30 #ifdef KEYSYM_RESOURCE
31 # include "keyboard.h"
32 #endif
33
34 /* place holders used for parsing command-line options */
35 #define Optflag_Reverse 1
36 #define Optflag_Boolean 2
37
38 /* monolithic option/resource structure: */
39 /*
40 * `string' options MUST have a usage argument
41 * `switch' and `boolean' options have no argument
42 * if there's no desc (ription), it won't appear in rxvt_usage ()
43 */
44
45 /* INFO () - descriptive information only */
46 #define INFO(opt, arg, desc) \
47 {0, 0, -1, NULL, (opt), (arg), (desc)}
48
49 /* STRG () - command-line option, with/without resource */
50 #define STRG(rsp, kw, opt, arg, desc) \
51 {0, 0, (rsp), (kw), (opt), (arg), (desc)}
52
53 /* RSTRG () - resource/long-option */
54 #define RSTRG(rsp, kw, arg) \
55 {0, 0, (rsp), (kw), NULL, (arg), NULL}
56
57 /* BOOL () - regular boolean `-/+' flag */
58 #define BOOL(rsp, kw, opt, option, flag, desc) \
59 { (option), (Optflag_Boolean | (flag)), (rsp), (kw), (opt), NULL, (desc)}
60
61 /* SWCH () - `-' flag */
62 #define SWCH(opt, option, flag, desc) \
63 { (option), (flag), -1, NULL, (opt), NULL, (desc)}
64
65 /* convenient macros */
66 #define optList_strlen(i) \
67 (optList[i].flag ? 0 : (optList[i].arg ? strlen (optList[i].arg) : 1))
68 #define optList_isBool(i) \
69 (optList[i].flag & Optflag_Boolean)
70 #define optList_isReverse(i) \
71 (optList[i].flag & Optflag_Reverse)
72 #define optList_size \
73 (sizeof (optList) / sizeof (optList[0]))
74
75 static const struct
76 {
77 const uint8_t index; /* Option index */
78 const uint8_t flag; /* Option flag */
79 const int16_t doff; /* resource value index or -1 */
80 const char *kw; /* keyword */
81 const char *opt; /* option */
82 const char *arg; /* argument */
83 const char *desc; /* description */
84 }
85 optList[] = {
86 STRG (Rs_display_name, NULL, "d", NULL, NULL), /* short form */
87 STRG (Rs_display_name, NULL, "display", "string", "X server to contact"),
88 STRG (Rs_term_name, "termName", "tn", "string", "value of the TERM environment variable"),
89 STRG (Rs_geometry, NULL, "g", NULL, NULL), /* short form */
90 STRG (Rs_geometry, "geometry", "geometry", "geometry", "size (in characters) and position"),
91 SWCH ("C", Opt_console, 0, "intercept console messages"),
92 SWCH ("iconic", Opt_iconic, 0, "start iconic"),
93 SWCH ("ic", Opt_iconic, 0, NULL), /* short form */
94 BOOL (Rs_reverseVideo, "reverseVideo", "rv", Opt_reverseVideo, 0, "reverse video"),
95 BOOL (Rs_loginShell, "loginShell", "ls", Opt_loginShell, 0, "login shell"),
96 BOOL (Rs_jumpScroll, "jumpScroll", "j", Opt_jumpScroll, 0, "jump scrolling"),
97 BOOL (Rs_pastableTabs, "pastableTabs", "ptab", Opt_pastableTabs, 0, "tab characters are pastable"),
98 #if HAVE_SCROLLBARS
99 RSTRG (Rs_scrollstyle, "scrollstyle", "mode"),
100 BOOL (Rs_scrollBar, "scrollBar", "sb", Opt_scrollBar, 0, "scrollbar"),
101 BOOL (Rs_scrollBar_right, "scrollBar_right", "sr", Opt_scrollBar_right, 0, "scrollbar right"),
102 BOOL (Rs_scrollBar_floating, "scrollBar_floating", "st", Opt_scrollBar_floating, 0, "scrollbar without a trough"),
103 RSTRG (Rs_scrollBar_align, "scrollBar_align", "mode"),
104 STRG (Rs_scrollBar_thickness, "thickness", "sbt", "number", "scrollbar thickness/width in pixels"),
105 #endif
106 BOOL (Rs_scrollTtyOutput, "scrollTtyOutput", NULL, Opt_scrollTtyOutput, 0, NULL),
107 BOOL (Rs_scrollTtyOutput, NULL, "si", Opt_scrollTtyOutput, Optflag_Reverse, "scroll-on-tty-output inhibit"),
108 BOOL (Rs_scrollTtyKeypress, "scrollTtyKeypress", "sk", Opt_scrollTtyKeypress, 0, "scroll-on-keypress"),
109 BOOL (Rs_scrollWithBuffer, "scrollWithBuffer", "sw", Opt_scrollWithBuffer, 0, "scroll-with-buffer"),
110 #if TRANSPARENT
111 BOOL (Rs_transparent, "inheritPixmap", "ip", Opt_transparent, 0, "inherit parent pixmap"),
112 SWCH ("tr", Opt_transparent, 0, NULL),
113 # if TINTING
114 STRG (Rs_color + Color_tint, "tintColor", "tint", "color", "tint color"),
115 # endif
116 #endif
117 #if OFF_FOCUS_FADING
118 STRG (Rs_fade, "fading", "fade", "%", "fade colors x% percent when rxvt-unicode is losing focus"),
119 STRG (Rs_color + Color_fade, "fadeColor", "fadecolor", "color", "target color for off-focus fading"),
120 #endif
121 #if TINTING
122 STRG (Rs_shade, "shading", "sh", "%", "shade background by x % when tinting."),
123 #endif
124 BOOL (Rs_utmpInhibit, "utmpInhibit", "ut", Opt_utmpInhibit, 0, "utmp inhibit"),
125 #ifndef NO_BELL
126 # if ENABLE_FRILLS
127 BOOL (Rs_urgentOnBell, "urgentOnBell", NULL, Opt_urgentOnBell, 0, NULL),
128 # endif
129 BOOL (Rs_visualBell, "visualBell", "vb", Opt_visualBell, 0, "visual bell"),
130 # if ! defined(NO_MAPALERT) && defined(MAPALERT_OPTION)
131 BOOL (Rs_mapAlert, "mapAlert", NULL, Opt_mapAlert, 0, NULL),
132 # endif
133 #endif
134 #ifdef META8_OPTION
135 BOOL (Rs_meta8, "meta8", NULL, Opt_meta8, 0, NULL),
136 #endif
137 #ifdef MOUSE_WHEEL
138 BOOL (Rs_mouseWheelScrollPage, "mouseWheelScrollPage", NULL, Opt_mouseWheelScrollPage, 0, NULL),
139 #endif
140 #if ENABLE_FRILLS
141 BOOL (Rs_tripleclickwords, "tripleclickwords", "tcw", Opt_tripleclickwords, 0, "triple click word selection"),
142 BOOL (Rs_insecure, "insecure", "insecure", Opt_insecure, 0, "enable possibly insecure escape sequences"),
143 BOOL (Rs_cursorUnderline, "cursorUnderline", "uc", Opt_cursorUnderline, 0, "underline cursor"),
144 #endif
145 #if CURSOR_BLINK
146 BOOL (Rs_cursorBlink, "cursorBlink", "bc", Opt_cursorBlink, 0, "blinking cursor"),
147 #endif
148 #ifdef POINTER_BLANK
149 BOOL (Rs_pointerBlank, "pointerBlank", "pb", Opt_pointerBlank, 0, "switch off pointer after delay"),
150 #endif
151 STRG (Rs_color + Color_bg, "background", "bg", "color", "background color"),
152 STRG (Rs_color + Color_fg, "foreground", "fg", "color", "foreground color"),
153 RSTRG (Rs_color + minCOLOR + 0, "color0", "color"),
154 RSTRG (Rs_color + minCOLOR + 1, "color1", "color"),
155 RSTRG (Rs_color + minCOLOR + 2, "color2", "color"),
156 RSTRG (Rs_color + minCOLOR + 3, "color3", "color"),
157 RSTRG (Rs_color + minCOLOR + 4, "color4", "color"),
158 RSTRG (Rs_color + minCOLOR + 5, "color5", "color"),
159 RSTRG (Rs_color + minCOLOR + 6, "color6", "color"),
160 RSTRG (Rs_color + minCOLOR + 7, "color7", "color"),
161 RSTRG (Rs_color + minBrightCOLOR + 0, "color8", "color"),
162 RSTRG (Rs_color + minBrightCOLOR + 1, "color9", "color"),
163 RSTRG (Rs_color + minBrightCOLOR + 2, "color10", "color"),
164 RSTRG (Rs_color + minBrightCOLOR + 3, "color11", "color"),
165 RSTRG (Rs_color + minBrightCOLOR + 4, "color12", "color"),
166 RSTRG (Rs_color + minBrightCOLOR + 5, "color13", "color"),
167 RSTRG (Rs_color + minBrightCOLOR + 6, "color14", "color"),
168 RSTRG (Rs_color + minBrightCOLOR + 7, "color15", "color"),
169 #ifndef NO_BOLD_UNDERLINE_REVERSE
170 RSTRG (Rs_color + Color_BD, "colorBD", "color"),
171 RSTRG (Rs_color + Color_IT, "colorIT", "color"),
172 RSTRG (Rs_color + Color_UL, "colorUL", "color"),
173 RSTRG (Rs_color + Color_RV, "colorRV", "color"),
174 #endif /* ! NO_BOLD_UNDERLINE_REVERSE */
175 #if ENABLE_FRILLS
176 RSTRG (Rs_color + Color_underline, "underlineColor", "color"),
177 #endif
178 #ifdef KEEP_SCROLLCOLOR
179 RSTRG (Rs_color + Color_scroll, "scrollColor", "color"),
180 RSTRG (Rs_color + Color_trough, "troughColor", "color"),
181 #endif /* KEEP_SCROLLCOLOR */
182 #ifdef OPTION_HC
183 STRG (Rs_color + Color_HC, "highlightColor", "hc", "color", "highlight color"),
184 #endif
185 #ifndef NO_CURSORCOLOR
186 STRG (Rs_color + Color_cursor, "cursorColor", "cr", "color", "cursor color"),
187 /* command-line option = resource name */
188 RSTRG (Rs_color + Color_cursor2, "cursorColor2", "color"),
189 #endif /* NO_CURSORCOLOR */
190 STRG (Rs_color + Color_pointer_fg, "pointerColor", "pr", "color", "pointer color"),
191 STRG (Rs_color + Color_pointer_bg, "pointerColor2", "pr2", "color", "pointer bg color"),
192 STRG (Rs_color + Color_border, "borderColor", "bd", "color", "border color"),
193 #ifdef XPM_BACKGROUND
194 RSTRG (Rs_path, "path", "search path"),
195 STRG (Rs_backgroundPixmap, "backgroundPixmap", "pixmap", "file[;geom]", "background pixmap"),
196 #endif
197 /* fonts: command-line option = resource name */
198 STRG (Rs_font, "font", "fn", "fontname", "normal text font"),
199 #if ENABLE_STYLES
200 STRG (Rs_boldFont, "boldFont", "fb", "fontname", "bold font"),
201 STRG (Rs_italicFont, "italicFont", "fi", "fontname", "italic font"),
202 STRG (Rs_boldItalicFont, "boldItalicFont", "fbi", "fontname", "bold italic font"),
203 BOOL (Rs_intensityStyles, "intensityStyles", "is", Opt_intensityStyles, 0, "font styles imply intensity changes"),
204 #endif
205 #ifdef USE_XIM
206 STRG (Rs_inputMethod, "inputMethod", "im", "name", "name of input method"),
207 STRG (Rs_preeditType, "preeditType", "pt", "style", "input style: style = OverTheSpot|OffTheSpot|Root"),
208 STRG (Rs_imLocale, "imLocale", "imlocale", "string", "locale to use for input method"),
209 STRG (Rs_imFont, "imFont", "imfont", "fontname", "fontset for styles OverTheSpot and OffTheSpot"),
210 #endif /* USE_XIM */
211 STRG (Rs_name, NULL, "name", "string", "client instance, icon, and title strings"),
212 STRG (Rs_title, "title", "title", "string", "title name for window"),
213 STRG (Rs_title, NULL, "T", NULL, NULL), /* short form */
214 STRG (Rs_iconName, "iconName", "n", "string", "icon name for window"),
215 STRG (Rs_saveLines, "saveLines", "sl", "number", "number of scrolled lines to save"),
216 #if ENABLE_XEMBED
217 STRG (Rs_embed, NULL, "embed", "windowid", "window id to embed terminal in"),
218 #endif
219 #if XFT
220 STRG (Rs_depth, "depth", "depth", "number", "depth of visual to request"),
221 #endif
222 #if ENABLE_FRILLS
223 RSTRG (Rs_transient_for, "transient-for", "windowid"),
224 BOOL (Rs_override_redirect, "override-redirect", "override-redirect", Opt_override_redirect, 0, "set override-redirect on the terminal window"),
225 STRG (Rs_pty_fd, NULL, "pty-fd", "fileno", "file descriptor of pty to use"),
226 BOOL (Rs_hold, "hold", "hold", Opt_hold, 0, "retain window after shell exit"),
227 STRG (Rs_ext_bwidth, "externalBorder", "w", "number", "external border in pixels"),
228 STRG (Rs_ext_bwidth, NULL, "bw", NULL, NULL),
229 STRG (Rs_ext_bwidth, NULL, "borderwidth", NULL, NULL),
230 STRG (Rs_int_bwidth, "internalBorder", "b", "number", "internal border in pixels"),
231 BOOL (Rs_borderLess, "borderLess", "bl", Opt_borderLess, 0, "borderless window"),
232 BOOL (Rs_skipBuiltinGlyphs, "skipBuiltinGlyphs", "sbg", Opt_skipBuiltinGlyphs, 0, "do not use internal glyphs"),
233 STRG (Rs_lineSpace, "lineSpace", "lsp", "number", "number of extra pixels between rows"),
234 #endif
235 #ifdef POINTER_BLANK
236 RSTRG (Rs_pointerBlankDelay, "pointerBlankDelay", "number"),
237 #endif
238 #ifndef NO_BACKSPACE_KEY
239 RSTRG (Rs_backspace_key, "backspacekey", "string"),
240 #endif
241 #ifndef NO_DELETE_KEY
242 RSTRG (Rs_delete_key, "deletekey", "string"),
243 #endif
244 RSTRG (Rs_selectstyle, "selectstyle", "mode"),
245 #ifdef PRINTPIPE
246 RSTRG (Rs_print_pipe, "print-pipe", "string"),
247 #endif
248 STRG (Rs_modifier, "modifier", "mod", "modifier", "meta modifier = alt|meta|hyper|super|mod1|...|mod5"),
249 #ifdef CUTCHAR_RESOURCE
250 RSTRG (Rs_cutchars, "cutchars", "string"),
251 #endif /* CUTCHAR_RESOURCE */
252 RSTRG (Rs_answerbackstring, "answerbackString", "string"),
253 #ifndef NO_SECONDARY_SCREEN
254 BOOL (Rs_secondaryScreen, "secondaryScreen", "ssc", Opt_secondaryScreen, 0, "enable secondary screen"),
255 BOOL (Rs_secondaryScroll, "secondaryScroll", "ssr", Opt_secondaryScroll, 0, "enable secondary screen scroll"),
256 #endif
257 #if ENABLE_PERL
258 RSTRG (Rs_perl_lib, "perl-lib", "string"), //, "colon-separated directories with extension scripts"),TODO
259 RSTRG (Rs_perl_eval, "perl-eval", "perl-eval"), // "string", "code to be evaluated after all extensions have been loaded"),TODO
260 RSTRG (Rs_perl_ext_1, "perl-ext-common", "string"), //, "colon-separated list of perl extensions to enable"),TODO
261 STRG (Rs_perl_ext_2, "perl-ext", "pe", "string", "colon-separated list of perl extensions to enable for this instance"),
262 #endif
263
264 #ifdef HAVE_AFTERIMAGE
265 STRG (Rs_blendtype, "blendType", "blt", "string", "background image blending type - alpha, tint, etc..."),
266 STRG (Rs_blurradius, "blurRadius", "blr", "number", "Gaussian Blur radius to apply to the root background"),
267 #endif
268 #ifndef NO_RESOURCES
269 INFO ("xrm", "string", "X resource"),
270 #endif
271 INFO ("e", "command arg ...", "command to execute")
272 };
273
274 #undef INFO
275 #undef STRG
276 #undef RSTRG
277 #undef SWCH
278 #undef BOOL
279
280 static const char releasestring[] = "rxvt-unicode (" RXVTNAME ") v" VERSION " - released: " DATE "\n";
281 static const char optionsstring[] = "options: "
282 #if ENABLE_PERL
283 "perl,"
284 #endif
285 #if XFT
286 "xft,"
287 #endif
288 #if ENABLE_STYLES
289 "styles,"
290 #endif
291 #if ENABLE_COMBINING
292 "combining,"
293 #endif
294 #if TEXT_BLINK
295 "blink,"
296 #endif
297 #if ISO_14755
298 "iso14755,"
299 #endif
300 #if UNICODE_3
301 "unicode3,"
302 #endif
303 "encodings=eu+vn"
304 #if ENCODING_JP
305 "+jp"
306 #endif
307 #if ENCODING_JP_EXT
308 "+jp-ext"
309 #endif
310 #if ENCODING_KR
311 "+kr"
312 #endif
313 #if ENCODING_ZH
314 "+zh"
315 #endif
316 #if ENCODING_ZH_EXT
317 "+zh-ext"
318 #endif
319 ","
320 #if OFF_FOCUS_FADING
321 "fade,"
322 #endif
323 #if defined(XPM_BACKGROUND)
324 "XPM,"
325 #endif
326 #if defined(TRANSPARENT)
327 "transparent,"
328 #endif
329 #if TINTING
330 "tint,"
331 #endif
332 #if defined(USE_XIM)
333 "XIM,"
334 #endif
335 #if defined(NO_BACKSPACE_KEY)
336 "no_backspace,"
337 #endif
338 #if defined(NO_DELETE_KEY)
339 "no_delete,"
340 #endif
341 #if EIGHT_BIT_CONTROLS
342 "8bitctrls,"
343 #endif
344 #if defined(ENABLE_FRILLS)
345 "frills,"
346 #endif
347 #if defined(SELECTION_SCROLLING)
348 "selectionscrolling,"
349 #endif
350 #if MOUSE_WHEEL
351 "wheel,"
352 #endif
353 #if MOUSE_SLIP_WHEELING
354 "slipwheel,"
355 #endif
356 #if defined(SMART_RESIZE)
357 "smart-resize,"
358 #endif
359 #if defined(CURSOR_BLINK)
360 "cursorBlink,"
361 #endif
362 #if defined(POINTER_BLANK)
363 "pointerBlank,"
364 #endif
365 #if defined(NO_RESOURCES)
366 "NoResources,"
367 #endif
368 "scrollbars="
369 #if !defined(HAVE_SCROLLBARS)
370 "NONE"
371 #else
372 # if defined(PLAIN_SCROLLBAR)
373 "plain"
374 # if defined(RXVT_SCROLLBAR) || defined(NEXT_SCROLLBAR) || defined(XTERM_SCROLLBAR)
375 "+"
376 # endif
377 # endif
378 # if defined(RXVT_SCROLLBAR)
379 "rxvt"
380 # if defined(NEXT_SCROLLBAR) || defined(XTERM_SCROLLBAR)
381 "+"
382 # endif
383 # endif
384 # if defined(NEXT_SCROLLBAR)
385 "NeXT"
386 # if defined(XTERM_SCROLLBAR)
387 "+"
388 # endif
389 # endif
390 # if defined(XTERM_SCROLLBAR)
391 "xterm"
392 # endif
393 #endif
394 "\nUsage: "; /* Usage */
395
396 #define INDENT 18
397
398 const char rxvt_term::resval_undef [] = "<undef>";
399 const char rxvt_term::resval_on [] = "on";
400 const char rxvt_term::resval_off [] = "off";
401
402 /*{{{ usage: */
403 /*----------------------------------------------------------------------*/
404 static void
405 rxvt_usage (int type)
406 {
407 unsigned int i, col;
408
409 rxvt_log ("%s%s%s", releasestring, optionsstring, RESNAME);
410
411 switch (type)
412 {
413 case 0: /* brief listing */
414 rxvt_log (" [-help] [--help]\n");
415
416 for (col = 1, i = 0; i < optList_size; i++)
417 if (optList[i].desc != NULL)
418 {
419 int len = 0;
420
421 if (!optList_isBool (i))
422 {
423 len = optList_strlen (i);
424 if (len > 0)
425 len++; /* account for space */
426 }
427 #ifdef DEBUG_STRICT
428 assert (optList[i].opt != NULL);
429 #endif
430 len += 4 + strlen (optList[i].opt) + (optList_isBool (i) ? 2: 0);
431 col += len;
432 if (col > 79)
433 { /* assume regular width */
434 rxvt_log ("\n");
435 col = 1 + len;
436 }
437
438 rxvt_log (" [-%s%s", (optList_isBool (i) ? "/+" : ""), optList[i].opt);
439 if (optList_strlen (i))
440 rxvt_log (" %s]", optList[i].arg);
441 else
442 rxvt_log ("]");
443 }
444 break;
445
446 case 1: /* full command-line listing */
447 rxvt_log (" [options] [-e command args]\n\nwhere options include:\n");
448
449 for (i = 0; i < optList_size; i++)
450 if (optList[i].desc != NULL)
451 {
452 #ifdef DEBUG_STRICT
453 assert (optList[i].opt != NULL);
454 #endif
455 rxvt_log (" %s%s %-*s%s%s\n",
456 (optList_isBool (i) ? "-/+" : "-"), optList[i].opt,
457 (INDENT - strlen (optList[i].opt)
458 + (optList_isBool (i) ? 0 : 2)),
459 (optList[i].arg ? optList[i].arg : ""),
460 (optList_isBool (i) ? "turn on/off " : ""),
461 optList[i].desc);
462 }
463 rxvt_log ("\n --help to list long-options");
464 break;
465
466 case 2: /* full resource listing */
467 rxvt_log (" [options] [-e command args]\n\n"
468 "where resources (long-options) include:\n");
469
470 for (i = 0; i < optList_size; i++)
471 if (optList[i].kw != NULL)
472 rxvt_log (" %s: %*s%s\n",
473 optList[i].kw,
474 (INDENT - strlen (optList[i].kw)), "", /* XXX */
475 (optList_isBool (i) ? "boolean" : optList[i].arg));
476 #ifdef KEYSYM_RESOURCE
477 rxvt_log (" " "keysym.sym" ": %*s%s\n",
478 (INDENT - sizeof ("keysym.sym") + 1), "", /* XXX */
479 "keysym");
480 #endif
481 rxvt_log ("\n -help to list options");
482 break;
483 }
484
485 rxvt_log ("\n\n");
486 rxvt_exit_failure ();
487 /* NOTREACHED */
488 }
489
490 /*}}} */
491
492 /*{{{ get command-line options before getting resources */
493 void
494 rxvt_term::get_options (int argc, const char *const *argv)
495 {
496 int i, bad_option = 0;
497
498 for (i = 1; i < argc; i++)
499 {
500 unsigned int entry, longopt = 0;
501 const char *flag, *opt;
502
503 opt = argv[i];
504
505 if (*opt == '-')
506 {
507 flag = resval_on;
508
509 if (*++opt == '-')
510 longopt = *opt++; /* long option */
511 }
512 else if (*opt == '+')
513 {
514 flag = resval_off;
515
516 if (*++opt == '+')
517 longopt = *opt++; /* long option */
518 }
519 else
520 {
521 bad_option = 1;
522 rxvt_warn ("\"%s\": malformed option.\n", opt);
523 continue;
524 }
525
526 if (!strcmp (opt, "help"))
527 rxvt_usage (longopt ? 2 : 1);
528
529 if (!strcmp (opt, "h"))
530 rxvt_usage (0);
531
532 /* feature: always try to match long-options */
533 for (entry = 0; entry < optList_size; entry++)
534 if ((optList[entry].kw && !strcmp (opt, optList[entry].kw))
535 || (!longopt
536 && optList[entry].opt && !strcmp (opt, optList[entry].opt)))
537 break;
538
539 if (entry < optList_size)
540 {
541 if (optList_isReverse (entry))
542 flag = flag == resval_on ? resval_off : resval_on;
543
544 if (optList_strlen (entry))
545 {
546 /*
547 * special cases are handled in main.c:main () to allow
548 * X resources to set these values before we settle for
549 * default values
550 */
551
552 if (optList[entry].doff != -1)
553 {
554 if (flag == resval_on && !argv [i+1])
555 rxvt_fatal ("option '%s' needs an argument, aborting.\n", argv [i]);
556
557 rs[optList[entry].doff] = flag == resval_on ? argv[++i] : resval_undef;
558 }
559 }
560 else
561 { /* boolean value */
562 set_option (optList[entry].index, flag == resval_on);
563
564 if (optList[entry].doff != -1)
565 rs[optList[entry].doff] = flag;
566 }
567 }
568 else
569 #ifdef KEYSYM_RESOURCE
570 /* if (!strncmp (opt, "keysym.", sizeof ("keysym.") - 1)) */
571 if (rxvt_Str_match (opt, "keysym."))
572 {
573 const char *str = argv[++i];
574
575 if (str != NULL)
576 parse_keysym (opt + sizeof ("keysym.") - 1, str);
577 }
578 else
579 #endif
580 {
581 bad_option = 1;
582 rxvt_warn ("\"%s\": unknown or malformed option.\n", opt);
583 }
584 }
585
586 if (bad_option)
587 rxvt_usage (0);
588 }
589
590 /*}}} */
591
592 #ifndef NO_RESOURCES
593 /*----------------------------------------------------------------------*/
594
595 # ifdef KEYSYM_RESOURCE
596 /*
597 * Define key from XrmEnumerateDatabase.
598 * quarks will be something like
599 * "rxvt" "keysym" "0xFF01"
600 * value will be a string
601 */
602 /* ARGSUSED */
603 int
604 rxvt_define_key (XrmDatabase *database UNUSED,
605 XrmBindingList bindings UNUSED,
606 XrmQuarkList quarks,
607 XrmRepresentation *type UNUSED,
608 XrmValue *value,
609 XPointer closure UNUSED)
610 {
611 int last;
612
613 for (last = 0; quarks[last] != NULLQUARK; last++) /* look for last quark in list */
614 ;
615
616 last--;
617 GET_R->parse_keysym (XrmQuarkToString (quarks[last]), (char *)value->addr);//D//TODO
618 return False;
619 }
620
621 /*
622 * look for something like this (XK_Delete)
623 * rxvt*keysym.0xFFFF: "\177"
624 *
625 * arg will be
626 * NULL for ~/.Xdefaults and
627 * non-NULL for command-line options (need to allocate)
628 */
629 #define NEWARGLIM 500 /* `reasonable' size */
630
631 struct keysym_vocabulary_t
632 {
633 const char *name;
634 unsigned short len;
635 unsigned short value;
636 };
637 keysym_vocabulary_t keysym_vocabulary[] =
638 {
639 { "ISOLevel3", 9, Level3Mask },
640 { "AppKeypad", 9, AppKeypadMask },
641 { "Control", 7, ControlMask },
642 { "NumLock", 7, NumLockMask },
643 { "Shift", 5, ShiftMask },
644 { "Meta", 4, MetaMask },
645 { "Lock", 4, LockMask },
646 { "Mod1", 4, Mod1Mask },
647 { "Mod2", 4, Mod2Mask },
648 { "Mod3", 4, Mod3Mask },
649 { "Mod4", 4, Mod4Mask },
650 { "Mod5", 4, Mod5Mask },
651 { "I", 1, Level3Mask },
652 { "K", 1, AppKeypadMask },
653 { "C", 1, ControlMask },
654 { "N", 1, NumLockMask },
655 { "S", 1, ShiftMask },
656 { "M", 1, MetaMask },
657 { "A", 1, MetaMask },
658 { "L", 1, LockMask },
659 { "1", 1, Mod1Mask },
660 { "2", 1, Mod2Mask },
661 { "3", 1, Mod3Mask },
662 { "4", 1, Mod4Mask },
663 { "5", 1, Mod5Mask },
664 };
665
666 int
667 rxvt_term::parse_keysym (const char *str, const char *arg)
668 {
669 int n, sym;
670 unsigned int state = 0;
671 const char *pmodend = NULL;
672 char *newarg = NULL;
673 char newargstr[NEWARGLIM];
674
675 if (arg == NULL)
676 {
677 if ((n = rxvt_Str_match (str, "keysym.")) == 0)
678 return 0;
679
680 str += n; /* skip `keysym.' */
681 if (!(pmodend = strchr (str, ':')))
682 return -1;
683 }
684 else
685 pmodend = str + strlen(str);
686
687 for (--pmodend; str < pmodend; --pmodend)
688 if (*pmodend == '-')
689 break;
690
691 while (str < pmodend)
692 {
693 unsigned int i;
694
695 for (i=0; i < sizeof (keysym_vocabulary) / sizeof (keysym_vocabulary_t); ++i)
696 {
697 if (strncmp (str, keysym_vocabulary [i].name, keysym_vocabulary [i].len) == 0)
698 {
699 state |= keysym_vocabulary[i].value;
700 str += keysym_vocabulary[i].len;
701 break;
702 }
703 }
704
705 if (i >= sizeof (keysym_vocabulary) / sizeof (keysym_vocabulary_t))
706 return -1;
707
708 if (*str == '-')
709 ++str;
710 }
711
712 /* some scanf () have trouble with a 0x prefix */
713 if (str[0] == '0' && toupper (str[1]) == 'X')
714 {
715 str += 2;
716
717 if (arg)
718 {
719 if (sscanf (str, (strchr (str, ':') ? "%x:" : "%x"), &sym) != 1)
720 return -1;
721 }
722 else
723 {
724 if (sscanf (str, "%x:", &sym) != 1)
725 return -1;
726
727 /* cue to ':', it's there since sscanf () worked */
728 strncpy (newargstr, strchr (str, ':') + 1, NEWARGLIM - 1);
729 newargstr[NEWARGLIM - 1] = '\0';
730 newarg = newargstr;
731 }
732 }
733 else
734 {
735 /*
736 * convert keysym name to keysym number
737 */
738 strncpy (newargstr, str, NEWARGLIM - 1);
739 newargstr[NEWARGLIM - 1] = '\0';
740
741 if (arg == NULL)
742 {
743 if ((newarg = strchr (newargstr, ':')) == NULL)
744 return -1;
745
746 *newarg++ = '\0'; /* terminate keysym name */
747 }
748
749 if ((sym = XStringToKeysym (newargstr)) == None)
750 return -1;
751 }
752
753 if (newarg == NULL)
754 {
755 strncpy (newargstr, arg, NEWARGLIM - 1);
756 newargstr[NEWARGLIM - 1] = '\0';
757 newarg = newargstr;
758 }
759
760 rxvt_Str_trim (newarg);
761 if (*newarg == '\0' || (n = rxvt_Str_escaped (newarg)) == 0)
762 return -1;
763
764 keyboard->register_user_translation (sym, state, newarg);
765 return 1;
766 }
767
768 # endif /* KEYSYM_RESOURCE */
769 #endif /* NO_RESOURCES */
770
771 static char *
772 get_res (XrmDatabase database, const char *program, const char *option)
773 {
774 char resource[512];
775 char *type;
776 XrmValue result;
777
778 snprintf (resource, sizeof (resource), "%s.%s", program, option);
779 XrmGetResource (database, resource, resource, &type, &result);
780
781 return result.addr;
782 }
783
784 const char *
785 rxvt_term::x_resource (const char *name)
786 {
787 XrmDatabase database = XrmGetDatabase (dpy);
788
789 const char *p = get_res (database, rs[Rs_name], name);
790 const char *p0 = get_res (database, "!INVALIDPROGRAMMENAMEDONTMATCH!", name);
791
792 if (p == NULL || (p0 && strcmp (p, p0) == 0))
793 {
794 p = get_res (database, RESCLASS, name);
795 #ifdef RESFALLBACK
796 if (p == NULL || (p0 && strcmp (p, p0) == 0))
797 p = get_res (database, RESFALLBACK, name);
798 #endif
799 }
800
801 if (p == NULL && p0)
802 p = p0;
803
804 return p;
805 }
806
807 void
808 rxvt_term::extract_resources ()
809 {
810 #ifndef NO_RESOURCES
811 /*
812 * Query resources for options that affect us
813 */
814 for (int entry = 0; entry < optList_size; entry++)
815 {
816 int s;
817 const char *kw = optList[entry].kw;
818
819 if (kw == NULL || rs[optList[entry].doff] != NULL)
820 continue; // previously set
821
822 const char *p = x_resource (kw);
823
824 if (p)
825 {
826 p = strdup (p);
827 allocated.push_back ((void *)p);
828 rs[optList[entry].doff] = p;
829
830 if (optList_isBool (entry))
831 {
832 s = strcasecmp (p, "TRUE") == 0
833 || strcasecmp (p, "YES") == 0
834 || strcasecmp (p, "ON") == 0
835 || strcasecmp (p, "1") == 0;
836
837 if (optList_isReverse (entry))
838 s = !s;
839
840 set_option (optList[entry].index, s);
841 }
842 }
843 }
844
845 /*
846 * [R5 or later]: enumerate the resource database
847 */
848 # ifdef KEYSYM_RESOURCE
849 XrmDatabase database = XrmGetDatabase (dpy);
850 XrmName name_prefix[3];
851 XrmClass class_prefix[3];
852
853 name_prefix[0] = XrmStringToName (rs[Rs_name]);
854 name_prefix[1] = XrmStringToName ("keysym");
855 name_prefix[2] = NULLQUARK;
856 class_prefix[0] = XrmStringToName (RESCLASS);
857 class_prefix[1] = XrmStringToName ("Keysym");
858 class_prefix[2] = NULLQUARK;
859 /* XXX: Need to check sizeof (rxvt_t) == sizeof (XPointer) */
860 XrmEnumerateDatabase (database, name_prefix, class_prefix,
861 XrmEnumOneLevel, rxvt_define_key, NULL);
862 # ifdef RESFALLBACK
863 name_prefix[0] = XrmStringToName (RESFALLBACK);
864 name_prefix[1] = XrmStringToName ("keysym");
865 class_prefix[0] = XrmStringToName (RESFALLBACK);
866 class_prefix[1] = XrmStringToName ("Keysym");
867 /* XXX: Need to check sizeof (rxvt_t) == sizeof (XPointer) */
868 XrmEnumerateDatabase (database, name_prefix, class_prefix,
869 XrmEnumOneLevel, rxvt_define_key, NULL);
870 # endif
871 # endif
872
873 #endif /* NO_RESOURCES */
874 }
875
876 /*----------------------- end-of-file (C source) -----------------------*/