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"
38 static char *path
= NULL
;
43 gspath
= getenv("GNUSTEP_USER_ROOT");
45 gspath
= wexpandpath(gspath
);
46 pathlen
= strlen(gspath
) + 4;
47 path
= wmalloc(pathlen
);
51 pathlen
= strlen(wgethomedir()) + 10;
52 path
= wmalloc(pathlen
);
53 strcpy(path
, wgethomedir());
54 strcat(path
, "/GNUstep");
63 wdefaultspathfordomain(char *domain
)
68 gspath
= wusergnusteppath();
69 path
= wmalloc(strlen(gspath
)+strlen(DEFAULTS_DIR
)+strlen(domain
)+4);
71 strcat(path
, DEFAULTS_DIR
);
81 saveDefaultsChanges(int foo
, void *bar
)
83 saveDefaultsChanges(void)
86 if (sharedUserDefaults
&& sharedUserDefaults
->dirty
) {
87 PLSave(sharedUserDefaults
->appDomain
, YES
);
94 WMSynchronizeUserDefaults(WMUserDefaults
*database
)
96 /* TODO: check what it should really do */
97 PLSave(database
->appDomain
, YES
);
102 WMGetStandardUserDefaults(void)
104 if (!sharedUserDefaults
) {
105 WMUserDefaults
*defaults
;
112 defaults
= wmalloc(sizeof(WMUserDefaults
));
113 memset(defaults
, 0, sizeof(WMUserDefaults
));
115 defaults
->defaults
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
117 defaults
->searchList
= wmalloc(sizeof(proplist_t
)*3);
119 /* application domain */
120 key
= PLMakeString(WMGetApplicationName());
121 defaults
->searchList
[0] = key
;
123 /* temporary kluge */
124 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
128 path
= wdefaultspathfordomain(PLGetString(key
));
130 domain
= PLGetProplistWithPath(path
);
135 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
137 p
= PLMakeString(path
);
138 PLSetFilename(domain
, p
);
145 defaults
->appDomain
= domain
;
148 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
153 key
= PLMakeString("WMGLOBAL");
154 defaults
->searchList
[1] = key
;
156 path
= wdefaultspathfordomain(PLGetString(key
));
158 domain
= PLGetProplistWithPath(path
);
163 domain
= PLMakeDictionaryFromEntries(NULL
, NULL
, NULL
);
166 PLInsertDictionaryEntry(defaults
->defaults
, key
, domain
);
171 defaults
->searchList
[2] = NULL
;
173 defaults
->searchListArray
=PLMakeArrayFromElements(NULL
,NULL
);
177 while (defaults
->searchList
[i
]) {
178 PLAppendArrayElement(defaults
->searchListArray
,
179 defaults
->searchList
[i
]);
183 sharedUserDefaults
= defaults
;
185 /* set to save changes in defaults when program is exited */
189 on_exit(saveDefaultsChanges
, (void*)NULL
);
191 atexit(saveDefaultsChanges
);
195 return sharedUserDefaults
;
201 WMGetUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
203 proplist_t domainName
, domain
;
204 proplist_t object
= NULL
;
205 proplist_t key
= PLMakeString(defaultName
);
208 while (database
->searchList
[i
] && !object
) {
209 domainName
= database
->searchList
[i
];
210 domain
= PLGetDictionaryEntry(database
->defaults
, domainName
);
212 object
= PLGetDictionaryEntry(domain
, key
);
223 WMSetUDObjectForKey(WMUserDefaults
*database
, proplist_t object
,
226 proplist_t key
= PLMakeString(defaultName
);
230 PLInsertDictionaryEntry(database
->appDomain
, key
, object
);
236 WMRemoveUDObjectForKey(WMUserDefaults
*database
, char *defaultName
)
238 proplist_t key
= PLMakeString(defaultName
);
242 PLRemoveDictionaryEntry(database
->appDomain
, key
);
249 WMGetUDStringForKey(WMUserDefaults
*database
, char *defaultName
)
253 val
= WMGetUDObjectForKey(database
, defaultName
);
258 if (!PLIsString(val
))
261 return wstrdup(PLGetString(val
));
266 WMGetUDIntegerForKey(WMUserDefaults
*database
, char *defaultName
)
272 val
= WMGetUDObjectForKey(database
, defaultName
);
277 if (!PLIsString(val
))
280 str
= PLGetString(val
);
284 if (sscanf(str
, "%i", &value
)!=1)
293 WMGetUDFloatForKey(WMUserDefaults
*database
, char *defaultName
)
299 val
= WMGetUDObjectForKey(database
, defaultName
);
301 if (!val
|| !PLIsString(val
))
304 if (!(str
= PLGetString(val
)))
307 if (sscanf(str
, "%f", &value
)!=1)
316 WMGetUDBoolForKey(WMUserDefaults
*database
, char *defaultName
)
322 val
= WMGetUDObjectForKey(database
, defaultName
);
327 if (!PLIsString(val
))
330 str
= PLGetString(val
);
334 if (sscanf(str
, "%i", &value
)==1 && value
!=0)
337 if (strcasecmp(str
, "YES")==0)
340 if (strcasecmp(str
, "Y")==0)
348 WMSetUDIntegerForKey(WMUserDefaults
*database
, int value
, char *defaultName
)
353 sprintf(buffer
, "%i", value
);
354 object
= PLMakeString(buffer
);
356 WMSetUDObjectForKey(database
, object
, defaultName
);
364 WMSetUDStringForKey(WMUserDefaults
*database
, char *value
, char *defaultName
)
368 object
= PLMakeString(value
);
370 WMSetUDObjectForKey(database
, object
, defaultName
);
377 WMSetUDFloatForKey(WMUserDefaults
*database
, float value
, char *defaultName
)
382 sprintf(buffer
, "%f", value
);
383 object
= PLMakeString(buffer
);
385 WMSetUDObjectForKey(database
, object
, defaultName
);
392 WMSetUDBoolForKey(WMUserDefaults
*database
, Bool value
, char *defaultName
)
394 static proplist_t yes
= NULL
, no
= NULL
;
397 yes
= PLMakeString("YES");
398 no
= PLMakeString("NO");
401 WMSetUDObjectForKey(database
, value
? yes
: no
, defaultName
);
406 WMGetUDSearchList(WMUserDefaults
*database
)
408 return database
->searchListArray
;
413 WMSetUDSearchList(WMUserDefaults
*database
, proplist_t list
)
417 if (database
->searchList
) {
419 while (database
->searchList
[i
]) {
420 PLRelease(database
->searchList
[i
]);
423 free(database
->searchList
);
425 if (database
->searchListArray
) {
426 PLRelease(database
->searchListArray
);
429 c
= PLGetNumberOfElements(list
);
430 database
->searchList
= wmalloc(sizeof(proplist_t
)*(c
+1));
432 for (i
=0; i
<c
; i
++) {
433 database
->searchList
[i
] = PLGetArrayElement(list
, i
);
436 database
->searchListArray
= PLDeepCopy(list
);