windows: initial commit for terminal colors

This commit is contained in:
Wim Taymans 2009-03-18 17:30:12 +01:00
parent 8af9d58ea7
commit 0c059ad2de
3 changed files with 168 additions and 0 deletions

View file

@ -117,6 +117,10 @@
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef G_OS_WIN32
#define WIN32_LEAN_AND_MEAN /* prevents from including too many things */
#include <windows.h> /* GetStdHandle, windows console */
#endif
#include "gst-i18n-lib.h"
#include <locale.h> /* for LC_ALL */
@ -1170,6 +1174,20 @@ gst_debug_help (void)
GstDebugCategory *cat = (GstDebugCategory *) walk->data;
if (gst_debug_is_colored ()) {
#ifdef G_OS_WIN32
gint color = gst_debug_construct_win_color (cat->color);
const gint clear = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color);
g_print ("%-20s", gst_debug_category_get_name (cat));
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), clear);
g_print (" %1d %s ", gst_debug_category_get_threshold (cat),
gst_debug_level_get_name (gst_debug_category_get_threshold (cat)));
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color);
g_print ("%s", gst_debug_category_get_description (cat));
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), clear);
g_print ("\n");
#else /* G_OS_WIN32 */
gchar *color = gst_debug_construct_term_color (cat->color);
g_print ("%s%-20s\033[00m %1d %s %s%s\033[00m\n",
@ -1179,6 +1197,7 @@ gst_debug_help (void)
gst_debug_level_get_name (gst_debug_category_get_threshold (cat)),
color, gst_debug_category_get_description (cat));
g_free (color);
#endif /* G_OS_WIN32 */
} else {
g_print ("%-20s %1d %s %s\n", gst_debug_category_get_name (cat),
gst_debug_category_get_threshold (cat),

View file

@ -104,6 +104,10 @@
# include <process.h> /* getpid on win32 */
#endif
#include <string.h> /* G_VA_COPY */
#ifdef G_OS_WIN32
# define WIN32_LEAN_AND_MEAN /* prevents from including too many things */
# include <windows.h> /* GetStdHandle, windows console */
#endif
#include "gst_private.h"
#include "gstutils.h"
@ -576,6 +580,8 @@ gst_debug_print_segment (gpointer ptr)
#endif /* HAVE_PRINTF_EXTENSION */
#ifndef G_OS_WIN32
/**
* gst_debug_construct_term_color:
* @colorinfo: the color info
@ -708,6 +714,144 @@ gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
g_free (obj);
}
#else /* !G_OS_WIN32 */
/**
* gst_debug_construct_win_color:
* @colorinfo: the color info
*
* Constructs an integer that can be used for getting the desired color in
* windows' terminals (cmd.exe). As there is no mean to underline, we simply
* ignore this attribute.
*
* Returns: an integer containing the color definition
*/
gint
gst_debug_construct_win_color (guint colorinfo)
{
gint color = 0;
static const guchar ansi_to_win_fg[8] = {
0, /* black */
FOREGROUND_RED, /* red */
FOREGROUND_GREEN, /* green */
FOREGROUND_RED | FOREGROUND_GREEN, /* yellow */
FOREGROUND_BLUE, /* blue */
FOREGROUND_RED | FOREGROUND_BLUE, /* magenta */
FOREGROUND_GREEN | FOREGROUND_BLUE, /* cyan */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE /* white */
};
static const guchar ansi_to_win_bg[8] = {
0,
BACKGROUND_RED,
BACKGROUND_GREEN,
BACKGROUND_RED | BACKGROUND_GREEN,
BACKGROUND_BLUE,
BACKGROUND_RED | BACKGROUND_BLUE,
BACKGROUND_GREEN | FOREGROUND_BLUE,
BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE
};
/* we draw black as white, as cmd.exe can only have black bg */
if (colorinfo == 0) {
return ansi_to_win_fg[7];
}
if (colorinfo & GST_DEBUG_BOLD) {
color |= FOREGROUND_INTENSITY;
}
if (colorinfo & GST_DEBUG_FG_MASK) {
color |= ansi_to_win_fg[colorinfo & GST_DEBUG_FG_MASK];
}
if (colorinfo & GST_DEBUG_BG_MASK) {
color |= ansi_to_win_bg[(colorinfo & GST_DEBUG_BG_MASK) >> 4];
}
return color;
}
void
gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
const gchar * file, const gchar * function, gint line,
GObject * object, GstDebugMessage * message, gpointer unused)
{
gint pidcolor, levelcolor, color, pid;
const gint clear = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
gchar *obj = NULL;
GstClockTime elapsed;
gboolean free_obj = TRUE;
static const guchar levelcolormap[] = {
/* GST_LEVEL_NONE */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
/* GST_LEVEL_ERROR */
FOREGROUND_RED | FOREGROUND_INTENSITY,
/* GST_LEVEL_WARNING */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
/* GST_LEVEL_INFO */
FOREGROUND_GREEN | FOREGROUND_INTENSITY,
/* GST_LEVEL_DEBUG */
FOREGROUND_GREEN | FOREGROUND_BLUE,
/* GST_LEVEL_LOG */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
};
static const guchar available_colors[6] = {
FOREGROUND_RED, FOREGROUND_GREEN, FOREGROUND_RED | FOREGROUND_GREEN,
FOREGROUND_BLUE, FOREGROUND_RED | FOREGROUND_BLUE,
FOREGROUND_GREEN | FOREGROUND_BLUE,
};
if (level > gst_debug_category_get_threshold (category))
return;
pid = getpid ();
if (object) {
obj = gst_debug_print_object (object);
} else {
obj = "\0";
free_obj = FALSE;
}
elapsed = GST_CLOCK_DIFF (_priv_gst_info_start_time,
gst_util_get_timestamp ());
/* color info */
if (gst_debug_is_colored ()) {
/* timestamp */
g_printerr ("%" GST_TIME_FORMAT " ", GST_TIME_ARGS (elapsed));
/* pid */
pidcolor = available_colors[pid % 6];
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), pidcolor);
g_printerr ("%5d", pid);
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), clear);
/* thread */
g_printerr (" %p ", g_thread_self ());
/* level */
levelcolor = levelcolormap[level];
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), levelcolor);
g_printerr ("%s ", gst_debug_level_get_name (level));
/* category */
color = gst_debug_construct_win_color (gst_debug_category_get_color
(category));
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), color);
g_printerr ("%20s %s:%d:%s:%s", gst_debug_category_get_name (category),
file, line, function, obj);
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), clear);
/* message */
g_printerr (" %s\n", gst_debug_message_get (message));
} else {
g_printerr ("%" GST_TIME_FORMAT
" %5d %p %s %20s %s:%d:%s:%s %s\n", GST_TIME_ARGS (elapsed), pid,
g_thread_self (), gst_debug_level_get_name (level),
gst_debug_category_get_name (category), file, line, function, obj,
gst_debug_message_get (message));
}
if (free_obj)
g_free (obj);
}
#endif /* !G_OS_WIN32 */
/**
* gst_debug_level_get_name:
* @level: the level to get the name for
@ -946,6 +1090,7 @@ gst_debug_get_default_threshold (void)
{
return (GstDebugLevel) g_atomic_int_get (&__default_level);
}
static void
gst_debug_reset_threshold (gpointer category, gpointer unused)
{
@ -970,6 +1115,7 @@ gst_debug_reset_threshold (gpointer category, gpointer unused)
exit:
g_static_mutex_unlock (&__level_name_mutex);
}
static void
gst_debug_reset_all_thresholds (void)
{
@ -977,6 +1123,7 @@ gst_debug_reset_all_thresholds (void)
g_slist_foreach (__categories, gst_debug_reset_threshold, NULL);
g_static_mutex_unlock (&__cat_mutex);
}
static void
for_each_threshold_by_entry (gpointer data, gpointer user_data)
{

View file

@ -398,6 +398,7 @@ GSList *
gst_debug_get_all_categories (void);
gchar * gst_debug_construct_term_color (guint colorinfo);
gint gst_debug_construct_win_color (guint colorinfo);
/**
@ -963,6 +964,7 @@ guint gst_debug_remove_log_function_by_data (gpointer data);
#define gst_debug_category_get_description(cat) ("")
#define gst_debug_get_all_categories() (NULL)
#define gst_debug_construct_term_color(colorinfo) (g_strdup ("00"))
#define gst_debug_construct_win_color(colorinfo) (0)
#ifdef G_HAVE_ISO_VARARGS