root/lib/tty/color-slang.c

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

DEFINITIONS

This source file includes following definitions.
  1. has_colors
  2. mc_tty_color_pair_init_special
  3. tty_color_init_lib
  4. tty_color_deinit_lib
  5. tty_color_try_alloc_pair_lib
  6. tty_setcolor
  7. tty_lowlevel_setcolor
  8. tty_set_normal_attrs
  9. tty_use_256colors
  10. tty_use_truecolors

   1 /*
   2    Color setup for S_Lang screen library
   3 
   4    Copyright (C) 1994-2019
   5    Free Software Foundation, Inc.
   6 
   7    Written by:
   8    Andrew Borodin <aborodin@vmail.ru>, 2009
   9    Egmont Koblinger <egmont@gmail.com>, 2010
  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 <http://www.gnu.org/licenses/>.
  25  */
  26 
  27 /** \file color-slang.c
  28  *  \brief Source: S-Lang-specific color setup
  29  */
  30 
  31 #include <config.h>
  32 
  33 #include <stdio.h>
  34 #include <stdlib.h>
  35 #include <string.h>
  36 #include <sys/types.h>          /* size_t */
  37 
  38 #include "lib/global.h"
  39 #include "lib/util.h"           /* whitespace() */
  40 
  41 #include "tty-slang.h"
  42 #include "color.h"              /* variables */
  43 #include "color-internal.h"
  44 
  45 /*** global variables ****************************************************************************/
  46 
  47 /*** file scope macro definitions ****************************************************************/
  48 
  49 /*** file scope type declarations ****************************************************************/
  50 
  51 /*** file scope variables ************************************************************************/
  52 
  53 /*** file scope functions ************************************************************************/
  54 /* --------------------------------------------------------------------------------------------- */
  55 
  56 static int
  57 has_colors (gboolean disable, gboolean force)
     /* [previous][next][first][last][top][bottom][index][help]  */
  58 {
  59     mc_tty_color_disable = disable;
  60 
  61     if (force || (getenv ("COLORTERM") != NULL))
  62         SLtt_Use_Ansi_Colors = 1;
  63 
  64     if (!mc_tty_color_disable)
  65     {
  66         const char *terminal = getenv ("TERM");
  67         const size_t len = strlen (terminal);
  68         char *cts = mc_global.tty.color_terminal_string;
  69 
  70         /* check mc_global.tty.color_terminal_string */
  71         while (*cts != '\0')
  72         {
  73             char *s;
  74             size_t i = 0;
  75 
  76             while (whitespace (*cts))
  77                 cts++;
  78             s = cts;
  79 
  80             while (*cts != '\0' && *cts != ',')
  81             {
  82                 cts++;
  83                 i++;
  84             }
  85 
  86             if ((i != 0) && (i == len) && (strncmp (s, terminal, i) == 0))
  87                 SLtt_Use_Ansi_Colors = 1;
  88 
  89             if (*cts == ',')
  90                 cts++;
  91         }
  92     }
  93     return SLtt_Use_Ansi_Colors;
  94 }
  95 
  96 /* --------------------------------------------------------------------------------------------- */
  97 
  98 static void
  99 mc_tty_color_pair_init_special (tty_color_pair_t * mc_color_pair,
     /* [previous][next][first][last][top][bottom][index][help]  */
 100                                 const char *fg1, const char *bg1,
 101                                 const char *fg2, const char *bg2, SLtt_Char_Type mask)
 102 {
 103     if (SLtt_Use_Ansi_Colors != 0)
 104     {
 105         if (!mc_tty_color_disable)
 106         {
 107             SLtt_set_color (mc_color_pair->pair_index, (char *) "", (char *) fg1, (char *) bg1);
 108         }
 109         else
 110         {
 111             SLtt_set_color (mc_color_pair->pair_index, (char *) "", (char *) fg2, (char *) bg2);
 112         }
 113     }
 114     else
 115     {
 116         SLtt_set_mono (mc_color_pair->pair_index, NULL, mask);
 117     }
 118 }
 119 
 120 /* --------------------------------------------------------------------------------------------- */
 121 /*** public functions ****************************************************************************/
 122 /* --------------------------------------------------------------------------------------------- */
 123 
 124 void
 125 tty_color_init_lib (gboolean disable, gboolean force)
     /* [previous][next][first][last][top][bottom][index][help]  */
 126 {
 127     /* FIXME: if S-Lang is used, has_colors() must be called regardless
 128        of whether we are interested in its result */
 129     if (has_colors (disable, force) && !disable)
 130     {
 131         use_colors = TRUE;
 132     }
 133 }
 134 
 135 /* --------------------------------------------------------------------------------------------- */
 136 
 137 void
 138 tty_color_deinit_lib (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 139 {
 140 }
 141 
 142 /* --------------------------------------------------------------------------------------------- */
 143 
 144 void
 145 tty_color_try_alloc_pair_lib (tty_color_pair_t * mc_color_pair)
     /* [previous][next][first][last][top][bottom][index][help]  */
 146 {
 147     if (mc_color_pair->ifg <= (int) SPEC_A_REVERSE)
 148     {
 149         switch (mc_color_pair->ifg)
 150         {
 151         case SPEC_A_REVERSE:
 152             mc_tty_color_pair_init_special (mc_color_pair,
 153                                             "black", "white", "black", "lightgray", SLTT_REV_MASK);
 154             break;
 155         case SPEC_A_BOLD:
 156             mc_tty_color_pair_init_special (mc_color_pair,
 157                                             "white", "black", "white", "black", SLTT_BOLD_MASK);
 158             break;
 159         case SPEC_A_BOLD_REVERSE:
 160             mc_tty_color_pair_init_special (mc_color_pair,
 161                                             "white", "white",
 162                                             "white", "white", SLTT_BOLD_MASK | SLTT_REV_MASK);
 163             break;
 164         case SPEC_A_UNDERLINE:
 165             mc_tty_color_pair_init_special (mc_color_pair,
 166                                             "white", "black", "white", "black", SLTT_ULINE_MASK);
 167             break;
 168         default:
 169             break;
 170         }
 171     }
 172     else
 173     {
 174         const char *fg, *bg;
 175 
 176         fg = tty_color_get_name_by_index (mc_color_pair->ifg);
 177         bg = tty_color_get_name_by_index (mc_color_pair->ibg);
 178         SLtt_set_color (mc_color_pair->pair_index, (char *) "", (char *) fg, (char *) bg);
 179         SLtt_add_color_attribute (mc_color_pair->pair_index, mc_color_pair->attr);
 180     }
 181 }
 182 
 183 /* --------------------------------------------------------------------------------------------- */
 184 
 185 void
 186 tty_setcolor (int color)
     /* [previous][next][first][last][top][bottom][index][help]  */
 187 {
 188     SLsmg_set_color (color);
 189 }
 190 
 191 /* --------------------------------------------------------------------------------------------- */
 192 /**
 193  * Set colorpair by index, don't interpret S-Lang "emulated attributes"
 194  */
 195 
 196 void
 197 tty_lowlevel_setcolor (int color)
     /* [previous][next][first][last][top][bottom][index][help]  */
 198 {
 199     SLsmg_set_color (color & 0x7F);
 200 }
 201 
 202 /* --------------------------------------------------------------------------------------------- */
 203 
 204 void
 205 tty_set_normal_attrs (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 206 {
 207     SLsmg_normal_video ();
 208 }
 209 
 210 /* --------------------------------------------------------------------------------------------- */
 211 
 212 gboolean
 213 tty_use_256colors (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 214 {
 215     return (SLtt_Use_Ansi_Colors && SLtt_tgetnum ((char *) "Co") == 256);
 216 }
 217 
 218 /* --------------------------------------------------------------------------------------------- */
 219 
 220 gboolean
 221 tty_use_truecolors (GError ** error)
     /* [previous][next][first][last][top][bottom][index][help]  */
 222 {
 223     char *colorterm;
 224 
 225     /* True color is supported since slang-2.3.1 on 64-bit machines,
 226        and expected to be supported from slang-3 on 32-bit machines:
 227        http://lists.jedsoft.org/lists/slang-users/2016/0000014.html.
 228        Check for sizeof (long) being 8, exactly as slang does. */
 229     if (SLang_Version < 20301 || (sizeof (long) != 8 && SLang_Version < 30000))
 230     {
 231         g_set_error (error, MC_ERROR, -1, _("True color not supported in this slang version."));
 232         return FALSE;
 233     }
 234 
 235     /* Sanity check that at least 256 colors are supported. */
 236     if (!tty_use_256colors ())
 237     {
 238         g_set_error (error, MC_ERROR, -1,
 239                      _("Your terminal doesn't even seem to support 256 colors."));
 240         return FALSE;
 241     }
 242 
 243     /* Duplicate slang's check so that we can pop up an error message
 244        rather than silently use wrong colors. */
 245     colorterm = getenv ("COLORTERM");
 246     if (colorterm == NULL
 247         || (strcmp (colorterm, "truecolor") != 0 && strcmp (colorterm, "24bit") != 0))
 248     {
 249         g_set_error (error, MC_ERROR, -1,
 250                      _("Set COLORTERM=truecolor if your terminal really supports true colors."));
 251         return FALSE;
 252     }
 253 
 254     return TRUE;
 255 }
 256 
 257 /* --------------------------------------------------------------------------------------------- */

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