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
);
79 saveDefaultsChanges(void)
81 if (sharedUserDefaults
&& sharedUserDefaults
->dirty
) {
82 PLSave(sharedUserDefaults
->appDomain
, YES
);
88 WMGetStandardUserDefaults(void)
90 if (!sharedUserDefaults
) {
91 WMUserDefaults
*defaults
;
98 defaults
= wmalloc(sizeof(WMUserDefaults
));
99 memset(defaults
, 0, sizeof(WMUserDefaults
));
101 defaults
->defaults
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
103 defaults
->searchList
= wmalloc(sizeof(proplist_t
)*3);
105 /* application domain */
106 key
= PLMakeString(WMGetApplicationName());
107 defaults
->searchList
[0] = key
;
109 /* temporary kluge */
110 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
114 path
= wdefaultspathfordomain(PLGetString(key
));
116 domain
= PLGetProplistWithPath(path
);
121 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
123 p
= PLMakeString(path
);
124 PLSetFilename(domain
, p
);
131 defaults
->appDomain
= domain
;
134 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
139 key
= PLMakeString("WMGLOBAL");
140 defaults
->searchList
[1] = key
;
142 path
= wdefaultspathfordomain(PLGetString(key
));
144 domain
= PLGetProplistWithPath(path
);
149 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
152 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
157 defaults
->searchList
[2] = NULL
;
159 defaults
->searchListArray
=PLMakeArrayFromElements(NULL
,NULL
);
163 while (defaults
->searchList
[i
]) {
164 PLAppendArrayElement(defaults
->searchListArray
,
165 defaults
->searchList
[i
]);
169 sharedUserDefaults
= defaults
;
171 /* set to save changes in defaults when program is exited */
175 on_exit(saveDefaultsChanges
,0);
177 atexit(saveDefaultsChanges
);
181 return sharedUserDefaults
;
187 WMGetUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
189 proplist_t domainName
, domain
;
190 proplist_t object
= NULL
;
191 proplist_t key
= PLMakeString(defaultName
);
194 while (database
->searchList
[i
] && !object
) {
195 domainName
= database
->searchList
[i
];
196 domain
= PLGetDictionaryEntry(database
->defaults
, domainName
);
198 object
= PLGetDictionaryEntry(domain
, key
);
209 WMSetUDObjectForKey(WMUserDefaults
*database
, proplist_t object
,
212 proplist_t key
= PLMakeString(defaultName
);
216 PLInsertDictionaryEntry(database
->appDomain
, key
, object
);
222 WMRemoveUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
224 proplist_t key
= PLMakeString(defaultName
);
228 PLRemoveDictionaryEntry(database
->appDomain
, key
);
235 WMGetUDStringForKey(WMUserDefaults
*database
, char *defaultName
)
239 val
= WMGetUDObjectForKey(database
, defaultName
);
244 if (!PLIsString(val
))
247 return wstrdup(PLGetString(val
));
252 WMGetUDIntegerForKey(WMUserDefaults
*database
, char *defaultName
)
258 val
= WMGetUDObjectForKey(database
, defaultName
);
263 if (!PLIsString(val
))
266 str
= PLGetString(val
);
270 if (sscanf(str
, "%i", &value
)!=1)
279 WMGetUDFloatForKey(WMUserDefaults
*database
, char *defaultName
)
285 val
= WMGetUDObjectForKey(database
, defaultName
);
290 if (!PLIsString(val
))
293 str
= PLGetString(val
);
297 if (sscanf(str
, "%f", &value
)!=1)
306 WMGetUDBoolForKey(WMUserDefaults
*database
, char *defaultName
)
312 val
= WMGetUDObjectForKey(database
, defaultName
);
317 if (!PLIsString(val
))
320 str
= PLGetString(val
);
324 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
327 if (strcasecmp(str
, "YES")==0)
330 if (strcasecmp(str
, "Y")==0)
338 WMSetUDIntegerForKey(WMUserDefaults
*database
, int value
, char *defaultName
)
343 sprintf(buffer
, "%i", value
);
344 object
= PLMakeString(buffer
);
346 WMSetUDObjectForKey(database
, object
, defaultName
);
354 WMSetUDStringForKey(WMUserDefaults
*database
, char *value
, char *defaultName
)
358 object
= PLMakeString(value
);
360 WMSetUDObjectForKey(database
, object
, defaultName
);
367 WMSetUDFloatForKey(WMUserDefaults
*database
, float value
, char *defaultName
)
372 sprintf(buffer
, "%f", value
);
373 object
= PLMakeString(buffer
);
375 WMSetUDObjectForKey(database
, object
, defaultName
);
382 WMSetUDBoolForKey(WMUserDefaults
*database
, Bool value
, char *defaultName
)
384 static proplist_t yes
= NULL
, no
= NULL
;
387 yes
= PLMakeString("YES");
388 no
= PLMakeString("NO");
391 WMSetUDObjectForKey(database
, value
? yes
: no
, defaultName
);
396 WMGetUDSearchList(WMUserDefaults
*database
)
398 return database
->searchListArray
;
403 WMSetUDSearchList(WMUserDefaults
*database
, proplist_t list
)
407 if (database
->searchList
) {
409 while (database
->searchList
[i
]) {
410 PLRelease(database
->searchList
[i
]);
413 free(database
->searchList
);
415 if (database
->searchListArray
) {
416 PLRelease(database
->searchListArray
);
419 c
= PLGetNumberOfElements(list
);
420 database
->searchList
= wmalloc(sizeof(proplist_t
)*(c
+1));
422 for (i
=0; i
<c
; i
++) {
423 database
->searchList
[i
] = PLGetArrayElement(list
, i
);
426 database
->searchListArray
= PLDeepCopy(list
);