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

# User Rev Content
1 root 1.95 /*----------------------------------------------------------------------*
2 pcg 1.24 * File: xdefaults.C
3 pcg 1.1 *----------------------------------------------------------------------*
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 root 1.73 * Copyright (c) 2003-2006 Marc Lehmann <pcg@goof.com>
10 pcg 1.1 *
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 root 1.90 #include "../config.h"
27     #include "rxvt.h"
28 pcg 1.1 #include "version.h"
29    
30 root 1.46 #ifdef KEYSYM_RESOURCE
31 root 1.93 # include "keyboard.h"
32 root 1.46 #endif
33    
34 root 1.64 /* place holders used for parsing command-line options */
35 ayin 1.97 #define Optflag_Reverse 1
36     #define Optflag_Boolean 2
37 ayin 1.106 #define Optflag_Switch 4
38 root 1.64
39 root 1.93 /* monolithic option/resource structure: */
40 pcg 1.1 /*
41     * `string' options MUST have a usage argument
42     * `switch' and `boolean' options have no argument
43 pcg 1.11 * if there's no desc (ription), it won't appear in rxvt_usage ()
44 pcg 1.1 */
45    
46 pcg 1.11 /* INFO () - descriptive information only */
47 pcg 1.1 #define INFO(opt, arg, desc) \
48 ayin 1.97 {0, 0, -1, NULL, (opt), (arg), (desc)}
49 pcg 1.1
50 pcg 1.11 /* STRG () - command-line option, with/without resource */
51 pcg 1.1 #define STRG(rsp, kw, opt, arg, desc) \
52 ayin 1.97 {0, 0, (rsp), (kw), (opt), (arg), (desc)}
53 pcg 1.1
54 pcg 1.11 /* RSTRG () - resource/long-option */
55 pcg 1.1 #define RSTRG(rsp, kw, arg) \
56 ayin 1.97 {0, 0, (rsp), (kw), NULL, (arg), NULL}
57 pcg 1.1
58 pcg 1.11 /* BOOL () - regular boolean `-/+' flag */
59 ayin 1.97 #define BOOL(rsp, kw, opt, option, flag, desc) \
60 ayin 1.99 { (option), (Optflag_Boolean | (flag)), (rsp), (kw), (opt), NULL, (desc)}
61 pcg 1.1
62 pcg 1.11 /* SWCH () - `-' flag */
63 ayin 1.97 #define SWCH(opt, option, flag, desc) \
64 ayin 1.106 { (option), (Optflag_Switch | (flag)), -1, NULL, (opt), NULL, (desc)}
65 pcg 1.1
66     /* convenient macros */
67     #define optList_strlen(i) \
68 root 1.34 (optList[i].flag ? 0 : (optList[i].arg ? strlen (optList[i].arg) : 1))
69 pcg 1.1 #define optList_isBool(i) \
70 root 1.64 (optList[i].flag & Optflag_Boolean)
71 pcg 1.1 #define optList_isReverse(i) \
72 root 1.64 (optList[i].flag & Optflag_Reverse)
73 root 1.54 #define optList_size \
74 pcg 1.11 (sizeof (optList) / sizeof (optList[0]))
75 pcg 1.1
76 pcg 1.9 static const struct
77     {
78 ayin 1.97 const uint8_t index; /* Option index */
79     const uint8_t flag; /* Option flag */
80 root 1.98 const int16_t doff; /* resource value index or -1 */
81 pcg 1.1 const char *kw; /* keyword */
82     const char *opt; /* option */
83     const char *arg; /* argument */
84     const char *desc; /* description */
85 pcg 1.9 }
86     optList[] = {
87 pcg 1.11 STRG (Rs_display_name, NULL, "d", NULL, NULL), /* short form */
88     STRG (Rs_display_name, NULL, "display", "string", "X server to contact"),
89 pcg 1.23 STRG (Rs_term_name, "termName", "tn", "string", "value of the TERM environment variable"),
90 pcg 1.11 STRG (Rs_geometry, NULL, "g", NULL, NULL), /* short form */
91 pcg 1.23 STRG (Rs_geometry, "geometry", "geometry", "geometry", "size (in characters) and position"),
92 ayin 1.97 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 root 1.107 BOOL (Rs_skipScroll, "skipScroll", "ss", Opt_skipScroll, 0, "skip scrolling"),
99 ayin 1.97 BOOL (Rs_pastableTabs, "pastableTabs", "ptab", Opt_pastableTabs, 0, "tab characters are pastable"),
100 root 1.59 #if HAVE_SCROLLBARS
101 root 1.49 RSTRG (Rs_scrollstyle, "scrollstyle", "mode"),
102 ayin 1.97 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 root 1.49 RSTRG (Rs_scrollBar_align, "scrollBar_align", "mode"),
106     STRG (Rs_scrollBar_thickness, "thickness", "sbt", "number", "scrollbar thickness/width in pixels"),
107 pcg 1.23 #endif
108 ayin 1.97 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 root 1.108 #if ENABLE_TRANSPARENCY
113 ayin 1.97 BOOL (Rs_transparent, "inheritPixmap", "ip", Opt_transparent, 0, "inherit parent pixmap"),
114 ayin 1.118 BOOL (Rs_transparent, "transparent", "tr", Opt_transparent, 0, "inherit parent pixmap"),
115 pcg 1.23 STRG (Rs_color + Color_tint, "tintColor", "tint", "color", "tint color"),
116 ayin 1.111 STRG (Rs_shade, "shading", "sh", "%", "shade background by x %."),
117 pcg 1.23 #endif
118 root 1.59 #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 pcg 1.1 #endif
122 ayin 1.97 BOOL (Rs_utmpInhibit, "utmpInhibit", "ut", Opt_utmpInhibit, 0, "utmp inhibit"),
123 pcg 1.1 #ifndef NO_BELL
124 ayin 1.100 # if ENABLE_FRILLS
125 ayin 1.101 BOOL (Rs_urgentOnBell, "urgentOnBell", NULL, Opt_urgentOnBell, 0, NULL),
126 ayin 1.100 # endif
127 ayin 1.97 BOOL (Rs_visualBell, "visualBell", "vb", Opt_visualBell, 0, "visual bell"),
128 pcg 1.1 # if ! defined(NO_MAPALERT) && defined(MAPALERT_OPTION)
129 ayin 1.97 BOOL (Rs_mapAlert, "mapAlert", NULL, Opt_mapAlert, 0, NULL),
130 pcg 1.1 # endif
131     #endif
132     #ifdef META8_OPTION
133 ayin 1.97 BOOL (Rs_meta8, "meta8", NULL, Opt_meta8, 0, NULL),
134 pcg 1.1 #endif
135     #ifdef MOUSE_WHEEL
136 ayin 1.97 BOOL (Rs_mouseWheelScrollPage, "mouseWheelScrollPage", NULL, Opt_mouseWheelScrollPage, 0, NULL),
137 pcg 1.1 #endif
138 root 1.34 #if ENABLE_FRILLS
139 ayin 1.97 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 pcg 1.1 #endif
143 root 1.58 #if CURSOR_BLINK
144 ayin 1.97 BOOL (Rs_cursorBlink, "cursorBlink", "bc", Opt_cursorBlink, 0, "blinking cursor"),
145 pcg 1.1 #endif
146     #ifdef POINTER_BLANK
147 ayin 1.97 BOOL (Rs_pointerBlank, "pointerBlank", "pb", Opt_pointerBlank, 0, "switch off pointer after delay"),
148 pcg 1.1 #endif
149 pcg 1.11 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 pcg 1.1 #ifndef NO_BOLD_UNDERLINE_REVERSE
168 pcg 1.11 RSTRG (Rs_color + Color_BD, "colorBD", "color"),
169 root 1.40 RSTRG (Rs_color + Color_IT, "colorIT", "color"),
170 pcg 1.11 RSTRG (Rs_color + Color_UL, "colorUL", "color"),
171     RSTRG (Rs_color + Color_RV, "colorRV", "color"),
172 ayin 1.120 #endif /* ! NO_BOLD_UNDERLINE_REVERSE */
173 root 1.43 #if ENABLE_FRILLS
174     RSTRG (Rs_color + Color_underline, "underlineColor", "color"),
175     #endif
176 pcg 1.1 #ifdef KEEP_SCROLLCOLOR
177 pcg 1.11 RSTRG (Rs_color + Color_scroll, "scrollColor", "color"),
178     RSTRG (Rs_color + Color_trough, "troughColor", "color"),
179 ayin 1.120 #endif /* KEEP_SCROLLCOLOR */
180 pcg 1.1 #ifdef OPTION_HC
181 pcg 1.11 STRG (Rs_color + Color_HC, "highlightColor", "hc", "color", "highlight color"),
182 pcg 1.1 #endif
183 root 1.49 #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 ayin 1.120 #endif /* NO_CURSORCOLOR */
188 root 1.49 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 sasha 1.114 #ifdef BG_IMAGE_FROM_FILE
192 pcg 1.11 RSTRG (Rs_path, "path", "search path"),
193 pcg 1.23 STRG (Rs_backgroundPixmap, "backgroundPixmap", "pixmap", "file[;geom]", "background pixmap"),
194 pcg 1.1 #endif
195 root 1.40 /* fonts: command-line option = resource name */
196 pcg 1.11 STRG (Rs_font, "font", "fn", "fontname", "normal text font"),
197 root 1.40 #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 ayin 1.97 BOOL (Rs_intensityStyles, "intensityStyles", "is", Opt_intensityStyles, 0, "font styles imply intensity changes"),
202 root 1.40 #endif
203 pcg 1.1 #ifdef USE_XIM
204 pcg 1.11 STRG (Rs_inputMethod, "inputMethod", "im", "name", "name of input method"),
205 pcg 1.23 STRG (Rs_preeditType, "preeditType", "pt", "style", "input style: style = OverTheSpot|OffTheSpot|Root"),
206 pcg 1.11 STRG (Rs_imLocale, "imLocale", "imlocale", "string", "locale to use for input method"),
207 root 1.49 STRG (Rs_imFont, "imFont", "imfont", "fontname", "fontset for styles OverTheSpot and OffTheSpot"),
208 ayin 1.120 #endif /* USE_XIM */
209 pcg 1.23 STRG (Rs_name, NULL, "name", "string", "client instance, icon, and title strings"),
210 pcg 1.11 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 pcg 1.23 STRG (Rs_saveLines, "saveLines", "sl", "number", "number of scrolled lines to save"),
214 root 1.57 #if ENABLE_XEMBED
215     STRG (Rs_embed, NULL, "embed", "windowid", "window id to embed terminal in"),
216     #endif
217 root 1.89 #if XFT
218     STRG (Rs_depth, "depth", "depth", "number", "depth of visual to request"),
219     #endif
220 root 1.34 #if ENABLE_FRILLS
221 root 1.72 RSTRG (Rs_transient_for, "transient-for", "windowid"),
222 ayin 1.97 BOOL (Rs_override_redirect, "override-redirect", "override-redirect", Opt_override_redirect, 0, "set override-redirect on the terminal window"),
223 root 1.56 STRG (Rs_pty_fd, NULL, "pty-fd", "fileno", "file descriptor of pty to use"),
224 ayin 1.97 BOOL (Rs_hold, "hold", "hold", Opt_hold, 0, "retain window after shell exit"),
225 pcg 1.23 STRG (Rs_ext_bwidth, "externalBorder", "w", "number", "external border in pixels"),
226 pcg 1.11 STRG (Rs_ext_bwidth, NULL, "bw", NULL, NULL),
227     STRG (Rs_ext_bwidth, NULL, "borderwidth", NULL, NULL),
228 pcg 1.23 STRG (Rs_int_bwidth, "internalBorder", "b", "number", "internal border in pixels"),
229 ayin 1.97 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 pcg 1.23 STRG (Rs_lineSpace, "lineSpace", "lsp", "number", "number of extra pixels between rows"),
232 pcg 1.1 #endif
233     #ifdef POINTER_BLANK
234 pcg 1.11 RSTRG (Rs_pointerBlankDelay, "pointerBlankDelay", "number"),
235 pcg 1.1 #endif
236     #ifndef NO_BACKSPACE_KEY
237 pcg 1.11 RSTRG (Rs_backspace_key, "backspacekey", "string"),
238 pcg 1.1 #endif
239     #ifndef NO_DELETE_KEY
240 pcg 1.11 RSTRG (Rs_delete_key, "deletekey", "string"),
241 pcg 1.1 #endif
242 pcg 1.11 RSTRG (Rs_selectstyle, "selectstyle", "mode"),
243 pcg 1.1 #ifdef PRINTPIPE
244 pcg 1.11 RSTRG (Rs_print_pipe, "print-pipe", "string"),
245 pcg 1.1 #endif
246 pcg 1.23 STRG (Rs_modifier, "modifier", "mod", "modifier", "meta modifier = alt|meta|hyper|super|mod1|...|mod5"),
247 pcg 1.1 #ifdef CUTCHAR_RESOURCE
248 pcg 1.11 RSTRG (Rs_cutchars, "cutchars", "string"),
249 ayin 1.120 #endif /* CUTCHAR_RESOURCE */
250 pcg 1.11 RSTRG (Rs_answerbackstring, "answerbackString", "string"),
251 pcg 1.23 #ifndef NO_SECONDARY_SCREEN
252 ayin 1.97 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 pcg 1.23 #endif
255 root 1.65 #if ENABLE_PERL
256 root 1.70 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 root 1.65 #endif
261 ayin 1.105 #if ISO_14755
262     BOOL (Rs_iso14755_52, "iso14755_52", NULL, Opt_iso14755_52, 0, NULL),
263     #endif
264 sasha 1.102 #ifdef HAVE_AFTERIMAGE
265     STRG (Rs_blendtype, "blendType", "blt", "string", "background image blending type - alpha, tint, etc..."),
266 sasha 1.109 STRG (Rs_blurradius, "blurRadius", "blr", "HxV", "Gaussian Blur radii to apply to the root background"),
267 sasha 1.102 #endif
268 root 1.77 #ifndef NO_RESOURCES
269 root 1.49 INFO ("xrm", "string", "X resource"),
270     #endif
271 pcg 1.11 INFO ("e", "command arg ...", "command to execute")
272 pcg 1.9 };
273 pcg 1.1
274     #undef INFO
275     #undef STRG
276     #undef RSTRG
277     #undef SWCH
278     #undef BOOL
279    
280 root 1.40 static const char releasestring[] = "rxvt-unicode (" RXVTNAME ") v" VERSION " - released: " DATE "\n";
281 root 1.34 static const char optionsstring[] = "options: "
282 root 1.77 #if ENABLE_PERL
283     "perl,"
284     #endif
285 root 1.30 #if XFT
286     "xft,"
287     #endif
288 root 1.40 #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 root 1.30 #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 root 1.41 #if ENCODING_ZH
314     "+zh"
315 root 1.30 #endif
316 root 1.41 #if ENCODING_ZH_EXT
317     "+zh-ext"
318 root 1.30 #endif
319     ","
320     #if OFF_FOCUS_FADING
321     "fade,"
322     #endif
323 root 1.108 #if defined(ENABLE_TRANSPARENCY)
324 pcg 1.9 "transparent,"
325 ayin 1.111 "tint,"
326 pcg 1.1 #endif
327 root 1.110 #if HAVE_AFTERIMAGE
328     "afterimage,"
329     #endif
330 pcg 1.1 #if defined(USE_XIM)
331 pcg 1.9 "XIM,"
332 pcg 1.1 #endif
333     #if defined(NO_BACKSPACE_KEY)
334 pcg 1.9 "no_backspace,"
335 pcg 1.1 #endif
336     #if defined(NO_DELETE_KEY)
337 pcg 1.9 "no_delete,"
338 pcg 1.1 #endif
339 root 1.30 #if EIGHT_BIT_CONTROLS
340     "8bitctrls,"
341     #endif
342 root 1.34 #if defined(ENABLE_FRILLS)
343 root 1.30 "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 pcg 1.1 #if defined(NO_RESOURCES)
364 root 1.87 "NoResources,"
365 pcg 1.1 #endif
366 root 1.88 "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 pcg 1.9 "\nUsage: "; /* Usage */
393 pcg 1.1
394     #define INDENT 18
395    
396 root 1.90 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 pcg 1.1 /*{{{ usage: */
401     /*----------------------------------------------------------------------*/
402 pcg 1.8 static void
403 pcg 1.11 rxvt_usage (int type)
404 pcg 1.1 {
405 pcg 1.19 unsigned int i, col;
406 pcg 1.1
407 pcg 1.19 rxvt_log ("%s%s%s", releasestring, optionsstring, RESNAME);
408 pcg 1.9
409     switch (type)
410     {
411     case 0: /* brief listing */
412 pcg 1.19 rxvt_log (" [-help] [--help]\n");
413    
414 root 1.54 for (col = 1, i = 0; i < optList_size; i++)
415 pcg 1.9 if (optList[i].desc != NULL)
416     {
417 root 1.92 int len = 0;
418 pcg 1.9
419 pcg 1.11 if (!optList_isBool (i))
420 pcg 1.9 {
421 pcg 1.11 len = optList_strlen (i);
422 pcg 1.9 if (len > 0)
423     len++; /* account for space */
424     }
425 pcg 1.1 #ifdef DEBUG_STRICT
426 pcg 1.11 assert (optList[i].opt != NULL);
427 pcg 1.1 #endif
428 root 1.34 len += 4 + strlen (optList[i].opt) + (optList_isBool (i) ? 2: 0);
429 pcg 1.9 col += len;
430     if (col > 79)
431     { /* assume regular width */
432 pcg 1.19 rxvt_log ("\n");
433 pcg 1.9 col = 1 + len;
434     }
435 pcg 1.19
436     rxvt_log (" [-%s%s", (optList_isBool (i) ? "/+" : ""), optList[i].opt);
437 pcg 1.11 if (optList_strlen (i))
438 pcg 1.19 rxvt_log (" %s]", optList[i].arg);
439 pcg 1.9 else
440 pcg 1.19 rxvt_log ("]");
441 pcg 1.9 }
442     break;
443    
444     case 1: /* full command-line listing */
445 pcg 1.19 rxvt_log (" [options] [-e command args]\n\nwhere options include:\n");
446    
447 root 1.54 for (i = 0; i < optList_size; i++)
448 pcg 1.9 if (optList[i].desc != NULL)
449     {
450 pcg 1.1 #ifdef DEBUG_STRICT
451 pcg 1.11 assert (optList[i].opt != NULL);
452 pcg 1.1 #endif
453 pcg 1.19 rxvt_log (" %s%s %-*s%s%s\n",
454     (optList_isBool (i) ? "-/+" : "-"), optList[i].opt,
455 root 1.34 (INDENT - strlen (optList[i].opt)
456 pcg 1.19 + (optList_isBool (i) ? 0 : 2)),
457     (optList[i].arg ? optList[i].arg : ""),
458     (optList_isBool (i) ? "turn on/off " : ""),
459     optList[i].desc);
460 pcg 1.9 }
461 pcg 1.19 rxvt_log ("\n --help to list long-options");
462 pcg 1.9 break;
463    
464     case 2: /* full resource listing */
465 pcg 1.19 rxvt_log (" [options] [-e command args]\n\n"
466     "where resources (long-options) include:\n");
467 pcg 1.9
468 root 1.54 for (i = 0; i < optList_size; i++)
469 pcg 1.9 if (optList[i].kw != NULL)
470 pcg 1.19 rxvt_log (" %s: %*s%s\n",
471 pcg 1.9 optList[i].kw,
472 root 1.34 (INDENT - strlen (optList[i].kw)), "", /* XXX */
473 pcg 1.11 (optList_isBool (i) ? "boolean" : optList[i].arg));
474 pcg 1.1 #ifdef KEYSYM_RESOURCE
475 pcg 1.19 rxvt_log (" " "keysym.sym" ": %*s%s\n",
476 pcg 1.11 (INDENT - sizeof ("keysym.sym") + 1), "", /* XXX */
477 pcg 1.9 "keysym");
478     #endif
479 pcg 1.19 rxvt_log ("\n -help to list options");
480 pcg 1.9 break;
481     }
482 pcg 1.19
483     rxvt_log ("\n\n");
484     rxvt_exit_failure ();
485 pcg 1.9 /* NOTREACHED */
486 pcg 1.1 }
487    
488     /*}}} */
489    
490     /*{{{ get command-line options before getting resources */
491     void
492 pcg 1.8 rxvt_term::get_options (int argc, const char *const *argv)
493 pcg 1.1 {
494 root 1.93 int i, bad_option = 0;
495 pcg 1.1
496 pcg 1.9 for (i = 1; i < argc; i++)
497     {
498 root 1.54 unsigned int entry, longopt = 0;
499     const char *flag, *opt;
500 pcg 1.1
501 pcg 1.9 opt = argv[i];
502 root 1.84
503 pcg 1.9 if (*opt == '-')
504     {
505 root 1.90 flag = resval_on;
506    
507 pcg 1.9 if (*++opt == '-')
508     longopt = *opt++; /* long option */
509     }
510     else if (*opt == '+')
511     {
512 root 1.90 flag = resval_off;
513    
514 pcg 1.9 if (*++opt == '+')
515     longopt = *opt++; /* long option */
516     }
517     else
518     {
519     bad_option = 1;
520 pcg 1.19 rxvt_warn ("\"%s\": malformed option.\n", opt);
521 pcg 1.9 continue;
522     }
523    
524 root 1.34 if (!strcmp (opt, "help"))
525 pcg 1.11 rxvt_usage (longopt ? 2 : 1);
526 root 1.90
527 root 1.34 if (!strcmp (opt, "h"))
528 pcg 1.11 rxvt_usage (0);
529 pcg 1.9
530     /* feature: always try to match long-options */
531 root 1.54 for (entry = 0; entry < optList_size; entry++)
532 root 1.34 if ((optList[entry].kw && !strcmp (opt, optList[entry].kw))
533 pcg 1.9 || (!longopt
534 root 1.34 && optList[entry].opt && !strcmp (opt, optList[entry].opt)))
535 pcg 1.9 break;
536    
537 root 1.54 if (entry < optList_size)
538 pcg 1.9 {
539 pcg 1.11 if (optList_isReverse (entry))
540 root 1.90 flag = flag == resval_on ? resval_off : resval_on;
541 root 1.28
542 pcg 1.11 if (optList_strlen (entry))
543 root 1.28 {
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 ayin 1.105
550 root 1.28 if (optList[entry].doff != -1)
551 root 1.93 {
552 ayin 1.115 if (flag == resval_on && i+1 == argc)
553 ayin 1.119 rxvt_fatal ("option '%s' requires an argument, aborting.\n", argv [i]);
554 root 1.93
555     rs[optList[entry].doff] = flag == resval_on ? argv[++i] : resval_undef;
556     }
557 pcg 1.9 }
558     else
559     { /* boolean value */
560 ayin 1.99 set_option (optList[entry].index, flag == resval_on);
561 pcg 1.9
562     if (optList[entry].doff != -1)
563     rs[optList[entry].doff] = flag;
564     }
565     }
566 pcg 1.1 #ifdef KEYSYM_RESOURCE
567 ayin 1.121 else if (!strncmp (opt, "keysym.", sizeof ("keysym.") - 1))
568     {
569     if (i+1 < argc)
570 ayin 1.122 {
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 ayin 1.121 }
577 pcg 1.1 #endif
578 ayin 1.121 else
579     {
580     bad_option = 1;
581     rxvt_warn ("\"%s\": unknown or malformed option.\n", opt);
582     }
583 pcg 1.1 }
584    
585 pcg 1.9 if (bad_option)
586 pcg 1.11 rxvt_usage (0);
587 pcg 1.1 }
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 pcg 1.13 int
603 root 1.82 rxvt_define_key (XrmDatabase *database UNUSED,
604     XrmBindingList bindings UNUSED,
605 pcg 1.13 XrmQuarkList quarks,
606 root 1.82 XrmRepresentation *type UNUSED,
607 pcg 1.13 XrmValue *value,
608 root 1.82 XPointer closure UNUSED)
609 pcg 1.1 {
610 root 1.49 int last;
611 pcg 1.1
612 pcg 1.9 for (last = 0; quarks[last] != NULLQUARK; last++) /* look for last quark in list */
613     ;
614 root 1.49
615 pcg 1.9 last--;
616 pcg 1.11 GET_R->parse_keysym (XrmQuarkToString (quarks[last]), (char *)value->addr);//D//TODO
617 pcg 1.9 return False;
618 pcg 1.1 }
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 root 1.46
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 pcg 1.1 int
666 pcg 1.8 rxvt_term::parse_keysym (const char *str, const char *arg)
667 pcg 1.1 {
668 root 1.49 int n, sym;
669 root 1.46 unsigned int state = 0;
670 root 1.49 const char *pmodend = NULL;
671     char *newarg = NULL;
672     char newargstr[NEWARGLIM];
673 pcg 1.9
674     if (arg == NULL)
675     {
676 ayin 1.112 n = sizeof ("keysym.") - 1;
677     if (strncmp (str, "keysym.", n))
678 pcg 1.9 return 0;
679 root 1.46
680 pcg 1.9 str += n; /* skip `keysym.' */
681 root 1.76 if (!(pmodend = strchr (str, ':')))
682 root 1.46 return -1;
683 pcg 1.9 }
684 root 1.46 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 pcg 1.11 /* some scanf () have trouble with a 0x prefix */
713 root 1.46 if (str[0] == '0' && toupper (str[1]) == 'X')
714 pcg 1.9 {
715 root 1.46 str += 2;
716    
717 pcg 1.9 if (arg)
718     {
719 root 1.34 if (sscanf (str, (strchr (str, ':') ? "%x:" : "%x"), &sym) != 1)
720 pcg 1.9 return -1;
721     }
722     else
723     {
724 pcg 1.11 if (sscanf (str, "%x:", &sym) != 1)
725 pcg 1.9 return -1;
726    
727 pcg 1.11 /* cue to ':', it's there since sscanf () worked */
728 root 1.34 strncpy (newargstr, strchr (str, ':') + 1, NEWARGLIM - 1);
729 pcg 1.9 newargstr[NEWARGLIM - 1] = '\0';
730     newarg = newargstr;
731     }
732     }
733     else
734     {
735     /*
736     * convert keysym name to keysym number
737     */
738 root 1.34 strncpy (newargstr, str, NEWARGLIM - 1);
739 pcg 1.9 newargstr[NEWARGLIM - 1] = '\0';
740 root 1.46
741 pcg 1.9 if (arg == NULL)
742     {
743 root 1.34 if ((newarg = strchr (newargstr, ':')) == NULL)
744 pcg 1.9 return -1;
745 root 1.46
746 pcg 1.9 *newarg++ = '\0'; /* terminate keysym name */
747     }
748 root 1.46
749 pcg 1.11 if ((sym = XStringToKeysym (newargstr)) == None)
750 pcg 1.9 return -1;
751     }
752    
753     if (newarg == NULL)
754     {
755 root 1.34 strncpy (newargstr, arg, NEWARGLIM - 1);
756 pcg 1.9 newargstr[NEWARGLIM - 1] = '\0';
757     newarg = newargstr;
758     }
759 root 1.46
760 ayin 1.113 if (*newarg == '\0')
761 pcg 1.9 return -1;
762    
763 root 1.46 keyboard->register_user_translation (sym, state, newarg);
764 pcg 1.9 return 1;
765 pcg 1.1 }
766    
767 ayin 1.120 # endif /* KEYSYM_RESOURCE */
768     #endif /* NO_RESOURCES */
769 pcg 1.1
770 root 1.78 static char *
771     get_res (XrmDatabase database, const char *program, const char *option)
772 root 1.75 {
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 ayin 1.117 const char *
784     rxvt_term::x_resource (const char *name)
785 root 1.78 {
786 root 1.94 XrmDatabase database = XrmGetDatabase (dpy);
787 root 1.78
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 pcg 1.1 void
807 root 1.54 rxvt_term::extract_resources ()
808 pcg 1.1 {
809     #ifndef NO_RESOURCES
810 ayin 1.122 XrmDatabase database = XrmGetDatabase (dpy);
811     XrmMergeDatabases (option_db, &database);
812     option_db = NULL;
813 root 1.54 /*
814     * Query resources for options that affect us
815     */
816 root 1.77 for (int entry = 0; entry < optList_size; entry++)
817 root 1.54 {
818     int s;
819     const char *kw = optList[entry].kw;
820    
821     if (kw == NULL || rs[optList[entry].doff] != NULL)
822 root 1.77 continue; // previously set
823 root 1.54
824 root 1.78 const char *p = x_resource (kw);
825 root 1.54
826     if (p)
827     {
828 root 1.77 p = strdup (p);
829 root 1.78 allocated.push_back ((void *)p);
830 root 1.54 rs[optList[entry].doff] = p;
831 pcg 1.15
832 root 1.54 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 pcg 1.15
839 root 1.54 if (optList_isReverse (entry))
840     s = !s;
841 pcg 1.9
842 ayin 1.99 set_option (optList[entry].index, s);
843 root 1.54 }
844     }
845     }
846 pcg 1.9
847 root 1.54 /*
848     * [R5 or later]: enumerate the resource database
849     */
850     # ifdef KEYSYM_RESOURCE
851 root 1.77 XrmName name_prefix[3];
852     XrmClass class_prefix[3];
853    
854 root 1.54 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 root 1.75 XrmEnumerateDatabase (database, name_prefix, class_prefix,
862 root 1.54 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 root 1.75 XrmEnumerateDatabase (database, name_prefix, class_prefix,
870 root 1.54 XrmEnumOneLevel, rxvt_define_key, NULL);
871 pcg 1.1 # endif
872     # endif
873    
874 ayin 1.120 #endif /* NO_RESOURCES */
875 pcg 1.1 }
876    
877     /*----------------------- end-of-file (C source) -----------------------*/