summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/computer.c1
-rw-r--r--modules/computer/modules.c212
2 files changed, 176 insertions, 37 deletions
diff --git a/modules/computer.c b/modules/computer.c
index e516cd54..da18b5c2 100644
--- a/modules/computer.c
+++ b/modules/computer.c
@@ -1074,6 +1074,7 @@ void hi_module_init(void)
{
computer = g_new0(Computer, 1);
init_memory_labels();
+ kernel_module_icon_init();
}
const ModuleAbout *hi_module_get_about(void)
diff --git a/modules/computer/modules.c b/modules/computer/modules.c
index 15ffa4b7..451b5c1b 100644
--- a/modules/computer/modules.c
+++ b/modules/computer/modules.c
@@ -18,7 +18,9 @@
#include <string.h>
#include <sys/utsname.h>
+#include <json-glib/json-glib.h>
+#include "syncmanager.h"
#include "computer.h"
#include "cpu_util.h" /* for STRIFNULL() */
#include "hardinfo.h"
@@ -33,48 +35,184 @@
GHashTable *_module_hash_table = NULL;
static gchar *kernel_modules_dir = NULL;
+enum icons {
+ ICON_INVALID = 0,
+
+ ICON_AUDIO,
+ ICON_BLUETOOTH,
+ ICON_CAMERA_WEB,
+ ICON_CDROM,
+ ICON_CRYPTOHASH,
+ ICON_DEVICES,
+ ICON_HDD,
+ ICON_INPUTDEVICES,
+ ICON_JOYSTICK,
+ ICON_KEYBOARD,
+ ICON_MEDIA_FLOPPY,
+ ICON_MEDIA_REMOVABLE,
+ ICON_MEMORY,
+ ICON_MONITOR,
+ ICON_MOUSE,
+ ICON_NETWORK,
+ ICON_NETWORK_CONNECTIONS,
+ ICON_NETWORK_INTERFACE,
+ ICON_THERM,
+ ICON_USB,
+ ICON_WIRELESS,
+
+ ICON_MAX,
+};
+
+static const char *icon_table[ICON_MAX] = {
+ [ICON_AUDIO] = "audio",
+ [ICON_BLUETOOTH] = "bluetooth",
+ [ICON_CAMERA_WEB] = "camera-web",
+ [ICON_CDROM] = "cdrom",
+ [ICON_CRYPTOHASH] = "cryptohash",
+ [ICON_DEVICES] = "devices",
+ [ICON_HDD] = "hdd",
+ [ICON_INPUTDEVICES] = "inputdevices",
+ [ICON_JOYSTICK] = "joystick",
+ [ICON_KEYBOARD] = "keyboard",
+ [ICON_MEDIA_FLOPPY] = "media-floppy",
+ [ICON_MEDIA_REMOVABLE] = "media-removable",
+ [ICON_MEMORY] = "memory",
+ [ICON_MONITOR] = "monitor",
+ [ICON_MOUSE] = "mouse",
+ [ICON_NETWORK] = "network",
+ [ICON_NETWORK_CONNECTIONS] = "network-connections",
+ [ICON_NETWORK_INTERFACE] = "network-interface",
+ [ICON_THERM] = "therm",
+ [ICON_USB] = "usb",
+ [ICON_WIRELESS] = "wireless",
+};
+
/* Keep this sorted by reverse strlen(dir)! */
static const struct {
const gchar *dir;
- const gchar *icon;
+ enum icons icon;
} modules_icons[] = {
- { "drivers/input/joystick/", "joystick" },
- { "drivers/input/keyboard/", "keyboard" },
- { "drivers/media/usb/uvc/", "camera-web" },
- { "drivers/net/wireless/", "wireless" },
- { "drivers/net/ethernet/", "network-interface" },
- { "drivers/input/mouse/", "mouse" },
- { "drivers/bluetooth/", "bluetooth" },
- { "drivers/media/v4l", "camera-web" },
- { "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" },
- { "crypto/", "cryptohash" },
- { "sound/", "audio" },
- { "net/", "network-connections" },
- { "fs/", "media-floppy" },
- { }
+ {"drivers/input/joystick/", ICON_JOYSTICK},
+ {"drivers/input/keyboard/", ICON_KEYBOARD},
+ {"drivers/media/usb/uvc/", ICON_CAMERA_WEB},
+ {"drivers/net/wireless/", ICON_WIRELESS},
+ {"drivers/net/ethernet/", ICON_NETWORK_INTERFACE},
+ {"drivers/input/mouse/", ICON_MOUSE},
+ {"drivers/bluetooth/", ICON_BLUETOOTH},
+ {"drivers/media/v4l", ICON_CAMERA_WEB},
+ {"arch/x86/crypto/", ICON_CRYPTOHASH},
+ {"drivers/crypto/", ICON_CRYPTOHASH},
+ {"net/bluetooth/", ICON_BLUETOOTH},
+ {"drivers/input/", ICON_INPUTDEVICES},
+ {"drivers/cdrom/", ICON_CDROM},
+ {"drivers/hwmon/", ICON_THERM},
+ {"drivers/iommu/", ICON_MEMORY},
+ {"net/wireless/", ICON_WIRELESS},
+ {"drivers/nvme/", ICON_HDD},
+ {"net/ethernet/", ICON_NETWORK_INTERFACE},
+ {"drivers/scsi/", ICON_HDD},
+ {"drivers/edac/", ICON_MEMORY},
+ {"drivers/hid/", ICON_INPUTDEVICES},
+ {"drivers/gpu/", ICON_MONITOR},
+ {"drivers/i2c/", ICON_MEMORY},
+ {"drivers/ata/", ICON_HDD},
+ {"drivers/usb/", ICON_USB},
+ {"drivers/pci/", ICON_DEVICES},
+ {"drivers/net/", ICON_NETWORK},
+ {"drivers/mmc/", ICON_MEDIA_REMOVABLE},
+ {"crypto/", ICON_CRYPTOHASH},
+ {"sound/", ICON_AUDIO},
+ {"net/", ICON_NETWORK_CONNECTIONS},
+ {"fs/", ICON_MEDIA_FLOPPY},
+ {},
};
-static const gchar* get_module_icon(const char *path)
+static GHashTable *module_icons;
+
+static void build_icon_table_iter(JsonObject *object,
+ const gchar *key,
+ JsonNode *value,
+ gpointer user_data)
+{
+ char *key_copy = g_strdup(key);
+ char *p;
+
+ for (p = key_copy; *p; p++) {
+ if (*p == '_')
+ *p = '-';
+ }
+
+ enum icons icon;
+ const gchar *value_str = json_node_get_string(value);
+ for (icon = ICON_INVALID; icon < ICON_MAX; icon++) {
+ const char *icon_name = icon_table[icon];
+
+ if (!icon_name)
+ continue;
+
+ if (g_str_equal(value_str, icon_name)) {
+ g_hash_table_insert(module_icons,
+ key_copy, GINT_TO_POINTER(icon));
+ return;
+ }
+ }
+
+ g_free(key_copy);
+}
+
+void kernel_module_icon_init(void)
+{
+ gchar *icon_json;
+
+ static SyncEntry sync_entry = {
+ .name = N_("Update kernel module icon table"),
+ .file_name = "kernel-module-icons.json",
+ };
+ sync_manager_add_entry(&sync_entry);
+
+ icon_json = g_build_filename(g_get_user_config_dir(),
+ "hardinfo", "kernel-module-icons.json",
+ NULL);
+
+ module_icons = g_hash_table_new(g_str_hash, g_str_equal);
+
+ if (!g_file_test(icon_json, G_FILE_TEST_EXISTS))
+ goto out;
+
+ JsonParser *parser = json_parser_new();
+ if (!json_parser_load_from_file(parser, icon_json, NULL))
+ goto out_destroy_parser;
+
+ JsonNode *root = json_parser_get_root(parser);
+ if (json_node_get_node_type(root) != JSON_NODE_OBJECT)
+ goto out_destroy_parser;
+
+ JsonObject *icons = json_node_get_object(root);
+ if (!icons)
+ goto out_destroy_parser;
+
+ json_object_foreach_member(icons, build_icon_table_iter, NULL);
+
+out_destroy_parser:
+ g_object_unref(parser);
+
+out:
+ g_free(icon_json);
+}
+
+static const gchar* get_module_icon(const char *modname, const char *path)
{
+ char *modname_temp = g_strdup(modname);
+ char *p;
+ for (p = modname_temp; *p; p++) {
+ if (*p == '_')
+ *p = '-';
+ }
+ gpointer icon = g_hash_table_lookup(module_icons, modname_temp);
+ g_free(modname_temp);
+ if (icon)
+ return icon_table[GPOINTER_TO_INT(icon)];
+
if (path == NULL) /* modinfo couldn't find module path */
return NULL;
@@ -93,7 +231,7 @@ static const gchar* get_module_icon(const char *path)
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;
+ return icon_table[modules_icons[i].icon];
}
return NULL;
@@ -185,7 +323,7 @@ void scan_modules_do(void) {
/* append this module to the list of modules */
module_list = h_strdup_cprintf("$%s$%s=%s\n", module_list, hashkey, modname,
description ? description : "");
- icon = get_module_icon(filename);
+ icon = get_module_icon(modname, filename);
module_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", module_icons, hashkey,
modname, icon ? icon: "module");