/* This file handles retrieval and modification of "resources", which * can be considered "preferences". * There are two sets: global, and user-specific. * The global prefs go in the KDrill file * * The user-specific stuff is handled by an additional file, * $HOME/.kdrill, in Xresource format. (like KDrill.ad) * We update that file with the latest values, when we quit. * Unless "NOXRMSAVE" is defined. In which case, we only * read the globals, and do not try to save. * * */ #include #include #include /* for POSIX_PATH_MAX */ #include #include #include #include #include "defs.h" #include "externs.h" /* GetXtrmNumber(), GetXtrmBoolean(), GetXtrmString(): * Not the "best way" to get resources... * supposed to read them all in at one go. * But I had reasons for reading things in at different times, * and I have stuck to that model */ /* GetXtrmString: * Given the resource name and class, will * copy the resource string value to * destinationstring address. * Destination must be MALLOCED ARRAY!!! * (or rather, not just a pointer?) * * Default value of string is "NOT SET". * This is used by initlog() [which is not used any more] * This should actually be encountered. I provide default values for * all resource strings used. */ void GetXtrmString(char *name,char *rec_class, char *destinationstring) { char resourcename[100],resourceclass[100]; char buffer[100]; char *returnstring = buffer; XtResource resourceList ={ NULL,NULL, XtRString,sizeof(char *),0, XtRString,"NOT SET" }; resourceList.resource_name = resourcename; resourceList.resource_class = resourceclass; strcpy(resourcename,name); strcpy(resourceclass,rec_class); XtGetApplicationResources(toplevel,&returnstring, &resourceList,1, NULL,0); strcpy(destinationstring,returnstring); } /* GetXtrmNumber: * Given resource name and and class, will attempt to look up * resource value in database. * Will return default of 0!!! */ int GetXtrmNumber(char *name,char *rec_class) { char resourcevalue[100]; GetXtrmString(name,rec_class,resourcevalue); return atoi(resourcevalue); } /* GetXtrmBoolean() * see GetXtrmNumber. * * default of False */ Boolean GetXtrmBoolean(char *name,char *rec_class) { Boolean resourcevalue; char resourcename[100],resourceclass[100]; XtResource resourceList ={ NULL,NULL, XtRBoolean,sizeof(Boolean),0, XtRBoolean,False, }; resourceList.resource_name = resourcename; resourceList.resource_class = resourceclass; strcpy(resourcename,name); strcpy(resourceclass,rec_class); XtGetApplicationResources(toplevel,&resourcevalue, &resourceList,1, NULL,0); return resourcevalue; } void SetXtrmString(char *string, char *value) { #ifndef NOXRMSAVE char namebuff[100]; char *pstring=namebuff; XrmDatabase db = XrmGetDatabase(display); if(db==NULL){ perror("could not get x resource db?"); return; } if(string[0]!='K'){ sprintf(namebuff, "KDrill.%s",string); } else{ strcpy(namebuff, string); } /*pstring=(char*)malloc(strlen(namebuff)+1); strcpy(pstring,namebuff); */ XrmPutStringResource(&db, pstring, value); #ifdef DEBUG printf("Set %s to %s\n", pstring, value); #endif #endif /*NOXRMSAVE*/ } void SetXtrmNumber(char *string, int value) { char svalue[10]; sprintf(svalue,"%d", value); SetXtrmString(string, svalue); } void SetXtrmBoolean(char *string, Boolean value) { char svalue[10]; if (value==False) sprintf(svalue,"False"); else sprintf(svalue,"True"); SetXtrmString(string, svalue); } #ifndef _POSIX_PATH_MAX #define _POSIX_PATH_MAX 1024 #endif /* * Save our options, in Xrm format, in the user's home directory. * We can only save stuff if values have been set with the SetXtrmXXXX() * convenience routines elsewhere in this file. */ void SaveConfig() { #ifndef NOXRMSAVE FILE *preffile; char fname[_POSIX_PATH_MAX]; char *savelist[]= { "noBell", "nousefile", "usefile", "kanjifont", "smallkanji", "englishfont", "kdictfile", "edictfile", "radkfile", "gradelevel", "guessmode", "questionmode", "romajiswitch", "lowfrequency", "highfrequency", "timersec", "logfile", NULL }; char **rname=savelist; sprintf(fname,"%s/.kdrill", homedir); preffile=fopen(fname,"w"); if(preffile==NULL){ perror("could not open pref file .kdrill"); return; } fprintf(preffile, "! Do not hand-edit this file\n"); fprintf(preffile, "! It will get overwritten when you quit kdrill\n"); while(*rname!=NULL){ char classbuff[100], infobuff[100]; sprintf(classbuff,*rname); GetXtrmString(*rname, classbuff,infobuff); if(strcmp(infobuff, "NOT SET")==0){ rname++; continue; } #ifdef DEBUG printf("Saving pref %s: %s\n",*rname, infobuff); #endif fprintf(preffile, "KDrill.%s: %s\n", *rname, infobuff); rname++; } fclose(preffile); #endif /* NOXRMSAVE*/ }