nmcli: add support for terminal formatting, like bold, dim, underline, etc.
This commit is contained in:
@@ -7144,7 +7144,8 @@ property_edit_submenu (NmCli *nmc,
|
|||||||
gboolean temp_changes;
|
gboolean temp_changes;
|
||||||
gboolean removed;
|
gboolean removed;
|
||||||
|
|
||||||
prompt = nmc_colorize (nmc->editor_prompt_color, "nmcli %s.%s> ",
|
prompt = nmc_colorize (nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL,
|
||||||
|
"nmcli %s.%s> ",
|
||||||
nm_setting_get_name (curr_setting), prop_name);
|
nm_setting_get_name (curr_setting), prop_name);
|
||||||
|
|
||||||
while (cmd_property_loop) {
|
while (cmd_property_loop) {
|
||||||
@@ -7492,7 +7493,7 @@ menu_switch_to_level0 (NmcEditorMenuContext *menu_ctx,
|
|||||||
{
|
{
|
||||||
menu_ctx->level = 0;
|
menu_ctx->level = 0;
|
||||||
g_free (menu_ctx->main_prompt);
|
g_free (menu_ctx->main_prompt);
|
||||||
menu_ctx->main_prompt = nmc_colorize (prompt_color, "%s", prompt);
|
menu_ctx->main_prompt = nmc_colorize (prompt_color, NMC_TERM_FORMAT_NORMAL, "%s", prompt);
|
||||||
menu_ctx->curr_setting = NULL;
|
menu_ctx->curr_setting = NULL;
|
||||||
g_strfreev (menu_ctx->valid_props);
|
g_strfreev (menu_ctx->valid_props);
|
||||||
menu_ctx->valid_props = NULL;
|
menu_ctx->valid_props = NULL;
|
||||||
@@ -7508,7 +7509,8 @@ menu_switch_to_level1 (NmcEditorMenuContext *menu_ctx,
|
|||||||
{
|
{
|
||||||
menu_ctx->level = 1;
|
menu_ctx->level = 1;
|
||||||
g_free (menu_ctx->main_prompt);
|
g_free (menu_ctx->main_prompt);
|
||||||
menu_ctx->main_prompt = nmc_colorize (prompt_color, "nmcli %s> ", setting_name);
|
menu_ctx->main_prompt = nmc_colorize (prompt_color, NMC_TERM_FORMAT_NORMAL,
|
||||||
|
"nmcli %s> ", setting_name);
|
||||||
menu_ctx->curr_setting = setting;
|
menu_ctx->curr_setting = setting;
|
||||||
g_strfreev (menu_ctx->valid_props);
|
g_strfreev (menu_ctx->valid_props);
|
||||||
menu_ctx->valid_props = nmc_setting_get_valid_properties (menu_ctx->curr_setting);
|
menu_ctx->valid_props = nmc_setting_get_valid_properties (menu_ctx->curr_setting);
|
||||||
@@ -7542,7 +7544,8 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
|
|||||||
g_print (_("You may edit the following settings: %s\n"), valid_settings_str);
|
g_print (_("You may edit the following settings: %s\n"), valid_settings_str);
|
||||||
|
|
||||||
menu_ctx.level = 0;
|
menu_ctx.level = 0;
|
||||||
menu_ctx.main_prompt = nmc_colorize (nmc->editor_prompt_color, BASE_PROMPT);
|
menu_ctx.main_prompt = nmc_colorize (nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL,
|
||||||
|
BASE_PROMPT);
|
||||||
menu_ctx.curr_setting = NULL;
|
menu_ctx.curr_setting = NULL;
|
||||||
menu_ctx.valid_props = NULL;
|
menu_ctx.valid_props = NULL;
|
||||||
menu_ctx.valid_props_str = NULL;
|
menu_ctx.valid_props_str = NULL;
|
||||||
@@ -8178,9 +8181,11 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
|
|||||||
nmc->editor_prompt_color = color;
|
nmc->editor_prompt_color = color;
|
||||||
g_free (menu_ctx.main_prompt);
|
g_free (menu_ctx.main_prompt);
|
||||||
if (menu_ctx.level == 0)
|
if (menu_ctx.level == 0)
|
||||||
menu_ctx.main_prompt = nmc_colorize (nmc->editor_prompt_color, BASE_PROMPT);
|
menu_ctx.main_prompt = nmc_colorize (nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL,
|
||||||
|
BASE_PROMPT);
|
||||||
else
|
else
|
||||||
menu_ctx.main_prompt = nmc_colorize (nmc->editor_prompt_color, "nmcli %s> ",
|
menu_ctx.main_prompt = nmc_colorize (nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL,
|
||||||
|
"nmcli %s> ",
|
||||||
nm_setting_get_name (menu_ctx.curr_setting));
|
nm_setting_get_name (menu_ctx.curr_setting));
|
||||||
}
|
}
|
||||||
} else if (!cmd_arg_p) {
|
} else if (!cmd_arg_p) {
|
||||||
|
@@ -80,6 +80,16 @@ typedef enum {
|
|||||||
NMC_TERM_COLOR_WHITE = 8
|
NMC_TERM_COLOR_WHITE = 8
|
||||||
} NmcTermColor;
|
} NmcTermColor;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NMC_TERM_FORMAT_NORMAL,
|
||||||
|
NMC_TERM_FORMAT_BOLD,
|
||||||
|
NMC_TERM_FORMAT_DIM,
|
||||||
|
NMC_TERM_FORMAT_UNDERLINE,
|
||||||
|
NMC_TERM_FORMAT_BLINK,
|
||||||
|
NMC_TERM_FORMAT_REVERSE,
|
||||||
|
NMC_TERM_FORMAT_HIDDEN,
|
||||||
|
} NmcTermFormat;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NMC_PRINT_TERSE = 0,
|
NMC_PRINT_TERSE = 0,
|
||||||
NMC_PRINT_NORMAL = 1,
|
NMC_PRINT_NORMAL = 1,
|
||||||
@@ -103,6 +113,7 @@ typedef struct _NmcOutputField {
|
|||||||
gboolean free_value; /* Whether to free the value */
|
gboolean free_value; /* Whether to free the value */
|
||||||
guint32 flags; /* Flags - whether and how to print values/field names/headers */
|
guint32 flags; /* Flags - whether and how to print values/field names/headers */
|
||||||
NmcTermColor color; /* Use this color to print value */
|
NmcTermColor color; /* Use this color to print value */
|
||||||
|
NmcTermFormat color_fmt; /* Use this terminal format to print value */
|
||||||
} NmcOutputField;
|
} NmcOutputField;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@@ -307,24 +307,52 @@ nmc_term_color_sequence (NmcTermColor color)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
nmc_term_format_sequence (NmcTermFormat format)
|
||||||
|
{
|
||||||
|
switch (format) {
|
||||||
|
case NMC_TERM_FORMAT_BOLD:
|
||||||
|
return "\33[1m";
|
||||||
|
break;
|
||||||
|
case NMC_TERM_FORMAT_DIM:
|
||||||
|
return "\33[2m";
|
||||||
|
break;
|
||||||
|
case NMC_TERM_FORMAT_UNDERLINE:
|
||||||
|
return "\33[4m";
|
||||||
|
break;
|
||||||
|
case NMC_TERM_FORMAT_BLINK:
|
||||||
|
return "\33[5m";
|
||||||
|
break;
|
||||||
|
case NMC_TERM_FORMAT_REVERSE:
|
||||||
|
return "\33[7m";
|
||||||
|
break;
|
||||||
|
case NMC_TERM_FORMAT_HIDDEN:
|
||||||
|
return "\33[8m";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
nmc_colorize (NmcTermColor color, const char *fmt, ...)
|
nmc_colorize (NmcTermColor color, NmcTermFormat format, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
char *str, *colored;
|
char *str, *colored;
|
||||||
const char *ansi_color, *color_end;
|
const char *ansi_color, *color_end, *ansi_fmt, *format_end;
|
||||||
|
static const char *end_seq = "\33[0m";
|
||||||
|
|
||||||
va_start (args, fmt);
|
va_start (args, fmt);
|
||||||
str = g_strdup_vprintf (fmt, args);
|
str = g_strdup_vprintf (fmt, args);
|
||||||
va_end (args);
|
va_end (args);
|
||||||
|
|
||||||
ansi_color = nmc_term_color_sequence (color);
|
ansi_color = nmc_term_color_sequence (color);
|
||||||
if (*ansi_color)
|
ansi_fmt = nmc_term_format_sequence (format);
|
||||||
color_end = "\33[0m";
|
color_end = *ansi_color ? end_seq : "";
|
||||||
else
|
format_end = *ansi_fmt ? end_seq : "";
|
||||||
color_end = "";
|
|
||||||
|
|
||||||
colored = g_strdup_printf ("%s%s%s", ansi_color, str, color_end);
|
colored = g_strdup_printf ("%s%s%s%s%s", ansi_fmt, ansi_color, str, color_end, format_end);
|
||||||
g_free (str);
|
g_free (str);
|
||||||
return colored;
|
return colored;
|
||||||
}
|
}
|
||||||
@@ -715,6 +743,16 @@ set_val_color_all (NmcOutputField fields_array[], NmcTermColor color)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
set_val_color_fmt_all (NmcOutputField fields_array[], NmcTermFormat format)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; fields_array[i].name; i++) {
|
||||||
|
fields_array[i].color_fmt = format;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free 'value' members in array of NmcOutputField
|
* Free 'value' members in array of NmcOutputField
|
||||||
*/
|
*/
|
||||||
@@ -935,14 +973,15 @@ nmc_empty_output_fields (NmCli *nmc)
|
|||||||
static char *
|
static char *
|
||||||
colorize_string (gboolean colorize,
|
colorize_string (gboolean colorize,
|
||||||
NmcTermColor color,
|
NmcTermColor color,
|
||||||
|
NmcTermFormat color_fmt,
|
||||||
const char *str,
|
const char *str,
|
||||||
gboolean *dealloc)
|
gboolean *dealloc)
|
||||||
{
|
{
|
||||||
char *out;
|
char *out;
|
||||||
|
|
||||||
if ( colorize
|
if ( colorize
|
||||||
&& (color != NMC_TERM_COLOR_NORMAL)) {
|
&& (color != NMC_TERM_COLOR_NORMAL || color_fmt != NMC_TERM_FORMAT_NORMAL)) {
|
||||||
out = nmc_colorize (color, str);
|
out = nmc_colorize (color, color_fmt, str);
|
||||||
*dealloc = TRUE;
|
*dealloc = TRUE;
|
||||||
} else {
|
} else {
|
||||||
out = (char *) str;
|
out = (char *) str;
|
||||||
@@ -972,7 +1011,7 @@ get_value_to_print (NmcOutputField *field,
|
|||||||
free_value = field->value && is_array && !field_name;
|
free_value = field->value && is_array && !field_name;
|
||||||
|
|
||||||
/* colorize the value */
|
/* colorize the value */
|
||||||
out = colorize_string (colorize, field->color, value, &free_out);
|
out = colorize_string (colorize, field->color, field->color_fmt, value, &free_out);
|
||||||
if (free_out) {
|
if (free_out) {
|
||||||
if (free_value)
|
if (free_value)
|
||||||
g_free (value);
|
g_free (value);
|
||||||
@@ -1061,7 +1100,7 @@ print_required_fields (NmCli *nmc, const NmcOutputField field_values[])
|
|||||||
|
|
||||||
for (p = (const char **) field_values[idx].value, j = 1; p && *p; p++, j++) {
|
for (p = (const char **) field_values[idx].value, j = 1; p && *p; p++, j++) {
|
||||||
val = *p ? *p : not_set_str;
|
val = *p ? *p : not_set_str;
|
||||||
print_val = colorize_string (colorize, field_values[idx].color,
|
print_val = colorize_string (colorize, field_values[idx].color, field_values[idx].color_fmt,
|
||||||
val, &free_print_val);
|
val, &free_print_val);
|
||||||
tmp = g_strdup_printf ("%s%s%s[%d]:",
|
tmp = g_strdup_printf ("%s%s%s[%d]:",
|
||||||
section_prefix ? (const char*) field_values[0].value : "",
|
section_prefix ? (const char*) field_values[0].value : "",
|
||||||
@@ -1082,7 +1121,7 @@ print_required_fields (NmCli *nmc, const NmcOutputField field_values[])
|
|||||||
char *print_val;
|
char *print_val;
|
||||||
|
|
||||||
val = val ? val : not_set_str;
|
val = val ? val : not_set_str;
|
||||||
print_val = colorize_string (colorize, field_values[idx].color,
|
print_val = colorize_string (colorize, field_values[idx].color, field_values[idx].color_fmt,
|
||||||
val, &free_print_val);
|
val, &free_print_val);
|
||||||
tmp = g_strdup_printf ("%s%s%s:",
|
tmp = g_strdup_printf ("%s%s%s:",
|
||||||
section_prefix ? hdr_name : "",
|
section_prefix ? hdr_name : "",
|
||||||
|
@@ -67,7 +67,8 @@ char *nmc_ip6_address_as_string (const struct in6_addr *ip, GError **error);
|
|||||||
void nmc_terminal_erase_line (void);
|
void nmc_terminal_erase_line (void);
|
||||||
void nmc_terminal_show_progress (const char *str);
|
void nmc_terminal_show_progress (const char *str);
|
||||||
const char *nmc_term_color_sequence (NmcTermColor color);
|
const char *nmc_term_color_sequence (NmcTermColor color);
|
||||||
char *nmc_colorize (NmcTermColor color, const char * fmt, ...);
|
const char *nmc_term_format_sequence (NmcTermFormat format);
|
||||||
|
char *nmc_colorize (NmcTermColor color, NmcTermFormat format, const char * fmt, ...);
|
||||||
void nmc_filter_out_colors_inplace (char *str);
|
void nmc_filter_out_colors_inplace (char *str);
|
||||||
char *nmc_filter_out_colors (const char *str);
|
char *nmc_filter_out_colors (const char *str);
|
||||||
char *nmc_get_user_input (const char *ask_str);
|
char *nmc_get_user_input (const char *ask_str);
|
||||||
@@ -82,6 +83,7 @@ void set_val_strc (NmcOutputField fields_array[], guint32 index, const char *val
|
|||||||
void set_val_arr (NmcOutputField fields_array[], guint32 index, char **value);
|
void set_val_arr (NmcOutputField fields_array[], guint32 index, char **value);
|
||||||
void set_val_arrc (NmcOutputField fields_array[], guint32 index, const char **value);
|
void set_val_arrc (NmcOutputField fields_array[], guint32 index, const char **value);
|
||||||
void set_val_color_all (NmcOutputField fields_array[], NmcTermColor color);
|
void set_val_color_all (NmcOutputField fields_array[], NmcTermColor color);
|
||||||
|
void set_val_color_fmt_all (NmcOutputField fields_array[], NmcTermFormat format);
|
||||||
void nmc_free_output_field_values (NmcOutputField fields_array[]);
|
void nmc_free_output_field_values (NmcOutputField fields_array[]);
|
||||||
GArray *parse_output_fields (const char *fields_str,
|
GArray *parse_output_fields (const char *fields_str,
|
||||||
const NmcOutputField fields_array[],
|
const NmcOutputField fields_array[],
|
||||||
|
Reference in New Issue
Block a user