This source file includes following definitions.
- mc_skin_hash_destroy_value
- mc_skin_get_default_name
- mc_skin_reinit
- mc_skin_try_to_load_default
- mc_skin_init
- mc_skin_deinit
- mc_skin_get
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <config.h>
29 #include <stdlib.h>
30
31 #include "internal.h"
32 #include "lib/util.h"
33
34 #include "lib/tty/color.h"
35
36
37
38 mc_skin_t mc_skin__default;
39
40
41
42
43
44
45
46
47
48
49
50
51
52 static void
53 mc_skin_hash_destroy_value (gpointer data)
54 {
55 tty_color_pair_t *mc_skin_color = (tty_color_pair_t *) data;
56
57 g_free (mc_skin_color->fg);
58 g_free (mc_skin_color->bg);
59 g_free (mc_skin_color->attrs);
60 g_free (mc_skin_color);
61 }
62
63
64
65 static char *
66 mc_skin_get_default_name (void)
67 {
68 char *tmp_str;
69
70
71 if (mc_global.tty.skin != NULL)
72 return g_strdup (mc_global.tty.skin);
73
74
75 tmp_str = getenv ("MC_SKIN");
76 if (tmp_str != NULL)
77 return g_strdup (tmp_str);
78
79
80 return mc_config_get_string (mc_global.main_config, CONFIG_APP_SECTION, "skin", "default");
81 }
82
83
84
85 static void
86 mc_skin_reinit (void)
87 {
88 mc_skin_deinit ();
89 mc_skin__default.name = mc_skin_get_default_name ();
90 mc_skin__default.colors =
91 g_hash_table_new_full (g_str_hash, g_str_equal, g_free, mc_skin_hash_destroy_value);
92 }
93
94
95
96 static void
97 mc_skin_try_to_load_default (void)
98 {
99 mc_skin_reinit ();
100 g_free (mc_skin__default.name);
101 mc_skin__default.name = g_strdup ("default");
102 if (!mc_skin_ini_file_load (&mc_skin__default))
103 {
104 mc_skin_reinit ();
105 mc_skin_set_hardcoded_skin (&mc_skin__default);
106 }
107 }
108
109
110
111
112
113 gboolean
114 mc_skin_init (const gchar *skin_override, GError **mcerror)
115 {
116 gboolean is_good_init = TRUE;
117 GError *error = NULL;
118
119 mc_return_val_if_error (mcerror, FALSE);
120
121 mc_skin__default.have_256_colors = FALSE;
122 mc_skin__default.have_true_colors = FALSE;
123
124 mc_skin__default.name =
125 skin_override != NULL ? g_strdup (skin_override) : mc_skin_get_default_name ();
126
127 mc_skin__default.colors =
128 g_hash_table_new_full (g_str_hash, g_str_equal, g_free, mc_skin_hash_destroy_value);
129 if (!mc_skin_ini_file_load (&mc_skin__default))
130 {
131 mc_propagate_error (mcerror, 0,
132 _ ("Unable to load '%s' skin.\nDefault skin has been loaded"),
133 mc_skin__default.name);
134 mc_skin_try_to_load_default ();
135 is_good_init = FALSE;
136 }
137
138 if (!mc_skin_ini_file_parse (&mc_skin__default))
139 {
140 mc_propagate_error (mcerror, 0,
141 _ ("Unable to parse '%s' skin.\nDefault skin has been loaded"),
142 mc_skin__default.name);
143
144 mc_skin_try_to_load_default ();
145 (void) mc_skin_ini_file_parse (&mc_skin__default);
146 is_good_init = FALSE;
147 }
148 if (is_good_init && mc_skin__default.have_true_colors && !tty_use_truecolors (&error))
149 {
150 if (!mc_global.tty.disable_colors || skin_override != NULL)
151 mc_propagate_error (mcerror, 0,
152 _ ("Unable to use '%s' skin with true colors support:\n%s\n"
153 "Default skin has been loaded"),
154 mc_skin__default.name, error->message);
155 g_error_free (error);
156 mc_skin_try_to_load_default ();
157 (void) mc_skin_ini_file_parse (&mc_skin__default);
158 is_good_init = FALSE;
159 }
160 if (is_good_init && mc_skin__default.have_256_colors && !tty_use_256colors (&error))
161 {
162 if (!mc_global.tty.disable_colors || skin_override != NULL)
163 mc_propagate_error (mcerror, 0,
164 _ ("Unable to use '%s' skin with 256 colors support:\n%s\n"
165 "Default skin has been loaded"),
166 mc_skin__default.name, error->message);
167 g_error_free (error);
168 mc_skin_try_to_load_default ();
169 (void) mc_skin_ini_file_parse (&mc_skin__default);
170 is_good_init = FALSE;
171 }
172 return is_good_init;
173 }
174
175
176
177 void
178 mc_skin_deinit (void)
179 {
180 tty_color_free_all ();
181
182 MC_PTR_FREE (mc_skin__default.name);
183 g_hash_table_destroy (mc_skin__default.colors);
184 mc_skin__default.colors = NULL;
185
186 MC_PTR_FREE (mc_skin__default.description);
187
188 mc_config_deinit (mc_skin__default.config);
189 mc_skin__default.config = NULL;
190 }
191
192
193
194 gchar *
195 mc_skin_get (const gchar *group, const gchar *key, const gchar *default_value)
196 {
197 if (mc_global.tty.ugly_line_drawing)
198 return g_strdup (default_value);
199
200 return mc_config_get_string_strict (mc_skin__default.config, group, key, default_value);
201 }
202
203