color.c 7.4 KB

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