📄 xdefaults.c
字号:
# if defined(NEXT_SCROLLBAR) "NeXT"# if defined(XTERM_SCROLLBAR) "+"# endif# endif# if defined(XTERM_SCROLLBAR) "xterm"# endif#endif ","#if defined(GREEK_SUPPORT) "Greek,"#endif#if defined(RXVT_GRAPHICS) "graphics,"#endif#if defined(NO_BACKSPACE_KEY) "no_backspace,"#endif#if defined(NO_DELETE_KEY) "no_delete,"#endif#if !defined(NO_STRINGS) "strings,"#endif#if defined(TTY_256COLOR) "256colour,"#endif#if defined(NO_RESOURCES) "NoResources"#else# if defined(USE_XGETDEFAULT) "XGetDefaults"# else ".Xdefaults"# endif#endif "\nUsage: "; /* Usage */#define INDENT 18/*{{{ usage: *//*----------------------------------------------------------------------*//* EXTPROTO */voidrxvt_usage(int type){ unsigned int i, col; write(STDERR_FILENO, releasestring, sizeof(releasestring) - 1); write(STDERR_FILENO, optionsstring, sizeof(optionsstring) - 1); write(STDERR_FILENO, APL_NAME, sizeof(APL_NAME) - 1); switch (type) { case 0: /* brief listing */ fprintf(stderr, " [-help] [--help]\n"); for (col = 1, i = 0; i < optList_size(); i++) if (optList[i].desc != NULL) { int len = 0; if (!optList_isBool(i)) { len = optList_strlen(i); if (len > 0) len++; /* account for space */ }#ifdef DEBUG_STRICT assert(optList[i].opt != NULL);#endif len += 4 + STRLEN(optList[i].opt) + (optList_isBool(i) ? 2: 0); col += len; if (col > 79) { /* assume regular width */ putc('\n', stderr); col = 1 + len; } fprintf(stderr, " [-%s%s", (optList_isBool(i) ? "/+" : ""), optList[i].opt); if (optList_strlen(i)) fprintf(stderr, " %s]", optList[i].arg); else fprintf(stderr, "]"); } break; case 1: /* full command-line listing */ fprintf(stderr, " [options] [-e command args]\n\n" "where options include:\n"); for (i = 0; i < optList_size(); i++) if (optList[i].desc != NULL) {#ifdef DEBUG_STRICT assert(optList[i].opt != NULL);#endif fprintf(stderr, " %s%s %-*s%s%s\n", (optList_isBool(i) ? "-/+" : "-"), optList[i].opt, (INDENT - STRLEN(optList[i].opt) + (optList_isBool(i) ? 0 : 2)), (optList[i].arg ? optList[i].arg : ""), (optList_isBool(i) ? "turn on/off " : ""), optList[i].desc); } fprintf(stderr, "\n --help to list long-options"); break; case 2: /* full resource listing */ fprintf(stderr, " [options] [-e command args]\n\n" "where resources (long-options) include:\n"); for (i = 0; i < optList_size(); i++) if (optList[i].kw != NULL) fprintf(stderr, " %s: %*s%s\n", optList[i].kw, (INDENT - STRLEN(optList[i].kw)), "", /* XXX */ (optList_isBool(i) ? "boolean" : optList[i].arg));#ifdef KEYSYM_RESOURCE fprintf(stderr, " " "keysym.sym" ": %*s%s\n", (INDENT - sizeof("keysym.sym") + 1), "", /* XXX */ "keysym");#endif fprintf(stderr, "\n -help to list options"); break; } fprintf(stderr, "\n\n"); exit(EXIT_FAILURE); /* NOTREACHED */}/*}}} *//*{{{ get command-line options before getting resources *//* EXTPROTO */voidrxvt_get_options(rxvt_t *r, int argc, const char *const *argv){ int i, bad_option = 0; static const char On[3] = "ON", Off[4] = "OFF"; for (i = 1; i < argc; i++) { unsigned int entry, longopt = 0; const char *flag, *opt; opt = argv[i];#ifdef DEBUG_RESOURCES fprintf(stderr, "argv[%d] = %s: ", i, opt);#endif if (*opt == '-') { flag = On; if (*++opt == '-') longopt = *opt++; /* long option */ } else if (*opt == '+') { flag = Off; if (*++opt == '+') longopt = *opt++; /* long option */ } else { bad_option = 1; rxvt_print_error("bad option \"%s\"", opt); continue; } if (!STRCMP(opt, "help")) rxvt_usage(longopt ? 2 : 1); if (!STRCMP(opt, "h")) rxvt_usage(0); /* feature: always try to match long-options */ for (entry = 0; entry < optList_size(); entry++) if ((optList[entry].kw && !STRCMP(opt, optList[entry].kw)) || (!longopt && optList[entry].opt && !STRCMP(opt, optList[entry].opt))) break; if (entry < optList_size()) { if (optList_isReverse(entry)) flag = flag == On ? Off : On; if (optList_strlen(entry)) { /* string value */ const char *str = argv[++i];#ifdef DEBUG_RESOURCES fprintf(stderr, "string (%s,%s) = ", optList[entry].opt ? optList[entry].opt : "nil", optList[entry].kw ? optList[entry].kw : "nil");#endif if (flag == On && str && (optList[entry].doff != -1)) {#ifdef DEBUG_RESOURCES fprintf(stderr, "\"%s\"\n", str);#endif r->h->rs[optList[entry].doff] = str; /* * special cases are handled in main.c:main() to allow * X resources to set these values before we settle for * default values */ }#ifdef DEBUG_RESOURCES else fprintf(stderr, "???\n");#endif } else { /* boolean value */#ifdef DEBUG_RESOURCES fprintf(stderr, "boolean (%s,%s) = %s\n", optList[entry].opt, optList[entry].kw, flag);#endif if (flag == On) r->Options |= (optList[entry].flag); else r->Options &= ~(optList[entry].flag); if (optList[entry].doff != -1) r->h->rs[optList[entry].doff] = flag; } } else#ifdef KEYSYM_RESOURCE /* if (!STRNCMP(opt, "keysym.", sizeof("keysym.") - 1)) */ if (rxvt_Str_match(opt, "keysym.")) { const char *str = argv[++i]; if (str != NULL) rxvt_parse_keysym(r, opt + sizeof("keysym.") - 1, str); } else#endif { /* * various old-style options, just ignore * Obsolete since about Jan 96, * so they can probably eventually be removed */ const char *msg = "bad"; if (longopt) { opt--; bad_option = 1; } else if (!STRCMP(opt, "7") || !STRCMP(opt, "8")#ifdef GREEK_SUPPORT /* obsolete 12 May 1996 (v2.17) */ || !rxvt_Str_match(opt, "grk")#endif ) msg = "obsolete"; else bad_option = 1; rxvt_print_error("%s option \"%s\"", msg, --opt); } } if (bad_option) rxvt_usage(0);}/*}}} */#ifndef NO_RESOURCES/*----------------------------------------------------------------------*/# ifdef KEYSYM_RESOURCE/* * Define key from XrmEnumerateDatabase. * quarks will be something like * "rxvt" "keysym" "0xFF01" * value will be a string *//* ARGSUSED *//* INTPROTO */Boolrxvt_define_key(XrmDatabase *database __attribute__((unused)), XrmBindingList bindings __attribute__((unused)), XrmQuarkList quarks, XrmRepresentation *type __attribute__((unused)), XrmValue *value, XPointer closure __attribute__((unused))){ int last; rxvt_t *r = rxvt_get_r(); for (last = 0; quarks[last] != NULLQUARK; last++) /* look for last quark in list */ ; last--; rxvt_parse_keysym(r, XrmQuarkToString(quarks[last]), (char *)value->addr); return False;}/* * look for something like this (XK_Delete) * rxvt*keysym.0xFFFF: "\177" * * arg will be * NULL for ~/.Xdefaults and * non-NULL for command-line options (need to allocate) */#define NEWARGLIM 500 /* `reasonable' size *//* INTPROTO */intrxvt_parse_keysym(rxvt_t *r, const char *str, const char *arg){ int n, sym; char *key_string, *newarg = NULL; char newargstr[NEWARGLIM]; if (arg == NULL) { if ((n = rxvt_Str_match(str, "keysym.")) == 0) return 0; str += n; /* skip `keysym.' */ }/* some scanf() have trouble with a 0x prefix */ if (isdigit(str[0])) { if (str[0] == '0' && toupper(str[1]) == 'X') str += 2; if (arg) { if (sscanf(str, (STRCHR(str, ':') ? "%x:" : "%x"), &sym) != 1) return -1; } else { if (sscanf(str, "%x:", &sym) != 1) return -1; /* cue to ':', it's there since sscanf() worked */ STRNCPY(newargstr, STRCHR(str, ':') + 1, NEWARGLIM - 1); newargstr[NEWARGLIM - 1] = '\0'; newarg = newargstr; } } else { /* * convert keysym name to keysym number */ STRNCPY(newargstr, str, NEWARGLIM - 1); newargstr[NEWARGLIM - 1] = '\0'; if (arg == NULL) { if ((newarg = STRCHR(newargstr, ':')) == NULL) return -1; *newarg++ = '\0'; /* terminate keysym name */ } if ((sym = XStringToKeysym(newargstr)) == None) return -1; } if (sym < 0xFF00 || sym > 0xFFFF) /* we only do extended keys */ return -1; sym &= 0xFF; if (r->h->Keysym_map[sym] != NULL) /* already set ? */ return -1; if (newarg == NULL) { STRNCPY(newargstr, arg, NEWARGLIM - 1); newargstr[NEWARGLIM - 1] = '\0'; newarg = newargstr; } rxvt_Str_trim(newarg); if (*newarg == '\0' || (n = rxvt_Str_escaped(newarg)) == 0) return -1; MIN_IT(n, 255); key_string = rxvt_malloc((n + 1) * sizeof(char)); key_string[0] = n; STRNCPY(key_string + 1, newarg, n); r->h->Keysym_map[sym] = (unsigned char *)key_string; return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -