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

# 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 root 1.64
38 root 1.93 /* monolithic option/resource structure: */
39 pcg 1.1 /*
40     * `string' options MUST have a usage argument
41     * `switch' and `boolean' options have no argument
42 pcg 1.11 * if there's no desc (ription), it won't appear in rxvt_usage ()
43 pcg 1.1 */
44    
45 pcg 1.11 /* INFO () - descriptive information only */
46 pcg 1.1 #define INFO(opt, arg, desc) \
47 ayin 1.97 {0, 0, -1, NULL, (opt), (arg), (desc)}
48 pcg 1.1
49 pcg 1.11 /* STRG () - command-line option, with/without resource */
50 pcg 1.1 #define STRG(rsp, kw, opt, arg, desc) \
51 ayin 1.97 {0, 0, (rsp), (kw), (opt), (arg), (desc)}
52 pcg 1.1
53 pcg 1.11 /* RSTRG () - resource/long-option */
54 pcg 1.1 #define RSTRG(rsp, kw, arg) \
55 ayin 1.97 {0, 0, (rsp), (kw), NULL, (arg), NULL}
56 pcg 1.1
57 pcg 1.11 /* BOOL () - regular boolean `-/+' flag */
58 ayin 1.97 #define BOOL(rsp, kw, opt, option, flag, desc) \
59 ayin 1.99 { (option), (Optflag_Boolean | (flag)), (rsp), (kw), (opt), NULL, (desc)}
60 pcg 1.1
61 pcg 1.11 /* SWCH () - `-' flag */
62 ayin 1.97 #define SWCH(opt, option, flag, desc) \
63 ayin 1.99 { (option), (flag), -1, NULL, (opt), NULL, (desc)}
64 pcg 1.1
65     /* convenient macros */
66     #define optList_strlen(i) \
67 root 1.34 (optList[i].flag ? 0 : (optList[i].arg ? strlen (optList[i].arg) : 1))
68 pcg 1.1 #define optList_isBool(i) \
69 root 1.64 (optList[i].flag & Optflag_Boolean)
70 pcg 1.1 #define optList_isReverse(i) \
71 root 1.64 (optList[i].flag & Optflag_Reverse)
72 root 1.54 #define optList_size \
73 pcg 1.11 (sizeof (optList) / sizeof (optList[0]))
74 pcg 1.1
75 pcg 1.9 static const struct
76     {
77 ayin 1.97 const uint8_t index; /* Option index */
78     const uint8_t flag; /* Option flag */
79 root 1.98 const int16_t doff; /* resource value index or -1 */
80 pcg 1.1 const char *kw; /* keyword */
81     const char *opt; /* option */
82     const char *arg; /* argument */
83     const char *desc; /* description */
84 pcg 1.9 }
85     optList[] = {
86 pcg 1.11 STRG (Rs_display_name, NULL, "d", NULL, NULL), /* short form */
87     STRG (Rs_display_name, NULL, "display", "string", "X server to contact"),
88 pcg 1.23 STRG (Rs_term_name, "termName", "tn", "string", "value of the TERM environment variable"),
89 pcg 1.11 STRG (Rs_geometry, NULL, "g", NULL, NULL), /* short form */
90 pcg 1.23 STRG (Rs_geometry, "geometry", "geometry", "geometry", "size (in characters) and position"),
91 ayin 1.97 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 root 1.59 #if HAVE_SCROLLBARS
99 root 1.49 RSTRG (Rs_scrollstyle, "scrollstyle", "mode"),
100 ayin 1.97 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 root 1.49 RSTRG (Rs_scrollBar_align, "scrollBar_align", "mode"),
104     STRG (Rs_scrollBar_thickness, "thickness", "sbt", "number", "scrollbar thickness/width in pixels"),
105 pcg 1.23 #endif
106 ayin 1.97 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 root 1.59 #if TRANSPARENT
111 ayin 1.97 BOOL (Rs_transparent, "inheritPixmap", "ip", Opt_transparent, 0, "inherit parent pixmap"),
112     SWCH ("tr", Opt_transparent, 0, NULL),
113 root 1.59 # if TINTING
114 pcg 1.23 STRG (Rs_color + Color_tint, "tintColor", "tint", "color", "tint color"),
115 root 1.59 # endif
116 pcg 1.23 #endif
117 root 1.59 #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 pcg 1.1 #endif
121 root 1.59 #if TINTING
122 root 1.96 STRG (Rs_shade, "shading", "sh", "%", "shade background by x % when tinting."),
123 root 1.28 #endif
124 ayin 1.97 BOOL (Rs_utmpInhibit, "utmpInhibit", "ut", Opt_utmpInhibit, 0, "utmp inhibit"),
125 pcg 1.1 #ifndef NO_BELL
126 ayin 1.100 # if ENABLE_FRILLS
127 ayin 1.101 BOOL (Rs_urgentOnBell, "urgentOnBell", NULL, Opt_urgentOnBell, 0, NULL),
128 ayin 1.100 # endif
129 ayin 1.97 BOOL (Rs_visualBell, "visualBell", "vb", Opt_visualBell, 0, "visual bell"),
130 pcg 1.1 # if ! defined(NO_MAPALERT) && defined(MAPALERT_OPTION)
131 ayin 1.97 BOOL (Rs_mapAlert, "mapAlert", NULL, Opt_mapAlert, 0, NULL),
132 pcg 1.1 # endif
133     #endif
134     #ifdef META8_OPTION
135 ayin 1.97 BOOL (Rs_meta8, "meta8", NULL, Opt_meta8, 0, NULL),
136 pcg 1.1 #endif
137     #ifdef MOUSE_WHEEL
138 ayin 1.97 BOOL (Rs_mouseWheelScrollPage, "mouseWheelScrollPage", NULL, Opt_mouseWheelScrollPage, 0, NULL),
139 pcg 1.1 #endif
140 root 1.34 #if ENABLE_FRILLS
141 ayin 1.97 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 pcg 1.1 #endif
145 root 1.58 #if CURSOR_BLINK
146 ayin 1.97 BOOL (Rs_cursorBlink, "cursorBlink", "bc", Opt_cursorBlink, 0, "blinking cursor"),
147 pcg 1.1 #endif
148     #ifdef POINTER_BLANK
149 ayin 1.97 BOOL (Rs_pointerBlank, "pointerBlank", "pb", Opt_pointerBlank, 0, "switch off pointer after delay"),
150 pcg 1.1 #endif
151 pcg 1.11 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 pcg 1.1 #ifndef NO_BOLD_UNDERLINE_REVERSE
170 pcg 1.11 RSTRG (Rs_color + Color_BD, "colorBD", "color"),
171 root 1.40 RSTRG (Rs_color + Color_IT, "colorIT", "color"),
172 pcg 1.11 RSTRG (Rs_color + Color_UL, "colorUL", "color"),
173     RSTRG (Rs_color + Color_RV, "colorRV", "color"),
174 pcg 1.1 #endif /* ! NO_BOLD_UNDERLINE_REVERSE */
175 root 1.43 #if ENABLE_FRILLS
176     RSTRG (Rs_color + Color_underline, "underlineColor", "color"),
177     #endif
178 pcg 1.1 #ifdef KEEP_SCROLLCOLOR
179 pcg 1.11 RSTRG (Rs_color + Color_scroll, "scrollColor", "color"),
180     RSTRG (Rs_color + Color_trough, "troughColor", "color"),
181 pcg 1.1 #endif /* KEEP_SCROLLCOLOR */
182     #ifdef OPTION_HC
183 pcg 1.11 STRG (Rs_color + Color_HC, "highlightColor", "hc", "color", "highlight color"),
184 pcg 1.1 #endif
185 root 1.49 #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 root 1.80 #ifdef XPM_BACKGROUND
194 pcg 1.11 RSTRG (Rs_path, "path", "search path"),
195 pcg 1.23 STRG (Rs_backgroundPixmap, "backgroundPixmap", "pixmap", "file[;geom]", "background pixmap"),
196 pcg 1.1 #endif
197 root 1.40 /* fonts: command-line option = resource name */
198 pcg 1.11 STRG (Rs_font, "font", "fn", "fontname", "normal text font"),
199 root 1.40 #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 ayin 1.97 BOOL (Rs_intensityStyles, "intensityStyles", "is", Opt_intensityStyles, 0, "font styles imply intensity changes"),
204 root 1.40 #endif
205 pcg 1.1 #ifdef USE_XIM
206 pcg 1.11 STRG (Rs_inputMethod, "inputMethod", "im", "name", "name of input method"),
207 pcg 1.23 STRG (Rs_preeditType, "preeditType", "pt", "style", "input style: style = OverTheSpot|OffTheSpot|Root"),
208 pcg 1.11 STRG (Rs_imLocale, "imLocale", "imlocale", "string", "locale to use for input method"),
209 root 1.49 STRG (Rs_imFont, "imFont", "imfont", "fontname", "fontset for styles OverTheSpot and OffTheSpot"),
210 pcg 1.1 #endif /* USE_XIM */
211 pcg 1.23 STRG (Rs_name, NULL, "name", "string", "client instance, icon, and title strings"),
212 pcg 1.11 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 pcg 1.23 STRG (Rs_saveLines, "saveLines", "sl", "number", "number of scrolled lines to save"),
216 root 1.57 #if ENABLE_XEMBED
217     STRG (Rs_embed, NULL, "embed", "windowid", "window id to embed terminal in"),
218     #endif
219 root 1.89 #if XFT
220     STRG (Rs_depth, "depth", "depth", "number", "depth of visual to request"),
221     #endif
222 root 1.34 #if ENABLE_FRILLS
223 root 1.72 RSTRG (Rs_transient_for, "transient-for", "windowid"),
224 ayin 1.97 BOOL (Rs_override_redirect, "override-redirect", "override-redirect", Opt_override_redirect, 0, "set override-redirect on the terminal window"),
225 root 1.56 STRG (Rs_pty_fd, NULL, "pty-fd", "fileno", "file descriptor of pty to use"),
226 ayin 1.97 BOOL (Rs_hold, "hold", "hold", Opt_hold, 0, "retain window after shell exit"),
227 pcg 1.23 STRG (Rs_ext_bwidth, "externalBorder", "w", "number", "external border in pixels"),
228 pcg 1.11 STRG (Rs_ext_bwidth, NULL, "bw", NULL, NULL),
229     STRG (Rs_ext_bwidth, NULL, "borderwidth", NULL, NULL),
230 pcg 1.23 STRG (Rs_int_bwidth, "internalBorder", "b", "number", "internal border in pixels"),
231 ayin 1.97 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 pcg 1.23 STRG (Rs_lineSpace, "lineSpace", "lsp", "number", "number of extra pixels between rows"),
234 pcg 1.1 #endif
235     #ifdef POINTER_BLANK
236 pcg 1.11 RSTRG (Rs_pointerBlankDelay, "pointerBlankDelay", "number"),
237 pcg 1.1 #endif
238     #ifndef NO_BACKSPACE_KEY
239 pcg 1.11 RSTRG (Rs_backspace_key, "backspacekey", "string"),
240 pcg 1.1 #endif
241     #ifndef NO_DELETE_KEY
242 pcg 1.11 RSTRG (Rs_delete_key, "deletekey", "string"),
243 pcg 1.1 #endif
244 pcg 1.11 RSTRG (Rs_selectstyle, "selectstyle", "mode"),
245 pcg 1.1 #ifdef PRINTPIPE
246 pcg 1.11 RSTRG (Rs_print_pipe, "print-pipe", "string"),
247 pcg 1.1 #endif
248 pcg 1.23 STRG (Rs_modifier, "modifier", "mod", "modifier", "meta modifier = alt|meta|hyper|super|mod1|...|mod5"),
249 pcg 1.1 #ifdef CUTCHAR_RESOURCE
250 pcg 1.11 RSTRG (Rs_cutchars, "cutchars", "string"),
251 pcg 1.1 #endif /* CUTCHAR_RESOURCE */
252 pcg 1.11 RSTRG (Rs_answerbackstring, "answerbackString", "string"),
253 pcg 1.23 #ifndef NO_SECONDARY_SCREEN
254 ayin 1.97 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 pcg 1.23 #endif
257 root 1.65 #if ENABLE_PERL
258 root 1.70 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 root 1.65 #endif
263 sasha 1.102
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 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 pcg 1.1 #if defined(XPM_BACKGROUND)
324 pcg 1.9 "XPM,"
325 pcg 1.1 #endif
326     #if defined(TRANSPARENT)
327 pcg 1.9 "transparent,"
328 pcg 1.1 #endif
329 root 1.30 #if TINTING
330     "tint,"
331     #endif
332 pcg 1.1 #if defined(USE_XIM)
333 pcg 1.9 "XIM,"
334 pcg 1.1 #endif
335     #if defined(NO_BACKSPACE_KEY)
336 pcg 1.9 "no_backspace,"
337 pcg 1.1 #endif
338     #if defined(NO_DELETE_KEY)
339 pcg 1.9 "no_delete,"
340 pcg 1.1 #endif
341 root 1.30 #if EIGHT_BIT_CONTROLS
342     "8bitctrls,"
343     #endif
344 root 1.34 #if defined(ENABLE_FRILLS)
345 root 1.30 "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 pcg 1.1 #if defined(NO_RESOURCES)
366 root 1.87 "NoResources,"
367 pcg 1.1 #endif
368 root 1.88 "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 pcg 1.9 "\nUsage: "; /* Usage */
395 pcg 1.1
396     #define INDENT 18
397    
398 root 1.90 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 pcg 1.1 /*{{{ usage: */
403     /*----------------------------------------------------------------------*/
404 pcg 1.8 static void
405 pcg 1.11 rxvt_usage (int type)
406 pcg 1.1 {
407 pcg 1.19 unsigned int i, col;
408 pcg 1.1
409 pcg 1.19 rxvt_log ("%s%s%s", releasestring, optionsstring, RESNAME);
410 pcg 1.9
411     switch (type)
412     {
413     case 0: /* brief listing */
414 pcg 1.19 rxvt_log (" [-help] [--help]\n");
415    
416 root 1.54 for (col = 1, i = 0; i < optList_size; i++)
417 pcg 1.9 if (optList[i].desc != NULL)
418     {
419 root 1.92 int len = 0;
420 pcg 1.9
421 pcg 1.11 if (!optList_isBool (i))
422 pcg 1.9 {
423 pcg 1.11 len = optList_strlen (i);
424 pcg 1.9 if (len > 0)
425     len++; /* account for space */
426     }
427 pcg 1.1 #ifdef DEBUG_STRICT
428 pcg 1.11 assert (optList[i].opt != NULL);
429 pcg 1.1 #endif
430 root 1.34 len += 4 + strlen (optList[i].opt) + (optList_isBool (i) ? 2: 0);
431 pcg 1.9 col += len;
432     if (col > 79)
433     { /* assume regular width */
434 pcg 1.19 rxvt_log ("\n");
435 pcg 1.9 col = 1 + len;
436     }
437 pcg 1.19
438     rxvt_log (" [-%s%s", (optList_isBool (i) ? "/+" : ""), optList[i].opt);
439 pcg 1.11 if (optList_strlen (i))
440 pcg 1.19 rxvt_log (" %s]", optList[i].arg);
441 pcg 1.9 else
442 pcg 1.19 rxvt_log ("]");
443 pcg 1.9 }
444     break;
445    
446     case 1: /* full command-line listing */
447 pcg 1.19 rxvt_log (" [options] [-e command args]\n\nwhere options include:\n");
448    
449 root 1.54 for (i = 0; i < optList_size; i++)
450 pcg 1.9 if (optList[i].desc != NULL)
451     {
452 pcg 1.1 #ifdef DEBUG_STRICT
453 pcg 1.11 assert (optList[i].opt != NULL);
454 pcg 1.1 #endif
455 pcg 1.19 rxvt_log (" %s%s %-*s%s%s\n",
456     (optList_isBool (i) ? "-/+" : "-"), optList[i].opt,
457 root 1.34 (INDENT - strlen (optList[i].opt)
458 pcg 1.19 + (optList_isBool (i) ? 0 : 2)),
459     (optList[i].arg ? optList[i].arg : ""),
460     (optList_isBool (i) ? "turn on/off " : ""),
461     optList[i].desc);
462 pcg 1.9 }
463 pcg 1.19 rxvt_log ("\n --help to list long-options");
464 pcg 1.9 break;
465    
466     case 2: /* full resource listing */
467 pcg 1.19 rxvt_log (" [options] [-e command args]\n\n"
468     "where resources (long-options) include:\n");
469 pcg 1.9
470 root 1.54 for (i = 0; i < optList_size; i++)
471 pcg 1.9 if (optList[i].kw != NULL)
472 pcg 1.19 rxvt_log (" %s: %*s%s\n",
473 pcg 1.9 optList[i].kw,
474 root 1.34 (INDENT - strlen (optList[i].kw)), "", /* XXX */
475 pcg 1.11 (optList_isBool (i) ? "boolean" : optList[i].arg));
476 pcg 1.1 #ifdef KEYSYM_RESOURCE
477 pcg 1.19 rxvt_log (" " "keysym.sym" ": %*s%s\n",
478 pcg 1.11 (INDENT - sizeof ("keysym.sym") + 1), "", /* XXX */
479 pcg 1.9 "keysym");
480     #endif
481 pcg 1.19 rxvt_log ("\n -help to list options");
482 pcg 1.9 break;
483     }
484 pcg 1.19
485     rxvt_log ("\n\n");
486     rxvt_exit_failure ();
487 pcg 1.9 /* NOTREACHED */
488 pcg 1.1 }
489    
490     /*}}} */
491    
492     /*{{{ get command-line options before getting resources */
493     void
494 pcg 1.8 rxvt_term::get_options (int argc, const char *const *argv)
495 pcg 1.1 {
496 root 1.93 int i, bad_option = 0;
497 pcg 1.1
498 pcg 1.9 for (i = 1; i < argc; i++)
499     {
500 root 1.54 unsigned int entry, longopt = 0;
501     const char *flag, *opt;
502 pcg 1.1
503 pcg 1.9 opt = argv[i];
504 root 1.84
505 pcg 1.9 if (*opt == '-')
506     {
507 root 1.90 flag = resval_on;
508    
509 pcg 1.9 if (*++opt == '-')
510     longopt = *opt++; /* long option */
511     }
512     else if (*opt == '+')
513     {
514 root 1.90 flag = resval_off;
515    
516 pcg 1.9 if (*++opt == '+')
517     longopt = *opt++; /* long option */
518     }
519     else
520     {
521     bad_option = 1;
522 pcg 1.19 rxvt_warn ("\"%s\": malformed option.\n", opt);
523 pcg 1.9 continue;
524     }
525    
526 root 1.34 if (!strcmp (opt, "help"))
527 pcg 1.11 rxvt_usage (longopt ? 2 : 1);
528 root 1.90
529 root 1.34 if (!strcmp (opt, "h"))
530 pcg 1.11 rxvt_usage (0);
531 pcg 1.9
532     /* feature: always try to match long-options */
533 root 1.54 for (entry = 0; entry < optList_size; entry++)
534 root 1.34 if ((optList[entry].kw && !strcmp (opt, optList[entry].kw))
535 pcg 1.9 || (!longopt
536 root 1.34 && optList[entry].opt && !strcmp (opt, optList[entry].opt)))
537 pcg 1.9 break;
538    
539 root 1.54 if (entry < optList_size)
540 pcg 1.9 {
541 pcg 1.11 if (optList_isReverse (entry))
542 root 1.90 flag = flag == resval_on ? resval_off : resval_on;
543 root 1.28
544 pcg 1.11 if (optList_strlen (entry))
545 root 1.28 {
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 pcg 1.9
552 root 1.28 if (optList[entry].doff != -1)
553 root 1.93 {
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 pcg 1.9 }
560     else
561     { /* boolean value */
562 ayin 1.99 set_option (optList[entry].index, flag == resval_on);
563 pcg 1.9
564     if (optList[entry].doff != -1)
565     rs[optList[entry].doff] = flag;
566     }
567     }
568     else
569 pcg 1.1 #ifdef KEYSYM_RESOURCE
570 root 1.34 /* if (!strncmp (opt, "keysym.", sizeof ("keysym.") - 1)) */
571 pcg 1.11 if (rxvt_Str_match (opt, "keysym."))
572 pcg 1.9 {
573 pcg 1.19 const char *str = argv[++i];
574 pcg 1.9
575     if (str != NULL)
576 pcg 1.11 parse_keysym (opt + sizeof ("keysym.") - 1, str);
577 pcg 1.9 }
578     else
579 pcg 1.1 #endif
580 pcg 1.19 {
581     bad_option = 1;
582     rxvt_warn ("\"%s\": unknown or malformed option.\n", opt);
583     }
584 pcg 1.1 }
585    
586 pcg 1.9 if (bad_option)
587 pcg 1.11 rxvt_usage (0);
588 pcg 1.1 }
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 pcg 1.13 int
604 root 1.82 rxvt_define_key (XrmDatabase *database UNUSED,
605     XrmBindingList bindings UNUSED,
606 pcg 1.13 XrmQuarkList quarks,
607 root 1.82 XrmRepresentation *type UNUSED,
608 pcg 1.13 XrmValue *value,
609 root 1.82 XPointer closure UNUSED)
610 pcg 1.1 {
611 root 1.49 int last;
612 pcg 1.1
613 pcg 1.9 for (last = 0; quarks[last] != NULLQUARK; last++) /* look for last quark in list */
614     ;
615 root 1.49
616 pcg 1.9 last--;
617 pcg 1.11 GET_R->parse_keysym (XrmQuarkToString (quarks[last]), (char *)value->addr);//D//TODO
618 pcg 1.9 return False;
619 pcg 1.1 }
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 root 1.46
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 pcg 1.1 int
667 pcg 1.8 rxvt_term::parse_keysym (const char *str, const char *arg)
668 pcg 1.1 {
669 root 1.49 int n, sym;
670 root 1.46 unsigned int state = 0;
671 root 1.49 const char *pmodend = NULL;
672     char *newarg = NULL;
673     char newargstr[NEWARGLIM];
674 pcg 1.9
675     if (arg == NULL)
676     {
677 pcg 1.11 if ((n = rxvt_Str_match (str, "keysym.")) == 0)
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 pcg 1.11 rxvt_Str_trim (newarg);
761     if (*newarg == '\0' || (n = rxvt_Str_escaped (newarg)) == 0)
762 pcg 1.9 return -1;
763    
764 root 1.46 keyboard->register_user_translation (sym, state, newarg);
765 pcg 1.9 return 1;
766 pcg 1.1 }
767    
768     # endif /* KEYSYM_RESOURCE */
769     #endif /* NO_RESOURCES */
770    
771 root 1.78 static char *
772     get_res (XrmDatabase database, const char *program, const char *option)
773 root 1.75 {
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 root 1.78 const char *
785     rxvt_term::x_resource (const char *name)
786     {
787 root 1.94 XrmDatabase database = XrmGetDatabase (dpy);
788 root 1.78
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 pcg 1.1 void
808 root 1.54 rxvt_term::extract_resources ()
809 pcg 1.1 {
810     #ifndef NO_RESOURCES
811 root 1.54 /*
812     * Query resources for options that affect us
813     */
814 root 1.77 for (int entry = 0; entry < optList_size; entry++)
815 root 1.54 {
816     int s;
817     const char *kw = optList[entry].kw;
818    
819     if (kw == NULL || rs[optList[entry].doff] != NULL)
820 root 1.77 continue; // previously set
821 root 1.54
822 root 1.78 const char *p = x_resource (kw);
823 root 1.54
824     if (p)
825     {
826 root 1.77 p = strdup (p);
827 root 1.78 allocated.push_back ((void *)p);
828 root 1.54 rs[optList[entry].doff] = p;
829 pcg 1.15
830 root 1.54 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 pcg 1.15
837 root 1.54 if (optList_isReverse (entry))
838     s = !s;
839 pcg 1.9
840 ayin 1.99 set_option (optList[entry].index, s);
841 root 1.54 }
842     }
843     }
844 pcg 1.9
845 root 1.54 /*
846     * [R5 or later]: enumerate the resource database
847     */
848     # ifdef KEYSYM_RESOURCE
849 root 1.94 XrmDatabase database = XrmGetDatabase (dpy);
850 root 1.77 XrmName name_prefix[3];
851     XrmClass class_prefix[3];
852    
853 root 1.54 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 root 1.75 XrmEnumerateDatabase (database, name_prefix, class_prefix,
861 root 1.54 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 root 1.75 XrmEnumerateDatabase (database, name_prefix, class_prefix,
869 root 1.54 XrmEnumOneLevel, rxvt_define_key, NULL);
870 pcg 1.1 # endif
871     # endif
872    
873     #endif /* NO_RESOURCES */
874     }
875    
876     /*----------------------- end-of-file (C source) -----------------------*/