diff options
| author | Leandro Pereira <leandro@hardinfo.org> | 2019-12-23 08:30:18 -0800 | 
|---|---|---|
| committer | Leandro Pereira <leandro@hardinfo.org> | 2019-12-23 08:34:10 -0800 | 
| commit | 6e283fd8ab36f51edb668b36988577e8bdba7f51 (patch) | |
| tree | 25d6cc410bf71c4817108e70e4e762e7bddaaefe /modules | |
| parent | 82e6d18ef7fff101586fd00619799cd8ba3b00f7 (diff) | |
Sort module icon table by reverse string length
This way, it's possible to add less specific icons for some categories
(e.g. net/bluetooth, net/wireless, net/ethernet, falling back to net/).
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/computer/modules.c | 87 | 
1 files changed, 47 insertions, 40 deletions
| diff --git a/modules/computer/modules.c b/modules/computer/modules.c index 5ee9abb3..0da3f56e 100644 --- a/modules/computer/modules.c +++ b/modules/computer/modules.c @@ -31,62 +31,69 @@      }  GHashTable *_module_hash_table = NULL; -gchar *kernel_modules_dir = NULL; +static gchar *kernel_modules_dir = NULL; -static struct { -    gchar *dir; -    gchar *icon; +/* Keep this sorted by reverse strlen(dir)! */ +static const struct { +    const gchar *dir; +    const gchar *icon;  } modules_icons[] = { -    { "kernel/net/bluetooth/", "bluetooth"}, -    { "kernel/net/wireless/", "wireless"}, -    { "kernel/net/ethernet/", "network-interface"}, -    { "kernel/drivers/bluetooth/", "bluetooth"}, -    { "kernel/drivers/input/joystick/", "joystick"}, -    { "kernel/drivers/input/keyboard/", "keyboard"}, -    { "kernel/drivers/input/mouse/", "mouse"}, -    { "kernel/drivers/cdrom/", "cdrom"}, -    { "kernel/drivers/hwmon/", "therm"}, -    { "kernel/drivers/hid/", "inputdevices"}, -    { "kernel/drivers/gpu/", "monitor"}, -    { "kernel/drivers/i2c/", "memory"}, -    { "kernel/drivers/nvme/", "hdd"}, -    { "kernel/drivers/ata/", "hdd"}, -    { "kernel/drivers/scsi/", "hdd"}, -    { "kernel/drivers/usb/", "usb"}, -    { "kernel/drivers/net/wireless/", "wireless"}, -    { "kernel/drivers/net/ethernet/", "network-interface"}, -    { "kernel/drivers/crypto/", "cryptohash"}, -    { "kernel/drivers/pci/", "devices"}, -    { "kernel/drivers/iommu/", "memory"}, -    { "kernel/drivers/edac/", "memory"}, -    { "kernel/arch/x86/crypto/", "cryptohash"}, -    { "kernel/net/", "network-connections"}, -    { "kernel/crypto/", "cryptohash"}, -    { "kernel/sound/", "audio"}, -    { NULL, NULL} +    { "drivers/input/joystick/", "joystick" }, +    { "drivers/input/keyboard/", "keyboard" }, +    { "drivers/net/wireless/", "wireless" }, +    { "drivers/net/ethernet/", "network-interface" }, +    { "drivers/input/mouse/", "mouse" }, +    { "drivers/bluetooth/", "bluetooth" }, +    { "arch/x86/crypto/", "cryptohash" }, +    { "drivers/crypto/", "cryptohash" }, +    { "net/bluetooth/", "bluetooth" }, +    { "drivers/input/", "inputdevices" }, +    { "drivers/cdrom/", "cdrom" }, +    { "drivers/hwmon/", "therm" }, +    { "drivers/iommu/", "memory" }, +    { "net/wireless/", "wireless" }, +    { "drivers/nvme/", "hdd" }, +    { "net/ethernet/", "network-interface" }, +    { "drivers/scsi/", "hdd" }, +    { "drivers/edac/", "memory" }, +    { "drivers/hid/", "inputdevices" }, +    { "drivers/gpu/", "monitor" }, +    { "drivers/i2c/", "memory" }, +    { "drivers/ata/", "hdd" }, +    { "drivers/usb/", "usb" }, +    { "drivers/pci/", "devices" }, +    { "drivers/net/", "network" }, +    { "drivers/mmc/", "media-removable" }, +    { "drivers/fs/", "media-floppy" }, +    { "crypto/", "cryptohash" }, +    { "sound/", "audio" }, +    { "net/", "network-connections" }, +    { }  }; -static const char* get_module_icon(const char *path) +static const gchar* get_module_icon(const char *path)  { -    int i = 0; +    if (path == NULL) /* modinfo couldn't find module path */ +        return NULL; -    if (kernel_modules_dir == NULL){ +    if (kernel_modules_dir == NULL) {          struct utsname utsbuf;          uname(&utsbuf); -        kernel_modules_dir = g_strdup_printf("/lib/modules/%s/", utsbuf.release); +        kernel_modules_dir = g_strdup_printf("/lib/modules/%s/kernel/", utsbuf.release);      }      if (!g_str_has_prefix(path, kernel_modules_dir))          return NULL; -    const gchar *path_no_prefix = path+strlen(kernel_modules_dir); +    const gchar *path_no_prefix = path + strlen(kernel_modules_dir); +    const size_t path_no_prefix_len = strlen(path_no_prefix); +    int i; -    while (modules_icons[i].dir != NULL) { -        if (g_str_has_prefix(path_no_prefix, modules_icons[i].dir)) { +    for (i = 0; modules_icons[i].dir; i++) { +        if (g_str_has_prefix(path_no_prefix, modules_icons[i].dir))              return modules_icons[i].icon; -        } -        i++;      } +      return NULL;  } | 
