Ticket #380: About colors schemes (reopened ticket)
[midnight-commander.git] / src / skin / common.c
blob2de791e140731e7d571218b5186dee749fa74d15
1 /*
2 Skins engine.
3 Interface functions
5 Copyright (C) 2009 The Free Software Foundation, Inc.
7 Written by:
8 Slava Zanko <slavazanko@gmail.com>, 2009.
10 This file is part of the Midnight Commander.
12 The Midnight Commander is free software; you can redistribute it
13 and/or modify it under the terms of the GNU General Public License as
14 published by the Free Software Foundation; either version 2 of the
15 License, or (at your option) any later version.
17 The Midnight Commander is distributed in the hope that it will be
18 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
19 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 MA 02110-1301, USA.
28 #include <config.h>
29 #include <stdlib.h>
31 #include "../src/global.h"
32 #include "../src/args.h"
33 #include "skin.h"
34 #include "internal.h"
36 /*** global variables ****************************************************************************/
38 mc_skin_t mc_skin__default;
40 /*** file scope macro definitions ****************************************************************/
42 /*** file scope type declarations ****************************************************************/
44 /*** file scope variables ************************************************************************/
46 static gboolean mc_skin_is_init = FALSE;
48 /* --------------------------------------------------------------------------------------------- */
49 /*** file scope functions ************************************************************************/
50 /* --------------------------------------------------------------------------------------------- */
52 static inline void
53 mc_skin_hash_destroy_key (gpointer data)
55 g_free (data);
58 /* --------------------------------------------------------------------------------------------- */
60 static void
61 mc_skin_hash_destroy_value (gpointer data)
63 mc_skin_color_t *mc_skin_color = (mc_skin_color_t *) data;
64 g_free (mc_skin_color->fgcolor);
65 g_free (mc_skin_color->bgcolor);
66 g_free (mc_skin_color);
69 /* --------------------------------------------------------------------------------------------- */
71 static char *
72 mc_skin_get_default_name (void)
74 char *tmp_str;
76 /* from command line */
77 if (mc_args__skin != NULL)
78 return g_strdup (mc_args__skin);
80 /* from envirovement variable */
81 tmp_str = getenv ("MC_SKIN");
82 if (tmp_str != NULL)
83 return g_strdup (tmp_str);
85 /* from config. Or 'default' if no present in config */
86 return mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, "skin", "default");
89 /* --------------------------------------------------------------------------------------------- */
91 static void
92 mc_skin_reinit (void)
94 mc_skin_deinit ();
95 mc_skin__default.name = mc_skin_get_default_name ();
96 mc_skin__default.colors = g_hash_table_new_full (g_str_hash, g_str_equal,
97 mc_skin_hash_destroy_key,
98 mc_skin_hash_destroy_value);
101 /* --------------------------------------------------------------------------------------------- */
103 static void
104 mc_skin_try_to_load_default (void)
106 mc_skin_reinit ();
107 g_free (mc_skin__default.name);
108 mc_skin__default.name = g_strdup ("default");
109 if (!mc_skin_ini_file_load (&mc_skin__default)) {
110 mc_skin_reinit ();
111 mc_skin_set_hardcoded_skin (&mc_skin__default);
116 /* --------------------------------------------------------------------------------------------- */
117 /*** public functions ****************************************************************************/
118 /* --------------------------------------------------------------------------------------------- */
120 gboolean
121 mc_skin_init (GError ** error)
124 mc_skin__default.name = mc_skin_get_default_name ();
126 mc_skin__default.colors = g_hash_table_new_full (g_str_hash, g_str_equal,
127 mc_skin_hash_destroy_key,
128 mc_skin_hash_destroy_value);
130 gboolean is_good_init = TRUE;
132 if (!mc_skin_ini_file_load (&mc_skin__default)) {
133 *error = g_error_new (MC_ERROR, 0,
134 _("Unable to load '%s' skin.\nDefault skin has been loaded"),
135 mc_skin__default.name);
137 mc_skin_try_to_load_default ();
138 is_good_init = FALSE;
140 mc_skin_colors_old_configure (&mc_skin__default);
142 if (!mc_skin_ini_file_parse (&mc_skin__default)) {
143 if (*error == NULL)
144 *error = g_error_new (MC_ERROR, 0,
145 _("Unable to parse '%s' skin.\nDefault skin has been loaded"),
146 mc_skin__default.name);
148 mc_skin_try_to_load_default ();
149 mc_skin_colors_old_configure (&mc_skin__default);
150 (void) mc_skin_ini_file_parse (&mc_skin__default);
151 is_good_init = FALSE;
153 mc_skin_is_init = TRUE;
154 return is_good_init;
157 /* --------------------------------------------------------------------------------------------- */
159 void
160 mc_skin_deinit (void)
163 g_free (mc_skin__default.name);
164 mc_skin__default.name = NULL;
165 g_hash_table_destroy (mc_skin__default.colors);
166 mc_skin__default.colors = NULL;
168 g_free (mc_skin__default.description);
169 mc_skin__default.description = NULL;
171 if (mc_skin__default.config) {
172 mc_config_deinit (mc_skin__default.config);
173 mc_skin__default.config = NULL;
176 mc_skin_is_init = FALSE;
179 /* --------------------------------------------------------------------------------------------- */