summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Bragg <robert@linux.intel.com>2011-08-03 18:15:54 +0100
committerRobert Bragg <robert@linux.intel.com>2011-08-12 15:28:42 +0100
commit2ac4002084864e2530ce7908efb00a8697e85d07 (patch)
tree9b669ac24a8d11c114fb1e887042b971ae8bed5a
parent5012bcf1d1fb09a0bece1e3d417ed7c4e3d6cd0c (diff)
downloadcogl-2ac4002084864e2530ce7908efb00a8697e85d07.tar.gz
cogl: Add support for reading a cogl.conf config file
When cogl initializes we now check for a cogl/cogl.conf in any of the system config dirs (determined using $XDG_CONFIG_DIRS on linux) we then also check the user's config directory (determined using XDG_CONFIG_HOME on linux) for a cogl/cogl.conf file. Options specified in the user config file have priority over the system config options. The config file has an .ini style syntax with a mandatory [global] section and we currently understand 3 keynames: COGL_DEBUG, COGL_DRIVER and COGL_RENDERER which have the same semantics as the corresponding environment variables. Options set using the environment variables have priority over options set in the config files. To allow users to undo the enabling of debug options in config files this patch also adds a check for COGL_NO_DEBUG environment variable which will disable the specified options which may have been enabled in config files. Reviewed-by: Neil Roberts <neil@linux.intel.com>
-rw-r--r--cogl/Makefile.am2
-rw-r--r--cogl/cogl-config-private.h37
-rw-r--r--cogl/cogl-config.c117
-rw-r--r--cogl/cogl-debug.c11
-rw-r--r--cogl/cogl-debug.h5
-rw-r--r--cogl/cogl-renderer.c6
-rw-r--r--cogl/cogl.c2
7 files changed, 179 insertions, 1 deletions
diff --git a/cogl/Makefile.am b/cogl/Makefile.am
index 7a9e0eaf..91dac5e7 100644
--- a/cogl/Makefile.am
+++ b/cogl/Makefile.am
@@ -306,6 +306,8 @@ cogl_sources_c = \
$(srcdir)/winsys/cogl-winsys-stub-private.h \
$(srcdir)/cogl-queue.h \
$(srcdir)/winsys/cogl-winsys-stub.c \
+ $(srcdir)/cogl-config-private.h \
+ $(srcdir)/cogl-config.c \
$(NULL)
if SUPPORT_XLIB
diff --git a/cogl/cogl-config-private.h b/cogl/cogl-config-private.h
new file mode 100644
index 00000000..14b43bb6
--- /dev/null
+++ b/cogl/cogl-config-private.h
@@ -0,0 +1,37 @@
+/*
+ * Cogl
+ *
+ * An object oriented GL/GLES Abstraction/Utility Layer
+ *
+ * Copyright (C) 2011 Intel Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ *
+ *
+ * Authors:
+ * Robert Bragg <robert@linux.intel.com>
+ */
+
+#ifndef __COGL_CONFIG_PRIVATE_H
+#define __COGL_CONFIG_PRIVATE_H
+
+void
+_cogl_config_read (void);
+
+extern char *_cogl_config_driver;
+extern char *_cogl_config_renderer;
+
+#endif /* __COGL_CONFIG_PRIVATE_H */
diff --git a/cogl/cogl-config.c b/cogl/cogl-config.c
new file mode 100644
index 00000000..8f0082ec
--- /dev/null
+++ b/cogl/cogl-config.c
@@ -0,0 +1,117 @@
+/*
+ * Cogl
+ *
+ * An object oriented GL/GLES Abstraction/Utility Layer
+ *
+ * Copyright (C) 2011 Intel Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ *
+ * Authors:
+ * Robert Bragg <robert@linux.intel.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "cogl-debug.h"
+
+#include <glib.h>
+
+char *_cogl_config_driver;
+char *_cogl_config_renderer;
+
+static void
+_cogl_config_process (GKeyFile *key_file)
+{
+ char *value;
+
+ value = g_key_file_get_string (key_file, "global", "COGL_DEBUG", NULL);
+ if (value)
+ {
+ _cogl_parse_debug_string (value,
+ TRUE /* enable the flags */,
+ TRUE /* ignore help option */);
+ g_free (value);
+ }
+
+ value = g_key_file_get_string (key_file, "global", "COGL_NO_DEBUG", NULL);
+ if (value)
+ {
+ _cogl_parse_debug_string (value,
+ FALSE /* disable the flags */,
+ TRUE /* ignore help option */);
+ g_free (value);
+ }
+
+ value = g_key_file_get_string (key_file, "global", "COGL_DRIVER", NULL);
+ if (value)
+ {
+ if (_cogl_config_driver)
+ g_free (_cogl_config_driver);
+
+ _cogl_config_driver = value;
+ }
+
+ value = g_key_file_get_string (key_file, "global", "COGL_RENDERER", NULL);
+ if (value)
+ {
+ if (_cogl_config_renderer)
+ g_free (_cogl_config_renderer);
+
+ _cogl_config_renderer = value;
+ }
+}
+
+void
+_cogl_config_read (void)
+{
+ GKeyFile *key_file = g_key_file_new ();
+ const char * const *system_dirs = g_get_system_config_dirs ();
+ char *filename;
+ gboolean status = FALSE;
+ int i;
+
+ for (i = 0; system_dirs[i]; i++)
+ {
+ filename = g_build_filename (system_dirs[i], "cogl", "cogl.conf", NULL);
+ status = g_key_file_load_from_file (key_file,
+ filename,
+ 0,
+ NULL);
+ g_free (filename);
+ if (status)
+ {
+ _cogl_config_process (key_file);
+ g_key_file_free (key_file);
+ key_file = g_key_file_new ();
+ break;
+ }
+ }
+
+ filename = g_build_filename (g_get_user_config_dir (), "cogl", "cogl.conf", NULL);
+ status = g_key_file_load_from_file (key_file,
+ filename,
+ 0,
+ NULL);
+ g_free (filename);
+
+ if (status)
+ _cogl_config_process (key_file);
+
+ g_key_file_free (key_file);
+}
diff --git a/cogl/cogl-debug.c b/cogl/cogl-debug.c
index 51163486..bc22f78e 100644
--- a/cogl/cogl-debug.c
+++ b/cogl/cogl-debug.c
@@ -126,7 +126,7 @@ _cogl_parse_debug_string_for_keys (const char *value,
}
}
-static void
+void
_cogl_parse_debug_string (const char *value,
gboolean enable,
gboolean ignore_help)
@@ -223,6 +223,15 @@ _cogl_debug_check_environment (void)
FALSE /* don't ignore help */);
env_string = NULL;
}
+
+ env_string = g_getenv ("COGL_NO_DEBUG");
+ if (env_string != NULL)
+ {
+ _cogl_parse_debug_string (env_string,
+ FALSE /* disable the flags */,
+ FALSE /* don't ignore help */);
+ env_string = NULL;
+ }
}
static gboolean
diff --git a/cogl/cogl-debug.h b/cogl/cogl-debug.h
index bf2d3190..3c8c73ae 100644
--- a/cogl/cogl-debug.h
+++ b/cogl/cogl-debug.h
@@ -119,6 +119,11 @@ extern GHashTable *_cogl_debug_instances;
void
_cogl_debug_check_environment (void);
+void
+_cogl_parse_debug_string (const char *value,
+ gboolean enable,
+ gboolean ignore_help);
+
G_END_DECLS
#endif /* __COGL_DEBUG_H__ */
diff --git a/cogl/cogl-renderer.c b/cogl/cogl-renderer.c
index 5a4f570e..7bd4746c 100644
--- a/cogl/cogl-renderer.c
+++ b/cogl/cogl-renderer.c
@@ -42,6 +42,7 @@
#include "cogl-winsys-private.h"
#include "cogl-winsys-stub-private.h"
#include "cogl-winsys-egl-private.h"
+#include "cogl-config-private.h"
#ifdef COGL_HAS_GLX_SUPPORT
extern const CoglWinsysVtable *_cogl_winsys_glx_get_vtable (void);
@@ -178,6 +179,9 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
const char *driver_name = g_getenv ("COGL_DRIVER");
const char *libgl_name;
+ if (!driver_name)
+ driver_name = _cogl_config_driver;
+
#ifdef HAVE_COGL_GL
if (driver_name == NULL || !strcmp (driver_name, "gl"))
{
@@ -263,6 +267,8 @@ cogl_renderer_connect (CoglRenderer *renderer, GError **error)
else
{
char *user_choice = getenv ("COGL_RENDERER");
+ if (!user_choice)
+ user_choice = _cogl_config_renderer;
if (user_choice && strcmp (winsys->name, user_choice) != 0)
continue;
}
diff --git a/cogl/cogl.c b/cogl/cogl.c
index e9621c2f..10c2cd84 100644
--- a/cogl/cogl.c
+++ b/cogl/cogl.c
@@ -47,6 +47,7 @@
#include "cogl-attribute-private.h"
#include "cogl-framebuffer-private.h"
#include "cogl-renderer-private.h"
+#include "cogl-config-private.h"
#ifndef GL_PACK_INVERT_MESA
#define GL_PACK_INVERT_MESA 0x8758
@@ -1122,6 +1123,7 @@ _cogl_init (void)
{
g_type_init ();
+ _cogl_config_read ();
_cogl_debug_check_environment ();
g_once_init_leave (&init_status, 1);
}