diff --git a/clients/cli/connections.c b/clients/cli/connections.c index 5d5ffc00c0..4274abc69f 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -7144,7 +7144,8 @@ property_edit_submenu (NmCli *nmc, gboolean temp_changes; 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); while (cmd_property_loop) { @@ -7492,7 +7493,7 @@ menu_switch_to_level0 (NmcEditorMenuContext *menu_ctx, { menu_ctx->level = 0; 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; g_strfreev (menu_ctx->valid_props); menu_ctx->valid_props = NULL; @@ -7508,7 +7509,8 @@ menu_switch_to_level1 (NmcEditorMenuContext *menu_ctx, { menu_ctx->level = 1; 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; g_strfreev (menu_ctx->valid_props); 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); 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.valid_props = 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; g_free (menu_ctx.main_prompt); 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 - 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)); } } else if (!cmd_arg_p) { diff --git a/clients/cli/nmcli.h b/clients/cli/nmcli.h index 0fb9de3cb5..ee1a86f96e 100644 --- a/clients/cli/nmcli.h +++ b/clients/cli/nmcli.h @@ -80,6 +80,16 @@ typedef enum { NMC_TERM_COLOR_WHITE = 8 } 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 { NMC_PRINT_TERSE = 0, NMC_PRINT_NORMAL = 1, @@ -103,6 +113,7 @@ typedef struct _NmcOutputField { gboolean free_value; /* Whether to free the value */ guint32 flags; /* Flags - whether and how to print values/field names/headers */ NmcTermColor color; /* Use this color to print value */ + NmcTermFormat color_fmt; /* Use this terminal format to print value */ } NmcOutputField; typedef struct { diff --git a/clients/cli/utils.c b/clients/cli/utils.c index ed06ad6e1e..3036dfe48f 100644 --- a/clients/cli/utils.c +++ b/clients/cli/utils.c @@ -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 * -nmc_colorize (NmcTermColor color, const char *fmt, ...) +nmc_colorize (NmcTermColor color, NmcTermFormat format, const char *fmt, ...) { va_list args; 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); str = g_strdup_vprintf (fmt, args); va_end (args); ansi_color = nmc_term_color_sequence (color); - if (*ansi_color) - color_end = "\33[0m"; - else - color_end = ""; + ansi_fmt = nmc_term_format_sequence (format); + color_end = *ansi_color ? end_seq : ""; + format_end = *ansi_fmt ? end_seq : ""; - 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); 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 */ @@ -935,14 +973,15 @@ nmc_empty_output_fields (NmCli *nmc) static char * colorize_string (gboolean colorize, NmcTermColor color, + NmcTermFormat color_fmt, const char *str, gboolean *dealloc) { char *out; if ( colorize - && (color != NMC_TERM_COLOR_NORMAL)) { - out = nmc_colorize (color, str); + && (color != NMC_TERM_COLOR_NORMAL || color_fmt != NMC_TERM_FORMAT_NORMAL)) { + out = nmc_colorize (color, color_fmt, str); *dealloc = TRUE; } else { out = (char *) str; @@ -972,7 +1011,7 @@ get_value_to_print (NmcOutputField *field, free_value = field->value && is_array && !field_name; /* 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_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++) { 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); tmp = g_strdup_printf ("%s%s%s[%d]:", section_prefix ? (const char*) field_values[0].value : "", @@ -1082,7 +1121,7 @@ print_required_fields (NmCli *nmc, const NmcOutputField field_values[]) char *print_val; 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); tmp = g_strdup_printf ("%s%s%s:", section_prefix ? hdr_name : "", diff --git a/clients/cli/utils.h b/clients/cli/utils.h index fbce15d828..949867f0ab 100644 --- a/clients/cli/utils.h +++ b/clients/cli/utils.h @@ -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_show_progress (const char *str); 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); char *nmc_filter_out_colors (const char *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_arrc (NmcOutputField fields_array[], guint32 index, const char **value); 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[]); GArray *parse_output_fields (const char *fields_str, const NmcOutputField fields_array[],