mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 20:42:30 +00:00
windows: initial commit for terminal colors
This commit is contained in:
parent
8af9d58ea7
commit
0c059ad2de
3 changed files with 168 additions and 0 deletions
19
gst/gst.c
19
gst/gst.c
|
@ -117,6 +117,10 @@
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#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 "gst-i18n-lib.h"
|
||||||
#include <locale.h> /* for LC_ALL */
|
#include <locale.h> /* for LC_ALL */
|
||||||
|
@ -1170,6 +1174,20 @@ gst_debug_help (void)
|
||||||
GstDebugCategory *cat = (GstDebugCategory *) walk->data;
|
GstDebugCategory *cat = (GstDebugCategory *) walk->data;
|
||||||
|
|
||||||
if (gst_debug_is_colored ()) {
|
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);
|
gchar *color = gst_debug_construct_term_color (cat->color);
|
||||||
|
|
||||||
g_print ("%s%-20s\033[00m %1d %s %s%s\033[00m\n",
|
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)),
|
gst_debug_level_get_name (gst_debug_category_get_threshold (cat)),
|
||||||
color, gst_debug_category_get_description (cat));
|
color, gst_debug_category_get_description (cat));
|
||||||
g_free (color);
|
g_free (color);
|
||||||
|
#endif /* G_OS_WIN32 */
|
||||||
} else {
|
} else {
|
||||||
g_print ("%-20s %1d %s %s\n", gst_debug_category_get_name (cat),
|
g_print ("%-20s %1d %s %s\n", gst_debug_category_get_name (cat),
|
||||||
gst_debug_category_get_threshold (cat),
|
gst_debug_category_get_threshold (cat),
|
||||||
|
|
147
gst/gstinfo.c
147
gst/gstinfo.c
|
@ -104,6 +104,10 @@
|
||||||
# include <process.h> /* getpid on win32 */
|
# include <process.h> /* getpid on win32 */
|
||||||
#endif
|
#endif
|
||||||
#include <string.h> /* G_VA_COPY */
|
#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 "gst_private.h"
|
||||||
#include "gstutils.h"
|
#include "gstutils.h"
|
||||||
|
@ -576,6 +580,8 @@ gst_debug_print_segment (gpointer ptr)
|
||||||
|
|
||||||
#endif /* HAVE_PRINTF_EXTENSION */
|
#endif /* HAVE_PRINTF_EXTENSION */
|
||||||
|
|
||||||
|
#ifndef G_OS_WIN32
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_debug_construct_term_color:
|
* gst_debug_construct_term_color:
|
||||||
* @colorinfo: the color info
|
* @colorinfo: the color info
|
||||||
|
@ -708,6 +714,144 @@ gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
|
||||||
g_free (obj);
|
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:
|
* gst_debug_level_get_name:
|
||||||
* @level: the level to get the name for
|
* @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);
|
return (GstDebugLevel) g_atomic_int_get (&__default_level);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_debug_reset_threshold (gpointer category, gpointer unused)
|
gst_debug_reset_threshold (gpointer category, gpointer unused)
|
||||||
{
|
{
|
||||||
|
@ -970,6 +1115,7 @@ gst_debug_reset_threshold (gpointer category, gpointer unused)
|
||||||
exit:
|
exit:
|
||||||
g_static_mutex_unlock (&__level_name_mutex);
|
g_static_mutex_unlock (&__level_name_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_debug_reset_all_thresholds (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_slist_foreach (__categories, gst_debug_reset_threshold, NULL);
|
||||||
g_static_mutex_unlock (&__cat_mutex);
|
g_static_mutex_unlock (&__cat_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
for_each_threshold_by_entry (gpointer data, gpointer user_data)
|
for_each_threshold_by_entry (gpointer data, gpointer user_data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -398,6 +398,7 @@ GSList *
|
||||||
gst_debug_get_all_categories (void);
|
gst_debug_get_all_categories (void);
|
||||||
|
|
||||||
gchar * gst_debug_construct_term_color (guint colorinfo);
|
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_category_get_description(cat) ("")
|
||||||
#define gst_debug_get_all_categories() (NULL)
|
#define gst_debug_get_all_categories() (NULL)
|
||||||
#define gst_debug_construct_term_color(colorinfo) (g_strdup ("00"))
|
#define gst_debug_construct_term_color(colorinfo) (g_strdup ("00"))
|
||||||
|
#define gst_debug_construct_win_color(colorinfo) (0)
|
||||||
|
|
||||||
#ifdef G_HAVE_ISO_VARARGS
|
#ifdef G_HAVE_ISO_VARARGS
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue