ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/xdefaults.C
Revision: 1.122
Committed: Thu Nov 22 15:07:10 2007 UTC (16 years, 6 months ago) by ayin
Content type: text/plain
Branch: MAIN
Changes since 1.121: +9 -2 lines
Log Message:
The removal of rxvt own parsing caused an inconsistency for keysym
directives between resources and command line options, because the
former are subjected to xlib parsing while the latter are not. Fix it
by generating resources from the command line options and merging them
later in the resource database.

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