aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--deps/sysobj_early/include/format_early.h3
-rw-r--r--deps/sysobj_early/src/format_early.c30
-rw-r--r--hardinfo/usb_util.c9
-rw-r--r--includes/usb_util.h2
-rw-r--r--modules/devices/usb.c7
5 files changed, 48 insertions, 3 deletions
diff --git a/deps/sysobj_early/include/format_early.h b/deps/sysobj_early/include/format_early.h
index 871d173f..e5524e26 100644
--- a/deps/sysobj_early/include/format_early.h
+++ b/deps/sysobj_early/include/format_early.h
@@ -25,6 +25,7 @@
#include <strings.h>
#include "appf.h"
#include "util_sysobj.h"
+#include "vendor.h"
enum {
FMT_OPT_NONE = 0,
@@ -41,4 +42,6 @@ gchar *format_with_ansi_color(const gchar *str, const gchar *ansi_color, int fmt
void tag_vendor(gchar **str, guint offset, const gchar *vendor_str, const char *ansi_color, int fmt_opts);
gchar *vendor_match_tag(const gchar *vendor_str, int fmt_opts);
+gchar *vendor_list_ribbon(const vendor_list vl_in, int fmt_opts);
+
#endif
diff --git a/deps/sysobj_early/src/format_early.c b/deps/sysobj_early/src/format_early.c
index bc5883cc..5f191d60 100644
--- a/deps/sysobj_early/src/format_early.c
+++ b/deps/sysobj_early/src/format_early.c
@@ -19,7 +19,6 @@
*/
#include "format_early.h"
-#include "vendor.h"
#define ANSI_COLOR_RESET "\x1b[0m"
@@ -128,3 +127,32 @@ gchar *vendor_match_tag(const gchar *vendor_str, int fmt_opts) {
}
return NULL;
}
+
+gchar *vendor_list_ribbon(const vendor_list vl_in, int fmt_opts) {
+ gchar *ret = NULL;
+ vendor_list vl = g_slist_copy(vl_in); /* shallow is fine */
+ vl = vendor_list_remove_duplicates(vl);
+ if (vl) {
+ GSList *l = vl, *n = l ? l->next : NULL;
+ /* replace each vendor with the vendor tag */
+ for(; l; l = n) {
+ n = l->next;
+ const Vendor *v = l->data;
+ if (!v) {
+ vl = g_slist_delete_link(vl, l);
+ continue;
+ }
+ gchar *ven_tag = v->name_short ? g_strdup(v->name_short) : g_strdup(v->name);
+ if(ven_tag) {
+ tag_vendor(&ven_tag, 0, ven_tag, v->ansi_color, fmt_opts);
+ l->data = ven_tag;
+ }
+ }
+ /* vl is now a regular GSList of formatted vendor tag strings */
+ vl = gg_slist_remove_duplicates_custom(vl, (GCompareFunc)g_strcmp0);
+ for(l = vl; l; l = l->next)
+ ret = appfsp(ret, "%s", (gchar*)l->data);
+ }
+ g_slist_free_full(vl, g_free);
+ return ret;
+}
diff --git a/hardinfo/usb_util.c b/hardinfo/usb_util.c
index f883657c..8b73332f 100644
--- a/hardinfo/usb_util.c
+++ b/hardinfo/usb_util.c
@@ -58,6 +58,7 @@ usbd *usbd_new() {
void usbd_free(usbd *s) {
if (s) {
usbi_list_free(s->if_list);
+ vendor_list_free(s->vendors);
g_free(s->vendor);
g_free(s->product);
g_free(s->manufacturer);
@@ -517,11 +518,17 @@ static usbd *usb_get_device_list_sysfs() {
}
usbd *usb_get_device_list() {
- usbd *lst;
+ usbd *lst, *l;
lst = usb_get_device_list_sysfs();
if (lst == NULL)
lst = usb_get_device_list_lsusb();
+ l = lst;
+ while(l) {
+ l->vendors = vendor_list_remove_duplicates_deep(vendors_match(l->vendor, l->manufacturer, NULL));
+ l = l->next;
+ }
+
return lst;
}
diff --git a/includes/usb_util.h b/includes/usb_util.h
index 045f07e4..ed752449 100644
--- a/includes/usb_util.h
+++ b/includes/usb_util.h
@@ -43,6 +43,8 @@ typedef struct usbd {
int speed_mbs;
+ vendor_list vendors;
+
gboolean user_scan; /* not scanned as root */
struct usbi *if_list;
diff --git a/modules/devices/usb.c b/modules/devices/usb.c
index ca4014ee..c00f3330 100644
--- a/modules/devices/usb.c
+++ b/modules/devices/usb.c
@@ -109,7 +109,12 @@ static void _usb_dev(const usbd *u) {
manufacturer = UNKIFNULL_AC(u->manufacturer);
device = UNKIFNULL_AC(u->device);
- name = g_strdup_printf("%s %s", u->vendor? vendor: manufacturer, u->product? product: device);
+ if (u->vendors) {
+ gchar *ribbon = vendor_list_ribbon(u->vendors, params.fmt_opts);
+ name = g_strdup_printf("%s %s", ribbon, u->product? product: device);
+ } else {
+ name = g_strdup_printf("%s %s", u->vendor? vendor: manufacturer, u->product? product: device);
+ }
key = g_strdup_printf("USB%03d:%03d:%03d", u->bus, u->dev, 0);
label = g_strdup_printf("%03d:%03d", u->bus, u->dev);
icon = get_usbdev_icon(u);