8 #include "../src/config.h"
15 typedef struct W_UserDefaults
{
20 proplist_t searchListArray
;
21 proplist_t
*searchList
; /* cache for searchListArray */
25 char *path
; /* where is db located */
27 struct W_UserDefaults
*next
;
32 static UserDefaults
*sharedUserDefaults
= NULL
;
33 static UserDefaults
**sharedDefaultsList
= NULL
;
34 static Bool registeredSaveOnExit
= False
;
37 extern char *WMGetApplicationName();
39 #define DEFAULTS_DIR "/Defaults"
45 static char *path
= NULL
;
50 gspath
= getenv("GNUSTEP_USER_ROOT");
52 gspath
= wexpandpath(gspath
);
53 pathlen
= strlen(gspath
) + 4;
54 path
= wmalloc(pathlen
);
58 pathlen
= strlen(wgethomedir()) + 10;
59 path
= wmalloc(pathlen
);
60 strcpy(path
, wgethomedir());
61 strcat(path
, "/GNUstep");
70 wdefaultspathfordomain(char *domain
)
75 gspath
= wusergnusteppath();
76 path
= wmalloc(strlen(gspath
)+strlen(DEFAULTS_DIR
)+strlen(domain
)+4);
78 strcat(path
, DEFAULTS_DIR
);
88 saveDefaultsChanges(int foo
, void *bar
)
90 saveDefaultsChanges(void)
93 /* save the user defaults database */
94 if (sharedUserDefaults
&& sharedUserDefaults
->dirty
) {
95 PLSave(sharedUserDefaults
->appDomain
, YES
);
98 /* now save the extra defaults databases we may have */
99 if (sharedDefaultsList
) {
100 UserDefaults
*tmp
= *sharedDefaultsList
;
104 PLSave(tmp
->appDomain
, YES
);
111 /* set to save changes in defaults when program is exited */
113 registerSaveOnExit(void)
115 if (!registeredSaveOnExit
) {
117 on_exit(saveDefaultsChanges
, (void*)NULL
);
119 atexit(saveDefaultsChanges
);
121 registeredSaveOnExit
= True
;
127 WMSynchronizeUserDefaults(WMUserDefaults
*database
)
129 /* TODO: check what it should really do */
130 PLSave(database
->appDomain
, YES
);
135 WMGetStandardUserDefaults(void)
137 if (!sharedUserDefaults
) {
138 WMUserDefaults
*defaults
;
145 defaults
= wmalloc(sizeof(WMUserDefaults
));
146 memset(defaults
, 0, sizeof(WMUserDefaults
));
148 defaults
->defaults
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
150 defaults
->searchList
= wmalloc(sizeof(proplist_t
)*3);
152 /* application domain */
153 key
= PLMakeString(WMGetApplicationName());
154 defaults
->searchList
[0] = key
;
156 /* temporary kluge */
157 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
161 path
= wdefaultspathfordomain(PLGetString(key
));
163 domain
= PLGetProplistWithPath(path
);
168 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
170 p
= PLMakeString(path
);
171 PLSetFilename(domain
, p
);
178 defaults
->appDomain
= domain
;
181 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
186 key
= PLMakeString("WMGLOBAL");
187 defaults
->searchList
[1] = key
;
189 path
= wdefaultspathfordomain(PLGetString(key
));
191 domain
= PLGetProplistWithPath(path
);
196 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
199 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
204 defaults
->searchList
[2] = NULL
;
206 defaults
->searchListArray
=PLMakeArrayFromElements(NULL
,NULL
);
210 while (defaults
->searchList
[i
]) {
211 PLAppendArrayElement(defaults
->searchListArray
,
212 defaults
->searchList
[i
]);
216 sharedUserDefaults
= defaults
;
218 registerSaveOnExit();
222 return sharedUserDefaults
;
227 WMGetDefaultsFromPath(char *path
)
229 WMUserDefaults
*defaults
;
235 assert(path
!= NULL
);
237 if (sharedDefaultsList
) {
238 defaults
= *sharedDefaultsList
;
240 if (strcmp(defaults
->path
, path
) == 0)
242 defaults
= defaults
->next
;
246 /* we didn't found the database we are looking for. Go read it. */
247 defaults
= wmalloc(sizeof(WMUserDefaults
));
248 memset(defaults
, 0, sizeof(WMUserDefaults
));
250 defaults
->defaults
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
252 defaults
->searchList
= wmalloc(sizeof(proplist_t
)*2);
254 /* the domain we want go first */
255 name
= strrchr(path
, '/');
260 key
= PLMakeString(name
);
261 defaults
->searchList
[0] = key
;
263 domain
= PLGetProplistWithPath(path
);
268 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
269 p
= PLMakeString(path
);
270 PLSetFilename(domain
, p
);
274 defaults
->path
= wstrdup(path
);
276 defaults
->appDomain
= domain
;
279 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
284 defaults
->searchList
[1] = NULL
;
286 defaults
->searchListArray
=PLMakeArrayFromElements(NULL
,NULL
);
289 while (defaults
->searchList
[i
]) {
290 PLAppendArrayElement(defaults
->searchListArray
,
291 defaults
->searchList
[i
]);
295 if (sharedDefaultsList
)
296 defaults
->next
= *sharedDefaultsList
;
297 sharedDefaultsList
= &defaults
;
299 registerSaveOnExit();
301 name
= PLGetDescriptionIndent(defaults
->defaults
, 0);
310 WMGetUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
312 proplist_t domainName
, domain
;
313 proplist_t object
= NULL
;
314 proplist_t key
= PLMakeString(defaultName
);
317 while (database
->searchList
[i
] && !object
) {
318 domainName
= database
->searchList
[i
];
319 domain
= PLGetDictionaryEntry(database
->defaults
, domainName
);
321 object
= PLGetDictionaryEntry(domain
, key
);
332 WMSetUDObjectForKey(WMUserDefaults
*database
, proplist_t object
,
335 proplist_t key
= PLMakeString(defaultName
);
339 PLInsertDictionaryEntry(database
->appDomain
, key
, object
);
345 WMRemoveUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
347 proplist_t key
= PLMakeString(defaultName
);
351 PLRemoveDictionaryEntry(database
->appDomain
, key
);
358 WMGetUDStringForKey(WMUserDefaults
*database
, char *defaultName
)
362 val
= WMGetUDObjectForKey(database
, defaultName
);
367 if (!PLIsString(val
))
370 return wstrdup(PLGetString(val
));
375 WMGetUDIntegerForKey(WMUserDefaults
*database
, char *defaultName
)
381 val
= WMGetUDObjectForKey(database
, defaultName
);
386 if (!PLIsString(val
))
389 str
= PLGetString(val
);
393 if (sscanf(str
, "%i", &value
)!=1)
402 WMGetUDFloatForKey(WMUserDefaults
*database
, char *defaultName
)
408 val
= WMGetUDObjectForKey(database
, defaultName
);
410 if (!val
|| !PLIsString(val
))
413 if (!(str
= PLGetString(val
)))
416 if (sscanf(str
, "%f", &value
)!=1)
425 WMGetUDBoolForKey(WMUserDefaults
*database
, char *defaultName
)
431 val
= WMGetUDObjectForKey(database
, defaultName
);
436 if (!PLIsString(val
))
439 str
= PLGetString(val
);
443 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
446 if (strcasecmp(str
, "YES")==0)
449 if (strcasecmp(str
, "Y")==0)
457 WMSetUDIntegerForKey(WMUserDefaults
*database
, int value
, char *defaultName
)
462 sprintf(buffer
, "%i", value
);
463 object
= PLMakeString(buffer
);
465 WMSetUDObjectForKey(database
, object
, defaultName
);
473 WMSetUDStringForKey(WMUserDefaults
*database
, char *value
, char *defaultName
)
477 object
= PLMakeString(value
);
479 WMSetUDObjectForKey(database
, object
, defaultName
);
486 WMSetUDFloatForKey(WMUserDefaults
*database
, float value
, char *defaultName
)
491 sprintf(buffer
, "%f", value
);
492 object
= PLMakeString(buffer
);
494 WMSetUDObjectForKey(database
, object
, defaultName
);
501 WMSetUDBoolForKey(WMUserDefaults
*database
, Bool value
, char *defaultName
)
503 static proplist_t yes
= NULL
, no
= NULL
;
506 yes
= PLMakeString("YES");
507 no
= PLMakeString("NO");
510 WMSetUDObjectForKey(database
, value
? yes
: no
, defaultName
);
515 WMGetUDSearchList(WMUserDefaults
*database
)
517 return database
->searchListArray
;
522 WMSetUDSearchList(WMUserDefaults
*database
, proplist_t list
)
526 if (database
->searchList
) {
528 while (database
->searchList
[i
]) {
529 PLRelease(database
->searchList
[i
]);
532 free(database
->searchList
);
534 if (database
->searchListArray
) {
535 PLRelease(database
->searchListArray
);
538 c
= PLGetNumberOfElements(list
);
539 database
->searchList
= wmalloc(sizeof(proplist_t
)*(c
+1));
541 for (i
=0; i
<c
; i
++) {
542 database
->searchList
[i
] = PLGetArrayElement(list
, i
);
545 database
->searchListArray
= PLDeepCopy(list
);