⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rxvtlib_xdefaults.c

📁 具有IDE功能的编辑器
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -