8 #include "../src/config.h"
15 typedef struct W_UserDefaults
{
20 proplist_t searchListArray
;
21 proplist_t
*searchList
; /* cache for searchListArray */
28 static UserDefaults
*sharedUserDefaults
= NULL
;
30 extern char *WMGetApplicationName();
32 #define DEFAULTS_DIR "/Defaults"
38 static char *path
= NULL
;
43 gspath
= getenv("GNUSTEP_USER_ROOT");
45 gspath
= wexpandpath(gspath
);
46 pathlen
= strlen(gspath
) + 4;
47 path
= wmalloc(pathlen
);
51 pathlen
= strlen(wgethomedir()) + 10;
52 path
= wmalloc(pathlen
);
53 strcpy(path
, wgethomedir());
54 strcat(path
, "/GNUstep");
63 wdefaultspathfordomain(char *domain
)
68 gspath
= wusergnusteppath();
69 path
= wmalloc(strlen(gspath
)+strlen(DEFAULTS_DIR
)+strlen(domain
)+4);
71 strcat(path
, DEFAULTS_DIR
);
81 saveDefaultsChanges(int foo
, void *bar
)
83 saveDefaultsChanges(void)
86 if (sharedUserDefaults
&& sharedUserDefaults
->dirty
) {
87 PLSave(sharedUserDefaults
->appDomain
, YES
);
93 WMGetStandardUserDefaults(void)
95 if (!sharedUserDefaults
) {
96 WMUserDefaults
*defaults
;
103 defaults
= wmalloc(sizeof(WMUserDefaults
));
104 memset(defaults
, 0, sizeof(WMUserDefaults
));
106 defaults
->defaults
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
108 defaults
->searchList
= wmalloc(sizeof(proplist_t
)*3);
110 /* application domain */
111 key
= PLMakeString(WMGetApplicationName());
112 defaults
->searchList
[0] = key
;
114 /* temporary kluge */
115 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
119 path
= wdefaultspathfordomain(PLGetString(key
));
121 domain
= PLGetProplistWithPath(path
);
126 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
128 p
= PLMakeString(path
);
129 PLSetFilename(domain
, p
);
136 defaults
->appDomain
= domain
;
139 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
144 key
= PLMakeString("WMGLOBAL");
145 defaults
->searchList
[1] = key
;
147 path
= wdefaultspathfordomain(PLGetString(key
));
149 domain
= PLGetProplistWithPath(path
);
154 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
157 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
162 defaults
->searchList
[2] = NULL
;
164 defaults
->searchListArray
=PLMakeArrayFromElements(NULL
,NULL
);
168 while (defaults
->searchList
[i
]) {
169 PLAppendArrayElement(defaults
->searchListArray
,
170 defaults
->searchList
[i
]);
174 sharedUserDefaults
= defaults
;
176 /* set to save changes in defaults when program is exited */
180 on_exit(saveDefaultsChanges
, (void*)NULL
);
182 atexit(saveDefaultsChanges
);
186 return sharedUserDefaults
;
192 WMGetUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
194 proplist_t domainName
, domain
;
195 proplist_t object
= NULL
;
196 proplist_t key
= PLMakeString(defaultName
);
199 while (database
->searchList
[i
] && !object
) {
200 domainName
= database
->searchList
[i
];
201 domain
= PLGetDictionaryEntry(database
->defaults
, domainName
);
203 object
= PLGetDictionaryEntry(domain
, key
);
214 WMSetUDObjectForKey(WMUserDefaults
*database
, proplist_t object
,
217 proplist_t key
= PLMakeString(defaultName
);
221 PLInsertDictionaryEntry(database
->appDomain
, key
, object
);
227 WMRemoveUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
229 proplist_t key
= PLMakeString(defaultName
);
233 PLRemoveDictionaryEntry(database
->appDomain
, key
);
240 WMGetUDStringForKey(WMUserDefaults
*database
, char *defaultName
)
244 val
= WMGetUDObjectForKey(database
, defaultName
);
249 if (!PLIsString(val
))
252 return wstrdup(PLGetString(val
));
257 WMGetUDIntegerForKey(WMUserDefaults
*database
, char *defaultName
)
263 val
= WMGetUDObjectForKey(database
, defaultName
);
268 if (!PLIsString(val
))
271 str
= PLGetString(val
);
275 if (sscanf(str
, "%i", &value
)!=1)
284 WMGetUDFloatForKey(WMUserDefaults
*database
, char *defaultName
)
290 val
= WMGetUDObjectForKey(database
, defaultName
);
292 if (!val
|| !PLIsString(val
))
295 if (!(str
= PLGetString(val
)))
298 if (sscanf(str
, "%f", &value
)!=1)
307 WMGetUDBoolForKey(WMUserDefaults
*database
, char *defaultName
)
313 val
= WMGetUDObjectForKey(database
, defaultName
);
318 if (!PLIsString(val
))
321 str
= PLGetString(val
);
325 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
328 if (strcasecmp(str
, "YES")==0)
331 if (strcasecmp(str
, "Y")==0)
339 WMSetUDIntegerForKey(WMUserDefaults
*database
, int value
, char *defaultName
)
344 sprintf(buffer
, "%i", value
);
345 object
= PLMakeString(buffer
);
347 WMSetUDObjectForKey(database
, object
, defaultName
);
355 WMSetUDStringForKey(WMUserDefaults
*database
, char *value
, char *defaultName
)
359 object
= PLMakeString(value
);
361 WMSetUDObjectForKey(database
, object
, defaultName
);
368 WMSetUDFloatForKey(WMUserDefaults
*database
, float value
, char *defaultName
)
373 sprintf(buffer
, "%f", value
);
374 object
= PLMakeString(buffer
);
376 WMSetUDObjectForKey(database
, object
, defaultName
);
383 WMSetUDBoolForKey(WMUserDefaults
*database
, Bool value
, char *defaultName
)
385 static proplist_t yes
= NULL
, no
= NULL
;
388 yes
= PLMakeString("YES");
389 no
= PLMakeString("NO");
392 WMSetUDObjectForKey(database
, value
? yes
: no
, defaultName
);
397 WMGetUDSearchList(WMUserDefaults
*database
)
399 return database
->searchListArray
;
404 WMSetUDSearchList(WMUserDefaults
*database
, proplist_t list
)
408 if (database
->searchList
) {
410 while (database
->searchList
[i
]) {
411 PLRelease(database
->searchList
[i
]);
414 free(database
->searchList
);
416 if (database
->searchListArray
) {
417 PLRelease(database
->searchListArray
);
420 c
= PLGetNumberOfElements(list
);
421 database
->searchList
= wmalloc(sizeof(proplist_t
)*(c
+1));
423 for (i
=0; i
<c
; i
++) {
424 database
->searchList
[i
] = PLGetArrayElement(list
, i
);
427 database
->searchListArray
= PLDeepCopy(list
);