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"
42 gspath
= getenv("GNUSTEP_USER_ROOT");
44 gspath
= wexpandpath(gspath
);
45 pathlen
= strlen(gspath
) + 4;
46 path
= wmalloc(pathlen
);
50 pathlen
= strlen(wgethomedir()) + 10;
51 path
= wmalloc(pathlen
);
52 strcpy(path
, wgethomedir());
53 strcat(path
, "/GNUstep");
61 wdefaultspathfordomain(char *domain
)
66 gspath
= wusergnusteppath();
67 path
= wmalloc(strlen(gspath
)+strlen(DEFAULTS_DIR
)+strlen(domain
)+4);
70 strcat(path
, DEFAULTS_DIR
);
80 saveDefaultsChanges(int foo
, void *bar
)
82 saveDefaultsChanges(void)
85 if (sharedUserDefaults
&& sharedUserDefaults
->dirty
) {
86 PLSave(sharedUserDefaults
->appDomain
, YES
);
92 WMGetStandardUserDefaults(void)
94 if (!sharedUserDefaults
) {
95 WMUserDefaults
*defaults
;
102 defaults
= wmalloc(sizeof(WMUserDefaults
));
103 memset(defaults
, 0, sizeof(WMUserDefaults
));
105 defaults
->defaults
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
107 defaults
->searchList
= wmalloc(sizeof(proplist_t
)*3);
109 /* application domain */
110 key
= PLMakeString(WMGetApplicationName());
111 defaults
->searchList
[0] = key
;
113 /* temporary kluge */
114 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
118 path
= wdefaultspathfordomain(PLGetString(key
));
120 domain
= PLGetProplistWithPath(path
);
125 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
127 p
= PLMakeString(path
);
128 PLSetFilename(domain
, p
);
135 defaults
->appDomain
= domain
;
138 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
143 key
= PLMakeString("WMGLOBAL");
144 defaults
->searchList
[1] = key
;
146 path
= wdefaultspathfordomain(PLGetString(key
));
148 domain
= PLGetProplistWithPath(path
);
153 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
156 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
161 defaults
->searchList
[2] = NULL
;
163 defaults
->searchListArray
=PLMakeArrayFromElements(NULL
,NULL
);
167 while (defaults
->searchList
[i
]) {
168 PLAppendArrayElement(defaults
->searchListArray
,
169 defaults
->searchList
[i
]);
173 sharedUserDefaults
= defaults
;
175 /* set to save changes in defaults when program is exited */
179 on_exit(saveDefaultsChanges
, (void*)NULL
);
181 atexit(saveDefaultsChanges
);
185 return sharedUserDefaults
;
191 WMGetUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
193 proplist_t domainName
, domain
;
194 proplist_t object
= NULL
;
195 proplist_t key
= PLMakeString(defaultName
);
198 while (database
->searchList
[i
] && !object
) {
199 domainName
= database
->searchList
[i
];
200 domain
= PLGetDictionaryEntry(database
->defaults
, domainName
);
202 object
= PLGetDictionaryEntry(domain
, key
);
213 WMSetUDObjectForKey(WMUserDefaults
*database
, proplist_t object
,
216 proplist_t key
= PLMakeString(defaultName
);
220 PLInsertDictionaryEntry(database
->appDomain
, key
, object
);
226 WMRemoveUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
228 proplist_t key
= PLMakeString(defaultName
);
232 PLRemoveDictionaryEntry(database
->appDomain
, key
);
239 WMGetUDStringForKey(WMUserDefaults
*database
, char *defaultName
)
243 val
= WMGetUDObjectForKey(database
, defaultName
);
248 if (!PLIsString(val
))
251 return wstrdup(PLGetString(val
));
256 WMGetUDIntegerForKey(WMUserDefaults
*database
, char *defaultName
)
262 val
= WMGetUDObjectForKey(database
, defaultName
);
267 if (!PLIsString(val
))
270 str
= PLGetString(val
);
274 if (sscanf(str
, "%i", &value
)!=1)
283 WMGetUDFloatForKey(WMUserDefaults
*database
, char *defaultName
)
289 val
= WMGetUDObjectForKey(database
, defaultName
);
294 if (!PLIsString(val
))
297 str
= PLGetString(val
);
301 if (sscanf(str
, "%f", &value
)!=1)
310 WMGetUDBoolForKey(WMUserDefaults
*database
, char *defaultName
)
316 val
= WMGetUDObjectForKey(database
, defaultName
);
321 if (!PLIsString(val
))
324 str
= PLGetString(val
);
328 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
331 if (strcasecmp(str
, "YES")==0)
334 if (strcasecmp(str
, "Y")==0)
342 WMSetUDIntegerForKey(WMUserDefaults
*database
, int value
, char *defaultName
)
347 sprintf(buffer
, "%i", value
);
348 object
= PLMakeString(buffer
);
350 WMSetUDObjectForKey(database
, object
, defaultName
);
358 WMSetUDStringForKey(WMUserDefaults
*database
, char *value
, char *defaultName
)
362 object
= PLMakeString(value
);
364 WMSetUDObjectForKey(database
, object
, defaultName
);
371 WMSetUDFloatForKey(WMUserDefaults
*database
, float value
, char *defaultName
)
376 sprintf(buffer
, "%f", value
);
377 object
= PLMakeString(buffer
);
379 WMSetUDObjectForKey(database
, object
, defaultName
);
386 WMSetUDBoolForKey(WMUserDefaults
*database
, Bool value
, char *defaultName
)
388 static proplist_t yes
= NULL
, no
= NULL
;
391 yes
= PLMakeString("YES");
392 no
= PLMakeString("NO");
395 WMSetUDObjectForKey(database
, value
? yes
: no
, defaultName
);
400 WMGetUDSearchList(WMUserDefaults
*database
)
402 return database
->searchListArray
;
407 WMSetUDSearchList(WMUserDefaults
*database
, proplist_t list
)
411 if (database
->searchList
) {
413 while (database
->searchList
[i
]) {
414 PLRelease(database
->searchList
[i
]);
417 free(database
->searchList
);
419 if (database
->searchListArray
) {
420 PLRelease(database
->searchListArray
);
423 c
= PLGetNumberOfElements(list
);
424 database
->searchList
= wmalloc(sizeof(proplist_t
)*(c
+1));
426 for (i
=0; i
<c
; i
++) {
427 database
->searchList
[i
] = PLGetArrayElement(list
, i
);
430 database
->searchListArray
= PLDeepCopy(list
);