2 Color setup for S_Lang screen library
4 Copyright (C) 1994-2017
5 Free Software Foundation, Inc.
8 Andrew Borodin <aborodin@vmail.ru>, 2009
9 Egmont Koblinger <egmont@gmail.com>, 2010
11 This file is part of the Midnight Commander.
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.
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.
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/>.
27 /** \file color-slang.c
28 * \brief Source: S-Lang-specific color setup
36 #include <sys/types.h> /* size_t */
38 #include "lib/global.h"
39 #include "lib/util.h" /* whitespace() */
41 #include "tty-slang.h"
42 #include "color.h" /* variables */
43 #include "color-internal.h"
45 /*** global variables ****************************************************************************/
47 /*** file scope macro definitions ****************************************************************/
49 /*** file scope type declarations ****************************************************************/
51 /*** file scope variables ************************************************************************/
53 /*** file scope functions ************************************************************************/
54 /* --------------------------------------------------------------------------------------------- */
57 has_colors (gboolean disable
, gboolean force
)
59 mc_tty_color_disable
= disable
;
61 if (force
|| (getenv ("COLORTERM") != NULL
))
62 SLtt_Use_Ansi_Colors
= 1;
64 if (!mc_tty_color_disable
)
66 const char *terminal
= getenv ("TERM");
67 const size_t len
= strlen (terminal
);
68 char *cts
= mc_global
.tty
.color_terminal_string
;
70 /* check mc_global.tty.color_terminal_string */
76 while (whitespace (*cts
))
80 while (*cts
!= '\0' && *cts
!= ',')
86 if ((i
!= 0) && (i
== len
) && (strncmp (s
, terminal
, i
) == 0))
87 SLtt_Use_Ansi_Colors
= 1;
93 return SLtt_Use_Ansi_Colors
;
96 /* --------------------------------------------------------------------------------------------- */
99 mc_tty_color_pair_init_special (tty_color_pair_t
* mc_color_pair
,
100 const char *fg1
, const char *bg1
,
101 const char *fg2
, const char *bg2
, SLtt_Char_Type mask
)
103 if (SLtt_Use_Ansi_Colors
!= 0)
105 if (!mc_tty_color_disable
)
107 SLtt_set_color (mc_color_pair
->pair_index
, (char *) "", (char *) fg1
, (char *) bg1
);
111 SLtt_set_color (mc_color_pair
->pair_index
, (char *) "", (char *) fg2
, (char *) bg2
);
116 SLtt_set_mono (mc_color_pair
->pair_index
, NULL
, mask
);
120 /* --------------------------------------------------------------------------------------------- */
121 /*** public functions ****************************************************************************/
122 /* --------------------------------------------------------------------------------------------- */
125 tty_color_init_lib (gboolean disable
, gboolean force
)
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
)
135 /* --------------------------------------------------------------------------------------------- */
138 tty_color_deinit_lib (void)
142 /* --------------------------------------------------------------------------------------------- */
145 tty_color_try_alloc_pair_lib (tty_color_pair_t
* mc_color_pair
)
147 if (mc_color_pair
->ifg
<= (int) SPEC_A_REVERSE
)
149 switch (mc_color_pair
->ifg
)
152 mc_tty_color_pair_init_special (mc_color_pair
,
153 "black", "white", "black", "lightgray", SLTT_REV_MASK
);
156 mc_tty_color_pair_init_special (mc_color_pair
,
157 "white", "black", "white", "black", SLTT_BOLD_MASK
);
159 case SPEC_A_BOLD_REVERSE
:
160 mc_tty_color_pair_init_special (mc_color_pair
,
162 "white", "white", SLTT_BOLD_MASK
| SLTT_REV_MASK
);
164 case SPEC_A_UNDERLINE
:
165 mc_tty_color_pair_init_special (mc_color_pair
,
166 "white", "black", "white", "black", SLTT_ULINE_MASK
);
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
);
183 /* --------------------------------------------------------------------------------------------- */
186 tty_setcolor (int color
)
188 SLsmg_set_color (color
);
191 /* --------------------------------------------------------------------------------------------- */
193 * Set colorpair by index, don't interpret S-Lang "emulated attributes"
197 tty_lowlevel_setcolor (int color
)
199 SLsmg_set_color (color
& 0x7F);
202 /* --------------------------------------------------------------------------------------------- */
205 tty_set_normal_attrs (void)
207 SLsmg_normal_video ();
210 /* --------------------------------------------------------------------------------------------- */
213 tty_use_256colors (void)
215 return (SLtt_Use_Ansi_Colors
&& SLtt_tgetnum ((char *) "Co") == 256);
218 /* --------------------------------------------------------------------------------------------- */
221 tty_use_truecolors (GError
** error
)
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))
231 g_set_error (error
, MC_ERROR
, -1, _("True color not supported in this slang version."));
235 /* Sanity check that at least 256 colors are supported. */
236 if (!tty_use_256colors ())
238 g_set_error (error
, MC_ERROR
, -1,
239 _("Your terminal doesn't even seem to support 256 colors."));
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))
249 g_set_error (error
, MC_ERROR
, -1,
250 _("Set COLORTERM=truecolor if your terminal really supports true colors."));
257 /* --------------------------------------------------------------------------------------------- */