root/lib/tty/color.c

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

DEFINITIONS

This source file includes following definitions.
  1. mc_color__deinit
  2. tty_color_free_temp_cb
  3. tty_color_get_next_cpn_cb
  4. tty_color_get_next__color_pair_number
  5. tty_init_colors
  6. tty_colors_done
  7. tty_use_colors
  8. tty_try_alloc_color_pair
  9. tty_color_free_temp
  10. tty_color_free_all
  11. tty_color_set_defaults

   1 /*
   2    Color setup.
   3    Interface functions.
   4 
   5    Copyright (C) 1994-2025
   6    Free Software Foundation, Inc.
   7 
   8    Written by:
   9    Andrew Borodin <aborodin@vmail.ru>, 2009
  10    Slava Zanko <slavazanko@gmail.com>, 2009
  11    Egmont Koblinger <egmont@gmail.com>, 2010
  12 
  13    This file is part of the Midnight Commander.
  14 
  15    The Midnight Commander is free software: you can redistribute it
  16    and/or modify it under the terms of the GNU General Public License as
  17    published by the Free Software Foundation, either version 3 of the License,
  18    or (at your option) any later version.
  19 
  20    The Midnight Commander is distributed in the hope that it will be useful,
  21    but WITHOUT ANY WARRANTY; without even the implied warranty of
  22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23    GNU General Public License for more details.
  24 
  25    You should have received a copy of the GNU General Public License
  26    along with this program.  If not, see <https://www.gnu.org/licenses/>.
  27  */
  28 
  29 /** \file color.c
  30  *  \brief Source: color setup
  31  */
  32 
  33 #include <config.h>
  34 
  35 #include <stdio.h>
  36 #include <stdlib.h>
  37 #include <string.h>
  38 #include <sys/types.h>  // size_t
  39 
  40 #include "lib/global.h"
  41 
  42 #include "tty.h"
  43 #include "color.h"
  44 
  45 #include "color-internal.h"
  46 
  47 /*** global variables ****************************************************************************/
  48 
  49 static tty_color_pair_t tty_color_defaults = {
  50     .fg = NULL, .bg = NULL, .attrs = NULL, .pair_index = 0
  51 };
  52 
  53 /* Set if we are actually using colors */
  54 gboolean use_colors = FALSE;
  55 
  56 /*** file scope macro definitions ****************************************************************/
  57 
  58 /*** file scope type declarations ****************************************************************/
  59 
  60 /*** forward declarations (file scope functions) *************************************************/
  61 
  62 /*** file scope variables ************************************************************************/
  63 
  64 static GHashTable *mc_tty_color__hashtable = NULL;
  65 
  66 /* --------------------------------------------------------------------------------------------- */
  67 /*** file scope functions ************************************************************************/
  68 /* --------------------------------------------------------------------------------------------- */
  69 
  70 static void
  71 mc_color__deinit (tty_color_pair_t *color)
     /* [previous][next][first][last][top][bottom][index][help]  */
  72 {
  73     g_free (color->fg);
  74     g_free (color->bg);
  75     g_free (color->attrs);
  76 }
  77 
  78 /* --------------------------------------------------------------------------------------------- */
  79 
  80 static gboolean
  81 tty_color_free_temp_cb (gpointer key, gpointer value, gpointer user_data)
     /* [previous][next][first][last][top][bottom][index][help]  */
  82 {
  83     (void) key;
  84     (void) user_data;
  85 
  86     return ((tty_color_lib_pair_t *) value)->is_temp;
  87 }
  88 
  89 /* --------------------------------------------------------------------------------------------- */
  90 
  91 static gboolean
  92 tty_color_get_next_cpn_cb (gpointer key, gpointer value, gpointer user_data)
     /* [previous][next][first][last][top][bottom][index][help]  */
  93 {
  94     tty_color_lib_pair_t *mc_color_pair = (tty_color_lib_pair_t *) value;
  95     size_t cp = GPOINTER_TO_SIZE (user_data);
  96 
  97     (void) key;
  98 
  99     return (cp == mc_color_pair->pair_index);
 100 }
 101 
 102 /* --------------------------------------------------------------------------------------------- */
 103 
 104 static size_t
 105 tty_color_get_next__color_pair_number (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 106 {
 107     size_t cp_count, cp;
 108 
 109     cp_count = g_hash_table_size (mc_tty_color__hashtable);
 110     for (cp = 0; cp < cp_count; cp++)
 111         if (g_hash_table_find (mc_tty_color__hashtable, tty_color_get_next_cpn_cb,
 112                                GSIZE_TO_POINTER (cp))
 113             == NULL)
 114             break;
 115 
 116     return cp;
 117 }
 118 
 119 /* --------------------------------------------------------------------------------------------- */
 120 /*** public functions ****************************************************************************/
 121 /* --------------------------------------------------------------------------------------------- */
 122 
 123 void
 124 tty_init_colors (gboolean disable, gboolean force)
     /* [previous][next][first][last][top][bottom][index][help]  */
 125 {
 126     tty_color_init_lib (disable, force);
 127     mc_tty_color__hashtable = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
 128 }
 129 
 130 /* --------------------------------------------------------------------------------------------- */
 131 
 132 void
 133 tty_colors_done (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 134 {
 135     tty_color_deinit_lib ();
 136     mc_color__deinit (&tty_color_defaults);
 137     g_hash_table_destroy (mc_tty_color__hashtable);
 138 }
 139 
 140 /* --------------------------------------------------------------------------------------------- */
 141 
 142 gboolean
 143 tty_use_colors (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 144 {
 145     return use_colors;
 146 }
 147 
 148 /* --------------------------------------------------------------------------------------------- */
 149 
 150 int
 151 tty_try_alloc_color_pair (const tty_color_pair_t *color, gboolean is_temp)
     /* [previous][next][first][last][top][bottom][index][help]  */
 152 {
 153     gboolean is_base;
 154     gchar *color_pair;
 155     tty_color_lib_pair_t *mc_color_pair;
 156     int ifg, ibg, attr;
 157 
 158     is_base = (color->fg == NULL || strcmp (color->fg, "base") == 0);
 159     ifg = tty_color_get_index_by_name (is_base ? tty_color_defaults.fg : color->fg);
 160     is_base = (color->bg == NULL || strcmp (color->bg, "base") == 0);
 161     ibg = tty_color_get_index_by_name (is_base ? tty_color_defaults.bg : color->bg);
 162     is_base = (color->attrs == NULL || strcmp (color->attrs, "base") == 0);
 163     attr = tty_attr_get_bits (is_base ? tty_color_defaults.attrs : color->attrs);
 164 
 165     color_pair = g_strdup_printf ("%d.%d.%d", ifg, ibg, attr);
 166     if (color_pair == NULL)
 167         return 0;
 168 
 169     mc_color_pair = (tty_color_lib_pair_t *) g_hash_table_lookup (mc_tty_color__hashtable,
 170                                                                   (gpointer) color_pair);
 171 
 172     if (mc_color_pair != NULL)
 173     {
 174         g_free (color_pair);
 175         return mc_color_pair->pair_index;
 176     }
 177 
 178     mc_color_pair = g_try_new0 (tty_color_lib_pair_t, 1);
 179     if (mc_color_pair == NULL)
 180     {
 181         g_free (color_pair);
 182         return 0;
 183     }
 184 
 185     mc_color_pair->is_temp = is_temp;
 186     mc_color_pair->fg = ifg;
 187     mc_color_pair->bg = ibg;
 188     mc_color_pair->attr = attr;
 189     mc_color_pair->pair_index = tty_color_get_next__color_pair_number ();
 190 
 191     tty_color_try_alloc_lib_pair (mc_color_pair);
 192 
 193     g_hash_table_insert (mc_tty_color__hashtable, (gpointer) color_pair, (gpointer) mc_color_pair);
 194 
 195     return mc_color_pair->pair_index;
 196 }
 197 
 198 /* --------------------------------------------------------------------------------------------- */
 199 
 200 void
 201 tty_color_free_temp (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 202 {
 203     g_hash_table_foreach_remove (mc_tty_color__hashtable, tty_color_free_temp_cb, NULL);
 204 }
 205 
 206 /* --------------------------------------------------------------------------------------------- */
 207 
 208 void
 209 tty_color_free_all (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 210 {
 211     g_hash_table_remove_all (mc_tty_color__hashtable);
 212 }
 213 
 214 /* --------------------------------------------------------------------------------------------- */
 215 
 216 void
 217 tty_color_set_defaults (const tty_color_pair_t *color)
     /* [previous][next][first][last][top][bottom][index][help]  */
 218 {
 219     mc_color__deinit (&tty_color_defaults);
 220 
 221     tty_color_defaults.fg = g_strdup (color->fg);
 222     tty_color_defaults.bg = g_strdup (color->bg);
 223     tty_color_defaults.attrs = g_strdup (color->attrs);
 224     tty_color_defaults.pair_index = 0;
 225 }
 226 
 227 /* --------------------------------------------------------------------------------------------- */

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