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>
This commit is contained in:
Robert Bragg 2011-08-03 18:15:54 +01:00
parent 5012bcf1d1
commit 2ac4002084
7 changed files with 179 additions and 1 deletions

View File

@ -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

View File

@ -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 */

117
cogl/cogl-config.c Normal file
View File

@ -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);
}

View File

@ -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

View File

@ -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__ */

View File

@ -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;
}

View File

@ -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);
}