aboutsummaryrefslogtreecommitdiff
path: root/hardinfo2
diff options
context:
space:
mode:
authorLeandro A. F. Pereira <leandro@hardinfo.org>2007-01-02 23:15:08 +0000
committerLeandro A. F. Pereira <leandro@hardinfo.org>2007-01-02 23:15:08 +0000
commitacc6e48b81d48b084393809110c8949c6782021f (patch)
tree24425ebe5bfbab63eb90e4dbedce6742cfbcc78f /hardinfo2
parent43d4be36dd06b69f8ac126c7dcc8c259b0544f7b (diff)
Implemented new module API. Needs cleanups.
Diffstat (limited to 'hardinfo2')
-rw-r--r--hardinfo2/arch/common/printers.h2
-rw-r--r--hardinfo2/arch/common/users.h3
-rw-r--r--hardinfo2/arch/linux/common/battery.h2
-rw-r--r--hardinfo2/arch/linux/common/inputdevices.h2
-rw-r--r--hardinfo2/arch/linux/common/modules.h6
-rw-r--r--hardinfo2/arch/linux/common/pci.h2
-rw-r--r--hardinfo2/arch/linux/common/sensors.h2
-rw-r--r--hardinfo2/arch/linux/common/storage.h4
-rw-r--r--hardinfo2/arch/linux/common/usb.h2
-rw-r--r--hardinfo2/arch/linux/x86/processor.h2
-rw-r--r--hardinfo2/benchmark.c273
-rw-r--r--hardinfo2/callbacks.c2
-rw-r--r--hardinfo2/computer.c462
-rw-r--r--hardinfo2/devices.c343
-rw-r--r--hardinfo2/hardinfo.h19
-rw-r--r--hardinfo2/report.c3
-rw-r--r--hardinfo2/shell.c25
-rw-r--r--hardinfo2/shell.h5
-rw-r--r--hardinfo2/util.c137
19 files changed, 734 insertions, 562 deletions
diff --git a/hardinfo2/arch/common/printers.h b/hardinfo2/arch/common/printers.h
index 3bb98f4c..b467f5a0 100644
--- a/hardinfo2/arch/common/printers.h
+++ b/hardinfo2/arch/common/printers.h
@@ -17,7 +17,7 @@
*/
void
-scan_printers(void)
+__scan_printers(void)
{
static GModule *cups = NULL;
static int (*cupsGetPrinters) (char ***printers) = NULL;
diff --git a/hardinfo2/arch/common/users.h b/hardinfo2/arch/common/users.h
index 08acd97a..84cec9d9 100644
--- a/hardinfo2/arch/common/users.h
+++ b/hardinfo2/arch/common/users.h
@@ -14,7 +14,8 @@ remove_users(gpointer key, gpointer value, gpointer data)
return FALSE;
}
-void scan_users(void)
+static void
+scan_users_do(void)
{
FILE *passwd;
char buffer[512];
diff --git a/hardinfo2/arch/linux/common/battery.h b/hardinfo2/arch/linux/common/battery.h
index dc003459..8be133ee 100644
--- a/hardinfo2/arch/linux/common/battery.h
+++ b/hardinfo2/arch/linux/common/battery.h
@@ -17,7 +17,7 @@
*/
static void
-scan_battery(void)
+__scan_battery(void)
{
gchar *acpi_path;
diff --git a/hardinfo2/arch/linux/common/inputdevices.h b/hardinfo2/arch/linux/common/inputdevices.h
index e9deffa7..0742bb3b 100644
--- a/hardinfo2/arch/linux/common/inputdevices.h
+++ b/hardinfo2/arch/linux/common/inputdevices.h
@@ -42,7 +42,7 @@ static struct {
};
void
-scan_inputdevices(void)
+__scan_input_devices(void)
{
FILE *dev;
gchar buffer[128];
diff --git a/hardinfo2/arch/linux/common/modules.h b/hardinfo2/arch/linux/common/modules.h
index 3acf4aba..9b895ee8 100644
--- a/hardinfo2/arch/linux/common/modules.h
+++ b/hardinfo2/arch/linux/common/modules.h
@@ -34,14 +34,12 @@ remove_module_devices(gpointer key, gpointer value, gpointer data)
return FALSE;
}
-void
-scan_modules(void)
+static void
+scan_modules_do(void)
{
FILE *lsmod;
gchar buffer[1024];
- shell_status_update("Getting loaded modules information...");
-
if (module_list) {
g_free(module_list);
module_list = NULL;
diff --git a/hardinfo2/arch/linux/common/pci.h b/hardinfo2/arch/linux/common/pci.h
index 5f48ba44..e50691d0 100644
--- a/hardinfo2/arch/linux/common/pci.h
+++ b/hardinfo2/arch/linux/common/pci.h
@@ -17,7 +17,7 @@
*/
void
-scan_pci(void)
+__scan_pci(void)
{
FILE *lspci;
gchar buffer[256], *buf, *strhash = NULL, *strdevice = NULL;
diff --git a/hardinfo2/arch/linux/common/sensors.h b/hardinfo2/arch/linux/common/sensors.h
index 246c53e7..3303d5d2 100644
--- a/hardinfo2/arch/linux/common/sensors.h
+++ b/hardinfo2/arch/linux/common/sensors.h
@@ -355,7 +355,7 @@ static void read_sensors_hddtemp(void)
}
}
-static void read_sensors(void)
+static void __scan_sensors(void)
{
if (sensors)
g_free(sensors);
diff --git a/hardinfo2/arch/linux/common/storage.h b/hardinfo2/arch/linux/common/storage.h
index 3397570d..8e248d3b 100644
--- a/hardinfo2/arch/linux/common/storage.h
+++ b/hardinfo2/arch/linux/common/storage.h
@@ -31,7 +31,7 @@ remove_scsi_devices(gpointer key, gpointer value, gpointer data)
/* SCSI support by Pascal F.Martin <pascalmartin@earthlink.net> */
void
-scan_scsi(void)
+__scan_scsi_devices(void)
{
FILE *proc_scsi;
gchar buffer[256], *buf;
@@ -160,7 +160,7 @@ remove_ide_devices(gpointer key, gpointer value, gpointer data)
void
-scan_ide(void)
+__scan_ide_devices(void)
{
FILE *proc_ide;
gchar *device, iface, *model, *media, *pgeometry = NULL, *lgeometry =
diff --git a/hardinfo2/arch/linux/common/usb.h b/hardinfo2/arch/linux/common/usb.h
index 286d9380..606bb0fb 100644
--- a/hardinfo2/arch/linux/common/usb.h
+++ b/hardinfo2/arch/linux/common/usb.h
@@ -32,7 +32,7 @@ remove_usb_devices(gpointer key, gpointer value, gpointer data)
static gchar *usb_list = NULL;
void
-scan_usb(void)
+__scan_usb(void)
{
FILE *dev;
gchar buffer[128];
diff --git a/hardinfo2/arch/linux/x86/processor.h b/hardinfo2/arch/linux/x86/processor.h
index 4e4a2646..a756a958 100644
--- a/hardinfo2/arch/linux/x86/processor.h
+++ b/hardinfo2/arch/linux/x86/processor.h
@@ -132,7 +132,7 @@ static void get_processor_strfamily(Processor * processor)
}
}
-static GSList *computer_get_processors(void)
+static GSList *__scan_processors(void)
{
GSList *procs = NULL;
Processor *processor = NULL;
diff --git a/hardinfo2/benchmark.c b/hardinfo2/benchmark.c
index bcf5c84e..c6b1be62 100644
--- a/hardinfo2/benchmark.c
+++ b/hardinfo2/benchmark.c
@@ -30,54 +30,75 @@ enum {
BENCHMARK_RAYTRACE
} Entries;
-static ModuleEntry hi_entries[] = {
- {"CPU ZLib", "compress.png"},
- {"CPU Fibonacci", "module.png"},
- {"CPU MD5", "module.png"},
- {"CPU SHA1", "module.png"},
- {"CPU Blowfish", "blowfish.png"},
- {"FPU Raytracing", "raytrace.png"}
+void scan_zlib(gboolean reload);
+void scan_raytr(gboolean reload);
+void scan_bfsh(gboolean reload);
+void scan_md5(gboolean reload);
+void scan_fib(gboolean reload);
+void scan_sha1(gboolean reload);
+
+gchar *callback_zlib();
+gchar *callback_raytr();
+gchar *callback_bfsh();
+gchar *callback_md5();
+gchar *callback_fib();
+gchar *callback_sha1();
+
+
+static ModuleEntry entries[] = {
+ {"CPU ZLib", "compress.png", callback_zlib, scan_zlib},
+ {"CPU Fibonacci", "module.png", callback_fib, scan_fib},
+ {"CPU MD5", "module.png", callback_md5, scan_md5},
+ {"CPU SHA1", "module.png", callback_sha1, scan_sha1},
+ {"CPU Blowfish", "blowfish.png", callback_bfsh, scan_bfsh},
+ {"FPU Raytracing", "raytrace.png", callback_raytr, scan_raytr},
+ { NULL }
};
-static gchar *
-__benchmark_include_results(gchar *results, const gchar *benchmark,
- ShellOrderType order_type)
+static gchar *__benchmark_include_results(gchar * results,
+ const gchar * benchmark,
+ ShellOrderType order_type)
{
GKeyFile *conf;
gchar **machines, *bconf_path;
int i;
-
+
conf = g_key_file_new();
- bconf_path = g_build_filename(params.path_data, "benchmark.conf", NULL);
+ bconf_path =
+ g_build_filename(params.path_data, "benchmark.conf", NULL);
g_key_file_load_from_file(conf, bconf_path, 0, NULL);
-
+
machines = g_key_file_get_keys(conf, benchmark, NULL, NULL);
for (i = 0; machines && machines[i]; i++) {
- gchar *value = g_key_file_get_value(conf, benchmark, machines[i], NULL);
- results = g_strconcat(results, machines[i], "=", value, "\n", NULL);
- g_free(value);
+ gchar *value =
+ g_key_file_get_value(conf, benchmark, machines[i], NULL);
+ results =
+ g_strconcat(results, machines[i], "=", value, "\n", NULL);
+ g_free(value);
}
-
+
g_strfreev(machines);
g_key_file_free(conf);
g_free(bconf_path);
-
+
return g_strdup_printf("[$ShellParam$]\n"
- "Zebra=1\n"
- "OrderType=%d\n"
- "ViewType=3\n%s", order_type, results);
+ "Zebra=1\n"
+ "OrderType=%d\n"
+ "ViewType=3\n%s", order_type, results);
}
-static gchar *
-benchmark_include_results_reverse(gchar *results, const gchar *benchmark)
+static gchar *benchmark_include_results_reverse(gchar * results,
+ const gchar * benchmark)
{
- return __benchmark_include_results(results, benchmark, SHELL_ORDER_DESCENDING);
+ return __benchmark_include_results(results, benchmark,
+ SHELL_ORDER_DESCENDING);
}
-static gchar *
-benchmark_include_results(gchar *results, const gchar *benchmark)
+static gchar *benchmark_include_results(gchar * results,
+ const gchar * benchmark)
{
- return __benchmark_include_results(results, benchmark, SHELL_ORDER_ASCENDING);
+ return __benchmark_include_results(results, benchmark,
+ SHELL_ORDER_ASCENDING);
}
#include <arch/common/fib.h>
@@ -88,138 +109,118 @@ benchmark_include_results(gchar *results, const gchar *benchmark)
#include <arch/common/raytrace.h>
static gchar *bench_zlib = NULL,
- *bench_fib = NULL,
- *bench_md5 = NULL,
- *bench_sha1 = NULL,
- *bench_fish = NULL,
- *bench_ray = NULL;
+ *bench_fib = NULL,
+ *bench_md5 = NULL,
+ *bench_sha1 = NULL,
+ *bench_fish = NULL,
+ *bench_ray = NULL;
-gchar *
-hi_info(gint entry)
+gchar *callback_zlib()
{
- switch (entry) {
- case BENCHMARK_ZLIB:
- if (bench_zlib)
- return g_strdup(bench_zlib);
-
- bench_zlib = benchmark_zlib();
- return g_strdup(bench_zlib);
-
- case BENCHMARK_RAYTRACE:
- if (bench_ray)
- return g_strdup(bench_ray);
-
- bench_ray = benchmark_raytrace();
- return g_strdup(bench_ray);
-
- case BENCHMARK_BLOWFISH:
- if (bench_fish)
- return g_strdup(bench_fish);
-
- bench_fish = benchmark_fish();
- return g_strdup(bench_fish);
-
- case BENCHMARK_MD5:
- if (bench_md5)
- return g_strdup(bench_md5);
-
- bench_md5 = benchmark_md5();
- return g_strdup(bench_md5);
-
- case BENCHMARK_FIB:
- if (bench_fib)
- return g_strdup(bench_fib);
-
- bench_fib = benchmark_fib();
- return g_strdup(bench_fib);
-
- case BENCHMARK_SHA1:
- if (bench_sha1)
- return g_strdup(bench_sha1);
-
- bench_sha1 = benchmark_sha1();
- return g_strdup(bench_sha1);
-
- default:
- return g_strdup("[Empty]\n");
- }
+ return g_strdup(bench_zlib);
}
-const gchar *
-hi_note_func(gint entry)
+gchar *callback_raytr()
{
- switch (entry) {
- case BENCHMARK_ZLIB:
- case BENCHMARK_MD5:
- case BENCHMARK_SHA1:
- return "Results in bytes/second. Higher is better.";
-
- case BENCHMARK_RAYTRACE:
- case BENCHMARK_BLOWFISH:
- case BENCHMARK_FIB:
- return "Results in seconds. Lower is better.";
- }
-
- return "";
+ return g_strdup(bench_ray);
}
-void
-hi_reload(gint entry)
+gchar *callback_bfsh()
{
- switch (entry) {
- case BENCHMARK_ZLIB:
- if (bench_zlib) g_free(bench_zlib);
- bench_zlib = benchmark_zlib();
- break;
- case BENCHMARK_RAYTRACE:
- if (bench_ray) g_free(bench_ray);
- bench_ray = benchmark_raytrace();
- break;
- case BENCHMARK_BLOWFISH:
- if (bench_fish) g_free(bench_fish);
- bench_fish = benchmark_fish();
- break;
- case BENCHMARK_MD5:
- if (bench_md5) g_free(bench_md5);
- bench_md5 = benchmark_md5();
- break;
- case BENCHMARK_FIB:
- if (bench_fib) g_free(bench_fib);
- bench_fib = benchmark_fib();
- break;
- case BENCHMARK_SHA1:
- if (bench_sha1) g_free(bench_sha1);
- bench_sha1 = benchmark_sha1();
- break;
- }
+ return g_strdup(bench_fish);
+}
+
+gchar *callback_md5()
+{
+ return g_strdup(bench_md5);
+}
+
+gchar *callback_fib()
+{
+ return g_strdup(bench_fib);
+}
+
+gchar *callback_sha1()
+{
+ return g_strdup(bench_sha1);
}
-gint
-hi_n_entries(void)
+void scan_zlib(gboolean reload)
{
- return G_N_ELEMENTS(hi_entries) - 1;
+ SCAN_START();
+ g_free(bench_zlib);
+ bench_zlib = benchmark_zlib();
+ SCAN_END();
}
-GdkPixbuf *
-hi_icon(gint entry)
+void scan_raytr(gboolean reload)
{
- return icon_cache_get_pixbuf(hi_entries[entry].icon);
+ SCAN_START();
+ g_free(bench_ray);
+ bench_ray = benchmark_raytrace();
+ SCAN_END();
}
-gchar *
-hi_name(gint entry)
+void scan_bfsh(gboolean reload)
{
- return hi_entries[entry].name;
+ SCAN_START();
+ g_free(bench_fish);
+ bench_fish = benchmark_fish();
+ SCAN_END();
}
-gchar *
-hi_module_name(void)
+void scan_md5(gboolean reload)
+{
+ SCAN_START();
+ g_free(bench_md5);
+ bench_md5 = benchmark_md5();
+ SCAN_END();
+}
+
+void scan_fib(gboolean reload)
+{
+ SCAN_START();
+ g_free(bench_fib);
+ bench_fib = benchmark_fib();
+ SCAN_END();
+}
+
+void scan_sha1(gboolean reload)
+{
+ SCAN_START();
+ g_free(bench_sha1);
+ bench_sha1 = benchmark_sha1();
+ SCAN_END();
+}
+
+const gchar *hi_note_func(gint entry)
+{
+ switch (entry) {
+ case BENCHMARK_ZLIB:
+ case BENCHMARK_MD5:
+ case BENCHMARK_SHA1:
+ return "Results in bytes/second. Higher is better.";
+
+ case BENCHMARK_RAYTRACE:
+ case BENCHMARK_BLOWFISH:
+ case BENCHMARK_FIB:
+ return "Results in seconds. Lower is better.";
+ }
+
+ return "";
+}
+
+gchar *hi_module_get_name(void)
{
return g_strdup("Benchmarks");
}
-guchar
-hi_module_weight(void)
+guchar hi_module_get_weight(void)
{
return 240;
}
+
+ModuleEntry *hi_module_get_entries(void)
+{
+ return entries;
+}
diff --git a/hardinfo2/callbacks.c b/hardinfo2/callbacks.c
index 5ee34fa4..bc50c668 100644
--- a/hardinfo2/callbacks.c
+++ b/hardinfo2/callbacks.c
@@ -83,7 +83,7 @@ void cb_copy_to_clipboard()
ShellModuleEntry *entry = shell_get_main_shell()->selected;
if (entry) {
- gchar *data = entry->func(entry->number);
+ gchar *data = module_entry_function(entry);
GtkClipboard *clip = gtk_clipboard_get(gdk_atom_intern("CLIPBOARD", FALSE));
ReportContext *ctx = report_context_text_new(NULL);
diff --git a/hardinfo2/computer.c b/hardinfo2/computer.c
index aebff09b..6f98aa09 100644
--- a/hardinfo2/computer.c
+++ b/hardinfo2/computer.c
@@ -43,22 +43,46 @@ enum {
COMPUTER_USERS,
} Entries;
-static ModuleEntry hi_entries[] = {
- {"Summary", "summary.png"},
- {"Operating System", "os.png"},
- {"Kernel Modules", "module.png"},
- {"Languages", "language.png"},
- {"Filesystems", "dev_removable.png"},
- {"Shared Directories", "shares.png"},
- {"Display", "monitor.png"},
- {"Network Interfaces", "network.png"},
- {"Users", "users.png"},
+/* Callbacks */
+gchar *callback_summary();
+gchar *callback_os();
+gchar *callback_modules();
+gchar *callback_locales();
+gchar *callback_fs();
+gchar *callback_shares();
+gchar *callback_display();
+gchar *callback_network();
+gchar *callback_users();
+
+/* Scan callbacks */
+void scan_summary(gboolean reload);
+void scan_os(gboolean reload);
+void scan_modules(gboolean reload);
+void scan_locales(gboolean reload);
+void scan_fs(gboolean reload);
+void scan_shares(gboolean reload);
+void scan_display(gboolean reload);
+void scan_network(gboolean reload);
+void scan_users(gboolean reload);
+
+static ModuleEntry entries[] = {
+ { "Summary", "summary.png", callback_summary, scan_summary },
+ { "Operating System", "os.png", callback_os, scan_os },
+ { "Kernel Modules", "module.png", callback_modules, scan_modules },
+ { "Languages", "language.png", callback_locales, scan_locales },
+ { "Filesystems", "dev_removable.png", callback_fs, scan_fs },
+ { "Shared Directories", "shares.png", callback_shares, scan_shares },
+ { "Display", "monitor.png", callback_display, scan_display },
+ { "Network Interfaces", "network.png", callback_network, scan_network },
+ { "Users", "users.png", callback_users, scan_users },
+ { NULL },
};
#include "computer.h"
static GHashTable *moreinfo = NULL;
static gchar *module_list = NULL;
+static Computer *computer = NULL;
#include <arch/this/modules.h>
#include <arch/common/languages.h>
@@ -74,71 +98,6 @@ static gchar *module_list = NULL;
#include <arch/this/net.h>
#include <arch/common/users.h>
-static Computer *
-computer_get_info(void)
-{
- Computer *computer;
-
- computer = g_new0(Computer, 1);
-
- if (moreinfo) {
-#ifdef g_hash_table_unref
- g_hash_table_unref(moreinfo);
-#else
- g_free(moreinfo);
-#endif
- }
-
- moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-
- shell_status_update("Getting memory information...");
- computer->memory = computer_get_memory();
-
- shell_status_update("Getting operating system information...");
- computer->os = computer_get_os();
-
- shell_status_update("Getting display information...");
- computer->display = computer_get_display();
-
- shell_status_update("Getting sound card information...");
- computer->alsa = computer_get_alsainfo();
-
- shell_status_update("Getting mounted file system information...");
- scan_filesystems();
-
- shell_status_update("Getting shared directories...");
- scan_samba_shared_directories();
- scan_nfs_shared_directories();
-
- shell_status_update("Obtaining network information...");
- scan_net_interfaces();
-
- shell_status_update("Obtaining users information...");
- scan_users();
-
- computer->date_time = "...";
- return computer;
-}
-
-void
-hi_reload(gint entry)
-{
- switch (entry) {
- case COMPUTER_KERNEL_MODULES:
- scan_modules();
- break;
- case COMPUTER_FILESYSTEMS:
- scan_filesystems();
- break;
- case COMPUTER_NETWORK:
- scan_net_interfaces();
- break;
- case COMPUTER_USERS:
- scan_users();
- break;
- }
-}
-
gchar *
hi_more_info(gchar * entry)
{
@@ -178,176 +137,243 @@ hi_get_field(gchar * field)
return tmp;
}
-gchar *
-hi_info(gint entry)
+void scan_summary(gboolean reload)
{
- static Computer *computer = NULL;
- static gchar *tmp1, *tmp2;
+ SCAN_START();
+ module_entry_scan_all_except(entries, COMPUTER_SUMMARY);
+ computer->alsa = computer_get_alsainfo();
+ SCAN_END();
+}
- if (!computer) {
- computer = computer_get_info();
- }
+void scan_os(gboolean reload)
+{
+ SCAN_START();
+ computer->os = computer_get_os();
+ SCAN_END();
+}
- switch (entry) {
- case COMPUTER_KERNEL_MODULES:
- if (!module_list) {
- shell_status_update("Getting loaded module information...");
- scan_modules();
- }
- return g_strdup_printf("[Loaded Modules]\n"
- "%s"
- "[$ShellParam$]\n"
- "ViewType=1",
- module_list);
- case COMPUTER_NETWORK:
- return g_strdup_printf("[$ShellParam$]\n"
- "ReloadInterval=3000\n"
- "ViewType=1\n"
- "%s", network_interfaces);
- case COMPUTER_USERS:
- return g_strdup_printf("[$ShellParam$]\n"
- "ReloadInterval=10000\n"
- "ViewType=1\n"
- "[Human Users]\n"
- "%s\n"
- "[System Users]\n"
- "%s\n", human_users, sys_users);
- case COMPUTER_SHARES:
- return g_strdup_printf("[SAMBA]\n"
- "%s\n"
- "[NFS]\n"
- "%s", smb_shares_list, nfs_shares_list);
- case COMPUTER_FILESYSTEMS:
- return g_strdup_printf("[$ShellParam$]\n"
- "ViewType=1\n"
- "ReloadInterval=5000\n"
- "[Mounted File Systems]\n%s\n", fs_list);
- case COMPUTER_SUMMARY:
- tmp1 = computer_get_alsacards(computer);
- tmp2 = module_call_method("devices::getProcessorName");
-
- schedule_free(tmp1);
- schedule_free(tmp2);
-
- return g_strdup_printf("[$ShellParam$]\n"
- "UpdateInterval$Memory=1000\n"
- "UpdateInterval$Date/Time=1000\n"
- "[Computer]\n"
- "Processor=%s\n"
- "Memory=...\n"
- "Operating System=%s\n"
- "User Name=%s\n"
- "Date/Time=%s\n"
- "[Display]\n"
- "Resolution=%dx%d pixels\n"
- "OpenGL Renderer=%s\n"
- "X11 Vendor=%s\n"
- "[Multimedia]\n"
- "%s\n",
- tmp2,
- computer->os->distro,
- computer->os->username,
- computer->date_time,
- computer->display->width,
- computer->display->height,
- computer->display->ogl_renderer,
- computer->display->vendor,
- tmp1);
- case COMPUTER_DISPLAY:
- return g_strdup_printf("[Display]\n"
- "Resolution=%dx%d pixels\n"
- "Vendor=%s\n"
- "Version=%s\n"
- "[Monitors]\n"
- "%s"
- "[Extensions]\n"
- "%s"
- "[OpenGL]\n"
- "Vendor=%s\n"
- "Renderer=%s\n"
- "Version=%s\n"
- "Direct Rendering=%s\n",
- computer->display->width,
- computer->display->height,
- computer->display->vendor,
- computer->display->version,
- computer->display->monitors,
- computer->display->extensions,
- computer->display->ogl_vendor,
- computer->display->ogl_renderer,
- computer->display->ogl_version,
- computer->display->dri ? "Yes" : "No");
- case COMPUTER_OPERATING_SYSTEM:
- return g_strdup_printf("[$ShellParam$]\n"
- "UpdateInterval$Uptime=10000\n"
- "UpdateInterval$Load Average=1000\n"
- "[Version]\n"
- "Kernel=%s\n"
- "Compiled=%s\n"
- "C Library=%s\n"
- "Distribution=%s\n"
- "[Current Session]\n"
- "Computer Name=%s\n"
- "User Name=%s\n"
- "#Language=%s\n"
- "Home Directory=%s\n"
- "Desktop Environment=%s\n"
- "[Misc]\n"
- "Uptime=...\n"
- "Load Average=...",
- computer->os->kernel,
- computer->os->compiled_date,
- computer->os->libc,
- computer->os->distro,
- computer->os->hostname,
- computer->os->username,
- computer->os->language,
- computer->os->homedir,
- computer->os->desktop);
- case COMPUTER_LANGUAGE:
- return g_strdup_printf("[$ShellParam$]\n"
- "ViewType=1\n"
- "[Available Languages]\n"
- "%s", computer->os->languages);
- default:
- return g_strdup("[Empty]\nNo info available=");
- }
+void scan_modules(gboolean reload)
+{
+ SCAN_START();
+ scan_modules_do();
+ SCAN_END();
}
-gint
-hi_n_entries(void)
+void scan_locales(gboolean reload)
{
- return G_N_ELEMENTS(hi_entries) - 1;
+ SCAN_START();
+ scan_languages(computer->os);
+ SCAN_END();
}
-GdkPixbuf *
-hi_icon(gint entry)
+void scan_fs(gboolean reload)
{
- return icon_cache_get_pixbuf(hi_entries[entry].icon);
+ SCAN_START();
+ scan_filesystems();
+ SCAN_END();
}
-gchar *
-hi_name(gint entry)
+void scan_shares(gboolean reload)
+{
+ SCAN_START();
+ scan_samba_shared_directories();
+ scan_nfs_shared_directories();
+ SCAN_END();
+}
+
+void scan_display(gboolean reload)
+{
+ SCAN_START();
+ computer->display = computer_get_display();
+ SCAN_END();
+}
+
+void scan_network(gboolean reload)
+{
+ SCAN_START();
+ scan_net_interfaces();
+ SCAN_END();
+}
+
+void scan_users(gboolean reload)
+{
+ SCAN_START();
+ scan_users_do();
+ SCAN_END();
+}
+
+gchar *callback_summary()
{
- return hi_entries[entry].name;
+ return g_strdup_printf("[$ShellParam$]\n"
+ "UpdateInterval$Memory=1000\n"
+ "UpdateInterval$Date/Time=1000\n"
+ "#ReloadInterval=5000\n"
+ "[Computer]\n"
+ "Processor=%s\n"
+ "Memory=...\n"
+ "Operating System=%s\n"
+ "User Name=%s\n"
+ "Date/Time=...\n"
+ "[Display]\n"
+ "Resolution=%dx%d pixels\n"
+ "OpenGL Renderer=%s\n"
+ "X11 Vendor=%s\n"
+ "[Multimedia]\n"
+ "%s\n"
+ "[Input Devices]\n%s\n"
+ "%s\n"
+ "%s\n",
+ (gchar*)idle_free(module_call_method("devices::getProcessorName")),
+ computer->os->distro,
+ computer->os->username,
+ computer->display->width,
+ computer->display->height,
+ computer->display->ogl_renderer,
+ computer->display->vendor,
+ (gchar*)idle_free(computer_get_alsacards(computer)),
+ (gchar*)idle_free(module_call_method("devices::getInputDevices")),
+ (gchar*)idle_free(module_call_method("devices::getPrinters")),
+ (gchar*)idle_free(module_call_method("devices::getStorageDevices")));
+}
+
+gchar *callback_os()
+{
+ return g_strdup_printf("[$ShellParam$]\n"
+ "UpdateInterval$Uptime=10000\n"
+ "UpdateInterval$Load Average=1000\n"
+ "[Version]\n"
+ "Kernel=%s\n"
+ "Compiled=%s\n"
+ "C Library=%s\n"
+ "Distribution=%s\n"
+ "[Current Session]\n"
+ "Computer Name=%s\n"
+ "User Name=%s\n"
+ "#Language=%s\n"
+ "Home Directory=%s\n"
+ "Desktop Environment=%s\n"
+ "[Misc]\n"
+ "Uptime=...\n"
+ "Load Average=...",
+ computer->os->kernel,
+ computer->os->compiled_date,
+ computer->os->libc,
+ computer->os->distro,
+ computer->os->hostname,
+ computer->os->username,
+ computer->os->language,
+ computer->os->homedir,
+ computer->os->desktop);
+}
+
+gchar *callback_modules()
+{
+ return g_strdup_printf("[Loaded Modules]\n"
+ "%s"
+ "[$ShellParam$]\n"
+ "ViewType=1",
+ module_list);
+}
+
+gchar *callback_locales()
+{
+ return g_strdup_printf("[$ShellParam$]\n"
+ "ViewType=1\n"
+ "[Available Languages]\n"
+ "%s", computer->os->languages);
+}
+
+gchar *callback_fs()
+{
+ return g_strdup_printf("[$ShellParam$]\n"
+ "ViewType=1\n"
+ "ReloadInterval=5000\n"
+ "[Mounted File Systems]\n%s\n", fs_list);
+}
+
+gchar *callback_shares()
+{
+ return g_strdup_printf("[SAMBA]\n"
+ "%s\n"
+ "[NFS]\n"
+ "%s", smb_shares_list, nfs_shares_list);
+}
+
+gchar *callback_display()
+{
+ return g_strdup_printf("[Display]\n"
+ "Resolution=%dx%d pixels\n"
+ "Vendor=%s\n"
+ "Version=%s\n"
+ "[Monitors]\n"
+ "%s"
+ "[Extensions]\n"
+ "%s"
+ "[OpenGL]\n"
+ "Vendor=%s\n"
+ "Renderer=%s\n"
+ "Version=%s\n"
+ "Direct Rendering=%s\n",
+ computer->display->width,
+ computer->display->height,
+ computer->display->vendor,
+ computer->display->version,
+ computer->display->monitors,
+ computer->display->extensions,
+ computer->display->ogl_vendor,
+ computer->display->ogl_renderer,
+ computer->display->ogl_version,
+ computer->display->dri ? "Yes" : "No");
+}
+
+gchar *callback_network()
+{
+ return g_strdup_printf("[$ShellParam$]\n"
+ "ReloadInterval=3000\n"
+ "ViewType=1\n"
+ "%s", network_interfaces);
+}
+
+gchar *callback_users()
+{
+ return g_strdup_printf("[$ShellParam$]\n"
+ "ReloadInterval=10000\n"
+ "ViewType=1\n"
+ "[Human Users]\n"
+ "%s\n"
+ "[System Users]\n"
+ "%s\n", human_users, sys_users);
+}
+
+ModuleEntry *
+hi_module_get_entries(void)
+{
+ return entries;
}
gchar *
-hi_module_name(void)
+hi_module_get_name(void)
{
return g_strdup("Computer");
}
guchar
-hi_module_weight(void)
+hi_module_get_weight(void)
{
return 80;
}
gchar **
-hi_module_depends_on(void)
+hi_module_get_dependencies(void)
{
static gchar *deps[] = { "devices.so", NULL };
return deps;
}
+
+void
+hi_module_init(void)
+{
+ computer = g_new0(Computer, 1);
+ moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+}
diff --git a/hardinfo2/devices.c b/hardinfo2/devices.c
index 9e6d15be..08ba754c 100644
--- a/hardinfo2/devices.c
+++ b/hardinfo2/devices.c
@@ -39,16 +39,37 @@ enum {
DEVICES_STORAGE,
} Entries;
-static ModuleEntry hi_entries[] = {
- {"Processor", "processor.png"},
- {"Memory", "memory.png"},
- {"PCI Devices", "devices.png"},
- {"USB Devices", "usb.png"},
- {"Printers", "printer.png"},
- {"Battery", "battery.png"},
- {"Sensors", "therm.png"},
- {"Input Devices", "keyboard.png"},
- {"Storage", "hdd.png"},
+gchar *callback_processors();
+gchar *callback_memory();
+gchar *callback_battery();
+gchar *callback_pci();
+gchar *callback_sensors();
+gchar *callback_printers();
+gchar *callback_storage();
+gchar *callback_input();
+gchar *callback_usb();
+
+void scan_processors(gboolean reload);
+void scan_memory(gboolean reload);
+void scan_battery(gboolean reload);
+void scan_pci(gboolean reload);
+void scan_sensors(gboolean reload);
+void scan_printers(gboolean reload);
+void scan_storage(gboolean reload);
+void scan_input(gboolean reload);
+void scan_usb(gboolean reload);
+
+static ModuleEntry entries[] = {
+ {"Processor", "processor.png", callback_processors, scan_processors},
+ {"Memory", "memory.png", callback_memory, scan_memory},
+ {"PCI Devices", "devices.png", callback_pci, scan_pci},
+ {"USB Devices", "usb.png", callback_usb, scan_usb},
+ {"Printers", "printer.png", callback_printers, scan_printers,},
+ {"Battery", "battery.png", callback_battery, scan_battery},
+ {"Sensors", "therm.png", callback_sensors, scan_sensors},
+ {"Input Devices", "keyboard.png", callback_input, scan_input},
+ {"Storage", "hdd.png", callback_storage, scan_storage},
+ { NULL }
};
static GHashTable *moreinfo = NULL;
@@ -116,55 +137,56 @@ struct _Processor {
#include <arch/this/battery.h>
#include <arch/this/sensors.h>
-static void
-detect_devices(void)
+gchar *
+get_processor_name(void)
{
- moreinfo = g_hash_table_new(g_str_hash, g_str_equal);
-
- shell_status_update("Getting processor information...");
- if (!processors)
- processors = computer_get_processors();
-
- shell_status_update("Scanning PCI devices...");
- scan_pci();
-
- shell_status_update("Searching for printers...");
- scan_printers();
-
- shell_status_update("Scanning input devices...");
- scan_inputdevices();
-
- shell_status_update("Scanning USB devices...");
- scan_usb();
-
- shell_status_update("Scanning IDE devices...");
- scan_ide();
+ scan_processors(FALSE);
+
+ Processor *p = (Processor *) processors->data;
- shell_status_update("Scanning SCSI devices...");
- scan_scsi();
+ if (g_slist_length(processors) > 1) {
+ return idle_free(g_strdup_printf("%dx %s",
+ g_slist_length(processors),
+ p->model_name));
+ } else {
+ return p->model_name;
+ }
+}
- shell_status_update("Scanning batteries...");
- scan_battery();
+gchar *
+get_storage_devices(void)
+{
+ if (!*storage_list) {
+ scan_storage(FALSE);
+ }
+
+ return storage_list;
+}
- shell_status_update("Reading sensors...");
- read_sensors();
+gchar *
+get_printers(void)
+{
+ scan_printers(FALSE);
+
+ return printer_list;
}
gchar *
-get_processor_name(void)
+get_input_devices(void)
{
- if (!processors) {
- processors = computer_get_processors();
- }
+ scan_input(FALSE);
- Processor *p = (Processor *) processors->data;
- return p->model_name;
+ return input_list;
}
-ShellModuleMethod *hi_exported_methods(void)
+ShellModuleMethod*
+hi_exported_methods(void)
{
static ShellModuleMethod m[] = {
- { "getProcessorName", get_processor_name },
+ { "getProcessorName", get_processor_name },
+ { "getStorageDevices", get_storage_devices },
+ { "getPrinters", get_printers },
+ { "getInputDevices", get_input_devices },
{ NULL }
};
@@ -182,115 +204,174 @@ hi_more_info(gchar * entry)
}
void
-hi_reload(gint entry)
+scan_processors(gboolean reload)
{
- switch (entry) {
- case DEVICES_BATTERY:
- scan_battery();
- break;
- case DEVICES_INPUT:
- scan_inputdevices();
- break;
- case DEVICES_PRINTERS:
- scan_printers();
- break;
- case DEVICES_USB:
- scan_usb();
- break;
- case DEVICES_SENSORS:
- read_sensors();
- break;
- case DEVICES_STORAGE:
- if (storage_list) {
- g_free(storage_list);
- g_free(storage_icons);
- storage_list = g_strdup("");
- storage_icons = g_strdup("");
- }
- scan_ide();
- scan_scsi();
- break;
- }
+ SCAN_START();
+ if (!processors)
+ processors = __scan_processors();
+ SCAN_END();
+}
+
+void
+scan_memory(gboolean reload)
+{
+ SCAN_START();
+ SCAN_END();
+}
+
+void
+scan_battery(gboolean reload)
+{
+ SCAN_START();
+ __scan_battery();
+ SCAN_END();
+}
+
+void
+scan_pci(gboolean reload)
+{
+ SCAN_START();
+ __scan_pci();
+ SCAN_END();
+}
+
+void
+scan_sensors(gboolean reload)
+{
+ SCAN_START();
+ __scan_sensors();
+ SCAN_END();
+}
+
+void
+scan_printers(gboolean reload)
+{
+ SCAN_START();
+ __scan_printers();
+ SCAN_END();
+}
+
+void
+scan_storage(gboolean reload)
+{
+ SCAN_START();
+ __scan_ide_devices();
+ __scan_scsi_devices();
+ SCAN_END();
+}
+
+void
+scan_input(gboolean reload)
+{
+ SCAN_START();
+ __scan_input_devices();
+ SCAN_END();
+}
+
+void
+scan_usb(gboolean reload)
+{
+ SCAN_START();
+ __scan_usb();
+ SCAN_END();
}
gchar *
-hi_info(gint entry)
+callback_processors()
{
- if (!moreinfo) {
- detect_devices();
- }
+ return processor_get_info(processors);
+}
- switch (entry) {
- case DEVICES_PROCESSORS:
- return processor_get_info(processors);
- case DEVICES_MEMORY:
- return g_strdup("[Memory]\nNot implemented=\n");
- case DEVICES_BATTERY:
- return g_strdup_printf("%s\n"
- "[$ShellParam$]\n"
- "ReloadInterval=4000\n", battery_list);
- case DEVICES_PCI:
- return g_strdup_printf("[PCI Devices]\n"
- "%s"
- "[$ShellParam$]\n"
- "ViewType=1\n",
- pci_list);
- case DEVICES_SENSORS:
- return g_strdup_printf("[$ShellParam$]\n"
- "ReloadInterval=5000\n"
- "%s", sensors);
- case DEVICES_PRINTERS:
- return g_strdup_printf("%s\n"
- "[$ShellParam$]\n"
- "ReloadInterval=5000", printer_list);
- case DEVICES_STORAGE:
- return g_strdup_printf("%s\n"
- "[$ShellParam$]\n"
- "ReloadInterval=5000\n"
- "ViewType=1\n%s", storage_list, storage_icons);
- case DEVICES_INPUT:
- return g_strdup_printf("[Input Devices]\n"
- "%s"
- "[$ShellParam$]\n"
- "ViewType=1\n"
- "ReloadInterval=5000\n%s", input_list, input_icons);
- case DEVICES_USB:
- return g_strdup_printf("%s"
- "[$ShellParam$]\n"
- "ViewType=1\n"
- "ReloadInterval=5000\n",
- usb_list);
- default:
- return g_strdup("[Empty]\nNo info available=");
- }
+gchar *
+callback_memory()
+{
+ return g_strdup("[Memory]\nNot implemented=\n");
}
-gint
-hi_n_entries(void)
+gchar *
+callback_battery()
{
- return G_N_ELEMENTS(hi_entries) - 1;
+ return g_strdup_printf("%s\n"
+ "[$ShellParam$]\n"
+ "ReloadInterval=4000\n", battery_list);
}
-GdkPixbuf *
-hi_icon(gint entry)
+gchar *
+callback_pci()
{
- return icon_cache_get_pixbuf(hi_entries[entry].icon);
+ return g_strdup_printf("[PCI Devices]\n"
+ "%s"
+ "[$ShellParam$]\n"
+ "ViewType=1\n",
+ pci_list);
}
gchar *
-hi_name(gint entry)
+callback_sensors()
{
- return hi_entries[entry].name;
+ return g_strdup_printf("[$ShellParam$]\n"
+ "ReloadInterval=5000\n"
+ "%s", sensors);
}
gchar *
-hi_module_name(void)
+callback_printers()
+{
+ return g_strdup_printf("%s\n"
+ "[$ShellParam$]\n"
+ "ReloadInterval=5000", printer_list);
+}
+
+gchar *
+callback_storage()
+{
+ return g_strdup_printf("%s\n"
+ "[$ShellParam$]\n"
+ "ReloadInterval=5000\n"
+ "ViewType=1\n%s", storage_list, storage_icons);
+}
+
+gchar *
+callback_input()
+{
+ return g_strdup_printf("[Input Devices]\n"
+ "%s"
+ "[$ShellParam$]\n"
+ "ViewType=1\n"
+ "ReloadInterval=5000\n%s", input_list, input_icons);
+}
+
+gchar *
+callback_usb()
+{
+ return g_strdup_printf("%s"
+ "[$ShellParam$]\n"
+ "ViewType=1\n"
+ "ReloadInterval=5000\n",
+ usb_list);
+}
+
+ModuleEntry *
+hi_module_get_entries(void)
+{
+ return entries;
+}
+
+gchar *
+hi_module_get_name(void)
{
return g_strdup("Devices");
}
guchar
-hi_module_weight(void)
+hi_module_get_weight(void)
{
return 160;
}
+
+void
+hi_module_init(void)
+{
+ moreinfo = g_hash_table_new(g_str_hash, g_str_equal);
+}
+
diff --git a/hardinfo2/hardinfo.h b/hardinfo2/hardinfo.h
index 36013060..48580274 100644
--- a/hardinfo2/hardinfo.h
+++ b/hardinfo2/hardinfo.h
@@ -48,8 +48,10 @@ struct _FileTypes {
};
struct _ModuleEntry {
- gchar *name;
- gchar *icon;
+ gchar *name;
+ gchar *icon;
+ gpointer callback;
+ gpointer scan_callback;
};
/* String utility functions */
@@ -71,13 +73,19 @@ gchar *file_chooser_build_filename(GtkWidget *chooser, gchar *extension);
gpointer file_types_get_data_by_name(FileTypes *file_types, gchar *name);
/* Misc utility functions */
-void schedule_free(gpointer ptr);
+gpointer idle_free(gpointer ptr);
inline gchar *size_human_readable(gfloat size);
void nonblock_sleep(guint msec);
void open_url(gchar *url);
GSList *modules_load_selected(void);
GSList *modules_load_all(void);
+void module_entry_scan_all_except(ModuleEntry *entries, gint except_entry);
+void module_entry_scan_all(ModuleEntry *entries);
+void module_entry_reload(ShellModuleEntry *module_entry);
+void module_entry_scan(ShellModuleEntry *module_entry);
+gchar *module_entry_function(ShellModuleEntry *module_entry);
+
/* BinReloc stuff */
gboolean binreloc_init(gboolean try_hardcoded);
@@ -87,7 +95,10 @@ void parameters_init(int *argc, char ***argv, ProgramParameters *params);
extern ProgramParameters params;
/* Module stuff */
-void module_register(ShellModule *module);
gchar *module_call_method(gchar *method);
+
+#define SCAN_START() static gboolean scanned = FALSE; if (reload) scanned = FALSE; if (scanned) return;
+#define SCAN_END() scanned = TRUE;
+
#endif /* __HARDINFO_H__ */
diff --git a/hardinfo2/report.c b/hardinfo2/report.c
index 0a486228..8247a0dc 100644
--- a/hardinfo2/report.c
+++ b/hardinfo2/report.c
@@ -345,7 +345,8 @@ report_create_inner_from_module_list(ReportContext *ctx, GSList *modules)
ctx->entry = entry;
report_subtitle(ctx, entry->name);
- report_table(ctx, entry->func(entry->number));
+ module_entry_scan(entry);
+ report_table(ctx, module_entry_function(entry));
}
}
}
diff --git a/hardinfo2/shell.c b/hardinfo2/shell.c
index 5cd0e56d..b05366be 100644
--- a/hardinfo2/shell.c
+++ b/hardinfo2/shell.c
@@ -271,13 +271,13 @@ void shell_do_reload(void)
shell_action_set_enabled("CopyAction", FALSE);
shell_action_set_enabled("ReportAction", FALSE);
- if (shell->selected && shell->selected->reloadfunc) {
+ if (shell->selected) {
GtkTreeSelection *ts;
ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(shell->tree->view));
shell_status_set_enabled(TRUE);
-
- shell->selected->reloadfunc(shell->selected->number);
+
+ module_entry_reload(shell->selected);
module_selected(ts, NULL);
}
@@ -569,7 +569,7 @@ static gboolean reload_section(gpointer data)
ShellModuleEntry *entry = (ShellModuleEntry *) data;
/* if the entry is still selected, update it */
- if (entry->selected && entry->reloadfunc) {
+ if (entry->selected) {
GtkTreePath *path = NULL;
GtkTreeSelection *ts;
GtkTreeIter iter;
@@ -581,7 +581,7 @@ static gboolean reload_section(gpointer data)
path = gtk_tree_model_get_path(shell->info->model, &iter);
/* update the information, clear the treeview and populate it again */
- entry->reloadfunc(entry->number);
+ module_entry_reload(entry);
info_selected_show_extra(NULL); /* clears the more info store */
module_selected_show_info(entry, TRUE);
@@ -920,11 +920,8 @@ module_selected_show_info(ShellModuleEntry * entry, gboolean reload)
gint i;
gsize ngroups;
- if (entry->func) {
- key_data = entry->func(entry->number);
- } else {
- key_data = g_strdup("[Error]\n" "Invalid module=");
- }
+ module_entry_scan(entry);
+ key_data = module_entry_function(entry);
/* reset the view type to normal */
set_view_type(SHELL_VIEW_NORMAL);
@@ -1033,7 +1030,7 @@ static void module_selected(GtkTreeSelection * ts, gpointer data)
/* Get the current selection and shows its related info */
gtk_tree_model_get(model, &parent, TREE_COL_DATA, &entry, -1);
- if (entry && entry->func && !entry->selected) {
+ if (entry && !entry->selected) {
shell_status_set_enabled(TRUE);
shell_status_update("Updating...");
@@ -1066,10 +1063,8 @@ static void module_selected(GtkTreeSelection * ts, gpointer data)
gtk_window_set_title(GTK_WINDOW(shell->window), tmp);
g_free(tmp);
- shell_action_set_enabled("RefreshAction",
- entry->reloadfunc ? TRUE : FALSE);
- shell_action_set_enabled("CopyAction",
- entry->reloadfunc ? TRUE : FALSE);
+ shell_action_set_enabled("RefreshAction", TRUE);
+ shell_action_set_enabled("CopyAction", TRUE);
} else {
gtk_window_set_title(GTK_WINDOW(shell->window),
"System Information");
diff --git a/hardinfo2/shell.h b/hardinfo2/shell.h
index c1204233..fca5a5d4 100644
--- a/hardinfo2/shell.h
+++ b/hardinfo2/shell.h
@@ -123,8 +123,9 @@ struct _ShellModuleEntry {
gboolean selected;
gint number;
- gchar *(*func) (gint entry);
- gchar *(*reloadfunc) (gint entry);
+ gchar *(*func) ();
+ void (*scan_func) ();
+
gchar *(*fieldfunc) (gchar * entry);
gchar *(*morefunc) (gchar * entry);
gchar *(*notefunc) (gint entry);
diff --git a/hardinfo2/util.c b/hardinfo2/util.c
index d47bb289..13194df3 100644
--- a/hardinfo2/util.c
+++ b/hardinfo2/util.c
@@ -121,8 +121,8 @@ void file_chooser_add_filters(GtkWidget * chooser, FileTypes * filters)
}
}
-gchar
- * file_chooser_get_extension(GtkWidget * chooser, FileTypes * filters)
+gchar *
+file_chooser_get_extension(GtkWidget * chooser, FileTypes * filters)
{
GtkFileFilter *filter;
const gchar *filter_name;
@@ -377,15 +377,15 @@ gchar *strreplace(gchar * string, gchar * replace, gchar new_char)
return string;
}
-static GHashTable *__modules = NULL;
+static GHashTable *__module_methods = NULL;
-void module_register(ShellModule *module)
+static void module_register_methods(ShellModule *module)
{
ShellModuleMethod *(*get_methods) (void);
gchar *method_name;
- if (__modules == NULL) {
- __modules = g_hash_table_new(g_str_hash, g_str_equal);
+ if (__module_methods == NULL) {
+ __module_methods = g_hash_table_new(g_str_hash, g_str_equal);
}
if (g_module_symbol(module->dll, "hi_exported_methods", (gpointer) &get_methods)) {
@@ -398,7 +398,7 @@ void module_register(ShellModule *module)
strend(name, '.');
method_name = g_strdup_printf("%s::%s", name, method.name);
- g_hash_table_insert(__modules, method_name, method.function);
+ g_hash_table_insert(__module_methods, method_name, method.function);
g_free(name);
if (!(*(++methods)).name)
@@ -412,11 +412,11 @@ gchar *module_call_method(gchar *method)
{
gchar *(*function) (void);
- if (__modules == NULL) {
+ if (__module_methods == NULL) {
return NULL;
}
- function = g_hash_table_lookup(__modules, method);
+ function = g_hash_table_lookup(__module_methods, method);
return function ? g_strdup(function()) :
g_strdup_printf("{Unknown method: \"%s\"}", method);
}
@@ -448,38 +448,35 @@ static ShellModule *module_load(gchar *filename)
g_free(tmp);
if (module->dll) {
- gint (*n_entries) (void);
- gint (*weight_func) (void);
- gchar *(*name_func) (void);
- gint i;
-
- if (!g_module_symbol(module->dll, "hi_n_entries", (gpointer) & n_entries) ||
- !g_module_symbol(module->dll, "hi_module_name", (gpointer) & name_func))
+ void (*init) (void);
+ ModuleEntry *(*get_module_entries) (void);
+ gint (*weight_func) (void);
+ gchar *(*name_func) (void);
+ ModuleEntry *entries;
+ gint i = 0;
+
+ if (!g_module_symbol(module->dll, "hi_module_get_entries", (gpointer) & get_module_entries) ||
+ !g_module_symbol(module->dll, "hi_module_get_name", (gpointer) & name_func)) {
goto failed;
+ }
- g_module_symbol(module->dll, "hi_module_weight", (gpointer) & weight_func);
+ if (g_module_symbol(module->dll, "hi_module_init", (gpointer) & init)) {
+ init();
+ }
+
+ g_module_symbol(module->dll, "hi_module_get_weight", (gpointer) & weight_func);
module->weight = weight_func ? weight_func() : 0;
module->name = name_func();
- gint j = n_entries();
- for (i = 0; i <= j; i++) {
- GdkPixbuf *(*shell_icon) (gint);
- const gchar *(*shell_name) (gint);
+ entries = get_module_entries();
+ while (entries[i].name) {
ShellModuleEntry *entry = g_new0(ShellModuleEntry, 1);
- if (params.gui_running && g_module_symbol(module->dll, "hi_icon",
- (gpointer) & (shell_icon))) {
- entry->icon = shell_icon(i);
- }
- if (g_module_symbol
- (module->dll, "hi_name", (gpointer) & (shell_name))) {
- entry->name = g_strdup(shell_name(i));
+ if (params.gui_running) {
+ entry->icon = icon_cache_get_pixbuf(entries[i].icon);
}
- g_module_symbol(module->dll, "hi_info",
- (gpointer) & (entry->func));
- g_module_symbol(module->dll, "hi_reload",
- (gpointer) & (entry->reloadfunc));
+
g_module_symbol(module->dll, "hi_more_info",
(gpointer) & (entry->morefunc));
g_module_symbol(module->dll, "hi_get_field",
@@ -487,10 +484,17 @@ static ShellModule *module_load(gchar *filename)
g_module_symbol(module->dll, "hi_note_func",
(gpointer) & (entry->notefunc));
- entry->number = i;
-
+ entry->name = entries[i].name;
+ entry->scan_func = entries[i].scan_callback;
+ entry->func = entries[i].callback;
+ entry->number = i;
+
module->entries = g_slist_append(module->entries, entry);
+
+ i++;
}
+
+ module_register_methods(module);
} else {
failed:
g_free(module->name);
@@ -498,8 +502,6 @@ static ShellModule *module_load(gchar *filename)
module = NULL;
}
- module_register(module);
-
return module;
}
@@ -560,7 +562,7 @@ static GSList *modules_check_deps(GSList *modules)
module = (ShellModule *) mm->data;
- if (g_module_symbol(module->dll, "hi_module_depends_on",
+ if (g_module_symbol(module->dll, "hi_module_get_dependencies",
(gpointer) & get_deps)) {
for (i = 0, deps = get_deps(); deps[i]; i++) {
GSList *l;
@@ -792,14 +794,69 @@ void tree_view_save_image(gchar *filename)
}
-static gboolean __schedule_free_do(gpointer ptr)
+static gboolean __idle_free_do(gpointer ptr)
{
g_free(ptr);
return FALSE;
}
-void schedule_free(gpointer ptr)
+gpointer idle_free(gpointer ptr)
+{
+ g_timeout_add(2000, __idle_free_do, ptr);
+
+ return ptr;
+}
+
+void module_entry_scan_all_except(ModuleEntry *entries, gint except_entry)
+{
+ ModuleEntry entry;
+ gint i = 0;
+
+ void (*scan_callback)(gboolean reload);
+
+ for (entry = entries[0]; entry.name; entry = entries[++i]) {
+ if (i == except_entry)
+ continue;
+
+ shell_status_update(idle_free(g_strdup_printf("Scanning: %s...", entry.name)));
+
+ if ((scan_callback = entry.scan_callback)) {
+ scan_callback(FALSE);
+ }
+ }
+
+ shell_status_update("Done.");
+}
+
+void module_entry_scan_all(ModuleEntry *entries)
+{
+ module_entry_scan_all_except(entries, -1);
+}
+
+void module_entry_reload(ShellModuleEntry *module_entry)
+{
+ if (module_entry->scan_func) {
+ module_entry->scan_func(TRUE);
+ }
+}
+
+void module_entry_scan(ShellModuleEntry *module_entry)
+{
+ shell_status_update(idle_free(g_strdup_printf("Scanning: %s...", module_entry->name)));
+
+ if (module_entry->scan_func) {
+ module_entry->scan_func(FALSE);
+ }
+
+ shell_status_update("Done.");
+}
+
+gchar *module_entry_function(ShellModuleEntry *module_entry)
{
- g_timeout_add(5000, __schedule_free_do, ptr);
+ if (module_entry->func) {
+ return g_strdup(module_entry->func());
+ }
+
+ return g_strdup("[Error]\n" "Invalid module=");
}