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
;
34 static Bool registeredSaveOnExit
= False
;
38 extern char *WMGetApplicationName();
40 #define DEFAULTS_DIR "/Defaults"
46 static char *path
= NULL
;
51 gspath
= getenv("GNUSTEP_USER_ROOT");
53 gspath
= wexpandpath(gspath
);
54 pathlen
= strlen(gspath
) + 4;
55 path
= wmalloc(pathlen
);
59 pathlen
= strlen(wgethomedir()) + 10;
60 path
= wmalloc(pathlen
);
61 strcpy(path
, wgethomedir());
62 strcat(path
, "/GNUstep");
71 wdefaultspathfordomain(char *domain
)
76 gspath
= wusergnusteppath();
77 path
= wmalloc(strlen(gspath
)+strlen(DEFAULTS_DIR
)+strlen(domain
)+4);
79 strcat(path
, DEFAULTS_DIR
);
89 saveDefaultsChanges(int foo
, void *bar
)
91 saveDefaultsChanges(void)
94 /* save the user defaults databases */
95 if (sharedUserDefaults
) {
96 UserDefaults
*tmp
= sharedUserDefaults
;
99 if (tmp
->appDomain
&& tmp
->dirty
)
100 PLShallowSynchronize(tmp
->appDomain
);
107 /* set to save changes in defaults when program is exited */
109 registerSaveOnExit(void)
111 if (!registeredSaveOnExit
) {
113 on_exit(saveDefaultsChanges
, (void*)NULL
);
115 atexit(saveDefaultsChanges
);
117 registeredSaveOnExit
= True
;
123 WMSynchronizeUserDefaults(WMUserDefaults
*database
)
125 /* TODO: check what it should really do */
126 PLShallowSynchronize(database
->appDomain
);
131 WMSaveUserDefaults(WMUserDefaults
*database
)
133 PLSave(database
->appDomain
, YES
);
138 WMGetStandardUserDefaults(void)
140 WMUserDefaults
*defaults
;
146 if (sharedUserDefaults
) {
147 defaults
= sharedUserDefaults
;
149 /* Trick, path == NULL only for StandardUserDefaults db */
150 if (defaults
->path
== NULL
)
152 defaults
= defaults
->next
;
156 /* we didn't found the database we are looking for. Go read it. */
157 defaults
= wmalloc(sizeof(WMUserDefaults
));
158 memset(defaults
, 0, sizeof(WMUserDefaults
));
160 defaults
->defaults
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
162 defaults
->searchList
= wmalloc(sizeof(proplist_t
)*3);
164 /* application domain */
165 key
= PLMakeString(WMGetApplicationName());
166 defaults
->searchList
[0] = key
;
168 /* temporary kluge */
169 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
173 path
= wdefaultspathfordomain(PLGetString(key
));
175 domain
= PLGetProplistWithPath(path
);
180 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
182 p
= PLMakeString(path
);
183 PLSetFilename(domain
, p
);
190 defaults
->appDomain
= domain
;
193 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
198 key
= PLMakeString("WMGLOBAL");
199 defaults
->searchList
[1] = key
;
201 path
= wdefaultspathfordomain(PLGetString(key
));
203 domain
= PLGetProplistWithPath(path
);
208 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
211 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
216 defaults
->searchList
[2] = NULL
;
218 defaults
->searchListArray
=PLMakeArrayFromElements(NULL
,NULL
);
222 while (defaults
->searchList
[i
]) {
223 PLAppendArrayElement(defaults
->searchListArray
,
224 defaults
->searchList
[i
]);
228 if (sharedUserDefaults
)
229 defaults
->next
= sharedUserDefaults
;
230 sharedUserDefaults
= defaults
;
232 registerSaveOnExit();
239 WMGetDefaultsFromPath(char *path
)
241 WMUserDefaults
*defaults
;
247 assert(path
!= NULL
);
249 if (sharedUserDefaults
) {
250 defaults
= sharedUserDefaults
;
252 if (defaults
->path
&& strcmp(defaults
->path
, path
) == 0)
254 defaults
= defaults
->next
;
258 /* we didn't found the database we are looking for. Go read it. */
259 defaults
= wmalloc(sizeof(WMUserDefaults
));
260 memset(defaults
, 0, sizeof(WMUserDefaults
));
262 defaults
->defaults
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
264 defaults
->searchList
= wmalloc(sizeof(proplist_t
)*2);
266 /* the domain we want, go in the first position */
267 name
= strrchr(path
, '/');
273 key
= PLMakeString(name
);
274 defaults
->searchList
[0] = key
;
276 domain
= PLGetProplistWithPath(path
);
281 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
282 p
= PLMakeString(path
);
283 PLSetFilename(domain
, p
);
287 defaults
->path
= wstrdup(path
);
289 defaults
->appDomain
= domain
;
292 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
297 defaults
->searchList
[1] = NULL
;
299 defaults
->searchListArray
=PLMakeArrayFromElements(NULL
,NULL
);
302 while (defaults
->searchList
[i
]) {
303 PLAppendArrayElement(defaults
->searchListArray
,
304 defaults
->searchList
[i
]);
308 if (sharedUserDefaults
)
309 defaults
->next
= sharedUserDefaults
;
310 sharedUserDefaults
= defaults
;
312 registerSaveOnExit();
319 WMGetUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
321 proplist_t domainName
, domain
;
322 proplist_t object
= NULL
;
323 proplist_t key
= PLMakeString(defaultName
);
326 while (database
->searchList
[i
] && !object
) {
327 domainName
= database
->searchList
[i
];
328 domain
= PLGetDictionaryEntry(database
->defaults
, domainName
);
330 object
= PLGetDictionaryEntry(domain
, key
);
341 WMSetUDObjectForKey(WMUserDefaults
*database
, proplist_t object
,
344 proplist_t key
= PLMakeString(defaultName
);
348 PLInsertDictionaryEntry(database
->appDomain
, key
, object
);
354 WMRemoveUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
356 proplist_t key
= PLMakeString(defaultName
);
360 PLRemoveDictionaryEntry(database
->appDomain
, key
);
367 WMGetUDStringForKey(WMUserDefaults
*database
, char *defaultName
)
371 val
= WMGetUDObjectForKey(database
, defaultName
);
376 if (!PLIsString(val
))
379 return PLGetString(val
);
384 WMGetUDIntegerForKey(WMUserDefaults
*database
, char *defaultName
)
390 val
= WMGetUDObjectForKey(database
, defaultName
);
395 if (!PLIsString(val
))
398 str
= PLGetString(val
);
402 if (sscanf(str
, "%i", &value
)!=1)
411 WMGetUDFloatForKey(WMUserDefaults
*database
, char *defaultName
)
417 val
= WMGetUDObjectForKey(database
, defaultName
);
419 if (!val
|| !PLIsString(val
))
422 if (!(str
= PLGetString(val
)))
425 if (sscanf(str
, "%f", &value
)!=1)
434 WMGetUDBoolForKey(WMUserDefaults
*database
, char *defaultName
)
440 val
= WMGetUDObjectForKey(database
, defaultName
);
445 if (!PLIsString(val
))
448 str
= PLGetString(val
);
452 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
455 if (strcasecmp(str
, "YES")==0)
458 if (strcasecmp(str
, "Y")==0)
466 WMSetUDIntegerForKey(WMUserDefaults
*database
, int value
, char *defaultName
)
471 sprintf(buffer
, "%i", value
);
472 object
= PLMakeString(buffer
);
474 WMSetUDObjectForKey(database
, object
, defaultName
);
482 WMSetUDStringForKey(WMUserDefaults
*database
, char *value
, char *defaultName
)
486 object
= PLMakeString(value
);
488 WMSetUDObjectForKey(database
, object
, defaultName
);
495 WMSetUDFloatForKey(WMUserDefaults
*database
, float value
, char *defaultName
)
500 sprintf(buffer
, "%f", value
);
501 object
= PLMakeString(buffer
);
503 WMSetUDObjectForKey(database
, object
, defaultName
);
510 WMSetUDBoolForKey(WMUserDefaults
*database
, Bool value
, char *defaultName
)
512 static proplist_t yes
= NULL
, no
= NULL
;
515 yes
= PLMakeString("YES");
516 no
= PLMakeString("NO");
519 WMSetUDObjectForKey(database
, value
? yes
: no
, defaultName
);
524 WMGetUDSearchList(WMUserDefaults
*database
)
526 return database
->searchListArray
;
531 WMSetUDSearchList(WMUserDefaults
*database
, proplist_t list
)
535 if (database
->searchList
) {
537 while (database
->searchList
[i
]) {
538 PLRelease(database
->searchList
[i
]);
541 free(database
->searchList
);
543 if (database
->searchListArray
) {
544 PLRelease(database
->searchListArray
);
547 c
= PLGetNumberOfElements(list
);
548 database
->searchList
= wmalloc(sizeof(proplist_t
)*(c
+1));
550 for (i
=0; i
<c
; i
++) {
551 database
->searchList
[i
] = PLGetArrayElement(list
, i
);
554 database
->searchListArray
= PLDeepCopy(list
);