12 typedef struct W_UserDefaults
{
17 proplist_t searchListArray
;
18 proplist_t
*searchList
; /* cache for searchListArray */
25 static UserDefaults
*sharedUserDefaults
= NULL
;
27 extern char *WMGetApplicationName();
29 #define DEFAULTS_DIR "/Defaults"
39 gspath
= getenv("GNUSTEP_USER_ROOT");
41 gspath
= wexpandpath(gspath
);
42 pathlen
= strlen(gspath
) + 4;
43 path
= wmalloc(pathlen
);
47 pathlen
= strlen(wgethomedir()) + 10;
48 path
= wmalloc(pathlen
);
49 strcpy(path
, wgethomedir());
50 strcat(path
, "/GNUstep");
58 wdefaultspathfordomain(char *domain
)
63 gspath
= wusergnusteppath();
64 path
= wmalloc(strlen(gspath
)+strlen(DEFAULTS_DIR
)+strlen(domain
)+4);
67 strcat(path
, DEFAULTS_DIR
);
76 saveDefaultsChanges(void)
78 if (sharedUserDefaults
&& sharedUserDefaults
->dirty
) {
79 PLSave(sharedUserDefaults
->appDomain
, YES
);
85 WMGetStandardUserDefaults(void)
87 if (!sharedUserDefaults
) {
88 WMUserDefaults
*defaults
;
95 defaults
= wmalloc(sizeof(WMUserDefaults
));
96 memset(defaults
, 0, sizeof(WMUserDefaults
));
98 defaults
->defaults
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
100 defaults
->searchList
= wmalloc(sizeof(proplist_t
)*3);
102 /* application domain */
103 key
= PLMakeString(WMGetApplicationName());
104 defaults
->searchList
[0] = key
;
106 /* temporary kluge */
107 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
111 path
= wdefaultspathfordomain(PLGetString(key
));
113 domain
= PLGetProplistWithPath(path
);
118 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
120 p
= PLMakeString(path
);
121 PLSetFilename(domain
, p
);
128 defaults
->appDomain
= domain
;
131 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
136 key
= PLMakeString("WMGLOBAL");
137 defaults
->searchList
[1] = key
;
139 path
= wdefaultspathfordomain(PLGetString(key
));
141 domain
= PLGetProplistWithPath(path
);
146 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
149 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
154 defaults
->searchList
[2] = NULL
;
156 defaults
->searchListArray
=PLMakeArrayFromElements(NULL
,NULL
);
160 while (defaults
->searchList
[i
]) {
161 PLAppendArrayElement(defaults
->searchListArray
,
162 defaults
->searchList
[i
]);
166 sharedUserDefaults
= defaults
;
168 /* set to save changes in defaults when program is exited */
171 #if !defined(HAVE_ATEXIT) && defined(HAVE_ON_EXIT)
172 on_exit(saveDefaultsChanges
,0);
174 atexit(saveDefaultsChanges
);
178 return sharedUserDefaults
;
184 WMGetUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
186 proplist_t domainName
, domain
;
187 proplist_t object
= NULL
;
188 proplist_t key
= PLMakeString(defaultName
);
191 while (database
->searchList
[i
] && !object
) {
192 domainName
= database
->searchList
[i
];
193 domain
= PLGetDictionaryEntry(database
->defaults
, domainName
);
195 object
= PLGetDictionaryEntry(domain
, key
);
206 WMSetUDObjectForKey(WMUserDefaults
*database
, proplist_t object
,
209 proplist_t key
= PLMakeString(defaultName
);
213 PLInsertDictionaryEntry(database
->appDomain
, key
, object
);
219 WMRemoveUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
221 proplist_t key
= PLMakeString(defaultName
);
225 PLRemoveDictionaryEntry(database
->appDomain
, key
);
232 WMGetUDStringForKey(WMUserDefaults
*database
, char *defaultName
)
236 val
= WMGetUDObjectForKey(database
, defaultName
);
241 if (!PLIsString(val
))
244 return wstrdup(PLGetString(val
));
249 WMGetUDIntegerForKey(WMUserDefaults
*database
, char *defaultName
)
255 val
= WMGetUDObjectForKey(database
, defaultName
);
260 if (!PLIsString(val
))
263 str
= PLGetString(val
);
267 if (sscanf(str
, "%i", &value
)!=1)
276 WMGetUDFloatForKey(WMUserDefaults
*database
, char *defaultName
)
282 val
= WMGetUDObjectForKey(database
, defaultName
);
287 if (!PLIsString(val
))
290 str
= PLGetString(val
);
294 if (sscanf(str
, "%f", &value
)!=1)
303 WMGetUDBoolForKey(WMUserDefaults
*database
, char *defaultName
)
309 val
= WMGetUDObjectForKey(database
, defaultName
);
314 if (!PLIsString(val
))
317 str
= PLGetString(val
);
321 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
324 if (strcasecmp(str
, "YES")==0)
327 if (strcasecmp(str
, "Y")==0)
335 WMSetUDIntegerForKey(WMUserDefaults
*database
, int value
, char *defaultName
)
340 sprintf(buffer
, "%i", value
);
341 object
= PLMakeString(buffer
);
343 WMSetUDObjectForKey(database
, object
, defaultName
);
351 WMSetUDStringForKey(WMUserDefaults
*database
, char *value
, char *defaultName
)
355 object
= PLMakeString(value
);
357 WMSetUDObjectForKey(database
, object
, defaultName
);
364 WMSetUDFloatForKey(WMUserDefaults
*database
, float value
, char *defaultName
)
369 sprintf(buffer
, "%f", value
);
370 object
= PLMakeString(buffer
);
372 WMSetUDObjectForKey(database
, object
, defaultName
);
379 WMSetUDBoolForKey(WMUserDefaults
*database
, Bool value
, char *defaultName
)
381 static proplist_t yes
= NULL
, no
= NULL
;
384 yes
= PLMakeString("YES");
385 no
= PLMakeString("NO");
388 WMSetUDObjectForKey(database
, value
? yes
: no
, defaultName
);
393 WMGetUDSearchList(WMUserDefaults
*database
)
395 return database
->searchListArray
;
400 WMSetUDSearchList(WMUserDefaults
*database
, proplist_t list
)
404 if (database
->searchList
) {
406 while (database
->searchList
[i
]) {
407 PLRelease(database
->searchList
[i
]);
410 free(database
->searchList
);
412 if (database
->searchListArray
) {
413 PLRelease(database
->searchListArray
);
416 c
= PLGetNumberOfElements(list
);
417 database
->searchList
= wmalloc(sizeof(proplist_t
)*(c
+1));
419 for (i
=0; i
<c
; i
++) {
420 database
->searchList
[i
] = PLGetArrayElement(list
, i
);
423 database
->searchListArray
= PLDeepCopy(list
);