📄 rxvtlib_xdefaults.c
字号:
#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].dp != 1) { #ifdef DEBUG_RESOURCES fprintf (stderr, "\"%s\"\n", str);#endif *(&(o->rs[optList[entry].dp])) = 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) o->Options |= (optList[entry].flag); else o->Options &= ~(optList[entry].flag); if (optList[entry].dp != 1) *(&(o->rs[optList[entry].dp])) = flag; } } else#ifdef KEYSYM_RESOURCE /* if (!strncmp (opt, "keysym.", strlen ("keysym."))) */ if (Str_match (opt, "keysym.")) { const char *str = argv[++i]; /* * '7' is strlen("keysym.") */ if (str != NULL) rxvtlib_parse_keysym (o, opt + 7, 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) */ || !Str_match (opt, "grk")#endif ) msg = "obsolete"; else bad_option = 1; print_error ("%s option \"%s\"", msg, --opt); } } if (bad_option) rxvtlib_usage (o, 0);}/*}}} */#ifndef NO_RESOURCES/*----------------------------------------------------------------------*//*{{{ string functions *//* * a replacement for strcasecmp() to avoid linking an entire library *//* INTPROTO */int my_strcasecmp (const char *s1, const char *s2){ for ( /*nil */ ; (*s1 && *s2); s1++, s2++) { register int c1 = toupper (*s1); register int c2 = toupper (*s2); if (c1 != c2) return (c1 - c2); } return (int)(*s1 - *s2);}/*}}} */# ifdef KEYSYM_RESOURCE/* * Define key from XrmEnumerateDatabase. * quarks will be something like * "rxvt" "keysym" "0xFF01" * value will be a string *//* ARGSUSED *//* INTPROTO */Bool rxvtlib_define_key (rxvtlib *o, XrmDatabase * database, XrmBindingList bindings, XrmQuarkList quarks, XrmRepresentation * type, XrmValue * value, XPointer closure){ int last; for (last = 0; quarks[last] != NULLQUARK; last++) /* look for last quark in list */ ; last--; rxvtlib_parse_keysym (o, 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) *//* INTPROTO */int rxvtlib_parse_keysym (rxvtlib *o, const char *str, const char *arg){ int n, sym; char *key_string, *newarg = NULL; char newargstr[NEWARGLIM]; if (arg == NULL) { if ((n = 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 = Str_trim (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 */ (void)Str_trim (newarg); } if ((sym = XStringToKeysym (newargstr)) == None) return -1; } if (sym < 0xFF00 || sym > 0xFFFF) /* we only do extended keys */ return -1; sym &= 0xFF; if (o->KeySym_map[sym] != NULL) /* already set ? */ return -1; if (newarg == NULL) { STRNCPY (newargstr, arg, NEWARGLIM - 1); newargstr[NEWARGLIM - 1] = '\0'; newarg = newargstr; } if (strlen (newargstr) == 0 || (n = Str_escaped (newargstr)) == 0) return -1; MIN_IT (n, 255); key_string = MALLOC ((n + 1) * sizeof (char)); key_string[0] = n; STRNCPY (key_string + 1, newarg, n); o->KeySym_map[sym] = (unsigned char *)key_string; return 1;}# endif /* KEYSYM_RESOURCE */# ifndef USE_XGETDEFAULT/*{{{ get_xdefaults() *//* * the matching algorithm used for memory-save fake resources *//* INTPROTO */void rxvtlib_get_xdefaults (rxvtlib *o, FILE * stream, const char *name){ unsigned int len; char *str, buffer[256]; if (stream == NULL) return; len = strlen (name); while ((str = fgets (buffer, sizeof (buffer), stream)) != NULL) { unsigned int entry, n; while (*str && isspace (*str)) str++; /* leading whitespace */ if ((str[len] != '*' && str[len] != '.') || (len && strncmp (str, name, len))) continue; str += (len + 1); /* skip `name*' or `name.' */# ifdef KEYSYM_RESOURCE if (!rxvtlib_parse_keysym (o, str, NULL))# endif /* KEYSYM_RESOURCE */ for (entry = 0; entry < optList_size (); entry++) { const char *kw = optList[entry].kw; if (kw == NULL) continue; n = strlen (kw); if (str[n] == ':' && Str_match (str, kw)) { /* skip `keyword:' */ str += (n + 1); (void)Str_trim (str); n = strlen (str); if (n && *(&(o->rs[optList[entry].dp])) == NULL) { /* not already set */ int s; char *p = MALLOC ((n + 1) * sizeof (char)); STRCPY (p, str); *(&(o->rs[optList[entry].dp])) = *(&(o->rs_free[optList[entry].dp])) = p; if (optList_isBool (entry)) { s = my_strcasecmp (p, "TRUE") == 0 || my_strcasecmp (p, "YES") == 0 || my_strcasecmp (p, "ON") == 0 || my_strcasecmp (p, "1") == 0; if (optList_isReverse (entry)) s = !s; if (s) o->Options |= (optList[entry].flag); else o->Options &= ~(optList[entry].flag); } } break; } } } rewind (stream);}/*}}} */# endif /* ! USE_XGETDEFAULT */#endif /* NO_RESOURCES *//*{{{ read the resources files *//* * using XGetDefault() or the hand-rolled replacement *//* ARGSUSED *//* EXTPROTO */void rxvtlib_extract_resources (rxvtlib *o, Display * display, const char *name){#ifndef NO_RESOURCES# ifdef USE_XGETDEFAULT/* * get resources using the X library function */ int entry;# ifdef XrmEnumOneLevel XrmName name_prefix[3]; XrmClass class_prefix[3]; char *displayResource; XrmDatabase database; char *screenResource; XrmDatabase screenDatabase;/* * Get screen-specific resources (X11R5) and merge into common resources. */ database = NULL; screenDatabase = NULL; displayResource = XResourceManagerString (display); if (displayResource != NULL) database = XrmGetStringDatabase (displayResource); screenResource = XScreenResourceString (DefaultScreenOfDisplay (display)); if (screenResource != NULL) screenDatabase = XrmGetStringDatabase (screenResource); XrmMergeDatabases (screenDatabase, &database); XrmSetDatabase (display, database);# endif for (entry = 0; entry < optList_size (); entry++) { int s; char *p; const char *kw = optList[entry].kw; if (kw == NULL || *(&(o->rs[optList[entry].dp])) != NULL) continue; /* previously set */ if ((p = XGetDefault (display, name, kw)) != NULL || (p = XGetDefault (display, APL_SUBCLASS, kw)) != NULL || (p = XGetDefault (display, APL_CLASS, kw)) != NULL) { *(&(o->rs[optList[entry].dp])) = p; if (optList_isBool (entry)) { s = my_strcasecmp (p, "TRUE") == 0 || my_strcasecmp (p, "YES") == 0 || my_strcasecmp (p, "ON") == 0 || my_strcasecmp (p, "1") == 0; if (optList_isReverse (entry)) s = !s; if (s) o->Options |= (optList[entry].flag); else o->Options &= ~(optList[entry].flag); } } }/* * [R5 or later]: enumerate the resource database */# ifdef XrmEnumOneLevel# ifdef KEYSYM_RESOURCE name_prefix[0] = XrmStringToName (name); name_prefix[1] = XrmStringToName ("keysym"); name_prefix[2] = NULLQUARK; class_prefix[0] = XrmStringToName (APL_SUBCLASS); class_prefix[1] = XrmStringToName ("Keysym"); class_prefix[2] = NULLQUARK; XrmEnumerateDatabase (XrmGetDatabase (display), name_prefix, class_prefix, XrmEnumOneLevel, rxvtlib_define_key, , NULL); name_prefix[0] = XrmStringToName (APL_CLASS); name_prefix[1] = XrmStringToName ("keysym"); class_prefix[0] = XrmStringToName (APL_CLASS); class_prefix[1] = XrmStringToName ("Keysym"); XrmEnumerateDatabase (XrmGetDatabase (display), name_prefix, class_prefix, XrmEnumOneLevel, rxvtlib_define_key, , NULL);# endif# endif# else /* USE_XGETDEFAULT *//* get resources the hard way, but save lots of memory */ const char *const fname[] = { ".Xdefaults", ".Xresources" }; FILE *fd = NULL; char *home; if ((home = getenv ("HOME")) != NULL) { int i, len = strlen (home) + 2; char *f = NULL; for (i = 0; i < (sizeof (fname) / sizeof (fname[0])); i++) { f = REALLOC (f, (len + strlen (fname[i])) * sizeof (char)); sprintf (f, "%s/%s", home, fname[i]); if ((fd = fopen (f, "r")) != NULL) break; } FREE (f); }/* * The normal order to match resources is the following: * @ global resources (partial match, ~/.Xdefaults) * @ application file resources (XAPPLOADDIR/Rxvt) * @ class resources (~/.Xdefaults) * @ private resources (~/.Xdefaults) * * However, for the hand-rolled resources, the matching algorithm * checks if a resource string value has already been allocated * and won't overwrite it with (in this case) a less specific * resource value. * * This avoids multiple allocation. Also, when we've called this * routine command-line string options have already been applied so we * needn't to allocate for those resources. * * So, search in resources from most to least specific. * * Also, use a special sub-class so that we can use either or both of * "XTerm" and "Rxvt" as class names. */ rxvtlib_get_xdefaults (o, fd, name); rxvtlib_get_xdefaults (o, fd, APL_SUBCLASS);# ifdef XAPPLOADDIR { FILE *ad = fopen (XAPPLOADDIR "/" APL_SUBCLASS, "r"); if (ad != NULL) { rxvtlib_get_xdefaults (o, ad, ""); fclose (ad); } }# endif /* XAPPLOADDIR */ rxvtlib_get_xdefaults (o, fd, APL_CLASS); rxvtlib_get_xdefaults (o, fd, ""); /* partial match */ if (fd != NULL) fclose (fd);# endif /* USE_XGETDEFAULT */#endif /* NO_RESOURCES *//* * even without resources, at least do this setup for command-line * options and command-line long options */#ifdef MULTICHAR_SET rxvtlib_set_multichar_encoding (o, o->rs[Rs_multichar_encoding]);#endif#ifdef GREEK_SUPPORT/* this could be a function in grkelot.c *//* void set_greek_keyboard (const char * str); */ if (o->rs[Rs_greek_keyboard]) { if (!strcmp (o->rs[Rs_greek_keyboard], "iso")) greek_setmode (GREEK_ELOT928); /* former -grk9 */ else if (!strcmp (o->rs[Rs_greek_keyboard], "ibm")) greek_setmode (GREEK_IBM437); /* former -grk4 */ }#endif /* GREEK_SUPPORT */#if defined (HOTKEY_CTRL) || defined (HOTKEY_META) { KeySym sym; if (o->rs[Rs_bigfont_key] && ((sym = XStringToKeysym (o->rs[Rs_bigfont_key])) != 0)) o->ks_bigfont = sym; if (o->rs[Rs_smallfont_key] && ((sym = XStringToKeysym (o->rs[Rs_smallfont_key])) != 0)) o->ks_smallfont = sym; }#endif}/*}}} *//*----------------------- end-of-file (C source) -----------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -