#include "clutter-master-clock.h"
#include "clutter-private.h"
#include "clutter-profile.h"
+#include "clutter-settings-private.h"
#include "clutter-stage-manager.h"
#include "clutter-stage-private.h"
#include "clutter-version.h" /* For flavour define */
clutter_threads_unlock = clutter_threads_impl_unlock;
}
+#define N_CONF_DIRS 2
+
+static void
+clutter_config_read (void)
+{
+ ClutterSettings *settings;
+ gchar *config_path;
+
+ settings = clutter_settings_get_default ();
+
+ config_path = g_build_filename (CLUTTER_SYSCONFDIR,
+ "clutter-1.0",
+ "settings.ini",
+ NULL);
+ if (g_file_test (config_path, G_FILE_TEST_EXISTS))
+ _clutter_settings_read_from_file (settings, config_path);
+
+ g_free (config_path);
+
+ config_path = g_build_filename (g_get_user_config_dir (),
+ "clutter-1.0",
+ "settings.ini",
+ NULL);
+ if (g_file_test (config_path, G_FILE_TEST_EXISTS))
+ _clutter_settings_read_from_file (settings, config_path);
+
+ g_free (config_path);
+}
+
/**
* clutter_get_show_fps:
*
ctx->is_initialized = FALSE;
ctx->motion_events_per_actor = TRUE;
+ /* create the default settings object, and store a back pointer to
+ * the backend singleton
+ */
+ ctx->settings = clutter_settings_get_default ();
+ _clutter_settings_set_backend (ctx->settings, ctx->backend);
+
#ifdef CLUTTER_ENABLE_DEBUG
ctx->timer = g_timer_new ();
g_timer_start (ctx->timer);
g_warning ("Locale not supported by C library.\n"
"Using the fallback 'C' locale.");
+ /* read the configuration file, if it exists; the configuration file
+ * determines the initial state of the settings, so that command line
+ * arguments can override them.
+ */
+ clutter_config_read ();
+
clutter_context = _clutter_context_get_default ();
clutter_context->id_pool = _clutter_id_pool_new (256);
cairo_subpixel_order_t subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
cairo_font_options_t *options;
+ if (self->backend == NULL)
+ return;
+
options = cairo_font_options_create ();
cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON);
{
CLUTTER_NOTE (BACKEND, "New font-name: %s", self->font_name);
- g_signal_emit_by_name (self->backend, "font-changed");
+ if (self->backend != NULL)
+ g_signal_emit_by_name (self->backend, "font-changed");
}
static void
{
CLUTTER_NOTE (BACKEND, "New resolution: %.2f", self->resolution);
- g_signal_emit_by_name (self->backend, "resolution-changed");
+ if (self->backend != NULL)
+ g_signal_emit_by_name (self->backend, "resolution-changed");
}
static void
settings_update_fontmap (ClutterSettings *self,
guint stamp)
{
+ if (self->backend == NULL)
+ return;
+
#ifdef HAVE_PANGO_FT2
CLUTTER_NOTE (BACKEND, "Update fontmaps (stamp: %d)", stamp);
klass->dispatch_properties_changed (gobject, n_pspecs, pspecs);
/* emit settings-changed just once for multiple properties */
- g_signal_emit_by_name (self->backend, "settings-changed");
+ if (self->backend != NULL)
+ g_signal_emit_by_name (self->backend, "settings-changed");
}
static void
* A back pointer to the #ClutterBackend
*
* Since: 1.4
+ *
+ * Deprecated: 1.10
*/
obj_props[PROP_BACKEND] =
g_param_spec_object ("backend",
"Backend",
"A pointer to the backend",
CLUTTER_TYPE_BACKEND,
- CLUTTER_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
+ CLUTTER_PARAM_WRITABLE |
+ G_PARAM_DEPRECATED |
+ G_PARAM_CONSTRUCT_ONLY);
/**
* ClutterSettings:double-click-time:
ClutterSettings *
clutter_settings_get_default (void)
{
- ClutterMainContext *context = _clutter_context_get_default ();
+ static ClutterSettings *settings = NULL;
+
+ if (G_UNLIKELY (settings == NULL))
+ settings = g_object_new (CLUTTER_TYPE_SETTINGS, NULL);
+
+ return settings;
+}
+
+void
+_clutter_settings_set_backend (ClutterSettings *settings,
+ ClutterBackend *backend)
+{
+ g_assert (CLUTTER_IS_SETTINGS (settings));
+ g_assert (CLUTTER_IS_BACKEND (backend));
+
+ settings->backend = backend;
+}
+
+#define SETTINGS_GROUP "Settings"
+
+void
+_clutter_settings_read_from_file (ClutterSettings *settings,
+ const gchar *file)
+{
+ GObjectClass *settings_class;
+ GObject *settings_obj;
+ GParamSpec **pspecs;
+ GKeyFile *keyfile;
+ GError *error;
+ guint n_pspecs, i;
+
+ error = NULL;
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_file (keyfile, file, G_KEY_FILE_NONE, &error);
+ if (error != NULL)
+ {
+ g_critical ("Unable to read configuration from '%s': %s",
+ file,
+ error->message);
+ g_error_free (error);
+ goto out;
+ }
- if (G_LIKELY (context->settings != NULL))
- return context->settings;
+ if (!g_key_file_has_group (keyfile, SETTINGS_GROUP))
+ goto out;
+
+ settings_obj = G_OBJECT (settings);
+ settings_class = G_OBJECT_GET_CLASS (settings);
+ pspecs = g_object_class_list_properties (settings_class, &n_pspecs);
+
+ CLUTTER_NOTE (BACKEND, "Reading settings from '%s'", file);
+
+ for (i = 0; i < n_pspecs; i++)
+ {
+ GParamSpec *pspec = pspecs[i];
+ const gchar *p_name = pspec->name;
+ GType p_type = G_TYPE_FUNDAMENTAL (pspec->value_type);
+ GValue value = G_VALUE_INIT;
+ GError *key_error = NULL;
+
+ g_value_init (&value, p_type);
+
+ switch (p_type)
+ {
+ case G_TYPE_INT:
+ case G_TYPE_UINT:
+ {
+ gint val;
+
+ val = g_key_file_get_integer (keyfile,
+ SETTINGS_GROUP, p_name,
+ &key_error);
+ if (p_type == G_TYPE_INT)
+ g_value_set_int (&value, val);
+ else
+ g_value_set_uint (&value, val);
+ }
+ break;
+
+ case G_TYPE_BOOLEAN:
+ {
+ gboolean val;
+
+ val = g_key_file_get_boolean (keyfile,
+ SETTINGS_GROUP, p_name,
+ &key_error);
+ g_value_set_boolean (&value, val);
+ }
+ break;
+
+ case G_TYPE_FLOAT:
+ case G_TYPE_DOUBLE:
+ {
+ gdouble val;
+
+ val = g_key_file_get_double (keyfile,
+ SETTINGS_GROUP, p_name,
+ &key_error);
+ if (p_type == G_TYPE_FLOAT)
+ g_value_set_float (&value, val);
+ else
+ g_value_set_double (&value, val);
+ }
+ break;
+
+ case G_TYPE_STRING:
+ {
+ const gchar *val;
+
+ val = g_key_file_get_string (keyfile,
+ SETTINGS_GROUP, p_name,
+ &key_error);
+ g_value_set_string (&value, val);
+ }
+ break;
+ }
+
+ if (key_error != NULL &&
+ key_error->domain != G_KEY_FILE_ERROR &&
+ key_error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND)
+ {
+ g_critical ("Unable to read the value for setting '%s' in '%s': %s",
+ p_name,
+ file,
+ key_error->message);
+ }
+
+ if (key_error == NULL)
+ g_object_set_property (settings_obj, p_name, &value);
+ else
+ g_error_free (key_error);
+
+ g_value_unset (&value);
+ }
- context->settings = g_object_new (CLUTTER_TYPE_SETTINGS,
- "backend", context->backend,
- NULL);
+ g_free (pspecs);
- return context->settings;
+out:
+ g_key_file_free (keyfile);
}