GSettings: only load backend when installed

The preferences backend can't work from the source environment because
it's schemas won't be compiled. This situation is only relevant for testing,
which is done from the source (or build) tree.
Note that a few preferences are needed by the xml backend. If no preferences
backend is loaded, some sane defaults will be used instead. Again this should
only matter for testing, in which case the real preferences are not relevant
anyway.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@23473 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Geert Janssens
2013-12-02 16:05:32 +00:00
parent b50ca70f50
commit 31c7396e15
5 changed files with 112 additions and 77 deletions

View File

@@ -533,28 +533,39 @@ gnc_gsettings_reset_schema (const gchar *schema)
void gnc_gsettings_load_backend (void)
{
ENTER("");
prefsbackend.register_cb = gnc_gsettings_register_cb;
prefsbackend.remove_cb_by_func = gnc_gsettings_remove_cb_by_func;
prefsbackend.remove_cb_by_id = gnc_gsettings_remove_cb_by_id;
prefsbackend.register_group_cb = gnc_gsettings_register_any_cb;
prefsbackend.remove_group_cb_by_func = gnc_gsettings_remove_any_cb_by_func;
prefsbackend.bind = gnc_gsettings_bind;
prefsbackend.get_bool = gnc_gsettings_get_bool;
prefsbackend.get_int = gnc_gsettings_get_int;
prefsbackend.get_float = gnc_gsettings_get_float;
prefsbackend.get_string = gnc_gsettings_get_string;
prefsbackend.get_enum = gnc_gsettings_get_enum;
prefsbackend.get_value = gnc_gsettings_get_value;
prefsbackend.set_bool = gnc_gsettings_set_bool;
prefsbackend.set_int = gnc_gsettings_set_int;
prefsbackend.set_float = gnc_gsettings_set_float;
prefsbackend.set_string = gnc_gsettings_set_string;
prefsbackend.set_enum = gnc_gsettings_set_enum;
prefsbackend.set_value = gnc_gsettings_set_value;
prefsbackend.reset = gnc_gsettings_reset;
prefsbackend.reset_group = gnc_gsettings_reset_schema;
LEAVE("Prefsbackend bind = %p", prefsbackend.bind);
/* The gsettings backend only works in an installed environment.
* When called from the source environment (for testing purposes)
* simply return.
*/
if (g_strcmp0 (g_getenv ("GNC_UNINSTALLED"), "1") == 0)
return;
if (!prefsbackend)
prefsbackend = g_new0 (PrefsBackend, 1);
prefsbackend->register_cb = gnc_gsettings_register_cb;
prefsbackend->remove_cb_by_func = gnc_gsettings_remove_cb_by_func;
prefsbackend->remove_cb_by_id = gnc_gsettings_remove_cb_by_id;
prefsbackend->register_group_cb = gnc_gsettings_register_any_cb;
prefsbackend->remove_group_cb_by_func = gnc_gsettings_remove_any_cb_by_func;
prefsbackend->bind = gnc_gsettings_bind;
prefsbackend->get_bool = gnc_gsettings_get_bool;
prefsbackend->get_int = gnc_gsettings_get_int;
prefsbackend->get_float = gnc_gsettings_get_float;
prefsbackend->get_string = gnc_gsettings_get_string;
prefsbackend->get_enum = gnc_gsettings_get_enum;
prefsbackend->get_value = gnc_gsettings_get_value;
prefsbackend->set_bool = gnc_gsettings_set_bool;
prefsbackend->set_int = gnc_gsettings_set_int;
prefsbackend->set_float = gnc_gsettings_set_float;
prefsbackend->set_string = gnc_gsettings_set_string;
prefsbackend->set_enum = gnc_gsettings_set_enum;
prefsbackend->set_value = gnc_gsettings_set_value;
prefsbackend->reset = gnc_gsettings_reset;
prefsbackend->reset_group = gnc_gsettings_reset_schema;
LEAVE("Prefsbackend bind = %p", prefsbackend->bind);
}
/* Attempt to migrate preferences from gconf files

View File

@@ -43,8 +43,11 @@ static QofLogModule log_module = G_LOG_DOMAIN;
static void
file_retain_changed_cb(gpointer gsettings, gchar *key, gpointer user_data)
{
gint days = (int)gnc_prefs_get_float(GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_DAYS);
gnc_prefs_set_file_retention_days (days);
if (gnc_prefs_is_set_up())
{
gint days = (int)gnc_prefs_get_float(GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_DAYS);
gnc_prefs_set_file_retention_days (days);
}
}
static void
@@ -52,21 +55,27 @@ file_retain_type_changed_cb(gpointer gsettings, gchar *key, gpointer user_data)
{
XMLFileRetentionType type = XML_RETAIN_ALL;
if (gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_TYPE_NEVER))
type = XML_RETAIN_NONE;
else if (gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_TYPE_DAYS))
type = XML_RETAIN_DAYS;
else if (!gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_TYPE_FOREVER))
PWARN("no file retention policy was set, assuming conservative policy 'forever'");
if (gnc_prefs_is_set_up())
{
if (gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_TYPE_NEVER))
type = XML_RETAIN_NONE;
else if (gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_TYPE_DAYS))
type = XML_RETAIN_DAYS;
else if (!gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_TYPE_FOREVER))
PWARN("no file retention policy was set, assuming conservative policy 'forever'");
gnc_prefs_set_file_retention_policy (type);
gnc_prefs_set_file_retention_policy (type);
}
}
static void
file_compression_changed_cb(gpointer gsettings, gchar *key, gpointer user_data)
{
gboolean file_compression = gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL, GNC_PREF_FILE_COMPRESSION);
gnc_prefs_set_file_save_compressed (file_compression);
if (gnc_prefs_is_set_up())
{
gboolean file_compression = gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL, GNC_PREF_FILE_COMPRESSION);
gnc_prefs_set_file_save_compressed (file_compression);
}
}
@@ -74,7 +83,9 @@ void gnc_prefs_init (void)
{
gnc_gsettings_load_backend();
/* Initialize the core preferences by reading their values from the loaded backend */
/* Initialize the core preferences by reading their values from the loaded backend.
* Note: of no backend was loaded, these functions will return sane default values.
*/
file_retain_changed_cb (NULL, NULL, NULL);
file_retain_type_changed_cb (NULL, NULL, NULL);
file_compression_changed_cb (NULL, NULL, NULL);
@@ -92,6 +103,8 @@ void gnc_prefs_init (void)
if ( (gnc_prefs_get_file_retention_policy () == XML_RETAIN_DAYS) &&
(gnc_prefs_get_file_retention_days () == 0 ) )
{
gnc_prefs_set_file_retention_policy (XML_RETAIN_ALL);
gnc_prefs_set_file_retention_days (30);
gnc_prefs_set_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_TYPE_FOREVER, TRUE);
gnc_prefs_set_float (GNC_PREFS_GROUP_GENERAL, GNC_PREF_RETAIN_DAYS, 30);
PWARN("retain 0 days policy was set, but this is probably not what the user wanted,\n"

View File

@@ -106,6 +106,6 @@ typedef struct
} PrefsBackend;
extern PrefsBackend prefsbackend;
extern PrefsBackend *prefsbackend;
#endif /* GNC_PREFS_P_H_ */

View File

@@ -35,7 +35,7 @@ static gboolean use_compression = TRUE; // This is also the default in the pre
static gint file_retention_policy = 1; // 1 = "days", the default in the prefs backend
static gint file_retention_days = 30; // This is also the default in the prefs backend
PrefsBackend prefsbackend;
PrefsBackend *prefsbackend = NULL;
/* This static indicates the debugging module that this .o belongs to. */
static QofLogModule log_module = G_LOG_DOMAIN;
@@ -130,15 +130,16 @@ gulong gnc_prefs_register_cb (const char *group,
gpointer func,
gpointer user_data)
{
ENTER("group %s; pref_name %s, prefsbackend.register_cb %p", group, pref_name, prefsbackend.register_cb);
if (prefsbackend.register_cb)
ENTER("group %s; pref_name %s, prefsbackend->register_cb %p", group, pref_name,
prefsbackend ? prefsbackend->register_cb : NULL);
if (prefsbackend && prefsbackend->register_cb)
{
LEAVE("");
return (prefsbackend.register_cb) (group, pref_name, func, user_data);
return (prefsbackend->register_cb) (group, pref_name, func, user_data);
}
else
{
LEAVE("");
LEAVE("no backend loaded, or the backend doesn't define register_cb, returning 0");
return 0;
}
}
@@ -149,16 +150,16 @@ void gnc_prefs_remove_cb_by_func (const gchar *group,
gpointer func,
gpointer user_data)
{
if (prefsbackend.remove_cb_by_func)
(prefsbackend.remove_cb_by_func) (group, pref_name, func, user_data);
if (prefsbackend && prefsbackend->remove_cb_by_func)
(prefsbackend->remove_cb_by_func) (group, pref_name, func, user_data);
}
void gnc_prefs_remove_cb_by_id (const gchar *group,
guint id)
{
if (prefsbackend.remove_cb_by_id)
(prefsbackend.remove_cb_by_id) (group, id);
if (prefsbackend && prefsbackend->remove_cb_by_id)
(prefsbackend->remove_cb_by_id) (group, id);
}
@@ -166,8 +167,8 @@ guint gnc_prefs_register_group_cb (const gchar *group,
gpointer func,
gpointer user_data)
{
if (prefsbackend.register_group_cb)
return (prefsbackend.register_group_cb) (group, func, user_data);
if (prefsbackend && prefsbackend->register_group_cb)
return (prefsbackend->register_group_cb) (group, func, user_data);
else
return 0;
}
@@ -177,8 +178,8 @@ void gnc_prefs_remove_group_cb_by_func (const gchar *group,
gpointer func,
gpointer user_data)
{
if (prefsbackend.remove_group_cb_by_func)
(prefsbackend.remove_group_cb_by_func) (group, func, user_data);
if (prefsbackend && prefsbackend->remove_group_cb_by_func)
(prefsbackend->remove_group_cb_by_func) (group, func, user_data);
}
@@ -187,16 +188,16 @@ void gnc_prefs_bind (const gchar *group,
gpointer object,
const gchar *property)
{
if (prefsbackend.bind)
(prefsbackend.bind) (group, pref_name, object, property);
if (prefsbackend && prefsbackend->bind)
(prefsbackend->bind) (group, pref_name, object, property);
}
gboolean gnc_prefs_get_bool (const gchar *group,
/*@ null @*/ const gchar *pref_name)
{
if (prefsbackend.get_bool)
return (prefsbackend.get_bool) (group, pref_name);
if (prefsbackend && prefsbackend->get_bool)
return (prefsbackend->get_bool) (group, pref_name);
else
return FALSE;
}
@@ -205,8 +206,8 @@ gboolean gnc_prefs_get_bool (const gchar *group,
gint gnc_prefs_get_int (const gchar *group,
const gchar *pref_name)
{
if (prefsbackend.get_int)
return (prefsbackend.get_int) (group, pref_name);
if (prefsbackend && prefsbackend->get_int)
return (prefsbackend->get_int) (group, pref_name);
else
return 0;
}
@@ -226,8 +227,8 @@ gint64 gnc_prefs_get_int64 (const gchar *group,
gdouble gnc_prefs_get_float (const gchar *group,
const gchar *pref_name)
{
if (prefsbackend.get_float)
return (prefsbackend.get_float) (group, pref_name);
if (prefsbackend && prefsbackend->get_float)
return (prefsbackend->get_float) (group, pref_name);
else
return 0.0;
}
@@ -236,8 +237,8 @@ gdouble gnc_prefs_get_float (const gchar *group,
gchar *gnc_prefs_get_string (const gchar *group,
const gchar *pref_name)
{
if (prefsbackend.get_string)
return (prefsbackend.get_string) (group, pref_name);
if (prefsbackend && prefsbackend->get_string)
return (prefsbackend->get_string) (group, pref_name);
else
return NULL;
}
@@ -246,8 +247,8 @@ gchar *gnc_prefs_get_string (const gchar *group,
gint gnc_prefs_get_enum (const gchar *group,
const gchar *pref_name)
{
if (prefsbackend.get_enum)
return (prefsbackend.get_enum) (group, pref_name);
if (prefsbackend && prefsbackend->get_enum)
return (prefsbackend->get_enum) (group, pref_name);
else
return 0;
}
@@ -271,8 +272,8 @@ gnc_prefs_get_coords (const gchar *group,
GVariant *gnc_prefs_get_value (const gchar *group,
const gchar *pref_name)
{
if (prefsbackend.get_value)
return (prefsbackend.get_value) (group,pref_name);
if (prefsbackend && prefsbackend->get_value)
return (prefsbackend->get_value) (group,pref_name);
else
return NULL;
}
@@ -282,8 +283,8 @@ gboolean gnc_prefs_set_bool (const gchar *group,
const gchar *pref_name,
gboolean value)
{
if (prefsbackend.set_bool)
return (prefsbackend.set_bool) (group, pref_name, value);
if (prefsbackend && prefsbackend->set_bool)
return (prefsbackend->set_bool) (group, pref_name, value);
else
return FALSE;
}
@@ -293,8 +294,8 @@ gboolean gnc_prefs_set_int (const gchar *group,
const gchar *pref_name,
gint value)
{
if (prefsbackend.set_int)
return (prefsbackend.set_int) (group, pref_name, value);
if (prefsbackend && prefsbackend->set_int)
return (prefsbackend->set_int) (group, pref_name, value);
else
return FALSE;
}
@@ -313,8 +314,8 @@ gboolean gnc_prefs_set_float (const gchar *group,
const gchar *pref_name,
gdouble value)
{
if (prefsbackend.set_float)
return (prefsbackend.set_float) (group, pref_name, value);
if (prefsbackend && prefsbackend->set_float)
return (prefsbackend->set_float) (group, pref_name, value);
else
return FALSE;
}
@@ -324,8 +325,8 @@ gboolean gnc_prefs_set_string (const gchar *group,
const gchar *pref_name,
const gchar *value)
{
if (prefsbackend.set_string)
return (prefsbackend.set_string) (group, pref_name, value);
if (prefsbackend && prefsbackend->set_string)
return (prefsbackend->set_string) (group, pref_name, value);
else
return FALSE;
}
@@ -335,8 +336,8 @@ gboolean gnc_prefs_set_enum (const gchar *group,
const gchar *pref_name,
gint value)
{
if (prefsbackend.set_enum)
return (prefsbackend.set_enum) (group, pref_name, value);
if (prefsbackend && prefsbackend->set_enum)
return (prefsbackend->set_enum) (group, pref_name, value);
else
return FALSE;
}
@@ -355,8 +356,8 @@ gboolean gnc_prefs_set_value (const gchar *group,
const gchar *pref_name,
GVariant *value)
{
if (prefsbackend.set_value)
return (prefsbackend.set_value) (group, pref_name, value);
if (prefsbackend && prefsbackend->set_value)
return (prefsbackend->set_value) (group, pref_name, value);
else
return FALSE;
}
@@ -365,13 +366,18 @@ gboolean gnc_prefs_set_value (const gchar *group,
void gnc_prefs_reset (const gchar *group,
const gchar *pref_name)
{
if (prefsbackend.reset)
(prefsbackend.reset) (group, pref_name);
if (prefsbackend && prefsbackend->reset)
(prefsbackend->reset) (group, pref_name);
}
void gnc_prefs_reset_group (const gchar *group)
{
if (prefsbackend.reset_group)
(prefsbackend.reset_group) (group);
if (prefsbackend && prefsbackend->reset_group)
(prefsbackend->reset_group) (group);
}
gboolean gnc_prefs_is_set_up (void)
{
return (prefsbackend !=NULL);
}

View File

@@ -116,6 +116,11 @@ guint gnc_prefs_get_long_version( void );
/** @} */
/** Test if preferences backend is set up
*/
gboolean gnc_prefs_is_set_up (void);
/** @name Listening for changes
@{
*/