Author: abrander Date: 2010-05-26 13:56:06 +0200 (Wed, 26 May 2010) New Revision: 3372
Added: trunk/librawstudio/conf_interface.c trunk/librawstudio/conf_interface.h Log: Missing from revision 3371. Copied: trunk/librawstudio/conf_interface.c (from rev 3370, trunk/src/conf_interface.c) =================================================================== --- trunk/librawstudio/conf_interface.c (rev 0) +++ trunk/librawstudio/conf_interface.c 2010-05-26 11:56:06 UTC (rev 3372) @@ -0,0 +1,512 @@ +/* + * * Copyright (C) 2006-2010 Anders Brander <[email protected]>, + * * Anders Kvist <[email protected]> and Klaus Post <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <glib.h> +#include <stdio.h> +#include "conf_interface.h" + +#ifdef G_OS_WIN32 + #define WITH_REGISTRY + #undef WITH_GCONF +#endif + +#ifdef WITH_GCONF + #include <gconf/gconf-client.h> + #define GCONF_PATH "/apps/rawstudio/" +#else + #ifdef G_OS_WIN32 + #include <windows.h> + #define WITH_REGISTRY + #define REGISTRY_KEY "Software\\Rawstudio" + #endif +#endif + +gboolean +rs_conf_get_boolean(const gchar *name, gboolean *boolean_value) +{ + gboolean ret = FALSE; +#ifdef WITH_GCONF + GConfValue *gvalue; + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + if (client) + { + g_static_mutex_lock(&lock); + gvalue = gconf_client_get(client, fullname->str, NULL); + g_static_mutex_unlock(&lock); + if (gvalue) + { + if (gvalue->type == GCONF_VALUE_BOOL) + { + ret = TRUE; + if (boolean_value) + *boolean_value = gconf_value_get_bool(gvalue); + } + gconf_value_free(gvalue); + } + g_object_unref(client); + } + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + ret = rs_conf_get_integer(name, boolean_value); +#endif + return(ret); +} + +gboolean +rs_conf_get_boolean_with_default(const gchar *name, gboolean *boolean_value, gboolean default_value) +{ + gboolean ret = FALSE; + if (boolean_value) + *boolean_value = default_value; +#ifdef WITH_GCONF + GConfValue *gvalue; + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + if (client) + { + g_static_mutex_lock(&lock); + gvalue = gconf_client_get(client, fullname->str, NULL); + g_static_mutex_unlock(&lock); + if (gvalue) + { + if (gvalue->type == GCONF_VALUE_BOOL) + { + ret = TRUE; + if (boolean_value) + *boolean_value = gconf_value_get_bool(gvalue); + } + gconf_value_free(gvalue); + } + g_object_unref(client); + } + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + ret = rs_conf_get_integer(name, boolean_value); +#endif + return(ret); +} + +gboolean +rs_conf_set_boolean(const gchar *name, gboolean bool_value) +{ + gboolean ret = FALSE; +#ifdef WITH_GCONF + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + g_static_mutex_lock(&lock); + if (client) + { + ret = gconf_client_set_bool(client, fullname->str, bool_value, NULL); + g_object_unref(client); + } + g_static_mutex_unlock(&lock); + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + ret = rs_conf_set_integer(name, bool_value); +#endif + return(ret); +} + +gchar * +rs_conf_get_string(const gchar *name) +{ + gchar *ret=NULL; +#ifdef WITH_GCONF + GConfValue *gvalue; + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + if (client) + { + g_static_mutex_lock(&lock); + gvalue = gconf_client_get(client, fullname->str, NULL); + g_static_mutex_unlock(&lock); + if (gvalue) + { + if (gvalue->type == GCONF_VALUE_STRING) + ret = g_strdup(gconf_value_get_string(gvalue)); + gconf_value_free(gvalue); + } + g_object_unref(client); + } + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + HKEY hKey; + char *szLwd; + DWORD dwBufLen; + LONG lRet; + + if (RegOpenKeyEx( HKEY_CURRENT_USER, REGISTRY_KEY, 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS) + { + lRet = RegQueryValueEx( hKey, name, NULL, NULL, NULL, &dwBufLen); + if (dwBufLen > 0) + { + szLwd = g_malloc(dwBufLen); + lRet = RegQueryValueEx( hKey, name, NULL, NULL, (LPBYTE) szLwd, &dwBufLen); + RegCloseKey( hKey ); + if (lRet == ERROR_SUCCESS) + ret = szLwd; + else + g_free(szLwd); + } + } +#endif + return(ret); +} + +gboolean +rs_conf_set_string(const gchar *name, const gchar *string_value) +{ + gboolean ret = FALSE; +#ifdef WITH_GCONF + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + if (client) + { + g_static_mutex_lock(&lock); + ret = gconf_client_set_string(client, fullname->str, string_value, NULL); + g_static_mutex_unlock(&lock); + g_object_unref(client); + } + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + HKEY hKey; + + if (RegCreateKeyEx(HKEY_CURRENT_USER, REGISTRY_KEY, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) + { + if (RegSetValueEx(hKey, name, 0, REG_SZ, (LPBYTE) string_value, (DWORD) (lstrlen(string_value)+1))==ERROR_SUCCESS) + ret = TRUE; + } + RegCloseKey(hKey); +#endif + return ret; +} + +gboolean +rs_conf_get_integer(const gchar *name, gint *integer_value) +{ + gboolean ret=FALSE; +#ifdef WITH_GCONF + GConfValue *gvalue; + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + if (client) + { + g_static_mutex_lock(&lock); + gvalue = gconf_client_get(client, fullname->str, NULL); + g_static_mutex_unlock(&lock); + if (gvalue) + { + if (gvalue->type == GCONF_VALUE_INT) + { + ret = TRUE; + *integer_value = gconf_value_get_int(gvalue); + } + gconf_value_free(gvalue); + } + g_object_unref(client); + } + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + HKEY hKey; + DWORD dwBufLen; + LONG lRet; + + if (RegOpenKeyEx( HKEY_CURRENT_USER, REGISTRY_KEY, 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS) + { + lRet = RegQueryValueEx( hKey, name, NULL, NULL, NULL, &dwBufLen); + if (dwBufLen > 0) + { + gint val; + DWORD size = sizeof(gint); + lRet = RegQueryValueEx( hKey, name, NULL, NULL, (LPBYTE) &val, &size); + RegCloseKey( hKey ); + if ((lRet == ERROR_SUCCESS) && (size == sizeof(gint))) + { + ret = TRUE; + *integer_value = val; + } + } + } +#endif + return(ret); +} + +gboolean +rs_conf_set_integer(const gchar *name, const gint integer_value) +{ + gboolean ret = FALSE; +#ifdef WITH_GCONF + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + g_static_mutex_lock(&lock); + if (client) + { + ret = gconf_client_set_int(client, fullname->str, integer_value, NULL); + g_object_unref(client); + } + g_static_mutex_unlock(&lock); + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + HKEY hKey; + + if (RegCreateKeyEx(HKEY_CURRENT_USER, REGISTRY_KEY, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) + { + if (RegSetValueEx(hKey, name, 0, REG_DWORD, (LPBYTE) &integer_value, sizeof(gint))==ERROR_SUCCESS) + ret = TRUE; + } + RegCloseKey(hKey); +#endif + return(ret); +} + +gboolean +rs_conf_get_color(const gchar *name, GdkColor *color) +{ + gchar *str; + gboolean ret = FALSE; + + str = rs_conf_get_string(name); + if (str) + { + ret = gdk_color_parse(str, color); + g_free(str); + } + return(ret); +} + +gboolean +rs_conf_set_color(const gchar *name, GdkColor *color) +{ + gchar *str; + gboolean ret = FALSE; + + str = g_strdup_printf ("#%02x%02x%02x", color->red>>8, color->green>>8, color->blue>>8); + if (str) + { + ret = rs_conf_set_string(name, str); + g_free(str); + } + return(ret); +} + +gboolean +rs_conf_get_double(const gchar *name, gdouble *float_value) +{ + gboolean ret=FALSE; +#ifdef WITH_GCONF + GConfValue *gvalue; + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + if (client) + { + g_static_mutex_lock(&lock); + gvalue = gconf_client_get(client, fullname->str, NULL); + g_static_mutex_unlock(&lock); + if (gvalue) + { + if (gvalue->type == GCONF_VALUE_FLOAT) + { + ret = TRUE; + *float_value = gconf_value_get_float(gvalue); + } + gconf_value_free(gvalue); + } + g_object_unref(client); + } + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + HKEY hKey; + DWORD dwBufLen; + LONG lRet; + + if (RegOpenKeyEx( HKEY_CURRENT_USER, REGISTRY_KEY, 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS) + { + lRet = RegQueryValueEx( hKey, name, NULL, NULL, NULL, &dwBufLen); + if (dwBufLen > 0) + { + gdouble val; + DWORD size = sizeof(gdouble); + lRet = RegQueryValueEx( hKey, name, NULL, NULL, (LPBYTE) &val, &size); + RegCloseKey( hKey ); + if ((lRet == ERROR_SUCCESS) && (size == sizeof(gdouble))) + { + ret = TRUE; + *float_value = val; + } + } + } +#endif + return(ret); +} + +gboolean +rs_conf_set_double(const gchar *name, const gdouble float_value) +{ + gboolean ret = FALSE; +#ifdef WITH_GCONF + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + g_static_mutex_lock(&lock); + if (client) + { + ret = gconf_client_set_float(client, fullname->str, float_value, NULL); + g_object_unref(client); + } + g_static_mutex_unlock(&lock); + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + HKEY hKey; + + if (RegCreateKeyEx(HKEY_CURRENT_USER, REGISTRY_KEY, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) + { + if (RegSetValueEx(hKey, name, 0, REG_BINARY, (LPBYTE) &float_value, sizeof(gdouble))==ERROR_SUCCESS) + ret = TRUE; + } + RegCloseKey(hKey); +#endif + return(ret); +} + +GSList * +rs_conf_get_list_string(const gchar *name) +{ + GSList *list = NULL; +#ifdef WITH_GCONF + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + + g_string_append(fullname, name); + g_static_mutex_lock(&lock); + if (client) + { + list = gconf_client_get_list(client, fullname->str, GCONF_VALUE_STRING, NULL); + g_object_unref(client); + } + g_static_mutex_unlock(&lock); + g_string_free(fullname, TRUE); +#else + /* FIXME: windows stub */ +#endif + return list; +} + +gboolean +rs_conf_set_list_string(const gchar *name, GSList *list) +{ + gboolean ret = FALSE; +#ifdef WITH_GCONF + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + + g_string_append(fullname, name); + g_static_mutex_lock(&lock); + if (client) + { + ret = gconf_client_set_list(client, fullname->str, GCONF_VALUE_STRING, list, NULL); + g_object_unref(client); + } + g_static_mutex_unlock(&lock); + g_string_free(fullname, TRUE); +#else + /* FIXME: windows stub */ +#endif + return(ret); +} + +gboolean +rs_conf_add_string_to_list_string(const gchar *name, gchar *value) +{ + gboolean ret = FALSE; + + GSList *newlist = NULL; + GSList *oldlist = rs_conf_get_list_string(name); + + while (oldlist) + { + newlist = g_slist_append(newlist, oldlist->data); + oldlist = oldlist->next; + } + + newlist = g_slist_append(newlist, value); + ret = rs_conf_set_list_string(name, newlist); + + return(ret); +} + +gchar * +rs_conf_get_nth_string_from_list_string(const gchar *name, gint num) +{ + GSList *list = rs_conf_get_list_string(name); + gint i; + gchar *value = NULL; + + if (list) + { + for (i = 0; i < num; i++) + list = list->next; + if (list) + value = (gchar *) list->data; + else + value = NULL; + } + return value; +} + +gboolean +rs_conf_unset(const gchar *name) +{ + gboolean ret = FALSE; +#ifdef WITH_GCONF + GConfClient *client = gconf_client_get_default(); + GString *fullname = g_string_new(GCONF_PATH); + g_string_append(fullname, name); + if (client) + { + g_static_mutex_lock(&lock); + ret = gconf_client_unset(client, fullname->str, NULL); + g_static_mutex_unlock(&lock); + g_object_unref(client); + } + g_string_free(fullname, TRUE); +#endif +#ifdef WITH_REGISTRY + /* FIXME: windows stub */ +#endif + return ret; +} Copied: trunk/librawstudio/conf_interface.h (from rev 3370, trunk/src/conf_interface.h) =================================================================== --- trunk/librawstudio/conf_interface.h (rev 0) +++ trunk/librawstudio/conf_interface.h 2010-05-26 11:56:06 UTC (rev 3372) @@ -0,0 +1,117 @@ +/* + * * Copyright (C) 2006-2010 Anders Brander <[email protected]>, + * * Anders Kvist <[email protected]> and Klaus Post <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define CONF_LWD "last_working_directory" +#define CONF_PREBGCOLOR "preview_background_color" +#define CONF_HISTHEIGHT "histogram_height" +#define CONF_PASTE_MASK "paste_mask" +#define CONF_DEFAULT_EXPORT_TEMPLATE "default_export_template" +#define CONF_CACHEDIR_IS_LOCAL "cache_in_home" +#define CONF_LOAD_GDK "open_8bit_images" +#define CONF_LOAD_RECURSIVE "load_recursive" +#define CONF_PRELOAD "preload_photos" +#define CONF_SAVE_FILETYPE "save_filetype" +#define CONF_BATCH_DIRECTORY "batch_directory" +#define CONF_BATCH_FILENAME "batch_filename" +#define CONF_BATCH_FILETYPE "batch_filetype" +#define CONF_BATCH_WIDTH "batch_width" +#define CONF_BATCH_HEIGHT "batch_height" +#define CONF_BATCH_JPEG_QUALITY "batch_jpeg_quality" +#define CONF_BATCH_TIFF_UNCOMPRESSED "batch_tiff_uncompressed" +#define CONF_BATCH_SIZE_LOCK "batch_size_lock" +#define CONF_BATCH_SIZE_WIDTH "batch_size_width" +#define CONF_BATCH_SIZE_HEIGHT "batch_size_height" +#define CONF_BATCH_SIZE_SCALE "batch_size_scale" +#define CONF_ROI_GRID "roi_grid" +#define CONF_CROP_ASPECT "crop_aspect" +#define CONF_SHOW_FILENAMES "show_filenames_in_iconview" +#define CONF_USE_SYSTEM_THEME "use_system_theme" +#define CONF_FULLSCREEN "fullscreen" +#define CONF_SHOW_TOOLBOX_FULLSCREEN "show_toolbox_fullscreen" +#define CONF_SHOW_TOOLBOX "show_toolbox" +#define CONF_SHOW_ICONBOX_FULLSCREEN "show_iconbox_fullscreen" +#define CONF_SHOW_ICONBOX "show_iconbox" +#define CONF_SHOW_TOOLBOX_EXPOSURE "show_toolbox_exposure" +#define CONF_SHOW_TOOLBOX_SATURATION "show_toolbox_saturation" +#define CONF_SHOW_TOOLBOX_HUE "show_toolbox_hue" +#define CONF_SHOW_TOOLBOX_CONTRAST "show_toolbox_contrast" +#define CONF_SHOW_TOOLBOX_WARMTH "show_toolbox_warmth" +#define CONF_SHOW_TOOLBOX_SHARPEN "show_toolbox_sharpen" +#define CONF_SHOW_TOOLBOX_DENOISE_LUMA "show_toolbox_denoise_luma" +#define CONF_SHOW_TOOLBOX_DENOISE_CHROMA "show_toolbox_denoise_chroma" +#define CONF_SHOW_TOOLBOX_CURVE "show_toolbox_curve" +#define CONF_SHOW_TOOLBOX_TRANSFORM "show_toolbox_transform" +#define CONF_SHOW_TOOLBOX_HIST "show_toolbox_hist" +#define CONF_TOOLBOX_WIDTH "toolbox_width" +#define CONF_SPLIT_CONTINUOUS "split_continuous" +#define CONF_LAST_PRIORITY_PAGE "last_priority_page" +#define CONF_STORE_SORT_METHOD "store_sort_method" +#define CONF_LIBRARY_AUTOTAG "library_autotag" +#define CONF_LIBRARY_TAG_SEARCH "library_tag_search" +#define CONF_EXPORT_AS_FOLDER "export_as_folder" +#define CONF_EXPORT_AS_SIZE_PERCENT "export_as_size_percent" + +#define DEFAULT_CONF_EXPORT_FILENAME "%f_%2c" +#define DEFAULT_CONF_BATCH_DIRECTORY "batch_exports/" +#define DEFAULT_CONF_BATCH_FILENAME "%f_%2c" +#define DEFAULT_CONF_BATCH_FILETYPE "jpeg" +#define DEFAULT_CONF_BATCH_JPEG_QUALITY "100" +#define DEFAULT_CONF_FULLSCREEN FALSE +#define DEFAULT_CONF_SHOW_TOOLBOX_FULLSCREEN TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX TRUE +#define DEFAULT_CONF_SHOW_ICONBOX_FULLSCREEN FALSE +#define DEFAULT_CONF_SHOW_ICONBOX TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_EXPOSURE TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_SATURATION TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_HUE TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_CONTRAST TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_WARMTH TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_SHARPEN TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_DENOISE_LUMA TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_DENOISE_CHROMA TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_CURVE TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_TRANSFORM TRUE +#define DEFAULT_CONF_SHOW_TOOLBOX_HIST TRUE +#define DEFAULT_CONF_LOAD_RECURSIVE FALSE +#define DEFAULT_CONF_USE_SYSTEM_THEME FALSE +#define DEFAULT_CONF_SHOW_FILENAMES FALSE +#define DEFAULT_CONF_LIBRARY_AUTOTAG FALSE + +/* get the last working directory from gconf */ +void rs_set_last_working_directory(const char *lwd); + +/* save the current working directory to gconf */ +gchar *rs_get_last_working_directory(void); + +gboolean rs_conf_get_boolean(const gchar *name, gboolean *boolean_value); +gboolean rs_conf_get_boolean_with_default(const gchar *name, gboolean *boolean_value, gboolean default_value); +gboolean rs_conf_set_boolean(const gchar *name, gboolean bool_value); +gchar *rs_conf_get_string(const gchar *path); +gboolean rs_conf_set_string(const gchar *path, const gchar *string); +gboolean rs_conf_get_integer(const gchar *name, gint *integer_value); +gboolean rs_conf_set_integer(const gchar *name, const gint integer_value); +gboolean rs_conf_get_color(const gchar *name, GdkColor *color); +gboolean rs_conf_set_color(const gchar *name, GdkColor *color); +gboolean rs_conf_get_double(const gchar *name, gdouble *float_value); +gboolean rs_conf_set_double(const gchar *name, const gdouble float_value); +GSList *rs_conf_get_list_string(const gchar *name); +gboolean rs_conf_set_list_string(const gchar *name, GSList *list); +gboolean rs_conf_add_string_to_list_string(const gchar *name, gchar *value); +gchar *rs_conf_get_nth_string_from_list_string(const gchar *name, gint num); +gboolean rs_conf_unset(const gchar *name); _______________________________________________ Rawstudio-commit mailing list [email protected] http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit
