Manual pages: mcmcdiffmceditmcview

root/lib/skin/ini-file.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. mc_skin_get_list_from_dir
  2. string_array_comparator
  3. mc_skin_ini_file_load_search_in_dir
  4. mc_skin_list
  5. mc_skin_ini_file_load
  6. mc_skin_ini_file_parse
  7. mc_skin_set_hardcoded_skin

   1 /*
   2    Skins engine.
   3    Reading and parse ini-files
   4 
   5    Copyright (C) 2009-2026
   6    Free Software Foundation, Inc.
   7 
   8    Written by:
   9    Slava Zanko <slavazanko@gmail.com>, 2009.
  10 
  11    This file is part of the Midnight Commander.
  12 
  13    The Midnight Commander is free software: you can redistribute it
  14    and/or modify it under the terms of the GNU General Public License as
  15    published by the Free Software Foundation, either version 3 of the License,
  16    or (at your option) any later version.
  17 
  18    The Midnight Commander is distributed in the hope that it will be useful,
  19    but WITHOUT ANY WARRANTY; without even the implied warranty of
  20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21    GNU General Public License for more details.
  22 
  23    You should have received a copy of the GNU General Public License
  24    along with this program.  If not, see <https://www.gnu.org/licenses/>.
  25  */
  26 
  27 #include <config.h>
  28 
  29 #include <string.h>
  30 
  31 #include "lib/global.h"  // <glib.h>
  32 
  33 #include "internal.h"
  34 #include "lib/fileloc.h"
  35 #include "lib/util.h"  // exist_file()
  36 
  37 /*** global variables ****************************************************************************/
  38 
  39 /*** file scope macro definitions ****************************************************************/
  40 
  41 /*** file scope type declarations ****************************************************************/
  42 
  43 /*** forward declarations (file scope functions) *************************************************/
  44 
  45 /*** file scope variables ************************************************************************/
  46 
  47 /* --------------------------------------------------------------------------------------------- */
  48 /*** file scope functions ************************************************************************/
  49 /* --------------------------------------------------------------------------------------------- */
  50 
  51 static void
  52 mc_skin_get_list_from_dir (const gchar *base_dir, GPtrArray *list)
     /* [previous][next][first][last][top][bottom][index][help]  */
  53 {
  54     gchar *name;
  55     GDir *dir;
  56 
  57     name = g_build_filename (base_dir, MC_SKINS_DIR, (char *) NULL);
  58     dir = g_dir_open (name, 0, NULL);
  59     g_free (name);
  60 
  61     if (dir != NULL)
  62     {
  63         const gchar *cname;
  64 
  65         while ((cname = g_dir_read_name (dir)) != NULL)
  66         {
  67             gchar *sname;
  68             size_t slen;
  69             unsigned int i;
  70 
  71             slen = strlen (cname);
  72 
  73             if (slen <= 4 || strcmp (cname + slen - 4, ".ini") != 0)
  74                 continue;
  75 
  76             sname = g_strndup (cname, slen - 4);
  77 
  78             for (i = 0; i < list->len; i++)
  79                 if (strcmp (sname, g_ptr_array_index (list, i)) == 0)
  80                     break;
  81 
  82             if (i < list->len)
  83                 g_free (sname);
  84             else
  85                 g_ptr_array_add (list, sname);
  86         }
  87 
  88         g_dir_close (dir);
  89     }
  90 }
  91 
  92 /* --------------------------------------------------------------------------------------------- */
  93 
  94 static int
  95 string_array_comparator (gconstpointer a, gconstpointer b)
     /* [previous][next][first][last][top][bottom][index][help]  */
  96 {
  97     return strcmp (*(char *const *) a, *(char *const *) b);
  98 }
  99 
 100 /* --------------------------------------------------------------------------------------------- */
 101 
 102 static gboolean
 103 mc_skin_ini_file_load_search_in_dir (mc_skin_t *mc_skin, const gchar *base_dir)
     /* [previous][next][first][last][top][bottom][index][help]  */
 104 {
 105     char *file_name, *file_name2;
 106 
 107     file_name = g_build_filename (base_dir, MC_SKINS_DIR, mc_skin->name, (char *) NULL);
 108     if (exist_file (file_name))
 109     {
 110         mc_skin->config = mc_config_init (file_name, TRUE);
 111         g_free (file_name);
 112         return (mc_skin->config != NULL);
 113     }
 114     g_free (file_name);
 115 
 116     file_name2 = g_strdup_printf ("%s.ini", mc_skin->name);
 117     file_name = g_build_filename (base_dir, MC_SKINS_DIR, file_name2, (char *) NULL);
 118     g_free (file_name2);
 119 
 120     if (exist_file (file_name))
 121     {
 122         mc_skin->config = mc_config_init (file_name, TRUE);
 123         g_free (file_name);
 124         return (mc_skin->config != NULL);
 125     }
 126     g_free (file_name);
 127     return FALSE;
 128 }
 129 
 130 /* --------------------------------------------------------------------------------------------- */
 131 /*** public functions ****************************************************************************/
 132 /* --------------------------------------------------------------------------------------------- */
 133 
 134 GPtrArray *
 135 mc_skin_list (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 136 {
 137     GPtrArray *list;
 138 
 139     list = g_ptr_array_new_with_free_func (g_free);
 140     mc_skin_get_list_from_dir (mc_config_get_data_path (), list);
 141     mc_skin_get_list_from_dir (mc_global.sysconfig_dir, list);
 142     mc_skin_get_list_from_dir (mc_global.share_data_dir, list);
 143     g_ptr_array_sort (list, (GCompareFunc) string_array_comparator);
 144 
 145     return list;
 146 }
 147 
 148 /* --------------------------------------------------------------------------------------------- */
 149 
 150 gboolean
 151 mc_skin_ini_file_load (mc_skin_t *mc_skin)
     /* [previous][next][first][last][top][bottom][index][help]  */
 152 {
 153     char *file_name;
 154 
 155     file_name = g_path_get_basename (mc_skin->name);
 156     if (file_name == NULL)
 157         return FALSE;
 158 
 159     if (strcmp (file_name, mc_skin->name) != 0)
 160     {
 161         g_free (file_name);
 162         if (!g_path_is_absolute (mc_skin->name))
 163             return FALSE;
 164         mc_skin->config = mc_config_init (mc_skin->name, TRUE);
 165         return (mc_skin->config != NULL);
 166     }
 167     g_free (file_name);
 168 
 169     // ${XDG_DATA_HOME}/mc/skins/
 170     if (mc_skin_ini_file_load_search_in_dir (mc_skin, mc_config_get_data_path ()))
 171         return TRUE;
 172 
 173     // /etc/mc/skins/
 174     if (mc_skin_ini_file_load_search_in_dir (mc_skin, mc_global.sysconfig_dir))
 175         return TRUE;
 176 
 177     // /usr/share/mc/skins/
 178     return mc_skin_ini_file_load_search_in_dir (mc_skin, mc_global.share_data_dir);
 179 }
 180 
 181 /* --------------------------------------------------------------------------------------------- */
 182 
 183 gboolean
 184 mc_skin_ini_file_parse (mc_skin_t *mc_skin)
     /* [previous][next][first][last][top][bottom][index][help]  */
 185 {
 186     mc_skin->description =
 187         mc_config_get_string (mc_skin->config, "skin", "description", "- no description -");
 188     if (!mc_skin_color_parse_ini_file (mc_skin))
 189         return FALSE;
 190 
 191     mc_skin_lines_parse_ini_file (mc_skin);
 192     mc_skin->have_256_colors = mc_config_get_bool (mc_skin->config, "skin", "256colors", FALSE);
 193     mc_skin->have_true_colors = mc_config_get_bool (mc_skin->config, "skin", "truecolors", FALSE);
 194 
 195     return TRUE;
 196 }
 197 
 198 /* --------------------------------------------------------------------------------------------- */
 199 
 200 void
 201 mc_skin_set_hardcoded_skin (mc_skin_t *mc_skin)
     /* [previous][next][first][last][top][bottom][index][help]  */
 202 {
 203     mc_skin->config = mc_config_init (NULL, TRUE);
 204 
 205     mc_config_set_string (mc_skin->config, "skin", "description", "hardcoded skin");
 206 
 207     mc_skin_hardcoded_ugly_lines (mc_skin);
 208     mc_skin_hardcoded_blackwhite_colors (mc_skin);
 209 }
 210 
 211 /* --------------------------------------------------------------------------------------------- */

/* [previous][next][first][last][top][bottom][index][help]  */