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 */
169 atexit(saveDefaultsChanges
);
172 return sharedUserDefaults
;
178 WMGetUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
180 proplist_t domainName
, domain
;
181 proplist_t object
= NULL
;
182 proplist_t key
= PLMakeString(defaultName
);
185 while (database
->searchList
[i
] && !object
) {
186 domainName
= database
->searchList
[i
];
187 domain
= PLGetDictionaryEntry(database
->defaults
, domainName
);
189 object
= PLGetDictionaryEntry(domain
, key
);
200 WMSetUDObjectForKey(WMUserDefaults
*database
, proplist_t object
,
203 proplist_t key
= PLMakeString(defaultName
);
207 PLInsertDictionaryEntry(database
->appDomain
, key
, object
);
213 WMRemoveUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
215 proplist_t key
= PLMakeString(defaultName
);
219 PLRemoveDictionaryEntry(database
->appDomain
, key
);
226 WMGetUDStringForKey(WMUserDefaults
*database
, char *defaultName
)
230 val
= WMGetUDObjectForKey(database
, defaultName
);
235 if (!PLIsString(val
))
238 return wstrdup(PLGetString(val
));
243 WMGetUDIntegerForKey(WMUserDefaults
*database
, char *defaultName
)
249 val
= WMGetUDObjectForKey(database
, defaultName
);
254 if (!PLIsString(val
))
257 str
= PLGetString(val
);
261 if (sscanf(str
, "%i", &value
)!=1)
270 WMGetUDFloatForKey(WMUserDefaults
*database
, char *defaultName
)
276 val
= WMGetUDObjectForKey(database
, defaultName
);
281 if (!PLIsString(val
))
284 str
= PLGetString(val
);
288 if (sscanf(str
, "%f", &value
)!=1)
297 WMGetUDBoolForKey(WMUserDefaults
*database
, char *defaultName
)
303 val
= WMGetUDObjectForKey(database
, defaultName
);
308 if (!PLIsString(val
))
311 str
= PLGetString(val
);
315 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
318 if (strcasecmp(str
, "YES")==0)
321 if (strcasecmp(str
, "Y")==0)
329 WMSetUDIntegerForKey(WMUserDefaults
*database
, int value
, char *defaultName
)
334 sprintf(buffer
, "%i", value
);
335 object
= PLMakeString(buffer
);
337 WMSetUDObjectForKey(database
, object
, defaultName
);
345 WMSetUDStringForKey(WMUserDefaults
*database
, char *value
, char *defaultName
)
349 object
= PLMakeString(value
);
351 WMSetUDObjectForKey(database
, object
, defaultName
);
358 WMSetUDFloatForKey(WMUserDefaults
*database
, float value
, char *defaultName
)
363 sprintf(buffer
, "%f", value
);
364 object
= PLMakeString(buffer
);
366 WMSetUDObjectForKey(database
, object
, defaultName
);
373 WMSetUDBoolForKey(WMUserDefaults
*database
, Bool value
, char *defaultName
)
375 static proplist_t yes
= NULL
, no
= NULL
;
378 yes
= PLMakeString("YES");
379 no
= PLMakeString("NO");
382 WMSetUDObjectForKey(database
, value
? yes
: no
, defaultName
);
387 WMGetUDSearchList(WMUserDefaults
*database
)
389 return database
->searchListArray
;
394 WMSetUDSearchList(WMUserDefaults
*database
, proplist_t list
)
398 if (database
->searchList
) {
400 while (database
->searchList
[i
]) {
401 PLRelease(database
->searchList
[i
]);
404 free(database
->searchList
);
406 if (database
->searchListArray
) {
407 PLRelease(database
->searchListArray
);
410 c
= PLGetNumberOfElements(list
);
411 database
->searchList
= wmalloc(sizeof(proplist_t
)*(c
+1));
413 for (i
=0; i
<c
; i
++) {
414 database
->searchList
[i
] = PLGetArrayElement(list
, i
);
417 database
->searchListArray
= PLDeepCopy(list
);