diff options
author | Burt P <pburt0@gmail.com> | 2019-12-27 17:13:10 -0600 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2019-12-27 22:16:36 -0800 |
commit | 74fe3984106ac559a2bea67a6f6fcdd5d2ca5464 (patch) | |
tree | 0cdf7ecd0e12f8a6f8959ab14581eb4a92b42632 /shell | |
parent | 4c386e89eb9bf28e43164b958374bee113b4cee7 (diff) |
shell: add key flag for strings expected to contian vendors
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'shell')
-rw-r--r-- | shell/shell.c | 98 |
1 files changed, 90 insertions, 8 deletions
diff --git a/shell/shell.c b/shell/shell.c index 2f3a68fc..3ece6a84 100644 --- a/shell/shell.c +++ b/shell/shell.c @@ -1524,6 +1524,46 @@ static gboolean detail_activate_link (GtkLabel *label, gchar *uri, gpointer user return uri_open(uri); } +#include "format_early.h" + +static gchar *vendor_info_markup(const Vendor *v) { + if (!v) return NULL; + gchar *ven_mt = NULL; + gchar *full_link = NULL, *p = NULL; + gchar *ven_tag = v->name_short ? g_strdup(v->name_short) : g_strdup(v->name); + tag_vendor(&ven_tag, 0, ven_tag, v->ansi_color, FMT_OPT_PANGO); + //if (v->name_short) + // ven_mt = appf(ven_mt, "\n", "%s", v->name); + ven_mt = appf(ven_mt, "\n", "%s", ven_tag); + if (v->url) { + if (!g_str_has_prefix(v->url, "http") ) + full_link = g_strdup_printf("http://%s", v->url); + ven_mt = appf(ven_mt, "\n", "<b>%s:</b> <a href=\"%s\">%s</a>", _("URL"), full_link ? full_link : v->url, v->url); + g_free(full_link); + full_link = NULL; + } + if (v->url_support) { + if (!g_str_has_prefix(v->url_support, "http") ) + full_link = g_strdup_printf("http://%s", v->url_support); + ven_mt = appf(ven_mt, "\n", "<b>%s:</b> <a href=\"%s\">%s</a>", _("Support URL"), full_link ? full_link : v->url_support, v->url_support); + g_free(full_link); + full_link = NULL; + } + if (v->wikipedia) { + /* sending the title to wikipedia.com/wiki will autmatically handle the language and section parts, + * but perhaps that shouldn't be relied on so much? */ + full_link = g_strdup_printf("http://wikipedia.com/wiki/%s", v->wikipedia); + for(p = full_link; *p; p++) { + if (*p == ' ') *p = '_'; + } + ven_mt = appf(ven_mt, "\n", "<b>%s:</b> <a href=\"%s\">%s</a>", _("Wikipedia"), full_link ? full_link : v->wikipedia, v->wikipedia); + g_free(full_link); + full_link = NULL; + } + g_free(ven_tag); + return ven_mt; +} + static void module_selected_show_info_detail(GKeyFile *key_file, ShellModuleEntry *entry, gchar **groups) @@ -1557,12 +1597,12 @@ static void module_selected_show_info_detail(GKeyFile *key_file, gtk_container_set_border_width(GTK_CONTAINER(table), 4); gtk_container_add(GTK_CONTAINER(frame), table); - gint j; + gint j, a = 0; for (j = 0; keys[j]; j++) { gchar *key_markup; gchar *value; - gchar *name, *label, *tag; - key_get_components(keys[j], NULL, &tag, &name, &label, NULL, TRUE); + gchar *name, *label, *tag, *flags; + key_get_components(keys[j], &flags, &tag, &name, &label, NULL, TRUE); value = g_key_file_get_string(key_file, groups[i], keys[j], NULL); @@ -1571,6 +1611,20 @@ static void module_selected_show_info_detail(GKeyFile *key_file, value = entry->fieldfunc(keys[j]); } + gboolean has_ven = key_value_has_vendor_string(flags); + const Vendor *v = has_ven ? vendor_match(value, NULL) : NULL; + gchar *value_markup = NULL; + +/* + if (v) { + gchar *vendor_markup = vendor_info_markup(v); + value_markup = g_strdup_printf("%s\n%s", value, vendor_markup); + g_free(vendor_markup); + } else { */ + value_markup = g_strdup(value); + g_free(value); + //} + key_markup = g_strdup_printf("<span color=\"#666\">%s</span>", label); @@ -1578,7 +1632,7 @@ static void module_selected_show_info_detail(GKeyFile *key_file, gtk_label_set_use_markup(GTK_LABEL(key_label), TRUE); gtk_misc_set_alignment(GTK_MISC(key_label), 1.0f, 0.5f); - GtkWidget *value_label = gtk_label_new(value); + GtkWidget *value_label = gtk_label_new(value_markup); gtk_label_set_use_markup(GTK_LABEL(value_label), TRUE); gtk_label_set_selectable(GTK_LABEL(value_label), TRUE); #if !GTK_CHECK_VERSION(3, 0, 0) @@ -1599,11 +1653,28 @@ static void module_selected_show_info_detail(GKeyFile *key_file, gtk_widget_show(value_box); gtk_widget_show(value_label); - gtk_table_attach(GTK_TABLE(table), key_label, 0, 1, j, j + 1, + gtk_table_attach(GTK_TABLE(table), key_label, 0, 1, j + a, j + a + 1, GTK_FILL, GTK_FILL, 6, 4); - gtk_table_attach(GTK_TABLE(table), value_box, 1, 2, j, j + 1, + gtk_table_attach(GTK_TABLE(table), value_box, 1, 2, j + a, j + a + 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 4); + if (v) { + a++; /* insert a row */ + gchar *vendor_markup = vendor_info_markup(v); + GtkWidget *vendor_label = gtk_label_new(vendor_markup); + gtk_label_set_use_markup(GTK_LABEL(vendor_label), TRUE); + gtk_label_set_selectable(GTK_LABEL(vendor_label), TRUE); + gtk_misc_set_alignment(GTK_MISC(vendor_label), 0.0f, 0.5f); + g_signal_connect(vendor_label, "activate-link", G_CALLBACK(detail_activate_link), NULL); + GtkWidget *vendor_box = gtk_hbox_new(FALSE, 4); + gtk_box_pack_start(GTK_BOX(vendor_box), vendor_label, TRUE, TRUE, 0); + gtk_table_attach(GTK_TABLE(table), vendor_box, 1, 2, j + a, j + a + 1, + GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 4); + gtk_widget_show(vendor_box); + gtk_widget_show(vendor_label); + g_free(vendor_markup); + } + struct UpdateTableItem *item = g_new0(struct UpdateTableItem, 1); item->is_iter = FALSE; item->widget = g_object_ref(value_box); @@ -1616,7 +1687,8 @@ static void module_selected_show_info_detail(GKeyFile *key_file, g_free(tag); } - g_free(value); + g_free(flags); + g_free(value_markup); g_free(key_markup); g_free(label); } @@ -2185,6 +2257,16 @@ gboolean key_wants_details(const gchar *key) { return FALSE; } +gboolean key_value_has_vendor_string(const gchar *key) { + gchar *flags; + key_get_components(key, &flags, NULL, NULL, NULL, NULL, TRUE); + if (flags && strchr(flags, '^')) { + g_free(flags); + return TRUE; + } + return FALSE; +} + gchar *key_mi_tag(const gchar *key) { gchar *p = (gchar*)key, *l, *t; @@ -2212,7 +2294,7 @@ const gchar *key_get_name(const gchar *key) { * [$[<flags>][<tag>]$]<name>[#[<dis>]] * * example for key = "$*!Foo$Bar#7": - * flags = "$*!Foo$" // key_is/wants_*() still works on flags + * flags = "$*!^Foo$" // key_is/wants_*() still works on flags * tag = "Foo" // the moreinfo/icon tag * name = "Bar#7" // the full unique name * label = "Bar" // the label displayed |