[cogl] cogl: Add support for reading a cogl.conf config file



commit 2ac4002084864e2530ce7908efb00a8697e85d07
Author: Robert Bragg <robert linux intel com>
Date:   Wed Aug 3 18:15:54 2011 +0100

    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>

 cogl/Makefile.am           |    2 +
 cogl/cogl-config-private.h |   37 ++++++++++++++
 cogl/cogl-config.c         |  117 ++++++++++++++++++++++++++++++++++++++++++++
 cogl/cogl-debug.c          |   11 ++++-
 cogl/cogl-debug.h          |    5 ++
 cogl/cogl-renderer.c       |    6 ++
 cogl/cogl.c                |    2 +
 7 files changed, 179 insertions(+), 1 deletions(-)
---
diff --git a/cogl/Makefile.am b/cogl/Makefile.am
index 7a9e0ea..91dac5e 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 0000000..14b43bb
--- /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 0000000..8f0082e
--- /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 5116348..bc22f78 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 bf2d319..3c8c73a 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 5a4f570..7bd4746 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 e9621c2..10c2cd8 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);
     }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]