2
This file is part of darktable,
3
copyright (c) 2009--2010 johannes hanika.
5
darktable is free software: you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
10
darktable is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
15
You should have received a copy of the GNU General Public License
16
along with darktable. If not, see <http://www.gnu.org/licenses/>.
18
#ifndef DT_USER_CONFIG_H
19
#define DT_USER_CONFIG_H
28
#include "common/darktable.h"
31
#include <gconf/gconf-client.h>
32
#define DT_GCONF_DIR "/apps/darktable"
35
// silly gconf replacement for mac. very sucky altogether.
37
#define DT_CONF_MAX_VARS 512
38
#define DT_CONF_MAX_VAR_BUF 512
40
typedef struct dt_conf_t
46
dt_pthread_mutex_t mutex;
48
char varname[DT_CONF_MAX_VARS][DT_CONF_MAX_VAR_BUF];
49
char varval [DT_CONF_MAX_VARS][DT_CONF_MAX_VAR_BUF];
55
/** return slot for this variable or newly allocated slot. */
56
static inline int dt_conf_get_var_pos(const char *name)
58
for(int i=0; i<darktable.conf->num; i++)
60
if(!strncmp(name, darktable.conf->varname[i], DT_CONF_MAX_VAR_BUF)) return i;
62
int num = darktable.conf->num++;
63
snprintf(darktable.conf->varname[num], DT_CONF_MAX_VAR_BUF, "%s", name);
64
memset(darktable.conf->varval[num], 0, DT_CONF_MAX_VAR_BUF);
69
static inline void dt_conf_set_int(const char *name, int val)
73
snprintf(var, 1024, "%s/%s", DT_GCONF_DIR, name);
74
gconf_client_set_int (darktable.conf->gconf, var, val, NULL);
76
dt_pthread_mutex_lock(&darktable.conf->mutex);
77
const int num = dt_conf_get_var_pos(name);
78
snprintf(darktable.conf->varval[num], DT_CONF_MAX_VAR_BUF, "%d", val);
79
dt_pthread_mutex_unlock(&darktable.conf->mutex);
83
static inline void dt_conf_set_float(const char *name, float val)
87
snprintf(var, 1024, "%s/%s", DT_GCONF_DIR, name);
88
gconf_client_set_float (darktable.conf->gconf, var, val, NULL);
90
dt_pthread_mutex_lock(&darktable.conf->mutex);
91
const int num = dt_conf_get_var_pos(name);
92
snprintf(darktable.conf->varval[num], DT_CONF_MAX_VAR_BUF, "%f", val);
93
dt_pthread_mutex_unlock(&darktable.conf->mutex);
97
static inline void dt_conf_set_bool(const char *name, int val)
101
snprintf(var, 1024, "%s/%s", DT_GCONF_DIR, name);
102
gconf_client_set_bool (darktable.conf->gconf, var, val, NULL);
104
dt_pthread_mutex_lock(&darktable.conf->mutex);
105
const int num = dt_conf_get_var_pos(name);
106
snprintf(darktable.conf->varval[num], DT_CONF_MAX_VAR_BUF, "%s", val ? "TRUE" : "FALSE");
107
dt_pthread_mutex_unlock(&darktable.conf->mutex);
111
static inline void dt_conf_set_string(const char *name, const char *val)
115
snprintf(var, 1024, "%s/%s", DT_GCONF_DIR, name);
116
gconf_client_set_string (darktable.conf->gconf, var, val, NULL);
118
dt_pthread_mutex_lock(&darktable.conf->mutex);
119
const int num = dt_conf_get_var_pos(name);
120
snprintf(darktable.conf->varval[num], DT_CONF_MAX_VAR_BUF, "%s", val);
121
dt_pthread_mutex_unlock(&darktable.conf->mutex);
125
static inline int dt_conf_get_int(const char *name)
129
snprintf(var, 1024, "%s/%s", DT_GCONF_DIR, name);
130
return gconf_client_get_int (darktable.conf->gconf, var, NULL);
132
dt_pthread_mutex_lock(&darktable.conf->mutex);
133
const int num = dt_conf_get_var_pos(name);
134
const int val = atol(darktable.conf->varval[num]);
135
dt_pthread_mutex_unlock(&darktable.conf->mutex);
140
static inline float dt_conf_get_float(const char *name)
144
snprintf(var, 1024, "%s/%s", DT_GCONF_DIR, name);
145
return gconf_client_get_float (darktable.conf->gconf, var, NULL);
147
dt_pthread_mutex_lock(&darktable.conf->mutex);
148
const int num = dt_conf_get_var_pos(name);
149
const float val = atof(darktable.conf->varval[num]);
150
dt_pthread_mutex_unlock(&darktable.conf->mutex);
155
static inline int dt_conf_get_bool(const char *name)
159
snprintf(var, 1024, "%s/%s", DT_GCONF_DIR, name);
160
return gconf_client_get_bool (darktable.conf->gconf, var, NULL);
162
dt_pthread_mutex_lock(&darktable.conf->mutex);
163
const int num = dt_conf_get_var_pos(name);
164
const int val = darktable.conf->varval[num][0] == 'T';
165
dt_pthread_mutex_unlock(&darktable.conf->mutex);
170
static inline gchar *dt_conf_get_string(const char *name)
174
snprintf(var, 1024, "%s/%s", DT_GCONF_DIR, name);
175
return gconf_client_get_string (darktable.conf->gconf, var, NULL);
177
dt_pthread_mutex_lock(&darktable.conf->mutex);
178
const int num = dt_conf_get_var_pos(name);
179
dt_pthread_mutex_unlock(&darktable.conf->mutex);
180
return g_strdup(darktable.conf->varval[num]);
184
typedef struct dt_conf_string_entry_t
188
} dt_conf_string_entry_t;
190
/** get all strings in */
191
static inline GSList *dt_conf_all_string_entries (const char *dir)
193
GSList *result = NULL;
197
snprintf (var, 1024, "%s/%s", DT_GCONF_DIR, dir);
198
GSList *slist = gconf_client_all_entries (darktable.conf->gconf, var, NULL);
203
GConfEntry *entry = (GConfEntry *)item->data;
204
dt_conf_string_entry_t *nv = (dt_conf_string_entry_t*)g_malloc (sizeof(dt_conf_string_entry_t));
206
/* get the key name from path/key */
207
gchar *p=entry->key+strlen (entry->key);
209
nv->key = g_strdup (++p);
211
/* get the value from gconf entry */
212
nv->value = g_strdup (gconf_value_get_string (entry->value));
213
if (nv->key && nv->value)
214
result = g_slist_append (result,nv);
222
while ((item=g_slist_next (item))!=NULL);
225
dt_pthread_mutex_lock(&darktable.conf->mutex);
226
for (int i=0; i<DT_CONF_MAX_VARS; i++)
228
if (strcmp(darktable.conf->varname[i],dir)==0)
230
dt_conf_string_entry_t *nv = (dt_conf_string_entry_t*)g_malloc (sizeof(dt_conf_string_entry_t));
231
gchar *key = g_strdup (darktable.conf->varname[i]);
233
/* get the key name from path/key */
234
gchar *p = key+strlen (key);
236
nv->key = g_strdup (++p);
239
nv->value = g_strdup(darktable.conf->varval[i]);
241
result = g_slist_append (result,nv);
244
dt_pthread_mutex_unlock(&darktable.conf->mutex);
250
static inline void dt_conf_init(dt_conf_t *cf, const char *filename)
254
cf->gconf = gconf_client_get_default();
257
memset(cf->varname,0, DT_CONF_MAX_VARS*DT_CONF_MAX_VAR_BUF);
258
memset(cf->varval, 0, DT_CONF_MAX_VARS*DT_CONF_MAX_VAR_BUF);
259
dt_pthread_mutex_init(&darktable.conf->mutex, NULL);
260
snprintf(darktable.conf->filename, 1024, "%s", filename);
261
darktable.conf->num = 0;
262
FILE *f = fopen(filename, "rb");
267
char buf[1024], defaultrc[1024];
268
dt_get_datadir(buf, 1024);
269
snprintf(defaultrc, 1024, "%s/darktablerc", buf);
270
f = fopen(defaultrc, "rb");
275
read = fscanf(f, "%[^\n]\n", line);
277
while(*c != '=' && c < line + strlen(line)) c++;
281
dt_conf_set_string(line, c+1);
289
static inline void dt_conf_cleanup(dt_conf_t *cf)
292
g_object_unref(cf->gconf);
294
FILE *f = fopen(cf->filename, "wb");
296
for(int i=0; i<cf->num; i++)
298
fprintf(f, "%s=%s\n", cf->varname[i], cf->varval[i]);
301
dt_pthread_mutex_destroy(&darktable.conf->mutex);
305
/** check if key exists, return 1 if lookup successed, 0 if failed..*/
306
static inline int dt_conf_key_exists (const char *key)
311
GConfValue *value = gconf_client_get (darktable.conf->gconf,key,&error);
312
if( value != NULL && error == NULL ) res = 1;
314
/* lookup in stringtable for match of key name */
315
dt_pthread_mutex_lock (&darktable.conf->mutex);
316
for (int i=0; i<darktable.conf->num; i++)
318
if (!strncmp (key, darktable.conf->varname[i], DT_CONF_MAX_VAR_BUF))
324
dt_pthread_mutex_unlock (&darktable.conf->mutex);