diff options
Diffstat (limited to 'hardinfo.c')
-rw-r--r-- | hardinfo.c | 623 |
1 files changed, 623 insertions, 0 deletions
diff --git a/hardinfo.c b/hardinfo.c new file mode 100644 index 00000000..e78cf7f5 --- /dev/null +++ b/hardinfo.c @@ -0,0 +1,623 @@ +/* + * Hardware Information, version 0.3.2 + * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br> + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + */ + +#include "hardinfo.h" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> + +#include "pixmaps/pci.xpm" +#include "pixmaps/usb.xpm" +#include "pixmaps/hdd.xpm" +#include "pixmaps/gen_connector.xpm" +#include "pixmaps/scsi.xpm" + +#include "computer.h" +#include "status.h" + +GenericDevice *generic_devices = NULL; + +void hi_show_device_info(GtkCTree * tree, GList * node, + gint column, gpointer user_data); +void hi_hide_device_info(GtkCTree * tree, GList * node, + gint column, gpointer user_data); +void hi_scan_all(MainWindow * mainwindow); + +void +main_window_refresh(GtkWidget * widget, gpointer data) +{ + MainWindow *mainwindow = (MainWindow *) data; + + if (!mainwindow) + return; + + hi_hide_device_info(NULL, NULL, 0, mainwindow); + + memory_update(mainwindow); + uptime_update(mainwindow); + net_update(mainwindow); + + hi_scan_all(mainwindow); +} + +static void +about_window_create(void) +{ + GtkAbout *about; + const gchar *authors[] = { + ">Written by:", + "Leandro Pereira (leandro@linuxmag.com.br)", + ">Disclaimer:", + "This is free software; you can modify and/or distribute it", + "under the terms of GNU GPL version 2. See http://www.fsf.org/", + "for more information.", + NULL + }; + + about = gtk_about_new("HardInfo", VERSION, + _("System information tool for Linux.\n"), + authors, IMG_PREFIX "logo.png"); + +} + +MainWindow * +main_window_create(void) +{ + GtkWidget *window, *mbox, *vbox, *frame, *ctree, *scroll; + GtkWidget *notebook, *label, *hbox, *btn, *hbbox; + MainWindow *mainwindow; + + mainwindow = g_new0(MainWindow, 1); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_container_set_border_width(GTK_CONTAINER(window), 4); + gtk_window_set_title(GTK_WINDOW(window), _("System Information")); + +#ifdef GTK2 + g_signal_connect(G_OBJECT(window), "delete-event", gtk_main_quit, NULL); +#else + gtk_signal_connect(GTK_OBJECT(window), "delete-event", + (GtkSignalFunc) gtk_main_quit, NULL); +#endif + + mbox = gtk_vbox_new(FALSE, 5); + gtk_widget_show(mbox); + gtk_container_add(GTK_CONTAINER(window), mbox); + + notebook = gtk_notebook_new(); + gtk_box_pack_start(GTK_BOX(mbox), notebook, TRUE, TRUE, 0); + + /* + * Computer tab + */ + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); + gtk_widget_show(vbox); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, + gtk_label_new(_("Computer"))); + +#ifdef GTK2 + label = gtk_label_new(_("<b><big>Operating System</big></b>")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Operating System")); +#endif + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), os_get_widget(mainwindow), + FALSE, FALSE, 0); + +#ifdef GTK2 + label = gtk_label_new(_("<b><big>Processor</big></b>")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Processor")); +#endif + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), processor_get_widget(), FALSE, + FALSE, 0); + +#ifdef GTK2 + label = gtk_label_new(_("<b><big>Memory Usage</big></b>")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Memory Usage")); +#endif + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), memory_get_widget(mainwindow), + FALSE, FALSE, 0); + + /* + * Devices tab + */ + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); + gtk_widget_show(vbox); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, + gtk_label_new(_("Devices"))); + + scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_box_pack_start(GTK_BOX(vbox), scroll, TRUE, TRUE, 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + ctree = gtk_ctree_new(2, 0); + gtk_container_add(GTK_CONTAINER(scroll), ctree); + gtk_widget_set_usize(GTK_WIDGET(ctree), 400, 300); + gtk_ctree_set_expander_style(GTK_CTREE(ctree), + GTK_CTREE_EXPANDER_TRIANGLE); + gtk_ctree_set_line_style(GTK_CTREE(ctree), GTK_CTREE_LINES_NONE); + gtk_clist_set_column_width(GTK_CLIST(ctree), 0, 32); + gtk_clist_set_column_width(GTK_CLIST(ctree), 1, 32); + gtk_clist_set_row_height(GTK_CLIST(ctree), 18); +#ifdef GTK2 + g_signal_connect(G_OBJECT(ctree), "tree-select-row", + (GCallback) hi_show_device_info, mainwindow); + g_signal_connect(G_OBJECT(ctree), "tree-unselect-row", + (GCallback) hi_hide_device_info, mainwindow); +#else + gtk_signal_connect(GTK_OBJECT(ctree), "tree-select-row", + (GtkCTreeFunc) hi_show_device_info, mainwindow); + gtk_signal_connect(GTK_OBJECT(ctree), "tree-unselect-row", + (GtkCTreeFunc) hi_hide_device_info, mainwindow); +#endif + + frame = gtk_frame_new(_("Device information")); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + + /* + * Environment tab + */ + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); + gtk_widget_show(vbox); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, + gtk_label_new(_("Environment"))); + +#ifdef GTK2 + label = gtk_label_new(_("<b><big>X-Window System</big></b>")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("X-Window System")); +#endif + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), x11_get_widget(mainwindow), + FALSE, FALSE, 0); + +#if 0 + /* + * Network tab + */ + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); + gtk_widget_show(vbox); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, + gtk_label_new(_("Network"))); + +#ifdef GTK2 + label = gtk_label_new(_("<b><big>Interfaces</big></b>")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Interfaces")); +#endif + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), net_get_widget(mainwindow), + TRUE, TRUE, 0); + +#endif + /* + * Buttons + */ + + hbox = gtk_hbox_new(FALSE, 5); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(mbox), hbox, FALSE, FALSE, 0); + + hbbox = gtk_hbutton_box_new(); + gtk_container_set_border_width(GTK_CONTAINER(hbbox), 4); + gtk_widget_show(hbbox); + gtk_box_pack_start(GTK_BOX(hbox), hbbox, FALSE, FALSE, 0); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbbox), 6); + gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_START); + + btn = gtk_button_new_with_mnemonic(_("Abo_ut...")); +#ifdef GTK2 + g_signal_connect(G_OBJECT(btn), "clicked", + (GCallback) about_window_create, NULL); +#else + gtk_signal_connect(GTK_OBJECT(btn), "clicked", + (GtkSignalFunc) about_window_create, NULL); +#endif + gtk_widget_show(btn); + gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0); + + hbbox = gtk_hbutton_box_new(); + gtk_container_set_border_width(GTK_CONTAINER(hbbox), 4); + gtk_widget_show(hbbox); + gtk_box_pack_end(GTK_BOX(hbox), hbbox, FALSE, FALSE, 0); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbbox), 6); + gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_END); + +#if 0 + btn = gtk_button_new_with_label(_("About")); +#ifdef GTK2 + g_signal_connect(G_OBJECT(btn), "clicked", + (GCallback) about_window_create, NULL); +#else + gtk_signal_connect(GTK_OBJECT(btn), "clicked", + (GtkSignalFunc) about_window_create, NULL); +#endif + gtk_widget_show(btn); + gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0); +#endif + +#ifdef GTK2 + btn = gtk_button_new_from_stock(GTK_STOCK_REFRESH); + g_signal_connect(G_OBJECT(btn), "clicked", + (GCallback) main_window_refresh, mainwindow); +#else + btn = gtk_button_new_with_label(_("Refresh")); + gtk_signal_connect(GTK_OBJECT(btn), "clicked", + (GtkSignalFunc) main_window_refresh, mainwindow); +#endif + gtk_widget_show(btn); + gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0); + +#ifdef GTK2 + btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + g_signal_connect(G_OBJECT(btn), "clicked", gtk_main_quit, NULL); +#else + btn = gtk_button_new_with_label(_("Close")); + gtk_signal_connect(GTK_OBJECT(btn), "clicked", + (GtkSignalFunc) gtk_main_quit, NULL); +#endif + gtk_widget_show(btn); + gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0); + + + + gtk_widget_show_all(window); + gtk_widget_hide(frame); + + mainwindow->window = window; + mainwindow->ctree = ctree; + mainwindow->frame = frame; + + return mainwindow; +} + +static GdkColor +gdk_color_from_rgb(gint r, gint g, gint b) +{ + GdkColormap *cmap = NULL; + GdkColor color; + + if (!cmap) { + cmap = gdk_colormap_get_system(); + gdk_colormap_ref(cmap); + } + + color.red = r * 255; + color.green = g * 255; + color.blue = b * 255; + + gdk_color_alloc(cmap, &color); + gdk_colormap_unref(cmap); + + return color; +} + +GtkCTreeNode * +tree_group_new(MainWindow * mainwindow, const gchar * name, DeviceType type) +{ + GtkCTreeNode *node; + const gchar *text[] = { NULL, name, NULL }; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask = NULL; + GdkColor color; + GdkColormap *colormap = NULL; + + if (!name) + return NULL; + if (type == NONE) + return NULL; + if (!mainwindow) + return NULL; + + colormap = gtk_widget_get_colormap(mainwindow->window); + + switch (type) { + case PARPORT: + case SERIAL: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, gen_connector_xpm); + + break; + case V4L: + case PCI: + case ISAPnP: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, pci_xpm); + break; + case SCSI: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, scsi_xpm); + break; + case IDE: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, hdd_xpm); + break; + case USB: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, usb_xpm); + break; + default: + mask = pixmap = NULL; + break; + } + + node = gtk_ctree_insert_node(GTK_CTREE(mainwindow->ctree), + NULL, NULL, text, 0, pixmap, mask, pixmap, + mask, FALSE, TRUE); + + color = gdk_color_from_rgb(0xcc, 0xcc, 0xcc); + gtk_ctree_node_set_background(GTK_CTREE(mainwindow->ctree), + node, &color); + + gdk_pixmap_unref(pixmap); + gdk_bitmap_unref(mask); + + return node; +} + +void +tree_insert_item(MainWindow * mainwindow, GtkCTreeNode * group, gchar * name, + gpointer data) +{ + GtkCTreeNode *node; + gchar *text[] = { NULL, name, NULL }; + + if (!mainwindow) + return; + if (!name) + return; + if (!group) + return; + + node = gtk_ctree_insert_node(GTK_CTREE(mainwindow->ctree), + group, NULL, + text, 0, + NULL, NULL, NULL, NULL, FALSE, TRUE); + gtk_ctree_node_set_row_data(GTK_CTREE(mainwindow->ctree), node, data); +} + +void +hi_insert_generic(gpointer device, DeviceType type) +{ + GenericDevice *generic; + + generic = g_new0(GenericDevice, 1); + + generic->next = generic_devices; + generic_devices = generic; + + generic_devices->device = device; + generic_devices->type = type; +} + +void +hi_hide_device_info(GtkCTree * tree, GList * node, + gint column, gpointer user_data) +{ + MainWindow *mainwindow = (MainWindow *) user_data; + + gtk_widget_hide(mainwindow->frame); +} + +void +hi_show_device_info(GtkCTree * tree, GList * node, + gint column, gpointer user_data) +{ + GenericDevice *dev; + MainWindow *mainwindow = (MainWindow *) user_data; + + dev = (GenericDevice *) gtk_ctree_node_get_row_data + (GTK_CTREE(tree), GTK_CLIST(tree)->selection->data); + + if (!dev) + return; + +#define dev_info(type,name,func) \ + { \ + type *name; \ + name = (type *)dev->device; \ + func(mainwindow, name); \ + } \ + break; + + switch (dev->type) { + case PCI: + dev_info(PCIDevice, pci, hi_show_pci_info); + case ISAPnP: + dev_info(ISADevice, isa, hi_show_isa_info); + case USB: + dev_info(USBDevice, usb, hi_show_usb_info); + case SERIAL: + dev_info(SerialDevice, serial, hi_show_serial_info); + case PARPORT: + dev_info(ParportDevice, parport, hi_show_parport_info); + case IDE: + dev_info(IDEDevice, ide, hi_show_ide_info); + case SCSI: + dev_info(SCSIDevice, scsi, hi_show_scsi_info); + case V4L: + dev_info(V4LDevice, v4l, hi_show_v4l_info); + default: + g_print("Showing info of device type %d not implemented yet.\n", + dev->type); + return; + break; + } + + gtk_widget_show(mainwindow->frame); + +} + +void +hi_scan_all(MainWindow * mainwindow) +{ + myStatus *status; + PCIDevice *pci; + ISADevice *isa; + IDEDevice *ide; + SCSIDevice *scsi; + V4LDevice *v4l; + ParportDevice *pp; + SerialDevice *sd; + GtkCTreeNode *node; + GenericDevice *gd = generic_devices; + gchar *buf; + + status = my_status_new(_("Scanning Devices"), _("Scanning devices...")); + +#define DEVICE_SCAN(name,ptr,func) \ + ptr = func(); \ + buf = g_strdup_printf(_("Scanning %s devices..."), name); \ + my_status_set_text(status, buf); \ + g_free(buf); \ + my_status_pulse(status) + + DEVICE_SCAN("PCI", pci, hi_scan_pci); + DEVICE_SCAN("ISA PnP", isa, hi_scan_isapnp); + DEVICE_SCAN("IDE", ide, hi_scan_ide); + DEVICE_SCAN("SCSI", scsi, hi_scan_scsi); + DEVICE_SCAN("V4L", v4l, hi_scan_v4l); + DEVICE_SCAN("Parallel", pp, hi_scan_parport); + DEVICE_SCAN("Serial", sd, hi_scan_serial); + + gtk_clist_freeze(GTK_CLIST(mainwindow->ctree)); + + /* + * Free the generic_devices stuff and remove all device-related + * nodes. + */ + if (gd != NULL) { + for (; gd != NULL; gd = gd->next) { + g_free(gd->device); + gtk_ctree_remove_node(GTK_CTREE(mainwindow->ctree), + gd->node); + g_free(gd); + } + generic_devices = NULL; + } + +#define CHECK_INSERT(a,b,c,d) \ + if (a) { \ + node = tree_group_new(mainwindow, b, c); \ + for (; a != NULL; a = a->next) { \ + if (a->d) { \ + hi_insert_generic(a, c); \ + tree_insert_item(mainwindow, node, a->d, \ + generic_devices); \ + } \ + } \ + } + + CHECK_INSERT(pci, _("PCI Devices"), PCI, name); + CHECK_INSERT(isa, _("ISA PnP Devices"), ISAPnP, card); + + /* + * USB is different since it's Plug'n'Pray, so we have a + * routine just for it :) + */ + usb_update(mainwindow); + + CHECK_INSERT(ide, _("ATA/IDE Block Devices"), IDE, model); + CHECK_INSERT(scsi, _("SCSI Devices"), SCSI, model); + CHECK_INSERT(v4l, _("Video for Linux"), V4L, name); + CHECK_INSERT(sd, _("Communication Ports"), SERIAL, name); + CHECK_INSERT(pp, _("Parallel Ports"), PARPORT, name); + + gtk_clist_thaw(GTK_CLIST(mainwindow->ctree)); + + my_status_destroy(status); +} + +#if 0 +static void +usage(char *argv0) +{ + g_print("%s [--prefix <prefix>]\n", argv0); + exit(1); +} +#endif + +int +main(int argc, char **argv) +{ + MainWindow *mainwindow; +#if 0 + gint i; +#endif + +#ifdef ENABLE_NLS + intl_init(); +#endif + + g_print("HardInfo " VERSION "\n"); + g_print + ("Copyright (c) 2003 Leandro Pereira <leandro@linuxmag.com.br>\n\n"); + g_print(_ + ("This is free software; you can modify and/or distribute it\n")); + g_print(_ + ("under the terms of GNU GPL version 2. See http://www.fsf.org/\n")); + g_print(_("for more information.\n\n")); + + gtk_init(&argc, &argv); + +#ifndef GTK2 + gdk_rgb_init(); + gtk_widget_set_default_colormap(gdk_rgb_get_cmap()); + gtk_widget_set_default_visual(gdk_rgb_get_visual()); +#endif + +#if 0 + for (i = 1; i < argc; i++) { + if (!strncmp(argv[i], "--help", 6) || + !strncmp(argv[i], "-h", 2)) { + usage(argv[0]); + } else + if (!strncmp(argv[i], "--prefix", 8) || + !strncmp(argv[i], "-p", 2)) { + i++; + if (argv[i][0] == '-') + usage(argv[0]); + + g_print("prefix = %s\n", argv[i]); + } + } +#endif + + mainwindow = main_window_create(); + main_window_refresh(NULL, mainwindow); + + gtk_main(); + + return 0; +} |