|
25 | 25 | */
|
26 | 26 |
|
27 | 27 | #include <config.h>
|
| 28 | + |
28 | 29 | #include <string.h>
|
29 | 30 |
|
| 31 | +#include "lib/global.h" /* <glib.h> */ |
| 32 | + |
30 | 33 | #include "internal.h"
|
31 | 34 | #include "lib/fileloc.h"
|
32 | 35 | #include "lib/util.h" /* exist_file() */
|
|
43 | 46 |
|
44 | 47 | /* --------------------------------------------------------------------------------------------- */
|
45 | 48 |
|
| 49 | +static void |
| 50 | +mc_skin_get_list_from_dir (const gchar * base_dir, GPtrArray * list) |
| 51 | +{ |
| 52 | + gchar *name; |
| 53 | + GDir *dir; |
| 54 | + |
| 55 | + name = g_build_filename (base_dir, MC_SKINS_SUBDIR, (char *) NULL); |
| 56 | + dir = g_dir_open (name, 0, NULL); |
| 57 | + g_free (name); |
| 58 | + |
| 59 | + if (dir != NULL) |
| 60 | + { |
| 61 | + while ((name = (gchar *) g_dir_read_name (dir)) != NULL) |
| 62 | + { |
| 63 | + gchar *sname; |
| 64 | + size_t slen; |
| 65 | + unsigned int i; |
| 66 | + |
| 67 | + slen = strlen (name); |
| 68 | + sname = g_strndup (name, slen); |
| 69 | + |
| 70 | + if (slen > 4 && strcmp (sname + slen - 4, ".ini") == 0) |
| 71 | + sname[slen - 4] = '\0'; |
| 72 | + |
| 73 | + for (i = 0; i < list->len; i++) |
| 74 | + if (strcmp (sname, g_ptr_array_index (list, i)) == 0) |
| 75 | + break; |
| 76 | + |
| 77 | + if (i < list->len) |
| 78 | + g_free (sname); |
| 79 | + else |
| 80 | + g_ptr_array_add (list, sname); |
| 81 | + } |
| 82 | + |
| 83 | + g_dir_close (dir); |
| 84 | + } |
| 85 | +} |
| 86 | + |
| 87 | +/* --------------------------------------------------------------------------------------------- */ |
| 88 | + |
| 89 | +static int |
| 90 | +string_array_comparator (gconstpointer a, gconstpointer b) |
| 91 | +{ |
| 92 | + char *aa = *(char **) a; |
| 93 | + char *bb = *(char **) b; |
| 94 | + |
| 95 | + return strcmp (aa, bb); |
| 96 | +} |
| 97 | + |
| 98 | +/* --------------------------------------------------------------------------------------------- */ |
| 99 | + |
46 | 100 | static gboolean
|
47 | 101 | mc_skin_ini_file_load_search_in_dir (mc_skin_t * mc_skin, const gchar * base_dir)
|
48 | 102 | {
|
@@ -75,6 +129,22 @@ mc_skin_ini_file_load_search_in_dir (mc_skin_t * mc_skin, const gchar * base_dir
|
75 | 129 | /*** public functions ****************************************************************************/
|
76 | 130 | /* --------------------------------------------------------------------------------------------- */
|
77 | 131 |
|
| 132 | +GPtrArray * |
| 133 | +mc_skin_list (void) |
| 134 | +{ |
| 135 | + GPtrArray *list; |
| 136 | + |
| 137 | + list = g_ptr_array_new (); |
| 138 | + mc_skin_get_list_from_dir (mc_config_get_data_path (), list); |
| 139 | + mc_skin_get_list_from_dir (mc_global.sysconfig_dir, list); |
| 140 | + mc_skin_get_list_from_dir (mc_global.share_data_dir, list); |
| 141 | + g_ptr_array_sort (list, (GCompareFunc) string_array_comparator); |
| 142 | + |
| 143 | + return list; |
| 144 | +} |
| 145 | + |
| 146 | +/* --------------------------------------------------------------------------------------------- */ |
| 147 | + |
78 | 148 | gboolean
|
79 | 149 | mc_skin_ini_file_load (mc_skin_t * mc_skin)
|
80 | 150 | {
|
|
0 commit comments