From 13a25537bc3ecf2e139d45d850db29a54210490d Mon Sep 17 00:00:00 2001 From: Leandro Pereira Date: Fri, 18 Jul 2003 17:10:00 +0300 Subject: [PATCH] Add historical release of HardInfo (0.3.6) Thanks to Fabricio Cabral for finding this! --- ChangeLog | 127 +++++++ Makefile.in | 39 +++ README | 8 + about.c | 120 +++++++ about.h | 16 + computer.c | 511 +++++++++++++++++++++++++++ computer.h | 45 +++ configure | 226 ++++++++++++ debian/changelog | 36 ++ debian/compat | 1 + debian/control | 15 + debian/copyright | 13 + debian/dirs | 2 + debian/docs | 0 debian/files | 1 + debian/hardinfo.1 | 35 ++ debian/hardinfo.doc-base | 8 + debian/hardinfo.postinst.debhelper | 8 + debian/hardinfo.postrm.debhelper | 3 + debian/hardinfo.prerm.debhelper | 6 + debian/hardinfo.substvars | 1 + debian/menu | 2 + debian/postinst | 48 +++ debian/postrm | 38 ++ debian/preinst | 44 +++ debian/prerm | 39 +++ debian/rules | 95 +++++ default.lang | 109 ++++++ genintl.pl | 80 +++++ hardinfo.c | 544 +++++++++++++++++++++++++++++ hardinfo.h | 77 ++++ ide.c | 142 ++++++++ ide.h | 18 + intl.c | 111 ++++++ intl.h | 11 + isapnp.c | 130 +++++++ isapnp.h | 20 ++ lang/es_CO.lang | 1 + lang/es_DO.lang | 1 + lang/es_ES.lang | 1 + lang/es_GT.lang | 1 + lang/es_MX.ISO-8859-1.lang | 117 +++++++ lang/es_MX.lang | 1 + lang/es_PR.lang | 1 + lang/es_US.lang | 1 + lang/pt_BR.lang | 117 +++++++ parport.c | 234 +++++++++++++ parport.h | 30 ++ pci.c | 323 +++++++++++++++++ pci.h | 31 ++ pixmaps/cd.png | Bin 0 -> 2811 bytes pixmaps/cpu.png | Bin 0 -> 2753 bytes pixmaps/distro/.xvpics/mdk.png | Bin 0 -> 2706 bytes pixmaps/distro/cnc.png | Bin 0 -> 4379 bytes pixmaps/distro/deb.png | Bin 0 -> 1718 bytes pixmaps/distro/gnt.png | Bin 0 -> 3470 bytes pixmaps/distro/mdk.png | Bin 0 -> 4648 bytes pixmaps/distro/rh.png | Bin 0 -> 3199 bytes pixmaps/distro/slk.png | Bin 0 -> 2054 bytes pixmaps/distro/suse.png | Bin 0 -> 988 bytes pixmaps/distro/tl.png | Bin 0 -> 731 bytes pixmaps/distro/unk.png | Bin 0 -> 2945 bytes pixmaps/gen_connector.png | Bin 0 -> 1820 bytes pixmaps/gen_connector.xpm | 46 +++ pixmaps/hdd.png | Bin 0 -> 3805 bytes pixmaps/hdd.xpm | 138 ++++++++ pixmaps/logo.png | Bin 0 -> 2699 bytes pixmaps/lpr.png | Bin 0 -> 5741 bytes pixmaps/media.png | Bin 0 -> 3113 bytes pixmaps/mem.png | Bin 0 -> 2792 bytes pixmaps/pci.png | Bin 0 -> 3797 bytes pixmaps/pci.xpm | 136 ++++++++ pixmaps/scan.png | Bin 0 -> 1517 bytes pixmaps/scsi.png | Bin 0 -> 647 bytes pixmaps/scsi.xpm | 79 +++++ pixmaps/stock-about-16.png | Bin 0 -> 320 bytes pixmaps/tape.png | Bin 0 -> 1013 bytes pixmaps/usb.png | Bin 0 -> 2925 bytes pixmaps/usb.xpm | 49 +++ pixmaps/v4l.png | Bin 0 -> 3133 bytes pixmaps/x11.png | Bin 0 -> 1061 bytes scsi.c | 197 +++++++++++ scsi.h | 23 ++ serial.c | 128 +++++++ serial.h | 19 + usb.c | 223 ++++++++++++ usb.h | 28 ++ v4l.c | 137 ++++++++ v4l.h | 16 + x11.c | 244 +++++++++++++ x11.h | 20 ++ 91 files changed, 5071 insertions(+) create mode 100644 ChangeLog create mode 100644 Makefile.in create mode 100644 README create mode 100644 about.c create mode 100644 about.h create mode 100644 computer.c create mode 100644 computer.h create mode 100755 configure create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/dirs create mode 100644 debian/docs create mode 100644 debian/files create mode 100644 debian/hardinfo.1 create mode 100644 debian/hardinfo.doc-base create mode 100644 debian/hardinfo.postinst.debhelper create mode 100644 debian/hardinfo.postrm.debhelper create mode 100644 debian/hardinfo.prerm.debhelper create mode 100644 debian/hardinfo.substvars create mode 100644 debian/menu create mode 100644 debian/postinst create mode 100644 debian/postrm create mode 100644 debian/preinst create mode 100644 debian/prerm create mode 100755 debian/rules create mode 100644 default.lang create mode 100755 genintl.pl create mode 100644 hardinfo.c create mode 100644 hardinfo.h create mode 100644 ide.c create mode 100644 ide.h create mode 100644 intl.c create mode 100644 intl.h create mode 100644 isapnp.c create mode 100644 isapnp.h create mode 120000 lang/es_CO.lang create mode 120000 lang/es_DO.lang create mode 120000 lang/es_ES.lang create mode 120000 lang/es_GT.lang create mode 100644 lang/es_MX.ISO-8859-1.lang create mode 120000 lang/es_MX.lang create mode 120000 lang/es_PR.lang create mode 120000 lang/es_US.lang create mode 100644 lang/pt_BR.lang create mode 100644 parport.c create mode 100644 parport.h create mode 100644 pci.c create mode 100644 pci.h create mode 100644 pixmaps/cd.png create mode 100644 pixmaps/cpu.png create mode 100644 pixmaps/distro/.xvpics/mdk.png create mode 100644 pixmaps/distro/cnc.png create mode 100644 pixmaps/distro/deb.png create mode 100644 pixmaps/distro/gnt.png create mode 100644 pixmaps/distro/mdk.png create mode 100644 pixmaps/distro/rh.png create mode 100644 pixmaps/distro/slk.png create mode 100644 pixmaps/distro/suse.png create mode 100644 pixmaps/distro/tl.png create mode 100644 pixmaps/distro/unk.png create mode 100644 pixmaps/gen_connector.png create mode 100644 pixmaps/gen_connector.xpm create mode 100644 pixmaps/hdd.png create mode 100644 pixmaps/hdd.xpm create mode 100644 pixmaps/logo.png create mode 100644 pixmaps/lpr.png create mode 100644 pixmaps/media.png create mode 100644 pixmaps/mem.png create mode 100644 pixmaps/pci.png create mode 100644 pixmaps/pci.xpm create mode 100644 pixmaps/scan.png create mode 100644 pixmaps/scsi.png create mode 100644 pixmaps/scsi.xpm create mode 100644 pixmaps/stock-about-16.png create mode 100644 pixmaps/tape.png create mode 100644 pixmaps/usb.png create mode 100644 pixmaps/usb.xpm create mode 100644 pixmaps/v4l.png create mode 100644 pixmaps/x11.png create mode 100644 scsi.c create mode 100644 scsi.h create mode 100644 serial.c create mode 100644 serial.h create mode 100644 usb.c create mode 100644 usb.h create mode 100644 v4l.c create mode 100644 v4l.h create mode 100644 x11.c create mode 100644 x11.h diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 000000000..cf801b379 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,127 @@ +03/07/2003 13:25 BRST 0.3.6-pre3 + + * v4l.[ch], hardinfo.[ch], pixmaps/v4l.png + - Added Video 4 Linux support + +02/07/2003 20:51 BRST 0.3.6-pre2 + + * pixmaps/cnc.png + - Added pixmap for Conectiva Linux. + + * pci.c + - Fixed memory detection bug in lspci parser. + +24/06/2003 20:10 BRST 0.3.6-pre1 + + * intl.c + - Search for locale information in LANG, LC_MESSAGES and LC_ALL. + + * about.[ch], hardinfo.[ch], pixmaps/logo.png + - Included about box. + + * configure + - Added --with-gtk1 and --with-gtk2. + + * lang/es_*.lang + - Added Spanish translation + (Thanks to Erica Andrews ) + + * pixmaps/usb.png + - Changed USB icon a little bit. + +23/06/2003 15:50 BRST 0.3.5 + + * intl.c + - Improved error checking. + - Fixed segfault. + (Patch from Sameh Attia ) + + * configure + - Added option to disable i18n (--disable-nls). + +22/06/2003 21:52 BRST 0.3.4 + + * 0.3.4 released! + +19/06/2003 21:42 BRST 0.3.4-pre2 + + * intl.c, intl.h, genintl.pl, lang/* + - Added i18n support. + + * configure, computer.c + - Finished PowerPC processor information support. + +19/06/2003 10:52 BRST 0.3.4-pre1 + + * hardinfo.h + - Fixed segfault on startup. + (Patch from Thomas Zajic ) + + * x11.c, x11.h, hardinfo.c + - Added X-Window system information. + + * pixmaps/x11.png + - Added pixmap for X-Window information. + + * configure, computer.c + - Preliminary PowerPC processor information support. + +18/06/2003 22:14 BRST 0.3.3 + + * pci.c + - Fixed a bug in lspci parser. + + * computer.c, computer.h, hardinfo.c, hardinfo.h + - Added operating system, processor and memory information + + * hardinfo.c, hardinfo.h + - Added "Refresh" and "Close" buttons + +16/06/2003 17:50 BRST 0.3.2 + + * configure, Makefile.in, hardinfo.c, pci.c + - Some cleanups. + +16/06/2003 17:41 BRST 0.3.2-pre2 + + * configure, Makefile.in + - Using automatic configuration utility: + o If GTK2 isn't available, the GTK1.2 version will be built. + o Search for lspci in various paths. If not found, fall back + to the old /proc/pci parser. + + * hardinfo.c + - Parallel Port support added. + + * ide.c, isapnp.c, parport.c, pci.c, scsi.c, serial.c, usb.c + - Separate parsers from GUI. + + * *.xpm + - Moved *.xpm to pixmaps/. + +16/06/2003 10:46 BRST 0.3.2-pre1 + + * hardinfo.c + - SCSI support added. + (Patch from Pascal F.Martin ) + - Fixed lspci path (it's now fixed in "/sbin/lspci", which seems + to be the default, as Google says). + + * *.png + - Moved all PNG files to pixmaps/. + + +15/06/2003 21:17 BRST 0.3.1 + + * hardinfo.c + - Application is now exits when the window is closed. + - Parse `lspci -v' output instead of `/proc/pci', which + is deprecated. This should work with 2.5 kernels too! + - Images are not loaded from current directory anymore. + + * debian/ + - HardInfo is now Debianized. :) + + * Makefile + - Added `install' target. + - Images are now installed in `/usr/share/hardinfo/pixmaps'. diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 000000000..6f7d5724a --- /dev/null +++ b/Makefile.in @@ -0,0 +1,39 @@ +# ---------------------------------------------------------------------------- + +CC = gcc +CFLAGS = -Wall -g $(GTK_CFLAGS) -O6 -march=i686 + +# ---------------------------------------------------------------------------- + +OBJECTS = hardinfo.o scsi.o ide.o pci.o usb.o isapnp.o serial.o parport.o \ + computer.o x11.o intl.o about.o v4l.o + +all: $(OBJECTS) + $(CC) $(CFLAGS) -o hardinfo $(OBJECTS) $(GTK_LIBS) $(GTK_FLAGS) + +clean: + rm -rf *~ .xvpics pixmaps/.xvpics *.o hardinfo + +install: all + cp hardinfo ${DESTDIR}/usr/bin/hardinfo + mkdir -p ${DESTDIR}/usr/share/hardinfo/pixmaps + cp -rv pixmaps/*.png ${DESTDIR}/usr/share/hardinfo/pixmaps + mkdir -p ${DESTDIR}/usr/share/hardinfo/pixmaps/distro + cp -rv pixmaps/distro/*.png ${DESTDIR}/usr/share/hardinfo/pixmaps/distro + mkdir -p ${DESTDIR}/usr/share/hardinfo/lang + cp -rv lang/* ${DESTDIR}/usr/share/hardinfo/lang + chmod -R 755 /usr/share/hardinfo + +dist-clean: clean + rm -rf Makefile debian/hardinfo/ config.h + +package: dist-clean + @echo "Creating tar.gz..." + cd .. && tar czf $(PACKAGE).tar.gz $(PACKAGE)/* && cd $(PACKAGE) + @echo "Creating tar.bz2..." + cd .. && tar cjf $(PACKAGE).tar.bz2 $(PACKAGE)/* && cd $(PACKAGE) + +deb: dist-clean + @echo "Creating deb..." + dpkg-buildpackage -rfakeroot -k${USER} + diff --git a/README b/README new file mode 100644 index 000000000..4e2f765e6 --- /dev/null +++ b/README @@ -0,0 +1,8 @@ + + +Some sites that mentions HardInfo: +---------------------------------- + +- http://www.smlug.org/meetings/2003/06.php +- http://www.linuxzone.cz/modules/tisk_clanku-nw.phtml?ids=7&idc=742 +- http://vico.kleinplanet.de/crux.html diff --git a/about.c b/about.c new file mode 100644 index 000000000..0d7fae0e1 --- /dev/null +++ b/about.c @@ -0,0 +1,120 @@ +#include "hardinfo.h" +#include "about.h" + +static void about_close(GtkWidget *widget, gpointer data) +{ + GtkAbout *about = (GtkAbout*) data; + + gtk_widget_destroy(about->window); +} + +GtkAbout * +gtk_about_new(const gchar * name, const gchar * version, + const gchar * description, const gchar * authors[], const gchar * logo_img) +{ +#ifdef GTK2 + GtkWidget *img; +#endif + gchar *buf; + const gchar *auth; + GtkWidget *window, *vbox, *label, *btn, *hr, *hbox; + GtkAbout *about; + gint i; + + about = g_new0(GtkAbout, 1); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window), "About"); + gtk_container_set_border_width(GTK_CONTAINER(window), 8); + + about->window = window; + +#ifdef GTK2 + gtk_window_set_resizable(GTK_WINDOW(window), FALSE); +#else + gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE); +#endif + + vbox = gtk_vbox_new(FALSE, 5); + gtk_box_set_spacing(GTK_BOX(vbox), 3); + gtk_container_add(GTK_CONTAINER(window), vbox); + +#ifdef GTK2 + img = gtk_image_new_from_file(logo_img); + gtk_widget_show(img); + gtk_box_pack_start(GTK_BOX(vbox), img, FALSE, FALSE, 0); + gtk_widget_set_usize(GTK_WIDGET(img), 64, 64); +#endif + +#ifdef GTK2 +#define ADD_LABEL(x,y) label = gtk_label_new(x); \ + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); \ + gtk_widget_show(label); \ + gtk_box_pack_start(GTK_BOX(y), label, TRUE, TRUE, 0); +#else +#define ADD_LABEL(x,y) label = gtk_label_new(x); \ + gtk_widget_show(label); \ + gtk_box_pack_start(GTK_BOX(y), label, TRUE, TRUE, 0); +#endif + +#ifdef GTK2 + buf = + g_strdup_printf + ("%s %s", name, + version); +#else + buf = g_strdup_printf("%s %s", name, version); +#endif + ADD_LABEL(buf, vbox); + g_free(buf); + + ADD_LABEL(description, vbox); + + for (i = 0; authors[i] != NULL; i++) { + auth = authors[i]; + + if (*auth == '>') { + auth++; + +#ifdef GTK2 + buf = g_strdup_printf("%s", auth); +#else + buf = g_strdup_printf("%s", auth); +#endif + ADD_LABEL(buf, vbox); + g_free(buf); + } else { +#ifdef GTK2 + buf = g_strdup_printf("%s", auth); +#else + buf = g_strdup_printf(" %s", auth); +#endif + ADD_LABEL(buf, vbox); + g_free(buf); + } + } + + hr = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(vbox), hr, FALSE, FALSE, 0); + + hbox = gtk_hbutton_box_new(); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbox), 6); + +#ifdef GTK2 + btn = gtk_button_new_from_stock(GTK_STOCK_OK); + g_signal_connect(G_OBJECT(btn), "clicked", (GCallback)about_close, about); +#else + btn = gtk_button_new_with_label(_("OK")); + gtk_signal_connect(GTK_OBJECT(btn), "clicked", about_close, about); +#endif + gtk_widget_show(btn); + gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 0); + + gtk_widget_show_all(window); + + return about; + +} diff --git a/about.h b/about.h new file mode 100644 index 000000000..a131b0d95 --- /dev/null +++ b/about.h @@ -0,0 +1,16 @@ +#ifndef __GTK_ABOUT_H__ +#define __GTK_ABOUT_H__ + +typedef struct _GtkAbout GtkAbout; + +struct _GtkAbout { + GtkWidget *window; +}; + +GtkAbout *gtk_about_new(const gchar * name, + const gchar * version, + const gchar * comments, + const gchar * authors[], + const gchar * logo_img); + +#endif /* __GTK_ABOUT_H__ */ diff --git a/computer.c b/computer.c new file mode 100644 index 000000000..0945ec58e --- /dev/null +++ b/computer.c @@ -0,0 +1,511 @@ +/* + * Distribuition detection routines + * Copyright (c) 2003 Leandro Pereira + * + * May be distributed under the terms of GNU General Public License version 2. + */ + +#include "hardinfo.h" +#include "computer.h" + +#include +#include +#include +#include + +static struct { + gchar *file, *codename; +} distro_db [] = { + { DB_PREFIX "debian_version", "deb" }, + { DB_PREFIX "slackware-version", "slk" }, + { DB_PREFIX "mandrake-release", "mdk" }, + { DB_PREFIX "gentoo-release", "gnt" }, + { DB_PREFIX "conectiva-release", "cnc" }, + { DB_PREFIX "versão-conectiva", "cnc" }, + { DB_PREFIX "turbolinux-release", "tl" }, + { DB_PREFIX "yellowdog-release", "yd" }, + { DB_PREFIX "SuSE-release", "suse" }, + + /* + * RedHat must be the *last* one to be checked, since + * some distros (like Mandrake) includes a redhat-relase + * file too. + */ + + { DB_PREFIX "redhat-release", "rh" }, + { NULL, NULL } +}; + +#define get_int_val(var) { \ + walk_until_inclusive(':'); buf++; \ + var = atoi(buf); \ + continue; \ + } + +#define get_str_val(var) { \ + walk_until_inclusive(':'); buf++; \ + var = g_strdup(buf); \ + continue; \ + } + +MemoryInfo *memory_get_info(void) +{ + MemoryInfo *mi; + FILE *procmem; + gchar buffer[64]; + gint memfree, memused; + + mi = g_new0(MemoryInfo, 1); + + procmem = fopen("/proc/meminfo", "r"); + while (fgets(buffer, 128, procmem)) { + gchar *buf = buffer; + + buf = g_strstrip(buf); + + if(!strncmp(buf, "MemTotal", 8)) + get_int_val(mi->total) + else if(!strncmp(buf, "MemFree", 7)) + get_int_val(memfree) + else if(!strncmp(buf, "Cached", 6)) + get_int_val(mi->cached) + + } + fclose(procmem); + + mi->used = mi->total - memfree; + + mi->total/=1000; + mi->cached/=1000; + mi->used/=1000; + memfree/=1000; + + memused = mi->total - mi->used + mi->cached; + +#if 0 + printf("total = %d\n" + "cached = %d\n" + "used = %d\n" + "free = %d\n" + "realused = %d\n" + "ratio = %f\n\n", mi->total, mi->cached, mi->used, memfree, + memused, (gdouble)memused/mi->total); +#endif + mi->ratio=1 - (gdouble)memused/mi->total; + + return mi; +} + +#ifdef ARCH_i386 +#define PARSE_PROC_CPU() \ + if(!strncmp(buf, "bogomips", 8)) \ + get_int_val(ci->bogomips) \ + else if(!strncmp(buf, "cpu family", 10)) \ + get_int_val(ci->family) \ + else if(!strncmp(buf, "model name", 10)) \ + get_str_val(ci->processor) \ + else if(!strncmp(buf, "stepping", 8)) \ + get_int_val(ci->stepping) \ + else if(!strncmp(buf, "cpu MHz", 7)) \ + get_int_val(ci->frequency) \ + else if(!strncmp(buf, "cache size", 10)) \ + get_int_val(ci->cachel2) \ + else if(!strncmp(buf, "model", 5)) \ + get_int_val(ci->model) +#endif +#ifdef ARCH_PPC +#define PARSE_PROC_CPU() \ + if(!strncmp(buf, "bogomips", 8)) \ + get_int_val(ci->bogomips) \ + else if(!strncmp(buf, "cpu", 3)) \ + get_str_val(ci->processor) \ + else if(!strncmp(buf, "clock", 5)) \ + get_int_val(ci->frequency) \ + else if(!strncmp(buf, "L2 cache", 8)) \ + get_int_val(ci->cachel2) +#endif + +static void computer_processor_info(ComputerInfo *ci) +{ + FILE *proccpu; + gchar buffer[128]; + + proccpu = fopen("/proc/cpuinfo", "r"); + while (fgets(buffer, 128, proccpu)) { + gchar *buf = buffer; + + buf = g_strstrip(buf); + + PARSE_PROC_CPU(); + } + fclose(proccpu); + +#ifdef ARCH_PPC + { + gchar *proctemp; + + proctemp = g_strdup_printf("PowerPC %s", ci->processor); + g_free(ci->processor); + ci->processor = proctemp; + } +#endif + + +} + +ComputerInfo *computer_get_info(void) +{ + gint i; + struct stat st; + ComputerInfo *ci; + struct utsname utsbuf; + + ci = g_new0(ComputerInfo, 1); + + for (i = 0; ; i++) { + if (distro_db[i].file == NULL) { + ci->distrocode = g_strdup("unk"); + ci->distroinfo = g_strdup(_("Unknown distribution")); + break; + } + + if (!stat(distro_db[i].file, &st)) { + FILE *distro_ver; + char buf[128]; + + distro_ver = fopen(distro_db[i].file, "r"); + fgets(buf, 128, distro_ver); + fclose(distro_ver); + + buf[strlen(buf)-1]=0; + + /* + * Some Debian systems doesn't include + * the distribuition name in /etc/debian_release, + * so add them here. This is a hack, though... + */ + if (!strncmp(distro_db[i].codename, "deb", 3) && + buf[0] >= '0' && buf[0] <= '9') { + ci->distroinfo = g_strdup_printf + ("Debian GNU/Linux %s", buf); + } else { + ci->distroinfo = g_strdup(buf); + } + + + ci->distrocode = g_strdup(distro_db[i].codename); + + break; + } + } + + uname(&utsbuf); + + ci->kernel = g_strdup_printf("%s %s (%s)", utsbuf.sysname, + utsbuf.release, utsbuf.machine); + + ci->hostname = g_strdup(utsbuf.nodename); + + computer_processor_info(ci); + + return ci; +} + +/* + * Code stolen from GKrellM + * Copyright (c) 1999-2002 Bill Wilson + */ +gboolean uptime_update(gpointer data) +{ + MainWindow *mainwindow = (MainWindow *) data; + gchar *buf; + gint days, hours; + FILE *procuptime; + gulong minutes = 0; + + if(!mainwindow) return FALSE; + +#define plural(a) (a == 1) ? "" : "s" + + if ((procuptime = fopen("/proc/uptime", "r")) != NULL) { + fscanf(procuptime, "%lu", &minutes); + minutes /= 60; + fclose(procuptime); + } else + return FALSE; + + hours = minutes / 60; + minutes %= 60; + days = hours / 24; + hours %= 24; + + if (days < 1) { + buf = g_strdup_printf(_("%d hour%s and %ld minute%s"), hours, + plural(hours), minutes, plural(minutes)); + } else { + buf = g_strdup_printf(_("%d day%s, %d hour%s and %ld minute%s"), + days, plural(days), hours, plural(hours), + minutes, plural(minutes)); + } + + gtk_label_set_text(GTK_LABEL(mainwindow->uptime), buf); + g_free(buf); + + return TRUE; +} + +GtkWidget *os_get_widget(MainWindow *mainwindow) +{ + GtkWidget *label, *hbox; + GtkWidget *table; +#ifdef GTK2 + GtkWidget *pixmap; + gchar *buf; +#endif + ComputerInfo *info; + + if(!mainwindow) return NULL; + + info = computer_get_info(); + + hbox = gtk_hbox_new(FALSE, 0); + gtk_widget_show(hbox); + +#ifdef GTK2 + buf = g_strdup_printf("%s/distro/%s.png", IMG_PREFIX, info->distrocode); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_set_usize(GTK_WIDGET(pixmap), 64, 0); + gtk_widget_show(pixmap); + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); + g_free(buf); +#endif + + table = gtk_table_new(4, 2, FALSE); + gtk_widget_show(table); + gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(table), 10); + gtk_table_set_row_spacings(GTK_TABLE(table), 4); + gtk_table_set_col_spacings(GTK_TABLE(table), 4); + + /* + * Table headers + */ +#ifdef GTK2 + label = gtk_label_new(_("Computer name:")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Computer name:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + +#ifdef GTK2 + label = gtk_label_new(_("Distribution:")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Distribution:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + +#ifdef GTK2 + label = gtk_label_new(_("Kernel:")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Kernel:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + +#ifdef GTK2 + label = gtk_label_new(_("Uptime:")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Uptime:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + + /* + * Table content + */ + label = gtk_label_new(info->hostname); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + label = gtk_label_new(info->distroinfo); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + label = gtk_label_new(info->kernel); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 3); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + label = gtk_label_new(_("Updating...")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 3, 4); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + mainwindow->uptime = label; + + uptime_update(mainwindow); + gtk_timeout_add(30000, uptime_update, mainwindow); + + g_free(info); + + return hbox; +} + +gboolean memory_update(gpointer data) +{ + MainWindow *mainwindow = (MainWindow*) data; + MemoryInfo *mi; + + if(!mainwindow) return FALSE; + + mi = memory_get_info(); + +#ifdef GTK2 + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwindow->membar), + mi->ratio); +#else + gtk_progress_set_percentage(GTK_PROGRESS(mainwindow->membar), + mi->ratio); +#endif + + g_free(mi); + + return TRUE; +} + +GtkWidget *memory_get_widget(MainWindow *mainwindow) +{ + GtkWidget *label, *vbox, *hbox, *hbox2, *progress; +#ifdef GTK2 + GtkWidget *pixmap; +#endif + MemoryInfo *mi; + gchar *buf; + + mi = memory_get_info(); + + hbox = gtk_hbox_new(FALSE, 0); + gtk_widget_show(hbox); + +#ifdef GTK2 + buf = g_strdup_printf("%s/mem.png", IMG_PREFIX); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_set_usize(GTK_WIDGET(pixmap), 64, 0); + gtk_widget_show(pixmap); + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); + g_free(buf); +#endif + + vbox = gtk_vbox_new(FALSE, 0); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); + gtk_box_set_spacing(GTK_BOX(vbox), 4); + + hbox2 = gtk_hbox_new(FALSE, 5); + gtk_widget_show(hbox2); + gtk_box_pack_start(GTK_BOX(vbox), hbox2, TRUE, TRUE, 0); + + label = gtk_label_new("0MB"); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + buf = g_strdup_printf("%dMB", mi->total); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_end(GTK_BOX(hbox2), label, FALSE, FALSE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + g_free(buf); + + progress = gtk_progress_bar_new(); + mainwindow->membar = progress; + gtk_widget_show(progress); + gtk_box_pack_start(GTK_BOX(vbox), progress, TRUE, TRUE, 0); + + memory_update(mainwindow); + + gtk_timeout_add(2000, memory_update, mainwindow); + + g_free(mi); + return hbox; +} + +GtkWidget *processor_get_widget(void) +{ + GtkWidget *label, *vbox, *hbox; +#ifdef GTK2 + GtkWidget *pixmap; +#endif + ComputerInfo *info; + gchar *buf; + + info = computer_get_info(); + + hbox = gtk_hbox_new(FALSE, 0); + gtk_widget_show(hbox); + +#ifdef GTK2 + buf = g_strdup_printf("%s/cpu.png", IMG_PREFIX); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_set_usize(GTK_WIDGET(pixmap), 64, 0); + gtk_widget_show(pixmap); + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); + g_free(buf); +#endif + + vbox = gtk_vbox_new(FALSE, 0); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); + gtk_box_set_spacing(GTK_BOX(vbox), 4); + +#ifdef GTK2 + buf = g_strdup_printf(_("%s at %d MHz (%d bogomips)"), info->processor, + info->frequency, info->bogomips); +#else + buf = g_strdup_printf(_("%s at %d MHz (%d bogomips)"), info->processor, + info->frequency, info->bogomips); +#endif + label = gtk_label_new(buf); + gtk_widget_show(label); +#ifdef GTK2 + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#endif + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + g_free(buf); + +#ifdef ARCH_i386 + buf = g_strdup_printf(_("Family %d, model %d, stepping %d"), + info->family, info->model, info->stepping); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + g_free(buf); +#endif + + buf = g_strdup_printf(_("%d KB L2 cache"), info->cachel2); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + g_free(buf); + + g_free(info); + return hbox; +} + diff --git a/computer.h b/computer.h new file mode 100644 index 000000000..60579689e --- /dev/null +++ b/computer.h @@ -0,0 +1,45 @@ +#ifndef __COMPUTER_H__ +#define __COMPUTER_H__ + +#include + +#define DB_PREFIX "/etc/" + +typedef struct _ComputerInfo ComputerInfo; +typedef struct _MemoryInfo MemoryInfo; + +struct _MemoryInfo { + gint total; + gint used; + gint cached; + + gdouble ratio; +}; + +struct _ComputerInfo { + gchar *distrocode; + gchar *distroinfo; + + gchar *kernel; + + gchar *hostname; + + gint procno; + gchar *processor; + gint frequency; + gint family, model, stepping; + gint cachel2; + gint bogomips; +}; + +ComputerInfo *computer_get_info(void); +MemoryInfo *memory_get_info(void); + +GtkWidget *os_get_widget(MainWindow *mainwindow); +GtkWidget *memory_get_widget(MainWindow *mainwindow); +GtkWidget *processor_get_widget(void); + +gboolean uptime_update(gpointer data); +gboolean memory_update(gpointer data); + +#endif diff --git a/configure b/configure new file mode 100755 index 000000000..8fef3e682 --- /dev/null +++ b/configure @@ -0,0 +1,226 @@ +#!/bin/bash +# +# ToscoConf 0.02 +# Copyright (c) 2003 Leandro Pereira +# All rights reserved. +# +# This script is in the Tosco Public License. It may be copied and/or +# modified, in whole or in part, provided that all copies must retain the +# above copyright notice, this condition and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# +# (yes, I did a copy&paste from the BSD license, eat me) +# +# --------------------------------------------------------------------------- +# Some defaults + +IGNORE_GTK2=0 +DISABLE_NLS=0 + +# --------------------------------------------------------------------------- + +PACKAGE=`basename ${PWD} | cut -d"-" -f1`; +VERSION=`basename ${PWD} | cut -d"-" -f2`; + +echo "ToscoConf (version 0.03) for $PACKAGE version $VERSION" + +# --------------------------------------------------------------------------- +# Damn-cool command line argument parsing. Yay. + +while [ "$1" != "" ]; do + case $1 in + --with-gtk1) + echo "Building with GTK+ 1.2" + IGNORE_GTK2=1;; + --with-gtk2) + echo "Building with GTK+ 2.0" + IGNORE_GTK2=0;; + --disable-nls) + echo "NLS disabled." + DISABLE_NLS=1 ;; + --help) + echo " --disable-nls Don't use i18n." + echo "Interface (default is auto-test):" + echo " --with-gtk1 Build with GTK1.2 interface." + echo " --with-gtk2 Build with GTK2.0 interface." + echo " --help This help screen." + + exit 1;; + *) + echo "Please use the --help switch." + exit 1;; + esac + shift +done + + +# --------------------------------------------------------------------------- + +echo -n "Running: " +OS=`uname` +echo -n $OS +case $OS in + Linux) + echo -n " (OK) " ;; + *) + echo " (not supported, yet!)" + exit ;; +esac + +PROC=`uname -m` +case $PROC in + i?86) + ARCH="ARCH_i386" ;; + ppc) + ARCH="ARCH_PPC" ;; + *) + echo "Architeture \"$ARCH\" not supported." + exit ;; +esac + +echo "$PROC ($ARCH)" + +# --------------------------------------------------------------------------- + +echo -n "Checking for lspci... " +LSPCIPATH="`which lspci` /sbin/lspci /usr/sbin/lspci /bin/lspci /usr/bin/lspci" +for i in $LSPCIPATH; do + if [ -x "$i" ]; then + USE_LSPCI=1 + LSPCI=$i + break; + fi +done + +if [ -e "$LSPCI" ]; then + echo $LSPCI +else + if [ -e "/proc/pci" ]; then + echo "not found, will parse /proc/pci" + else + echo "no lspci, no /proc/pci..." + echo "Are you sure you're running Linux?" + exit + fi +fi + +# --------------------------------------------------------------------------- + + +GTK2=-1 +if [ "$IGNORE_GTK2" == "0" ]; then + MIN_VERSION="2.0.0" + echo -n "Checking for GTK ${MIN_VERSION}... " + for i in `which pkg-config`; do + pkg-config --errors-to-stdout gtk+-2.0 \ + --atleast-version=$MIN_VERSION > /dev/null + case $? in + 0) + GTK_FLAGS=`pkg-config gtk+-2.0 --cflags` + GTK_LIBS=`pkg-config gtk+-2.0 --libs` + echo "seems ok, will not test though." + GTK2=1 ;; + *) + echo "not found." ;; + esac + done +fi + +# If the user doesn't have GTK2, try to compile with GTK1.2 :) + +GTK1=-1 +if [ "$GTK2" -ne 1 ]; then + min_major=1 + min_minor=2 + min_rev=6 + echo -n "Checking for GTK $min_major.$min_minor.$min_rev... " + for i in `which gtk-config`; do + VER=`gtk-config --version` + + # RegExp stolen from AutoConf. + major=`echo $VER | sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + minor=`echo $VER | sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + rev=`echo $VER | sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + + if [ $major -lt $min_major ]; then + break; + fi + + if [ $minor -lt $min_minor ]; then + break; + fi + + if [ $rev -lt $min_rev ]; then + break; + fi + + GTK_FLAGS=`gtk-config --cflags` + GTK_LIBS=`gtk-config --libs` + echo "seems ok, will not test though." + GTK1=1 + done +fi + +# -------------------------------------------------------------------------- + +if [ `expr $GTK1 + $GTK2` -eq -2 ]; then + echo -e "\nYou need the GTK libraries, including the development stuff." + echo "If you're using Debian, running the command as root:" + echo -e "\n\tapt-get install libgtk2.0-dev\n" + echo "Will do the trick." + exit +fi + +# -------------------------------------------------------------------------- + +echo -e "\nWriting config.h..." +rm -f config.h +echo -e "#ifndef __CONFIG_H__\n#define __CONFIG_H__\n" > config.h + +echo "#define VERSION \"$VERSION\"" >> config.h + +if [ "$LSPCI" ]; then + echo "#define USE_LSPCI" >> config.h + echo "#define LSPCI \"$LSPCI -v\"" >> config.h +fi + +if [ "$GTK2" -ne -1 ]; then + echo "#define GTK2" >> config.h +else + echo "#define GTK1" >> config.h +fi + +if [ "$DISABLE_NLS" != "1" ]; then + echo "#define ENABLE_NLS" >> config.h +fi + +echo "#define $ARCH" >> config.h + +echo -e "\n#endif /* __CONFIG_H__ */" >> config.h + +echo "Writing Makefile..." +rm -f Makefile +if [ "$GTK2" -ne -1 ]; then + echo "TARGET = GTK2" > Makefile +else + echo "TARGET = GTK1" > Makefile +fi + +echo "GTK_LIBS = ${GTK_LIBS}" >> Makefile +echo "GTK_CFLAGS = ${GTK_FLAGS}" >> Makefile +echo "PACKAGE = `basename ${PWD}`" >> Makefile + +cat Makefile.in >> Makefile + +echo -e "\nDone. Type \"make\" to compile the program.\n" +echo "If you get errors, probably you don't have the right libraries," +echo "includes or utilities. However, if you're sure this is a bug in my" +echo -e "code, please send a patch (use \"diff -u\") to .\n" + diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 000000000..f4101afb3 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,36 @@ +hardinfo (0.3.5-1) unstable; urgency=high + + * Sync with upstream sources. + + -- Leandro Pereira Sun, 23 Jun 2003 15:55:22 -0300 + +hardinfo (0.3.4-1) unstable; urgency=high + + * Sync with upstream sources. + + -- Leandro Pereira Sun, 22 Jun 2003 21:45:15 -0300 + +hardinfo (0.3.3-1) unstable; urgency=low + + * Sync with upstream sources. + + -- Leandro Pereira Sun, 18 Jun 2003 22:15:34 -0300 + +hardinfo (0.3.2-1) unstable; urgency=low + + * Sync with upstream sources. + + -- Leandro Pereira Sun, 17 Jun 2003 10:50:34 -0300 + +hardinfo (0.3.1-1) unstable; urgency=low + + * Sync with upstream sources. + + -- Leandro Pereira Sun, 15 Jun 2003 21:32:14 -0300 + +hardinfo (0.3-1) unstable; urgency=low + + * Initial Release. + + -- Leandro Pereira Sun, 15 Jun 2003 11:13:14 -0300 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 000000000..b8626c4cf --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +4 diff --git a/debian/control b/debian/control new file mode 100644 index 000000000..b66f50382 --- /dev/null +++ b/debian/control @@ -0,0 +1,15 @@ +Source: hardinfo +Section: x11 +Priority: optional +Maintainer: Leandro Pereira +Build-Depends: debhelper (>> 4.0.0) +Standards-Version: 3.5.8 + +Package: hardinfo +Architecture: any +Depends: ${shlibs:Depends} ${misc:Depends}, pciutils (>=1:2.1.11-2) +Description: Shows system information in a GTK window + HardInfo is a system information tool for Linux written from scratch in + pure C. It uses the GTK+ toolkit for all of its interface needs. + . + Homepage: http://alpha.linuxmag.com.br/~leandro/hardinfo diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 000000000..00d5b7dfd --- /dev/null +++ b/debian/copyright @@ -0,0 +1,13 @@ +This package was debianized by Leandro Pereira on +Sun, 15 Jun 2003 11:13:14 -0300. + +It was downloaded from http://alpha.linuxmag.com.br/~leandro/hardinfo/ + +Upstream Author: Leandro Pereira + +This software is copyright (c) 2003 by Leandro Pereira. + +You are free to distribute and/or modify this software under the terms of +the GNU General Public License. +On Debian systems, the complete text of the GNU General Public License can +be found in /usr/share/common-licenses/GPL file. diff --git a/debian/dirs b/debian/dirs new file mode 100644 index 000000000..70e8bfc72 --- /dev/null +++ b/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/share/hardinfo/pixmaps diff --git a/debian/docs b/debian/docs new file mode 100644 index 000000000..e69de29bb diff --git a/debian/files b/debian/files new file mode 100644 index 000000000..2de9f386e --- /dev/null +++ b/debian/files @@ -0,0 +1 @@ +hardinfo_0.3.5-1_i386.deb x11 optional diff --git a/debian/hardinfo.1 b/debian/hardinfo.1 new file mode 100644 index 000000000..e3f492f8c --- /dev/null +++ b/debian/hardinfo.1 @@ -0,0 +1,35 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH HARDINFO 1 "June 15, 2003" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +hardinfo \- shows hardware information in a GTK+ window +.SH SYNOPSIS +.B hardinfo +.SH DESCRIPTION +.B hardinfo +parses some files in /proc and displays their information in a +user-friendly window. + +This manual page was written for the Debian distribution +because the original program does not have a manual page. +.PP +.\" TeX users may be more comfortable with the \fB\fP and +.\" \fI\fP escape sequences to invode bold face and italics, +.\" respectively. +.SH AUTHOR +This manual page was written by Leandro Pereira , +for the Debian project (but may be used by others). diff --git a/debian/hardinfo.doc-base b/debian/hardinfo.doc-base new file mode 100644 index 000000000..5a39a707a --- /dev/null +++ b/debian/hardinfo.doc-base @@ -0,0 +1,8 @@ +Document: hardinfo +Title: Debian hardinfo Manual +Author: Leandro Pereira +Abstract: This manual describes what hardinfo is + and how it can be used to + manage online manuals on Debian systems. +Section: unknown + diff --git a/debian/hardinfo.postinst.debhelper b/debian/hardinfo.postinst.debhelper new file mode 100644 index 000000000..3a37bda3a --- /dev/null +++ b/debian/hardinfo.postinst.debhelper @@ -0,0 +1,8 @@ +# Automatically added by dh_installdocs +if [ "$1" = configure ] && which install-docs >/dev/null 2>&1; then + install-docs -i /usr/share/doc-base/hardinfo +fi +# End automatically added section +# Automatically added by dh_installmenu +if [ "$1" = "configure" ] && [ -x /usr/bin/update-menus ]; then update-menus ; fi +# End automatically added section diff --git a/debian/hardinfo.postrm.debhelper b/debian/hardinfo.postrm.debhelper new file mode 100644 index 000000000..2b4be4f27 --- /dev/null +++ b/debian/hardinfo.postrm.debhelper @@ -0,0 +1,3 @@ +# Automatically added by dh_installmenu +if [ -x "`which update-menus 2>/dev/null`" ]; then update-menus ; fi +# End automatically added section diff --git a/debian/hardinfo.prerm.debhelper b/debian/hardinfo.prerm.debhelper new file mode 100644 index 000000000..be5a4cbda --- /dev/null +++ b/debian/hardinfo.prerm.debhelper @@ -0,0 +1,6 @@ +# Automatically added by dh_installdocs +if [ "$1" = remove ] || [ "$1" = upgrade ] && \ + which install-docs >/dev/null 2>&1; then + install-docs -r hardinfo +fi +# End automatically added section diff --git a/debian/hardinfo.substvars b/debian/hardinfo.substvars new file mode 100644 index 000000000..9842e5f17 --- /dev/null +++ b/debian/hardinfo.substvars @@ -0,0 +1 @@ +shlibs:Depends=libatk1.0-0 (>= 1.2.4), libc6 (>= 2.3.1-1), libglib2.0-0 (>= 2.2.2), libgtk2.0-0 (>= 2.2.1), libpango1.0-0 (>= 1.2.1), xlibs (>> 4.1.0) diff --git a/debian/menu b/debian/menu new file mode 100644 index 000000000..03d77f5a7 --- /dev/null +++ b/debian/menu @@ -0,0 +1,2 @@ +?package(hardinfo):needs=X11 section=Apps/System\ + title="System Information" command="/usr/bin/hardinfo" diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 000000000..10a660b27 --- /dev/null +++ b/debian/postinst @@ -0,0 +1,48 @@ +#! /bin/sh +# postinst script for hardinfo +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package +# +# quoting from the policy: +# Any necessary prompting should almost always be confined to the +# post-installation script, and should be protected with a conditional +# so that unnecessary prompting doesn't happen if a package's +# installation fails and the `postinst' is called with `abort-upgrade', +# `abort-remove' or `abort-deconfigure'. + +case "$1" in + configure) + + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/postrm b/debian/postrm new file mode 100644 index 000000000..9149cd4cc --- /dev/null +++ b/debian/postrm @@ -0,0 +1,38 @@ +#! /bin/sh +# postrm script for hardinfo +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' overwrit>r> +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + + + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian/preinst b/debian/preinst new file mode 100644 index 000000000..f7df17418 --- /dev/null +++ b/debian/preinst @@ -0,0 +1,44 @@ +#! /bin/sh +# preinst script for hardinfo +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + install|upgrade) +# if [ "$1" = "upgrade" ] +# then +# start-stop-daemon --stop --quiet --oknodo \ +# --pidfile /var/run/hardinfo.pid \ +# --exec /usr/sbin/hardinfo 2>/dev/null || true +# fi + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/prerm b/debian/prerm new file mode 100644 index 000000000..2a27c8cdf --- /dev/null +++ b/debian/prerm @@ -0,0 +1,39 @@ +#! /bin/sh +# prerm script for hardinfo +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove|upgrade|deconfigure) +# install-info --quiet --remove /usr/info/hardinfo.info.gz + ;; + failed-upgrade) + ;; + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/rules b/debian/rules new file mode 100755 index 000000000..319a2470a --- /dev/null +++ b/debian/rules @@ -0,0 +1,95 @@ +#!/usr/bin/make -f +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + + + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +configure: configure-stamp +configure-stamp: + dh_testdir + ./configure + + touch configure-stamp + + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) clean + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/hardinfo. + $(MAKE) install DESTDIR=$(CURDIR)/debian/hardinfo + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs +# dh_installexamples + dh_install + dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman debian/hardinfo.1 + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_python +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/default.lang b/default.lang new file mode 100644 index 000000000..13eccb4ec --- /dev/null +++ b/default.lang @@ -0,0 +1,109 @@ +[Translation] +translated-by=Unknown + +[computer.c] +Unknown distribution=Unknown distribution +%d hour%s and %ld minute%s=%d hour%s and %ld minute%s +%d day%s, %d hour%s and %ld minute%s=%d day%s, %d hour%s and %ld minute%s +Computer name:=Computer name: +Computer name:=Computer name: +Distribution:=Distribution: +Distribution:=Distribution: +Kernel:=Kernel: +Kernel:=Kernel: +Uptime:=Uptime: +Uptime:=Uptime: +Updating...=Updating... +%s at %d MHz (%d bogomips)=%s at %d MHz (%d bogomips) +%s at %d MHz (%d bogomips)=%s at %d MHz (%d bogomips) +Family %d, model %d, stepping %d=Family %d, model %d, stepping %d +%d KB L2 cache=%d KB L2 cache + +[hardinfo.c] +System Information=System Information +Computer=Computer +Operating System=Operating System +Operating System=Operating System +Processor=Processor +Processor=Processor +Memory Usage=Memory Usage +Memory Usage=Memory Usage +Devices=Devices +Device information=Device information +Refresh=Refresh +Close=Close +Environment=Environment +X-Window System=X-Window System +X-Window System=X-Window System +PCI Devices=PCI Devices +ISA PnP Devices=ISA PnP Devices +ATA/IDE Block Devices=ATA/IDE Block Devices +SCSI Devices=SCSI Devices +Communication Ports=Communication Ports +Parallel Ports=Parallel Ports +This is free software; you can modify and/or distribute it\n=This is free software; you can modify and/or distribute it\n +under the terms of GNU GPL version 2. See http://www.fsf.org/\n=under the terms of GNU GPL version 2. See http://www.fsf.org/\n +for more information.\n\n=for more information.\n\n + +[ide.c] +ATA/IDE %s Device=ATA/IDE %s Device +Cache: %d KB=Cache: %d KB + +[intl.c] + +[isapnp.c] +ISA Plug and Play Device=ISA Plug and Play Device +Card ID: %d=Card ID: %d +PnP version: %.2f, Product version: %.2f=PnP version: %.2f, Product version: %.2f + +[parport.c] +N/A=N/A +Parallel Port=Parallel Port +Description: %s=Description: %s +Command set: %s=Command set: %s +Class: %s=Class: %s +Base I/O address: 0x%x=Base I/O address: 0x%x +Modes: %s=Modes: %s +Uses DMA=Uses DMA + +[pci.c] +I/O address: 0x%x to 0x%x=I/O address: 0x%x to 0x%x +Memory: %ld KB=Memory: %ld KB +Frequency: %dMHz=Frequency: %dMHz +Latency: %d=Latency: %d +Bus master=Bus master +Bus: %d, Device: %d, Function: %d=Bus: %d, Device: %d, Function: %d + +[scsi.c] +SCSI %s Device=SCSI %s Device +Revision: %s=Revision: %s +Type: %s=Type: %s +Controller: %d, Bus: %d, ID: %d, LUN: %d=Controller: %d, Bus: %d, ID: %d, LUN: %d + +[serial.c] +Communication Port=Communication Port +I/O port: 0x%x, IRQ: %d=I/O port: 0x%x, IRQ: %d + +[usb.c] +USB Devices=USB Devices +Unknown device (%s)=Unknown device (%s) +USB Device=USB Device +Manufacturer: %s=Manufacturer: %s +Class: %s (%d)=Class: %s (%d) +Version: %.2f, Revision: %.2f=Version: %.2f, Revision: %.2f +Vendor ID: 0x%X, Product ID: 0x%X=Vendor ID: 0x%X, Product ID: 0x%X + +[x11.c] +Local display (%s)=Local display (%s) +Remote display (%s)=Remote display (%s) +XFree86 version %s (protocol version %d.%d)=XFree86 version %s (protocol version %d.%d) +%d (protocol version %d.%d)=%d (protocol version %d.%d) +Display:=Display: +Display:=Display: +Vendor:=Vendor: +Vendor:=Vendor: +Release:=Release: +Release:=Release: +Resolution:=Resolution: +Resolution:=Resolution: + diff --git a/genintl.pl b/genintl.pl new file mode 100755 index 000000000..0e19846c6 --- /dev/null +++ b/genintl.pl @@ -0,0 +1,80 @@ +#!/usr/bin/perl +# +# Script para gerar arquivo de internacionalização +# Versão 1.0 +# +# Copyright (c) 2002-2003 Leandro Pereira +# Copyright (c) 2003 RadSys Software Ltda. +# Todos os direitos reservados. +# +# É permitida a distribuição e modificação deste, desde que os créditos +# estejam presentes e que exista uma notificação sobre as modificações +# feitas. +# Não há restrição de uso. +# + +print "Generating `default.lang' catalog...\n"; + +@list=`find *.c`; + +$maxsize=0; +foreach $i (0..$#list){ + $maxsize=length($list[$i]) if(length($list[$i]) > $maxsize); +} + +open(B, ">default.lang"); + +print B "[Translation]\n"; +print B "translated-by=Unknown\n\n"; + +$messages=0; + +foreach $k (0..$#list){ + $line=0; + $thismsg=0; + + $file=$list[$k]; + chomp($file); + print B "[$file]\n"; + print STDERR "Searching in `$file':"; + print STDERR " " x ($maxsize - length($file) + 2); + + open(A, $file); + while(){ + $line++; + if(/_\(/){ + chomp; + $_=~s/\t//g; + $_=~s/_ \(/_\(/g; + + for($i=0; $i<=length($_); $i++){ + if(substr($_, $i, 1) eq "_" && + substr($_, $i+1, 1) eq "\("){ + for($j=$i+3; substr($_, $j, 1) ne "\""; $j++){ + print B substr($_, $j, 1); + } + print B "="; + for($j=$i+3; substr($_, $j, 1) ne "\""; $j++){ + print B substr($_, $j, 1); + } + print B "\n"; + + $messages++; + $thismsg++; + } + } + } + } + close(A); + print B "\n"; + if($thismsg){ + printf "%02d messages", $thismsg; + }else{ + print "Nothing"; + } + print " found.\n"; +} + +close(B); + +print "$messages messages saved in `default.lang'\n"; diff --git a/hardinfo.c b/hardinfo.c new file mode 100644 index 000000000..39948ec80 --- /dev/null +++ b/hardinfo.c @@ -0,0 +1,544 @@ +/* + * Hardware Information, version 0.3.2 + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + */ + +#include "hardinfo.h" +#include +#include +#include +#include + +#include "pixmaps/pci.xpm" +#include "pixmaps/usb.xpm" +#include "pixmaps/hdd.xpm" +#include "pixmaps/gen_connector.xpm" +#include "pixmaps/scsi.xpm" + +#include "computer.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); + 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; + 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(_("Operating System")); + 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(_("Processor")); + 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(_("Memory Usage")); + 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); + + hbox = gtk_hbutton_box_new(); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(mbox), hbox, FALSE, FALSE, 0); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbox), 6); + + 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(hbox), btn, FALSE, FALSE, 0); + +#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(hbox), 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(hbox), btn, 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(_("X-Window System")); + 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); + + 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) +{ + PCIDevice *pci = hi_scan_pci(); + ISADevice *isa = hi_scan_isapnp(); + IDEDevice *ide = hi_scan_ide(); + SCSIDevice *scsi = hi_scan_scsi(); + V4LDevice *v4l = hi_scan_v4l(); + ParportDevice *pp = hi_scan_parport(); + SerialDevice *sd = hi_scan_serial(); + GtkCTreeNode *node; + GenericDevice *gd = generic_devices; + + 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)); +} + +#if 0 +static void +usage(char *argv0) +{ + g_print("%s [--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 \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; +} diff --git a/hardinfo.h b/hardinfo.h new file mode 100644 index 000000000..072fd73b4 --- /dev/null +++ b/hardinfo.h @@ -0,0 +1,77 @@ +#ifndef __HARDINFO_H__ +#define __HARDINFO_H__ + +#define walk_until(x) while((*buf != '\0') && (*buf != x)) buf++ +#define walk_until_inclusive(x) walk_until(x); buf++ + +#define PREFIX "/usr/share/hardinfo/" +#define IMG_PREFIX PREFIX "pixmaps/" + +#include +#include +#include +#include + +#include "config.h" + +#ifdef ENABLE_NLS +#define INTL_PREFIX PREFIX "lang/" +#include "intl.h" +#else +#define _(x) (x) +#endif + +typedef struct _GenericDevice GenericDevice; +typedef enum _DeviceType DeviceType; + +typedef struct _MainWindow MainWindow; + +enum _DeviceType { + NONE, PCI, ISAPnP, USB, + IDE, SCSI, SERIAL, PARPORT, + V4L +}; + +struct _GenericDevice { + gpointer device; + DeviceType type; + + GtkCTreeNode *node; + + GenericDevice *next; +}; + +struct _MainWindow { + GtkWidget *window; + + GtkWidget *ctree; + + GtkWidget *frame; + GtkWidget *framec; + + GtkWidget *membar; + GtkWidget *uptime; +}; + +extern GenericDevice *generic_devices; + +#include "ide.h" +#include "scsi.h" +#include "isapnp.h" +#include "usb.h" +#include "pci.h" +#include "serial.h" +#include "parport.h" +#include "v4l.h" + +#include "x11.h" + +#include "about.h" + +GtkCTreeNode *tree_group_new(MainWindow *mainwindow, const gchar *name, + DeviceType type); +void tree_insert_item(MainWindow *mainwindow, GtkCTreeNode *group, gchar *name, + gpointer data); +void hi_insert_generic(gpointer device, DeviceType type); + +#endif diff --git a/ide.c b/ide.c new file mode 100644 index 000000000..7d9b009cd --- /dev/null +++ b/ide.c @@ -0,0 +1,142 @@ +/* + * Hardware Information, version 0.3 + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + */ + +#include "hardinfo.h" +#include "ide.h" + +#include + +IDEDevice *hi_scan_ide(void) +{ + FILE *proc_ide; + gchar *device, iface; + gint n=0, i=0; + struct stat st; + IDEDevice *ide_dev, *ide; + + ide = NULL; + + for (i=0; i<=4; i++) { + iface='a'+i; + device = g_strdup_printf("/proc/ide/hd%c/model", iface); + if (!stat(device, &st)) { + gchar buf[64]; + + ide_dev = g_new0(IDEDevice, 1); + ide_dev->next = ide; + ide = ide_dev; + + proc_ide = fopen(device, "r"); + fgets(buf, 64, proc_ide); + fclose(proc_ide); + + buf[strlen(buf)-1]=0; + + ide_dev->model = g_strdup(buf); + + g_free(device); + + device = g_strdup_printf("/proc/ide/hd%c/media", iface); + proc_ide = fopen(device, "r"); + fgets(buf, 64, proc_ide); + fclose(proc_ide); + buf[strlen(buf)-1]=0; + + ide_dev->media = g_strdup(buf); + + g_free(device); + + device = g_strdup_printf("/proc/ide/hd%c/cache", iface); + if (!stat(device, &st)) { + proc_ide = fopen(device, "r"); + fgets(buf, 64, proc_ide); + fclose(proc_ide); + + ide_dev->cache = atoi(buf); + } + n++; + } + g_free(device); + } + + return ide; +} + +void hi_show_ide_info(MainWindow *mainwindow, IDEDevice *device) +{ + GtkWidget *hbox, *vbox, *label; + static struct { + char *type; + char *label; + char *icon; + } type2icon[] = { + {"cdrom", "CD-ROM", "cd.png"}, + {"disk", "Hard Disk", "hdd.png"} + }; + int i; + gchar *buf; +#ifdef GTK2 + GtkWidget *pixmap; +#endif + + if(!device) return; + + for (i = 0; type2icon[i].type != NULL; ++i) { + if (!strcmp(device->media, type2icon[i].type)) break; + } + +#ifdef GTK2 + buf = g_strdup_printf("%s%s", IMG_PREFIX, type2icon[i].icon); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_show(pixmap); + + g_free(buf); +#endif + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + + buf = g_strdup_printf(_("ATA/IDE %s Device"), type2icon[i].label); + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), buf); + g_free(buf); + +#ifdef GTK2 + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); +#endif + + vbox = gtk_vbox_new(FALSE, 2); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("%s", device->model); + label = gtk_label_new(buf); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + + g_free(buf); +#else + label = gtk_label_new(device->model); +#endif + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + if (device->cache) { + buf = g_strdup_printf(_("Cache: %d KB"), device->cache); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + } +} diff --git a/ide.h b/ide.h new file mode 100644 index 000000000..baf7b091b --- /dev/null +++ b/ide.h @@ -0,0 +1,18 @@ +#ifndef __IDE_H__ +#define __IDE_H__ + +typedef struct _IDEDevice IDEDevice; + +struct _IDEDevice { + gchar *model; + + gchar *media; + gint cache; + + IDEDevice *next; +}; + +void hi_show_ide_info(MainWindow *mainwindow, IDEDevice *device); +IDEDevice *hi_scan_ide(void); + +#endif diff --git a/intl.c b/intl.c new file mode 100644 index 000000000..e0817b518 --- /dev/null +++ b/intl.c @@ -0,0 +1,111 @@ +/* + * ToscoIntl version 0.1 + * Copyright (c) 2002-2003 Leandro Pereira + * All rights reserved. + * + * This script is in the Tosco Public License. It may be copied and/or + * modified, in whole or in part, provided that all copies and related + * documentation includes the above copyright notice, this condition + * and the following disclaimer. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * + * (yes, the disclaimer is a copy from the BSD license, eat me!) + */ + +#include +#include +#include +#include + +#include "hardinfo.h" + +#ifdef ENABLE_NLS + +void intl_init(void) +{ + const gchar *by; + + g_print("Translation module registered.\n"); + + by = intl_translate("translated-by", "Translation"); + if (strcmp(by, "translated-by")) { + g_print("Translated by: %s\n", by); + } +} + +/* + * GNU's gettext is cool and all... but hey, this is smaller :) + */ +const gchar * +intl_translate(const gchar * string, const gchar * source) __THROW +{ + FILE *file; + gchar buffer[256], *keyname, *lang = NULL, *langenv = NULL; + const gchar *retval, *langvars[] = + {"LANG", "LC_MESSAGES", "LC_ALL", NULL}; + gboolean found; + struct stat st; + gint i = 0; + + keyname = g_strdup_printf("[%s]", source); + + for (; langvars[i]; i++) + if (getenv(langvars[i])) { + langenv = getenv(langvars[i]); + goto langenv_ok; + } + + goto not_found; + + langenv_ok: + lang = g_strconcat(INTL_PREFIX, langenv, ".lang", NULL); + if (stat(lang, &st)) { + lang = g_strconcat(INTL_PREFIX, "default.lang", NULL); + if (stat(lang, &st)) { + not_found: + retval = string; + goto finished; + } + } + + retval = string; + + file = fopen(lang, "r"); + if (!file) + goto finished; + + while (fgets(buffer, 256, file)) { + const gchar *buf = buffer; + + buf = g_strstrip(buf); + + if (*buf == '[' && !found && + !strncmp(buf, keyname, strlen(keyname))) + found = TRUE; + if (found && !strncmp(buf, string, strlen(string)) && + *(buf + strlen(string)) == '=') { + walk_until_inclusive('='); + retval = g_strdup(buf); + + fclose(file); + + goto finished; + } + } + fclose(file); + + finished: + g_free(keyname); + g_free(lang); + + return retval; +} + +#endif diff --git a/intl.h b/intl.h new file mode 100644 index 000000000..35684866b --- /dev/null +++ b/intl.h @@ -0,0 +1,11 @@ +#ifndef __INTL_H__ +#define __INTL_H__ + +#include "config.h" + +void intl_init(void); +const gchar *intl_translate(const gchar *string, const gchar *source) __THROW; + +#define _(x) (intl_translate(x, __FILE__)) + +#endif /* __INTL_H__ */ diff --git a/isapnp.c b/isapnp.c new file mode 100644 index 000000000..391633498 --- /dev/null +++ b/isapnp.c @@ -0,0 +1,130 @@ +/* + * Hardware Information, version 0.3.1b + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + */ + +#include "hardinfo.h" +#include "isapnp.h" + +ISADevice *hi_scan_isapnp(void) +{ + FILE *proc_isapnp; + gchar buffer[256], *buf; + gint n=0; + ISADevice *isa_dev, *isa; + struct stat st; + + isa = NULL; + + if(stat("/proc/isapnp", &st)) return NULL; + + proc_isapnp = fopen("/proc/isapnp", "r"); + while(fgets(buffer, 256, proc_isapnp)){ + buf = g_strstrip(buffer); + if(!strncmp(buf, "Card", 4)){ + gboolean lock = FALSE; + gfloat pnpversion, prodversion; + gint card_id; + gpointer start, end; + + sscanf(buf, "Card %d", &card_id); + + for (; buf != NULL; buf++) { + if (lock && *buf == '\'') { + end = buf; + break; + } else if (!lock && *buf == ':') { + start = buf+1; + lock = TRUE; + } + } + buf+=2; + + sscanf(buf, "PnP version %f Product version %f", &pnpversion, &prodversion); + + buf = end; + *buf=0; + buf = start; + + isa_dev = g_new0(ISADevice, 1); + + isa_dev->next = isa; + isa = isa_dev; + + isa_dev->pnpversion = pnpversion; + isa_dev->prodversion = prodversion; + isa_dev->card_id = card_id; + + isa_dev->card = g_strdup(buf); + + n++; + } + } + fclose(proc_isapnp); + + return isa; +} + +void hi_show_isa_info(MainWindow *mainwindow, ISADevice *device) +{ + GtkWidget *hbox, *vbox, *label; + gchar *buf; +#ifdef GTK2 + GtkWidget *pixmap; + + pixmap = gtk_image_new_from_file(IMG_PREFIX "pci.png"); + gtk_widget_show(pixmap); +#endif + + if(!device) return; + + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), _("ISA Plug and Play Device")); + +#ifdef GTK2 + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); +#endif + + vbox = gtk_vbox_new(FALSE, 2); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("%s", device->card); + label = gtk_label_new(buf); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + + g_free(buf); +#else + label = gtk_label_new(device->card); +#endif + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + buf = g_strdup_printf(_("Card ID: %d"), device->card_id); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf(_("PnP version: %.2f, Product version: %.2f"), + device->pnpversion, device->prodversion); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); +} + diff --git a/isapnp.h b/isapnp.h new file mode 100644 index 000000000..e6e283c96 --- /dev/null +++ b/isapnp.h @@ -0,0 +1,20 @@ +#ifndef __ISAPnP_H__ +#define __ISAPnP_H__ + +#include "hardinfo.h" + +typedef struct _ISADevice ISADevice; + +struct _ISADevice { + gchar *card; + gint card_id; + gfloat pnpversion, prodversion; + + ISADevice *next; +}; + +ISADevice *hi_scan_isapnp(void); +void hi_show_isa_info(MainWindow *mainwindow, ISADevice *device); + + +#endif diff --git a/lang/es_CO.lang b/lang/es_CO.lang new file mode 120000 index 000000000..990137fc8 --- /dev/null +++ b/lang/es_CO.lang @@ -0,0 +1 @@ +es_MX.ISO-8859-1.lang \ No newline at end of file diff --git a/lang/es_DO.lang b/lang/es_DO.lang new file mode 120000 index 000000000..990137fc8 --- /dev/null +++ b/lang/es_DO.lang @@ -0,0 +1 @@ +es_MX.ISO-8859-1.lang \ No newline at end of file diff --git a/lang/es_ES.lang b/lang/es_ES.lang new file mode 120000 index 000000000..990137fc8 --- /dev/null +++ b/lang/es_ES.lang @@ -0,0 +1 @@ +es_MX.ISO-8859-1.lang \ No newline at end of file diff --git a/lang/es_GT.lang b/lang/es_GT.lang new file mode 120000 index 000000000..990137fc8 --- /dev/null +++ b/lang/es_GT.lang @@ -0,0 +1 @@ +es_MX.ISO-8859-1.lang \ No newline at end of file diff --git a/lang/es_MX.ISO-8859-1.lang b/lang/es_MX.ISO-8859-1.lang new file mode 100644 index 000000000..79511225b --- /dev/null +++ b/lang/es_MX.ISO-8859-1.lang @@ -0,0 +1,117 @@ +[Translation] +translated-by=Erica Andrews + +[computer.c] +Unknown distribution=Distribución desconocido +%d hour%s and %ld minute%s=%d hora%s y %ld minuto%s +%d day%s, %d hour%s and %ld minute%s=%d dia%s, %d hora%s y %ld minuto%s +Computer name:=Nombre de computadora: +Computer name:=Nombre de computadora: +Distribution:=Distribución: +Distribution:=Distribución: +Kernel:=Kernel: +Kernel:=Kernel: +Uptime:=Uptime: +Uptime:=Uptime: +Updating...=Atualizando... +%s at %d MHz (%d bogomips)=%s en %d MHz (%d bogomips) +%s at %d MHz (%d bogomips)=%s en %d MHz (%d bogomips) +Family %d, model %d, stepping %d=Familia %d, modelo %d, stepping %d +%d KB L2 cache=%d KB de caché L2 + +[hardinfo.c] +System Information=Información de Sistema +Computer=Computadora +Operating System=Sistema Operativo +Operating System=Sistema Operativo +Processor=Procesador +Processor=Procesador +Memory Usage=Uso de Memoria +Memory Usage=Uso de Memoria +Devices=Dispositivos +Device information=Información de Dispositivo +Refresh=Refrescar +Close=Cerrar +Environment=Ambiente +X-Window System=X-Window System +X-Window System=Sistema X-Window +PCI Devices=Dispositivos PCI +ISA PnP Devices=Dispositivos ISA PnP +ATA/IDE Block Devices=Dispositivos ATA/IDE +SCSI Devices=Dispositivos SCSI +Communication Ports=Puertos de Communicación +Parallel Ports=Puertos Paralelos +This is free software; you can modify and/or distribute it\n=Este programa es software libre; puede modficarlo o distribuirlo\n +under the terms of GNU GPL version 2. See http://www.fsf.org/\n=conforme a los termos de la licencia GNU GPL versión 2. Vea http://www.fsf.org/\n +for more information.\n\n=para más información.\n\n +Translation module registered.\n=Módulo de traducción registrado.\n + +[ide.c] +ATA/IDE %s Device=%s ATA/IDE +Cache: %d KB=Caché: %d KB + +[intl.c] + +[isapnp.c] +ISA Plug and Play Device=Dispositivo ISA Plug and Play +Card ID: %d=Identificación de tarjeta: %d +PnP version: %.2f, Product version: %.2f=Versión PnP: %.2f, versión de producto: %.2f + +[parport.c] +N/A=N/D +Printer=Impresora +Multimedia=Multimedia +Legacy Device=Dispositivo Legado +Parallel Port=Puerto paralelo +Description: %s=Descripción: %s +Command set: %s=Mandos: %s +Class: %s=Clase: %s +Base I/O address: 0x%x=Direccion I/O básico: 0x%x +Modes: %s=Modos: %s +Uses DMA=Uso acesso directo a memoria + +[pci.c] +I/O address: 0x%x to 0x%x=Direccion de I/O: desde 0x%x hasta 0x%x +Memory: %ld KB=Memoria: %ld KB +Frequency: %dMHz=Frecuencia: %dMHz +Latency: %d=Tiempo de Latencia: %d +Bus master=Bus master +Bus: %d, Device: %d, Function: %d=Bus: %d, Unidad: %d, Función: %d + +[scsi.c] +Disk=Disco +Tape=Cinta +Printer=Impresora +CD-ROM=CD-ROM +CD-ROM=CD-ROM +Scanner=Escáner +Generic=Genérico +SCSI %s Device=%s SCSI +Revision: %s=Revisión: %s +Type: %s=Tipo: %s +Controller: %d, Bus: %d, ID: %d, LUN: %d=Controlador: %d, Bus: %d, ID: %d, LUN: %d + +[serial.c] +Communication Port=Puerto de Communicación +I/O port: 0x%x, IRQ: %d=Puerto de I/O: 0x%x, IRQ: %d + +[usb.c] +USB Device=Dispositivo USB +Manufacturer: %s=Fabricante: %s +Class: %s (%d)=Clase: %s (%d) +Version: %.2f, Revision: %.2f=Versión: %.2f, Revisión: %.2f +Vendor ID: 0x%X, Product ID: 0x%X=Identificación de fabricante: 0x%X, producto: 0x%X +USB Devices=Dispositivos USB +Unknown device (%s)=Dispositivo desconocido (%s) + +[x11.c] +Display:=Display: +Display:=Display: +Vendor:=Distribuidor: +Vendor:=Distribuidor: +Release:=Versión: +Release:=Versión: +Resolution:=Resolución: +Resolution:=Resolución: +Local display (%s)=Pantalla local (%s) +Remote display (%s)=Pantalla remota (%s) diff --git a/lang/es_MX.lang b/lang/es_MX.lang new file mode 120000 index 000000000..990137fc8 --- /dev/null +++ b/lang/es_MX.lang @@ -0,0 +1 @@ +es_MX.ISO-8859-1.lang \ No newline at end of file diff --git a/lang/es_PR.lang b/lang/es_PR.lang new file mode 120000 index 000000000..990137fc8 --- /dev/null +++ b/lang/es_PR.lang @@ -0,0 +1 @@ +es_MX.ISO-8859-1.lang \ No newline at end of file diff --git a/lang/es_US.lang b/lang/es_US.lang new file mode 120000 index 000000000..990137fc8 --- /dev/null +++ b/lang/es_US.lang @@ -0,0 +1 @@ +es_MX.ISO-8859-1.lang \ No newline at end of file diff --git a/lang/pt_BR.lang b/lang/pt_BR.lang new file mode 100644 index 000000000..cc4c592cc --- /dev/null +++ b/lang/pt_BR.lang @@ -0,0 +1,117 @@ +[Translation] +translated-by=Leandro Pereira + +[computer.c] +Unknown distribution=Distribuição desconhecida +%d hour%s and %ld minute%s=%d hora%s e %ld minuto%s +%d day%s, %d hour%s and %ld minute%s=%d dia%s, %d hora%s e %ld minuto%s +Computer name:=Nome do computador: +Computer name:=Nome do computador: +Distribution:=Distribuição: +Distribution:=Distribuição: +Kernel:=Kernel: +Kernel:=Kernel: +Uptime:=Uptime: +Uptime:=Uptime: +Updating...=Atualizando... +%s at %d MHz (%d bogomips)=%s em %d MHz (%d bogomips) +%s at %d MHz (%d bogomips)=%s em %d MHz (%d bogomips) +Family %d, model %d, stepping %d=Família %d, modelo %d, stepping %d +%d KB L2 cache=%d KB de cache nível 2 + +[hardinfo.c] +System Information=Informações do Sistema +Computer=Computador +Operating System=Sistema Operacional +Operating System=Sistema Operacional +Processor=Processador +Processor=Processador +Memory Usage=Uso da Memória +Memory Usage=Uso da Memória +Devices=Dipositivos +Device information=Informação do Dispositivo +Refresh=Atualizar +Close=Fechar +Environment=Ambiente +X-Window System=X-Window System +X-Window System=Sistema X-Window +PCI Devices=Dispositivos PCI +ISA PnP Devices=Dispositivos ISA PnP +ATA/IDE Block Devices=Dispositivos ATA/IDE +SCSI Devices=Dispositivos SCSI +Communication Ports=Portas de Comunicação +Parallel Ports=Portas Paralelas +This is free software; you can modify and/or distribute it\n=Este programa é software livre; você pode modificá-lo e/ou distribuí-lo\n +under the terms of GNU GPL version 2. See http://www.fsf.org/\n=sob os termos da GNU GPL versão 2. Veja http://www.fsf.org/\n +for more information.\n\n=para maiores informações.\n\n +Translation module registered.\n=Módulo de tradução registrado.\n + +[ide.c] +ATA/IDE %s Device=%s ATA/IDE +Cache: %d KB=Cache: %d KB + +[intl.c] + +[isapnp.c] +ISA Plug and Play Device=Dispositivo ISA Plug and Play +Card ID: %d=Identificação da placa: %d +PnP version: %.2f, Product version: %.2f=Versão PnP: %.2f, versão do produto: %.2f + +[parport.c] +N/A=N/D +Printer=Impressora +Multimedia=Multimídia +Legacy Device=Dispositivo Legado +Parallel Port=Porta paralela +Description: %s=Descrição: %s +Command set: %s=Comandos: %s +Class: %s=Classe: %s +Base I/O address: 0x%x=Endereço E/S básico: 0x%x +Modes: %s=Modos: %s +Uses DMA=Usa acesso direto à memória + +[pci.c] +I/O address: 0x%x to 0x%x=Endereço de E/S: 0x%x até 0x%x +Memory: %ld KB=Memória: %ld KB +Frequency: %dMHz=Frequência: %dMHz +Latency: %d=Latência: %d +Bus master=Bus master +Bus: %d, Device: %d, Function: %d=Barramento: %d, Dispositivo: %d, Função: %d + +[scsi.c] +Disk=Disco +Tape=Fita +Printer=Impressora +CD-ROM=CD-ROM +CD-ROM=CD-ROM +Scanner=Scanner +Generic=Genérico +SCSI %s Device=%s SCSI +Revision: %s=Revisão: %s +Type: %s=Tipo: %s +Controller: %d, Bus: %d, ID: %d, LUN: %d=Controlador: %d, Barramento: %d, ID: %d, LUN: %d + +[serial.c] +Communication Port=Porta de Comunicação +I/O port: 0x%x, IRQ: %d=Porta de E/S: 0x%x, IRQ: %d + +[usb.c] +USB Device=Dispositivo USB +Manufacturer: %s=Fabricante: %s +Class: %s (%d)=Classe: %s (%d) +Version: %.2f, Revision: %.2f=Versão: %.2f, Revisão: %.2f +Vendor ID: 0x%X, Product ID: 0x%X=Identificação do fabricante: 0x%X, produto: 0x%X +USB Devices=Dispositivos USB +Unknown device (%s)=Dispositivo desconhecido (%s) + +[x11.c] +Display:=Display: +Display:=Display: +Vendor:=Distribuidor: +Vendor:=Distribuidor: +Release:=Versão: +Release:=Versão: +Resolution:=Resolução: +Resolution:=Resolução: +Local display (%s)=Display local (%s) +Remote display (%s)=Display remoto (%s) diff --git a/parport.c b/parport.c new file mode 100644 index 000000000..d27aca2be --- /dev/null +++ b/parport.c @@ -0,0 +1,234 @@ +/* + * Hardware Information, version 0.3.1b + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + * Tested only with 2.4.x kernels on ix86. + * USB support needs usbdevfs. + */ + +#include "hardinfo.h" +#include "parport.h" + +#define srch_def(str,len,var) \ + if (!strncmp(buffer, str, len)) { \ + walk_until_inclusive(':'); \ + parport_dev->var = g_strdup(buf); \ + } + +ParportDevice *hi_scan_parport(void) +{ + FILE *autoprobe; + struct stat st; + gint n=0, i; + ParportDevice *parport_dev, *parport; + + parport = NULL; + + for (i = 0; i <= 16; i++) { + gchar *file; + gchar buffer[128]; + gint port, dma; + + file = g_strdup_printf(PARPORT_PROC_BASE "parport%d", i); + + if (stat(file, &st)) { + g_free(file); + continue; + } + g_free(file); + + file = g_strdup_printf + (PARPORT_PROC_BASE "parport%d/autoprobe", i); + + parport_dev = g_new0(ParportDevice, 1); + parport_dev->next = parport; + parport = parport_dev; + + n++; + + parport_dev->number = i; + + autoprobe = fopen(file, "r"); + while (autoprobe && fgets(buffer, 128, autoprobe)) { + char *buf; + + buf = g_strstrip(buffer); + *(buf + strlen(buf) - 1) = 0; + + srch_def("CLASS:", 6, pclass); + srch_def("MODEL:", 6, model); + srch_def("MANUFA", 6, manufacturer); + srch_def("DESCRI", 6, description); + srch_def("COMMAN", 6, cmdset); + } + if(autoprobe) fclose(autoprobe); + + g_free(file); + + if (parport_dev->model) { + parport_dev->name = + g_strdup_printf("%s %s (lp%d)", + parport_dev->manufacturer, + parport_dev->model, i); + } else { + parport_dev->name = + g_strdup_printf ("Parallel port (lp%d)", i); + } + + file = g_strdup_printf + (PARPORT_PROC_BASE "parport%d/base-addr", i); + autoprobe = fopen(file, "r"); + if (autoprobe) { + fscanf(autoprobe, "%d", &port); + fclose(autoprobe); + + parport_dev->port = port; + } + g_free(file); + + file = g_strdup_printf + (PARPORT_PROC_BASE "parport%d/dma", i); + autoprobe = fopen(file, "r"); + if (autoprobe) { + fscanf(autoprobe, "%d", &dma); + fclose(autoprobe); + + parport_dev->dma = (dma == -1) ? FALSE : TRUE; + } + g_free(file); + + file = g_strdup_printf + (PARPORT_PROC_BASE "parport%d/modes", i); + autoprobe = fopen(file, "r"); + if (autoprobe) { + gchar modes[64]; + + fgets(modes, 64, autoprobe); + fclose(autoprobe); + + modes[strlen(modes)-1]=0; + parport_dev->modes = g_strdup(modes); + + } + if(!parport_dev->modes) + parport_dev->modes = g_strdup(_("N/A")); + + g_free(file); + } + + return parport; + +} + +void hi_show_parport_info(MainWindow *mainwindow, ParportDevice *device) +{ + GtkWidget *hbox, *vbox, *label; + gchar *buf; + static struct { + gchar *type, *label, *icon; + } type2icon[] = { + {"PRINTER", "Printer", "lpr.png"}, + {"MEDIA", "Multimedia", "media.png"}, + {NULL, "Legacy Device", "gen_connector.png"}, + }; + gint i; +#ifdef GTK2 + GtkWidget *pixmap; +#endif + + if(!device) return; + + if (device->pclass) { + for (i = 0; type2icon[i].type != NULL; ++i) + if(!strcmp(device->pclass, type2icon[i].type)) + break; + } else + i = sizeof(type2icon) / sizeof(type2icon[0]) - 1; + + +#ifdef GTK2 + buf = g_strdup_printf("%s%s", IMG_PREFIX, type2icon[i].icon); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_show(pixmap); + + g_free(buf); +#endif + + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), _("Parallel Port")); + +#ifdef GTK2 + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); +#endif + + vbox = gtk_vbox_new(FALSE, 2); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("%s", device->name); + label = gtk_label_new(buf); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + + g_free(buf); +#else + label = gtk_label_new(device->name); +#endif + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + if (device->description) { + buf = g_strdup_printf(_("Description: %s"), device->description); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + g_free(buf); + } + + if (device->cmdset) { + buf = g_strdup_printf(_("Command set: %s"), device->cmdset); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + g_free(buf); + } + + buf = g_strdup_printf(_("Class: %s"), type2icon[i].label); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf(_("Base I/O address: 0x%x"), device->port); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf(_("Modes: %s"), device->modes); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + if (device->dma) { + label = gtk_label_new(_("Uses DMA")); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + } + +} diff --git a/parport.h b/parport.h new file mode 100644 index 000000000..1461a9099 --- /dev/null +++ b/parport.h @@ -0,0 +1,30 @@ +#ifndef __PARPORT_H__ +#define __PARPORT_H__ + +#include "hardinfo.h" + +#define PARPORT_PROC_BASE "/proc/sys/dev/parport/" + +typedef struct _ParportDevice ParportDevice; + +struct _ParportDevice { + gchar *name; + + gchar *cmdset; + gchar *model; + gchar *manufacturer; + gchar *description; + gchar *pclass; + + gint number, port; + gboolean dma; + + gchar *modes; + + ParportDevice *next; +}; + +ParportDevice *hi_scan_parport(void); +void hi_show_parport_info(MainWindow *mainwindow, ParportDevice *device); + +#endif diff --git a/pci.c b/pci.c new file mode 100644 index 000000000..3b4a252f2 --- /dev/null +++ b/pci.c @@ -0,0 +1,323 @@ +/* + * Hardware Information, version 0.3 + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + */ + +#include "hardinfo.h" +#include "pci.h" + +void hi_show_pci_info(MainWindow *mainwindow, PCIDevice *device) +{ + GtkWidget *hbox, *vbox, *label; + gchar *buf; +#ifdef GTK2 + GtkWidget *pixmap; + + pixmap = gtk_image_new_from_file(IMG_PREFIX "pci.png"); + gtk_widget_show(pixmap); +#endif + + if(!device) return; + + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), device->category); + +#ifdef GTK2 + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); +#endif + + vbox = gtk_vbox_new(FALSE, 2); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("%s", device->name); + label = gtk_label_new(buf); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + + g_free(buf); +#else + label = gtk_label_new(device->name); +#endif + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + if(device->irq) { + buf = g_strdup_printf("IRQ: %d", device->irq); + + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + g_free(buf); + } + + if(device->io_addr) { + buf = g_strdup_printf(_("I/O address: 0x%x to 0x%x"), device->io_addr, + device->io_addr_end); + + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + g_free(buf); + } + + if(device->memory) { + buf = g_strdup_printf(_("Memory: %ld %s"), + (device->memory <= 1024) ? device->memory : + device->memory / 1000, + (device->memory <= 1024) ? "bytes" : "KB"); + + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + g_free(buf); + } + + if(device->freq) { + buf = g_strdup_printf(_("Frequency: %dMHz"), device->freq); + + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + g_free(buf); + } + + if(device->latency) { + buf = g_strdup_printf(_("Latency: %d"), device->latency); + + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + g_free(buf); + } + + if(device->bus_master) { + label = gtk_label_new(_("Bus master")); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + } + + buf = g_strdup_printf(_("Bus: %d, Device: %d, Function: %d"), + device->bus, device->device, device->function); + + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); +} + +#ifdef USE_LSPCI +PCIDevice *hi_scan_pci(void) +{ + FILE *lspci; + gchar buffer[256], *buf; + gint n=0; + PCIDevice *pci_dev, *pci; + + pci = NULL; + + lspci = popen(LSPCI, "r"); + if(!lspci) return NULL; + + while(fgets(buffer, 256, lspci)){ + buf = g_strstrip(buffer); + if(!strncmp(buf, "Flags", 5)){ + gint irq=0, freq=0, latency=0, i; + gchar **list; + + buf+=7; + + pci_dev->bus_master = FALSE; + + list = g_strsplit(buf, ", ", 10); + for (i = 0; i <= 10; i++) { + if(!list[i]) break; + + if(!strncmp(list[i], "IRQ", 3)) + sscanf(list[i], "IRQ %d", &irq); + else if(strstr(list[i], "Mhz")) + sscanf(list[i], "%dMhz", &freq); + else + if(!strncmp(list[i], "bus master", 10)) + pci_dev->bus_master = TRUE; + else if(!strncmp(list[i], "latency", 7)) + sscanf(list[i], "latency %d", &latency); + } + g_strfreev(list); + + if (irq) pci_dev->irq = irq; + if (freq) pci_dev->freq = freq; + if (latency) pci_dev->latency = latency; + } + + else if(!strncmp(buf, "Memory at", 9) && + strstr(buf, "[size=")) { + gulong mem; + gchar unit; + + walk_until('['); + sscanf(buf, "[size=%ld%c", &mem, &unit); + + mem *= (unit == ']') ? 1 : + (unit == 'K') ? 1024 : + (unit == 'M') ? 1024 * 1000 : + (unit == 'G') ? 1024 * 1000 * 1000 : 1; + + pci_dev->memory += mem; + } else if(!strncmp(buf, "I/O", 3)){ + guint io_addr, io_size; + + sscanf(buf, "I/O ports at %x [size=%d]", &io_addr, &io_size); + + pci_dev->io_addr = io_addr; + pci_dev->io_addr_end = io_addr+io_size; + } else if((buf[0] >= '0' && buf[0] <= '9') && buf[2] == ':'){ + gint bus, device, function; + gpointer start, end; + + pci_dev = g_new0(PCIDevice, 1); + + pci_dev->next = pci; + pci = pci_dev; + + sscanf(buf, "%x:%x.%d", &bus, &device, &function); + + pci_dev->bus = bus; + pci_dev->device = device; + pci_dev->function = function; + + walk_until(' '); + + start = buf; + + walk_until(':'); + end = buf+1; + *buf=0; + + buf = start+1; + pci_dev->category = g_strdup(buf); + + buf = end; + start = buf; + walk_until('('); + *buf = 0; + buf = start+1; + + pci_dev->name = g_strdup(buf); + + n++; + } + } + pclose(lspci); + + return pci; +} + +#else + +#warning Using /proc/pci is deprecated, please install pciutils! + +PCIDevice *hi_scan_pci(void) +{ + FILE *proc_pci; + gchar buffer[256], *buf; + gboolean next_is_name = FALSE; + gint n=0; + PCIDevice *pci_dev, *pci; + struct stat st; + + g_print("Scanning PCI devices... "); + + pci = NULL; + + if(stat("/proc/pci", &st)) return NULL; + + proc_pci = fopen("/proc/pci", "r"); + while(fgets(buffer, 256, proc_pci)){ + buf = g_strstrip(buffer); + if(next_is_name == TRUE) { + gpointer start, end; + + start = buf; + + walk_until(':'); + end = buf+1; + *buf=0; + + buf = start; + pci_dev->category = g_strdup(buf); + + buf = end; + buf[strlen(buf)-1]=0; + pci_dev->name = g_strdup(buf); + + next_is_name = FALSE; + } else if(!strncmp(buf, "IRQ", 3)){ + gint irq; + + sscanf(buf, "IRQ %d", &irq); + + pci_dev->irq = irq; + } else if(!strncmp(buf, "Prefetchable 32 bit", 19) || + !strncmp(buf, "Non-prefetchable 32 bit", 23)){ + gulong mem_st, mem_end; + + if(*buf == 'N') buf+=4; + buf++; + + sscanf(buf, "refetchable 32 bit memory at %lx [%lx]", + &mem_st, &mem_end); + + pci_dev->memory+=(mem_end-mem_st)/1024; + } else if(!strncmp(buf, "I/O", 3)){ + guint io_addr, io_addr_end; + + sscanf(buf, "I/O at %x [%x]", &io_addr, &io_addr_end); + + pci_dev->io_addr = io_addr; + pci_dev->io_addr_end = io_addr_end; + } else if(!strncmp(buf, "Bus", 3)){ + gint bus, device, function; + + pci_dev = g_new0(PCIDevice, 1); + + pci_dev->next = pci; + pci = pci_dev; + + sscanf(buf, "Bus %d, device %d, function %d:", + &bus, &device, &function); + + pci_dev->bus = bus; + pci_dev->device = device; + pci_dev->function = function; + + next_is_name = TRUE; + n++; + } + } + fclose(proc_pci); + + g_print ("%d devices found\n", n); + + return pci; +} +#endif + diff --git a/pci.h b/pci.h new file mode 100644 index 000000000..635443ffa --- /dev/null +++ b/pci.h @@ -0,0 +1,31 @@ +#ifndef __PCI_H__ +#define __PCI_H__ + +typedef struct _PCIDevice PCIDevice; + +struct _PCIDevice { + gchar *name; + gchar *category; + + gint irq; + guint io_addr; + guint io_addr_end; + + gulong memory; + + gint bus; + gint device; + gint function; + + gint latency; + gint freq; + + gboolean bus_master; + + PCIDevice *next; +}; + +void hi_show_pci_info(MainWindow *mainwindow, PCIDevice *device); +PCIDevice *hi_scan_pci(void); + +#endif diff --git a/pixmaps/cd.png b/pixmaps/cd.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5d3341071405509794e83244c344b7ff1af548 GIT binary patch literal 2811 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%0AkY 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 M07*qoM6N<$g2lH5F#rGn literal 0 HcmV?d00001 diff --git a/pixmaps/distro/gnt.png b/pixmaps/distro/gnt.png new file mode 100644 index 0000000000000000000000000000000000000000..bf4290a9f9a92b21d6c8c6a261bebcc56635db9b GIT binary patch literal 3470 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 literal 0 HcmV?d00001 diff --git a/pixmaps/distro/mdk.png b/pixmaps/distro/mdk.png new file mode 100644 index 0000000000000000000000000000000000000000..a997ea1088a40de7a60626f7cc9809c9de26ae68 GIT binary patch literal 4648 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 eEDhREdHo;K;#e+w2<;F60000K literal 0 HcmV?d00001 diff --git a/pixmaps/distro/rh.png b/pixmaps/distro/rh.png new file mode 100644 index 0000000000000000000000000000000000000000..f612354be9c275a11c631f3b4556cdf7240adca8 GIT binary patch literal 3199 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 literal 0 HcmV?d00001 diff --git a/pixmaps/distro/slk.png b/pixmaps/distro/slk.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6d3365cb5b4032ea5ab69e70541b6af394727d GIT binary patch literal 2054 zcmV+h2>JJkP)yH2a`!e zK~#90#g}c2TxAu(Da%VMZBmxP2Z$yrfhYoz1YZ&*e$Wt2 zh#yRh@dJsNsELvoNw9#Zp-n7Bu~-aP6qmQsZ42Ad?RMX{`_k#|%n9G&%f)D|+%}G|TYGQMD z8+U*9#>=*MS>Sv3AJLcpHO9iCMKP!<76AnjK?KAY9HXF?tJkKv>oXhJxqb70wf&JV zy#4MOeR9tLxk43d!CDA4+MqeP25?eKhSqeC#DXc6y1>5>qUwz`BlBa#MrM%*@i(-p0mFTM&~Ws49ts z!7%|dQ=^QJPa!CquepYWN(SGzh^d`ks4SjiSC7Z{A9<*bX#kE7jOy{zMN~B^C5;?# zj3J>#&Q6SA2-vjcM$SwuacX#u;qe@U!{<0Pk|(>eoAzv)pt6WxS;R2{qCiBUs*rA8 z$-fUza`f0Sy$Jl^p)*(&LIq2-$Hr7H6>^eB3@wAt%$`5LSkcJS3w{7LR8q~I zv@|u~mkPZ4;xiORU!|2XI+_;fY7e-&GsUK>+GuV}kuO&8{A%4Psa+93aFY$><^%fP zcvAt~lY_Huh>2w@KE2ekT^X4wuwl zwNO~{5MvM#)M_k7iikl?10$p3QK>By$~C0=Rccm&FjR&n7HQ0G=k_n$M(CYmsW5|I z%Cl5FPhnw(sqqm`9_!N2dVu{p)6!}Qs?2)r7G^%@n4Vo+Cal3NtpTFnyiKD#s(zD$4^+y>R529Gt zb32NCXhTY+QWW!K(pi2^L{StWWo<{6_g;CN*Y`h4*D5#4ZXgUTo)=PF@|ZbSDo=rutbq|&mFzFg{a}yNiXPFu5qbZYsSO=D4 z6qS<=t5M3R;v`bBJZn9bqU2Yql?7T`n9D1{ja1S_0XN|SO8=V& z$eKykb+pisaY-f}Qb|L$CB>$78Twz_ixSe+y#?Pk)Rj#{5F@ybV1qIeF0!U`brf@e zD_WJAf+7g6W01-ui9{PgU`eIZluHGw)e0}~`z5Q_tfzCs^)xrN5mu`dr=~b^@(7++ z=8BHB?6~7=3{NjcfvdIPn9NdsmWFhd_3PIzgMX?g%isD+F^dw{nzB^(X|)b(x6s)-Lz@S`{hE!t_acx;xo=!`50P z;KT=~^anrfBQ#B9(n-47@{BFCQuYGYcQg`Ka)j;*ic3{iv^A129=7UZ90xbqKygXQ zEtCkVA+_Q+@gaI zzh01E^+~3lqY`5-Uu$$17d?E>WBm95x>l8WZqM%ewt7E*@cvsFc=XSxuBU1fxZW6U zoYO{^MMq+=WdMyq1&K$fn!~9~nnd#zyf^q3#vkRrFMpHg_Uz^o@QoWb%AcP9i~e@+ z5W~Sbgw(P^)hbIQ>O?jDtpQySUlYr!5ugOQiGGR`eSH4zUEF)m7cZJ*E}5%-{lruH z!YgyQjaPwj>j}dJlt#|P|6?^2BlW&uBx(}#XHSqHJ4Ej-TX_6eKl}I@uC|_d@+sYS zU=SKMlSntADzR8B*G=R^tcYUj3VXFD}*>&4ie)034T;B9rTQ45?t3LaO zgPhH0Nw=)WO*coKtPUMJ6n86tYNbH&+%U!Ie%hLS?z-o5eDC3JeH(9&eNX~zwG>At(!b@MHs{G;K+ z)*tsgr-$F^XLx9wLczoL1FR~Ju{1TMSku|TjoW(Y?cK@tZ8u$(-B0vkS6h=)lRB5n kq1KX0Ch57h=YO*EAHKzPV_WIxYXATM07*qoM6N<$f?av&O#lD@ literal 0 HcmV?d00001 diff --git a/pixmaps/distro/suse.png b/pixmaps/distro/suse.png new file mode 100644 index 0000000000000000000000000000000000000000..0c7759a1bf194b361ace2f4080ecaf6ca78ca96e GIT binary patch literal 988 zcmV<210(#2P)As%)yG54PB z-_fYSqsKyiBso-?AYRgg(u6=&l(e*mBpB#X58~0&F4IFg>+Ehe*=TeX_RD2wvNQ92 z^WK|zZ#e>j`;0!P30xPh0H@&!a2l=vr{M~48m<7R(SI9@6l*12!u96)Ypz#wbG=ID zinS6szc|D8uWi&%>o`0<(*9E$s`l&|_Gr(s&=U9o9>I~>D+{`^fMTsgQa=(c$+9Hd zfqhpNC8VP1u7z|hAYaLm(E41r>)1xOLTn4TY2rrgEbiKh6^ zE26D{Vy#3b;}bn6)(!l;4>PZ3EQ8(h9w^pIT<|l;K=PLv zpcw<1a#klqZKxVgT`CbTtdh)T_BQ#NK;1+ZC3uIt;0Jj8dGQ+$A3Q?!qzXUpgCGj< z4tW6>V&Ja0juEmbp?+G|+K0zS+7YV>h$O-!Q+96mWl@6N_5HjLdmr}oLELVzpZCGf z`>xBeBVwT?Tklcw!2cMC7gmY7Y)-;j2#7f4>V`v9PNQnf`M05;!# z=?P&gWXf67NhFIBVxc7{Nrf}!M|}Wv0YV2@WrVG+b9OP>Hukjx>z=fBNJZ0}l2kY) zsc@-inzPD@I0AyP7g04*L7OZ>HdU^Wgv_{@oLw6Jq8IS5p zJDNOshCSH&xn&weZ$TD*-q*D#wV~qt;tarLY^ef$&(Q}o&1lU0sEOHnm!f)7 zHT4-2u1=t*8C&I14z1?5g62Zhtowxnq>~$_Nm;PwraRazo;-eP>Ptn_oM+f$`$h%~ zF`y(B?)&E=!VB}-+1u(kWf!N^E{?)|q>SAf%S1vm{?fYWdVIE{ZEy!G?G=GA8a0000< KMNUMnLSTYh9?|ds literal 0 HcmV?d00001 diff --git a/pixmaps/distro/tl.png b/pixmaps/distro/tl.png new file mode 100644 index 0000000000000000000000000000000000000000..353bddd2c8e44165fdc1dda2529240a125b9a44a GIT binary patch literal 731 zcmV<10wn#3P)Ns1*o!VTuG8e40+&0X)dyWBlJ%&o`ny>nRL_wB&%d_TV*zjJ=) z0Gs-kH5L=-dVA`W2KvKGxbSwC22;6pPvWn79~Y?E7oZOR6deh~*Chd>CU{^pLZ3y_ z0Dyh=2HZX3M1O}}m4{~d$HWRf@gjs`sa!Zi2(Ikm@TjjtQv!;64gg16%%tCCtFB9w z;$2L@Y_{-N3tUmgJkJlyvb>iNvKR$>(>wYdt8%$|1EWK?)c^yd0|9V;R}+RjEsA{g zN`k`S@Q5giAcVl(>&cyMx3bUYG5`RnBx5?22LN=@h6BJY&o-F!`r$ne_|?Cl;V51f5T(X-X=A z5TH}hx zxo&lX1Hg56^BcQ?0RY_I--`RkcHjWVV!2qtw{*V#FW%sXc}gCBrb818RhVyPkp_}t z{o#@2!fT7~3qAERR1-|oJ@2v_&s^NygiuBTFG$0+B%nz%nLOqEQ*=D8{d=W(!u8l1 z$Uv7JlS$Qst#&v7T;O7}L7zN!CBzX9;k)a~0nyjTDL N002ovPDHLkV1lurM^pd+ literal 0 HcmV?d00001 diff --git a/pixmaps/distro/unk.png b/pixmaps/distro/unk.png new file mode 100644 index 0000000000000000000000000000000000000000..ed850e40019eeb8e6f7d7040782b85ce50bed188 GIT binary patch literal 2945 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 literal 0 HcmV?d00001 diff --git a/pixmaps/gen_connector.png b/pixmaps/gen_connector.png new file mode 100644 index 0000000000000000000000000000000000000000..477e55ff55c1fd96438a04240e74fc42c6dca775 GIT binary patch literal 1820 zcmV+%2jlpOP)2M{*?p$6|HSZ?@MhGSPYh zU;z%`s^%odTYXeoKLrq~Cb|XDNqHCeZX2t-&h~xa>%f3o-#V-ZY#Q|TD@&mKlyREvqW{f`OAs(H{MqO zQUGgfYn(cDiuLt%DwPV&W)sV@kW$iUG;m!P%d&7B2jBM@8X5vX2tg{9qS0s|gdmg2 zkV>Th@O__LE{6~T-}fmL3cPsnLhJMf-~pavc~`21kFM<0w)ytl?RSA&uK*Yx9)1V- z9WYT?xc1w^!nK)+^EbYyT*%he7WsUht*tHU^*Z%>y)6LSwh4j&$8iusAcP>DPE)Vf z5kk;vwMeJa2q6f=kT491q6pvjsZ=U#ZfOFvJwaVJs8k?J&RI625trk*Bq?CA`hi%(PDM_VL z1VKQf(IAQ~9D*RA)oPK=W^r8?DJ4M=kWQzGq6i@bwOS1!gx2ZU;-5aaX*WK- zbn?xsKLqZmgziedHua5>AAQA%`$`)g9+tp6zyy#{A>CCHJ3toLX|-CcuCD%v>pCQJ zyWbBx_R*t9tgo+g{rYu)?*RV<{-tt4>=i;u?q_v%m6es1R~Bjaxz~OG%d%KmS>gHf z=lZ9*vc9tyow^+;^ve&njSzxzxy+L%Pp~YDd_Lb%iT#vJj?L%u%*@Q-d0tEeQ55O! zw9?Nuj4QhVVClv5g2iHyix)5UWZ_O@hlYmmJP#=)j^mj9b~ncuci(+Jv7qLB+qOIQ z1FpmShXd?|&^1s%tU0hy9cr*{FAQsTNULI|QLA`HVAh;7^PPTe;E+R~|1D*kL* zF9?Fz+NOt0Ksqe6l6sTV@9=#;HcVeVU@my(%o&a!KTfOF>NX{{ zkV*a?h9Q+oM@>Vq_M5ClPd@&)bz zJ`gBJ0w2YVYqgd2Viw!NI|<<8^0ehkN(#?KkWr;1l38U=ye+FkM|}B2`rS z2k<%Ydtk`8*6AZ|3b=py@?{Ezf_WkDC}U$|JbwIGfBlInoivq|rBT@Off}%-`oq1v z;I@f>p{{TMEnr(Itd+ObwUa1{7#|<+3P3KGi_bmEsulJ0j4E8D0C`IJ=6)5rPC1}s zuLbNRtnUEF05&!@{ysiF{?>lVPfkv@ql40@G$w|L zihu?n)Fu4m+1c5*CMPF(_Uu_4D!E*4*9$Y54CQi}QmLemn@x4+)h$d|Stc0hQ2T&1 zUPR(v8UR1Pb?erRv9U4M*4ASB(?CoK!;t0WWtNtfhJo7(fUi6p7zujdI_6<2%(hDE zlfWGC3$yd?-MdsO6&4p4xpU`Ea_&vwk3bQ4VK7X@A;mq!9I0GhQdP4*0K-5Yc%aYt z2KWC!+gS8rZfG+SF^__|;P-zeigWG!oU>|axW~!#5*_WyT zFg-mDz=;zlP~d9Dm~DgqBYG6Ohq;=ie5FwAfti^ZGMNlhQ&Z-+mXWxkAIkR%z@)oS zS(H+#^c#SYkrB?FI|uNw@i&#-slxW(7Dv_fPXhA6g9mb9VL{H%&&vxJF5FZK&#J$V zj_LaA|AGgS%+v(V%+JrWy1L5f=qS_E)9 c #F7F7F7", +", c #EDEDED", +"' c #B8B8B8", +") c #8C8C8C", +"! c #989898", +"~ c #ADADAD", +"{ c #7B7B7B", +"] c #BDBDBD", +"^ c #D0D0D0", +"/ c #CECECE", +"( c #DBDBDB", +"_ c #DFDFDF", +": c #464646", +"< c #DDDDDD", +"[ c #7E7E7E", +" ", +" ........... ", +" .+@#$%%%%&. ", +" . .*@=*----;. .", +" ............. ", +" .>,,,,,,,,,'. ", +" .,)!!!!!!!~{. ", +" .,;-------*{. ", +" .,]^^^^^^/({. ", +" ._{{{{{{{{{:. ", +" ...{{{{{... ", +" .<-[. ", +" ..-.. ", +" .-. ", +" .-. ", +" .-. "}; diff --git a/pixmaps/hdd.png b/pixmaps/hdd.png new file mode 100644 index 0000000000000000000000000000000000000000..cc308f88ec8a3c9e1fcd0f9dbdaf2d04144f1ea9 GIT binary patch literal 3805 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 c #877159", +", c #B06F28", +"' c #C58C4D", +") c #EDCCA9", +"! c #EBC7A1", +"~ c #F2D8BC", +"{ c #EBD0B2", +"] c #8A7E71", +"^ c #5D5852", +"/ c #C79055", +"( c #BC7F3E", +"_ c #C28544", +": c #B28C64", +"< c #CCA276", +"[ c #EFD3B6", +"} c #EFD3B5", +"| c #B79672", +"1 c #666666", +"2 c #5D5D5D", +"3 c #745A3F", +"4 c #E5BD92", +"5 c #E4BA8E", +"6 c #70471D", +"7 c #83684A", +"8 c #84582B", +"9 c #C79967", +"0 c #E8C096", +"a c #E8C196", +"b c #423426", +"c c #565656", +"d c #272624", +"e c #796045", +"f c #F0D4B7", +"g c #EBCBA9", +"h c #7A4F22", +"i c #A67F56", +"j c #513416", +"k c #986E42", +"l c #EAC6A1", +"m c #ECCAA6", +"n c #352615", +"o c #6B6A6A", +"p c #6A6A6A", +"q c #7A7A7A", +"r c #797877", +"s c #938A80", +"t c #B2A89E", +"u c #A39A8F", +"v c #7F6E5B", +"w c #7A5734", +"x c #744F28", +"y c #B27532", +"z c #CE975A", +"A c #B38350", +"B c #494745", +"C c #606060", +"D c #747474", +"E c #858585", +"F c #656463", +"G c #767575", +"H c #514F4C", +"I c #776C5F", +"J c #BFB0A0", +"K c #F0D4B6", +"L c #EECEAB", +"M c #DAAC79", +"N c #B37736", +"O c #AF6E28", +"P c #715E4B", +"Q c #282828", +"R c #474747", +"S c #A5A5A5", +"T c #797979", +"U c #171310", +"V c #15110D", +"W c #2A2015", +"X c #B89C7D", +"Y c #EDCCA8", +"Z c #F0D1AF", +"` c #E0B78C", +" . c #B97E3F", +".. c #78624A", +"+. c #616161", +"@. c #4D4D4D", +"#. c #A4A4A4", +"$. c #767473", +"%. c #261A0E", +"&. c #5C4D3D", +"*. c #55412B", +"=. c #4F4C4C", +"-. c #4B4B4B", +";. c #A2A2A2", +">. c #474542", +",. c #5F5F5F", +"'. c #262626", +"). c #A7A7A7", +"!. c #474441", +"~. c #5C5C5C", +"{. c #252525", +"]. c #4E4E4E", +"^. c #AAAAAA", +"/. c #8D8D8D", +"(. c #5B5B5B", +"_. c #4F4F4F", +":. c #999999", +"<. c #777777", +"[. c #242424", +" . + ", +" . @ # $ ", +" % & * = - ; ", +" > , ' ) ! ~ { ] ", +" ^ / ( _ : < [ } | 1 ", +" 2 3 4 5 6 7 8 9 0 a b $ ", +" c d e f g h i j k l m n o ", +" p q r s t u v w x y z A B C ", +"D E F G H I J K L M N O P C Q ", +"R S T U V W X Y Z ` ...+.Q ", +" @.#.$.V V V %.&.*.=.C Q ", +" -.;.$.V V V V >.,.'. ", +" @.).$.U V !.~.{. ", +" ].^./.1 (.{. ", +" _.:.<.[. ", +" "}; diff --git a/pixmaps/logo.png b/pixmaps/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e19c735a09338a85700db68adbba07e88ad23847 GIT binary patch literal 2699 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 literal 0 HcmV?d00001 diff --git a/pixmaps/media.png b/pixmaps/media.png new file mode 100644 index 0000000000000000000000000000000000000000..cd061e6698cac67aa8d498a5cb2ed6c4a3b78f13 GIT binary patch literal 3113 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 uC}yak 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 c #738B57", +", c #4B673F", +"' c #546B47", +") c #3B542F", +"! c #FFFFFF", +"~ c #717171", +"{ c #DADBDA", +"] c #B9B691", +"^ c #55643F", +"/ c #A0A591", +"( c #606950", +"_ c #A0A593", +": c #2C3A21", +"< c #A9AAA9", +"[ c #B1B1B1", +"} c #A4A4A4", +"| c #A9A9A9", +"1 c #6D6B59", +"2 c #3E4832", +"3 c #8F9391", +"4 c #4F4436", +"5 c #8F9393", +"6 c #1E2416", +"7 c #B0BFA7", +"8 c #8A866E", +"9 c #000000", +"0 c #848069", +"a c #B9B086", +"b c #474736", +"c c #343E25", +"d c #6A706E", +"e c #443B33", +"f c #606769", +"g c #1D2416", +"h c #FAFAFA", +"i c #BEBEBE", +"j c #475236", +"k c #383E2B", +"l c #313726", +"m c #313425", +"n c #363A28", +"o c #1F2317", +"p c #3A4225", +"q c #3C502C", +"r c #334425", +"s c #364525", +"t c #27341C", +"u c #4D6538", +"v c #556437", +"w c #48552F", +"x c #4A552F", +"y c #4D5932", +"z c #3F4D29", +"A c #4D6433", +"B c #658042", +"C c #658248", +"D c #8F976F", +"E c #57604B", +"F c #848257", +"G c #939165", +"H c #B1B091", +"I c #9E9E77", +"J c #6B6942", +"K c #45592F", +"L c #4D6B36", +"M c #658442", +"N c #62824B", +"O c #80887A", +"P c #545454", +"Q c #343A21", +"R c #2B311C", +"S c #474D2B", +"T c #2C321D", +"U c #2D311C", +"V c #556736", +"W c #778F4A", +"X c #648241", +"Y c #648047", +"Z c #485441", +"` c #262925", +" . c #547E47", +".. c #A0A95E", +"+. c #D1CC84", +"@. c #8B9752", +"#. c #BBBB75", +"$. c #989E55", +"%. c #CAC77F", +"&. c #91A054", +"*. c #CFCB83", +"=. c #27361C", +"-. c #10140D", +";. c #0B0D09", +">. c #B8B078", +",. c #DDD58F", +"'. c #A5A161", +"). c #D4CD84", +"!. c #ADA772", +"~. c #D7D088", +"{. c #DAD38B", +" . ", +" . ", +" . ", +" . . . . . . . . . . . . . ", +". + @ @ @ @ @ @ @ @ @ @ @ . ", +". # $ % & * = - ; > , ' ) . ", +". # ! ~ ! ~ { ] ^ / ( _ : . ", +". ! < [ } | ~ 1 2 3 4 5 6 . . ", +". 7 8 9 0 9 a b c d e f g . h ", +". # j k l m n o p q r s t . 9 ", +". # u v w x y z A B C D E . ", +". # F G H I J K L M N O P . ", +". # Q R S T U V W X Y Z ` . ", +". ...+.@.#.$.%.&.*.=.-.;.. ", +" . >.,.'.).!.~.'.{.. . ", +" . . . . . . . . . . . "}; + + +/* + * Ripped from Ximian Setup Tools + * Unknown author + */ diff --git a/pixmaps/scan.png b/pixmaps/scan.png new file mode 100644 index 0000000000000000000000000000000000000000..8074cea6eeb1409ed4398bf24983f869e6380455 GIT binary patch literal 1517 zcmV(?ep z5+q5&#Kc6DF(I_*?^r#H#OUZ~Hx7)NPO;BIED{R~3s_rQ<2s#nT6VY5dc;TsgLLIS zMV`XIpyLRmgJlQl&-!irR z`}bpTa1ht7UHbySmr>w>&Qr*$*Xsa))zwwdbh>%-CICR!bCi8>l}e?k?}@e}z~JdL3D`5q?CdOyM7dneANPGBy#Krg_pS zNPzEDX~XYECNt=PcY2<}r~2%+_jmL&5ko^mNG6j2o}^PUnS`$ETsv(8fNHhsgy*=$ zFnIS=X?y+&Jn+QxLGbB50l)lhvN2JuR(*4y{<>! z`?&G2fj3{2=zzq~&=B`v!!VFYB)GO#@O}b376$LMF!+Aa?!Wt}i387zOhhJ=@ra;S ztJN6%v17*o_^+WnDb(NJ&(#%0fu?D`@Gm9Az_fA0)8p==CQGMUt>*E%8-9FzoWUk&|?R5%gobQ+4HV8`4K96TMgZuo7_i5z@i!(erzX~Ae(xbd*TjfpV$_4RcC z@P+pkKt&7;3~+09MNzQzO0lKqouU$=fK)Qc!5d8r^(MH1U8~hX;pgV&eBpfs%+Jp= z5!<(K=S0Y|jICFSoQI>NjT_!*T3EVx9_4bG6G7o+`Gg(iR4NocsKX+J;PBzY0DzH^ z5iBn+vrb*tQ7V=2!n>1Q!PEO2hJk!O4?+kBZ<+=!U%ng)AJ*v+;m*}ksf3r``?PC# zYWaK~vU~!jX}3jz_e~)xOjT7ZE-nH9Zr{G`nYU$G#)F@~j}2Z?K4A5z@L>W1ML6G- zg+c*K7tgl^Zy1IL{?w_Dq3i3B(q&*O~`&qT`k)2HqI(dFe@$MBt8#6&b24IDi>>MLT;$tf=9ofap2rx#j; z5bWFcI!v>HNI7Jh&eV ze785)+!x&q04NmR;r4^vo}ZdJ3jnBA|B4MB=OWd|%KA*?*^tqnF$7vQJ#DWEDX66$6LODHs&YGS+XN`}K)3(?xPH$L*5bWIf zDmFGYaPOY|32JHS*PePl&hNy6s;anu|4-J?YxrK7MF{C>+B_8z|7ZAT){gxPqQ5b; TpB&9n00000NkvXXu0mjfcY@!o literal 0 HcmV?d00001 diff --git a/pixmaps/scsi.png b/pixmaps/scsi.png new file mode 100644 index 0000000000000000000000000000000000000000..23dd73fd908c37478cba63bb5b90ea7d1cc48ea4 GIT binary patch literal 647 zcmV;20(kw2P)vIAi62fkH!kq637ky`-17fa+|vSs4vZ7^*4Q7DlH$=1tz;Gj5^;cR19Be{`RPZdST3>>u{4!mL-b%4-UAD)vPnBi(OdVa zqHPvVxc$sYm^l5x1`bnJ{@5*WlL(X9|7jV-8(I0nK(@AH`6Dz zilZ~1MJpd5%QRM-CuC7j2TP@&DqX# z5GHtt2TB@`d#>vT*Z!vk9wWy+SEx;KKLGRKmbJUP914M_Z!w!H4*=v+1?s7Ht(wZ0OZV*w^mMH3Y4=G=__8DUjTUHPvtAK;+^~n hs_E g #969696", +", g #9A9A9A", +"' g #585858", +") g #818181", +"! g #616161", +"~ g #8C8C8C", +"{ g #868686", +"] g #505050", +"^ g #797979", +"/ g #515151", +"( g #464646", +"_ g #747474", +": g #9C9C9C", +"< g #7C7C7C", +"[ g #5B5B5B", +"} g #A7A7A7", +"| g #5D5D5D", +"1 g #6A6A6A", +"2 g #666666", +"3 g #636363", +"4 g #5F5F5F", +"5 g #575757", +"6 g #A6A6A6", +"7 g #919191", +"8 g #676767", +"9 g #404040", +"0 g #5C5C5C", +"a g #555555", +"b g #4E4E4E", +"c g #737373", +"d g #7D7D7D", +"e g #707070", +"f g #3E3E3E", +"g g #2F2F2F", +"h g #606060", +"i g #474747", +"j g #3B3B3B", +"k g #4B4B4B", +"l g #3F3F3F", +"m g #4F4F4F", +"n g #545454", +"o g #3C3C3C", +"p g #373737", +"q g #414141", +"r g #454545", +"s g #363636", +"t g #353535", +"u g #313131", +" . ", +" +@# ", +" $@%&* ", +" =-*;>,' ", +" )! ~{] ", +" ^/ (_ ", +" :<[ ", +" }-| (1234[5 ", +" 678 9!0aa]b ", +" cd| ", +" 8e] fbg ", +" ;hi jkl ", +" mnop(o ", +" qrqs ", +" tu ", +" "}; diff --git a/pixmaps/stock-about-16.png b/pixmaps/stock-about-16.png new file mode 100644 index 0000000000000000000000000000000000000000..d66bfd7b02604ccf5ec74d9d284fa45498541868 GIT binary patch literal 320 zcmV-G0l)r2cp?*Tb%RNC9{As}zd zO9A9JlV2=!ZLivoTMs#~e4St5`yNlv=PvKbZMS}xd+En5ykfx7ah2)B$;@7DoaSss zq=&$YE4^SkaTudIS|w}n`{I*G4+#SAXRF4jasa@1Y+nGZ%}V{p(L4o6Q*j0Fdce1o z^7%*wtrA3_-3fy~msr$jFk2k#4`?m+$2?^(l;s}v>=9)<{&(7_STX!~Xe2Up0&+O;@ z`Tm&i!}4~$U3;v0o}1s9Uw)msJ7iu!y^eLKIz#r&Cw~{E%kkrP9TesP)b~)iAQz+p z!c54!-Q^!f`DNR-ZRrbMWAPfD>gk=*ii}*vE-;frl@r*a(yq#AG0aQ ztyr`u#eSrosh!)i@LeK^^4~b&iBeE_sQ`t(7xw$dc?5huraBu?ugh@3$ASVu<*|cu z6t>*)mrJqa0hKR@lxG3zb#U1Uxu??TJC{be!m3Nr{Qy8|!|&{yRfGCBB`*6wDv`?N z$n_8uwye4uZw~Fx%8o^@e~#{tMduXJDWocAqkL$u6L+l3nD0yyOT97Ve$@X> znG%&(c*MTR2T5^9OMS1DG7FX+^qyoaIlJ$!NB5VL+-}`^{NEdEQ2Q=#f|;(HT68ohmmXLR-2sC&XD|Yit5jl__1~J zD2ktqQ|DLDogebE3%RMMuar&5?*i&ii1JM;w!o5;@%+k%&;~`V_cf z5zQ=l0gg&N74UO~ebL^t8(-Ar)-I zNV5*^M*%H_L>5n^rfZ4_2{xnmX7bE(KM9DC<1HX-TXQ>pS9xW@w8yFoAVLmXkkNul zJhRxgLKpYb0WE}uHX5E;U=H_h21LjqnFV6c&y$=kfELmKN|`R5Gan#AmXONkl%HqS j>ceyVyZo<^|Ka)CWw1V=~-1|$SnS}Y8T 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 c #4B4B4B", +", c #2B2B2B", +"' c #323232", +") c #808080", +"! c #010101", +"~ c #C6C6C6", +"{ c #040404", +"] c #0D0D0D", +"^ c #0B0B0B", +"/ c #131313", +"( c #7D7D7D", +"_ c #030303", +": c #787878", +"< c #999999", +"[ c #CCCCCC", +"} c #959595", +"| c #8E8E8E", +"1 c #C2C2C2", +" ", +" ", +" ", +" ", +" ", +" .+@@@@# ", +" $%%%%%%&*=-; ", +" >%%%%%%% ,,') ", +"%%%%%%%%%% !,%~ ", +"%%{%%%%%%] ^,/ ", +" (_%%%%%> ::< ", +" [}||||1 ", +" ", +" ", +" ", +" "}; diff --git a/pixmaps/v4l.png b/pixmaps/v4l.png new file mode 100644 index 0000000000000000000000000000000000000000..88801a39a4f3370bf2dbcee6778438e6cfb3da0b GIT binary patch literal 3133 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 literal 0 HcmV?d00001 diff --git a/scsi.c b/scsi.c new file mode 100644 index 000000000..c5d19472c --- /dev/null +++ b/scsi.c @@ -0,0 +1,197 @@ +/* + * Hardware Information, version 0.3 + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + */ + +/* + * SCSI support by Pascal F.Martin + */ + +#include "hardinfo.h" +#include "scsi.h" + +SCSIDevice *hi_scan_scsi(void) +{ + FILE *proc_scsi; + gchar buffer[256], *buf; + gint n=0; + SCSIDevice *scsi_dev, *scsi; + struct stat st; + + scsi = NULL; + + if(stat("/proc/scsi/scsi", &st)) return NULL; + + proc_scsi = fopen("/proc/scsi/scsi", "r"); + while(fgets(buffer, 256, proc_scsi)) { + buf = g_strstrip(buffer); + if(!strncmp(buf, "Host: scsi", 10)) { + gint scsi_controller; + gint scsi_channel; + gint scsi_id; + gint scsi_lun; + + sscanf(buf, + "Host: scsi%d Channel: %d Id: %d Lun: %d", + &scsi_controller, + &scsi_channel, + &scsi_id, + &scsi_lun); + + buf = strstr (buffer, "Rev: "); + if (buf == NULL) { + buf = "(unknown)"; + } else { + buf += 5; + } + scsi_dev = g_new0(SCSIDevice, 1); + + scsi_dev->next = scsi; + scsi = scsi_dev; + + scsi_dev->controller = scsi_controller; + scsi_dev->channel = scsi_channel; + scsi_dev->id = scsi_id; + scsi_dev->lun = scsi_lun; + + n++; + + } else if (!strncmp(buf, "Vendor: ", 8)) { + + char *p; + char *model = strstr (buf, "Model: "); + char *rev = strstr (buf, "Rev: "); + + if (model == NULL) { + model = buf + strlen(buf); + } + p = model; + while (*(--p) == ' ') ; + *(++p) = 0; + scsi_dev->vendor = g_strdup(buf+8); + + if (rev != NULL) { + scsi_dev->revision = g_strdup(rev+5); + } else { + rev = model + strlen(model); + } + p = rev; + while (*(--p) == ' ') ; + *(++p) = 0; + scsi_dev->model = + g_strdup_printf + ("%s %s", scsi_dev->vendor, model+7); + + } else if (!strncmp(buf, "Type: ", 8)) { + char *p = strstr (buf, "ANSI SCSI revi"); + + if (p != NULL) { + while (*(--p) == ' ') ; + *(++p) = 0; + scsi_dev->type = g_strdup(buf+8); + } + } + } + fclose(proc_scsi); + + return scsi; +} + +void hi_show_scsi_info(MainWindow *mainwindow, SCSIDevice *device) +{ + static struct { + char *type; + char *label; + char *icon; + } type2icon[] = { + {"Direct-Access", "Disk", "hdd.png"}, + {"Sequential-Access", "Tape", "tape.png"}, + {"Printer", "Printer", "lpr.png"}, + {"WORM", "CD-ROM", "cd.png"}, + {"CD-ROM", "CD-ROM", "cd.png"}, + {"Scanner", "Scanner", "scan.png"}, + {NULL, "Generic", "scsi.png"} + }; + + int i; + GtkWidget *hbox, *vbox, *label; + gchar *buf; +#ifdef GTK2 + GtkWidget *pixmap; +#endif + + if(!device) return; + + for (i = 0; type2icon[i].type != NULL; ++i) { + if (!strcmp(device->type, type2icon[i].type)) break; + } + +#ifdef GTK2 + buf = g_strdup_printf("%s%s", IMG_PREFIX, type2icon[i].icon); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_show(pixmap); + + g_free(buf); +#endif + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + buf = g_strdup_printf(_("SCSI %s Device"), type2icon[i].label); + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), buf); + g_free(buf); + +#ifdef GTK2 + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); +#endif + + vbox = gtk_vbox_new(FALSE, 2); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("%s", device->model); + + label = gtk_label_new(buf); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + + g_free(buf); +#else + label = gtk_label_new(device->model); +#endif + + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + buf = g_strdup_printf(_("Revision: %s"), device->revision); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf(_("Type: %s"), device->type); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf + (_("Controller: %d, Bus: %d, ID: %d, LUN: %d"), + device->controller, + device->channel, + device->id, + device->lun); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); +} diff --git a/scsi.h b/scsi.h new file mode 100644 index 000000000..430d9e769 --- /dev/null +++ b/scsi.h @@ -0,0 +1,23 @@ +#ifndef __SCSI_H__ +#define __SCSI_H__ + +typedef struct _SCSIDevice SCSIDevice; + +struct _SCSIDevice { + gchar *model; + + gchar *vendor; + gchar *type; + gchar *revision; + gint controller; + gint channel; + gint id; + gint lun; + + SCSIDevice *next; +}; + +void hi_show_scsi_info(MainWindow *mainwindow, SCSIDevice *device); +SCSIDevice *hi_scan_scsi(void); + +#endif diff --git a/serial.c b/serial.c new file mode 100644 index 000000000..837117b28 --- /dev/null +++ b/serial.c @@ -0,0 +1,128 @@ +/* + * Hardware Information, version 0.3.1b + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + * Tested only with 2.4.x kernels on ix86. + * USB support needs usbdevfs. + */ + +#include "hardinfo.h" +#include "serial.h" + +SerialDevice *hi_scan_serial(void) +{ + FILE *proc_tty; + struct stat st; + const gchar *ser_drv="/proc/tty/driver/serial"; + gint n=0; + SerialDevice *serial_dev, *serial; + + serial = NULL; + + if (!stat(ser_drv, &st)) { + gchar buffer[256]; + + proc_tty = fopen(ser_drv, "r"); + while(fgets(buffer, 256, proc_tty)){ + gint port, irq; + gpointer start, end; + gchar *buf = buffer; + + if(*buf == 's') continue; + if(strstr(buf, "unknown")) continue; + + serial_dev = g_new0(SerialDevice, 1); + + serial_dev->next = serial; + serial = serial_dev; + + serial_dev->name = g_strdup_printf + ("Serial Port (tty%d)", buffer[0]-'0'); + + + + walk_until('t'); + buf+=2; + start = buf; + walk_until(' '); + end = buf; + *buf = 0; + buf = start; + + serial_dev->uart = g_strdup(buf); + + buf = end; + *buf = ' '; + + sscanf(buf, " port:%x irq:%d", &port, &irq); + serial->port = port; + serial->irq = irq; + n++; + } + fclose(proc_tty); + } + + return serial; +} + +void hi_show_serial_info(MainWindow *mainwindow, SerialDevice *device) +{ + GtkWidget *hbox, *vbox, *label; + gchar *buf; +#ifdef GTK2 + GtkWidget *pixmap; + + pixmap = gtk_image_new_from_file(IMG_PREFIX "gen_connector.png"); + gtk_widget_show(pixmap); +#endif + + if(!device) return; + + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), _("Communication Port")); + +#ifdef GTK2 + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); +#endif + + vbox = gtk_vbox_new(FALSE, 2); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("%s", device->name); + label = gtk_label_new(buf); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + + g_free(buf); +#else + label = gtk_label_new(device->name); +#endif + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + buf = g_strdup_printf(_("I/O port: 0x%x, IRQ: %d"), device->port, device->irq); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf("UART: %s", device->uart); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + +} diff --git a/serial.h b/serial.h new file mode 100644 index 000000000..e2d3e5e8a --- /dev/null +++ b/serial.h @@ -0,0 +1,19 @@ +#ifndef __SERIAL_H__ +#define __SERIAL_H__ + +#include "hardinfo.h" + +typedef struct _SerialDevice SerialDevice; + +struct _SerialDevice { + gchar *name; + gchar *uart; + gint port, irq, baud; + + SerialDevice *next; +}; + +SerialDevice *hi_scan_serial(void); +void hi_show_serial_info(MainWindow *mainwindow, SerialDevice *device); + +#endif diff --git a/usb.c b/usb.c new file mode 100644 index 000000000..24b09dd11 --- /dev/null +++ b/usb.c @@ -0,0 +1,223 @@ +/* + * Hardware Information, version 0.3 + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + * Tested only with 2.4.x kernels on ix86. + * USB support needs usbdevfs. + */ + +#include "hardinfo.h" +#include "usb.h" + +gboolean usb_update(gpointer data) +{ + MainWindow *mainwindow = (MainWindow*)data; + GtkCTreeNode *node; + USBDevice *usb; + + if(!mainwindow) return FALSE; + + g_print("Refreshing USB... "); + + gtk_clist_freeze(GTK_CLIST(mainwindow->ctree)); + + usb = hi_scan_usb(); + + if (usb != NULL) { + node = tree_group_new(mainwindow, _("USB Devices"), USB); + for (; usb != NULL; usb=usb->next) { + hi_insert_generic(usb, USB); + if (!usb->product) + usb->product = g_strdup_printf + (_("Unknown device (%s)"), usb->class); + + tree_insert_item(mainwindow, node, usb->product, + generic_devices); + } + } + + gtk_clist_thaw(GTK_CLIST(mainwindow->ctree)); + + g_print("done.\n"); + + return TRUE; +} + +USBDevice *hi_scan_usb(void) +{ + FILE *proc_usb; + gchar buffer[64]; + gint n=0; + USBDevice *usb_dev, *usb; + struct stat st; + + usb = NULL; + + if (stat("/proc/bus/usb/devices", &st)) return NULL; + + proc_usb = fopen("/proc/bus/usb/devices", "r"); + while(fgets(buffer, 64, proc_usb)){ + if (strstr(buffer, "Manufacturer=")) { + gchar *buf = buffer; + gboolean lock = FALSE; + gpointer start, end; + + for (; buf != NULL; buf++) { + if (lock && *buf == '\n') { + end = buf; + break; + } else if (!lock && *buf == '=') { + start = buf+1; + lock = TRUE; + } + } + + buf = end; + *buf = 0; + buf = start; + + usb->vendor = g_strdup(buf); + } else if (strstr(buffer, "Product=")) { + gchar *buf = buffer; + gboolean lock = FALSE; + gpointer start, end; + + for (; buf != NULL; buf++) { + if (lock && *buf == '\n') { + end = buf; + break; + } else if (!lock && *buf == '=') { + start = buf+1; + lock = TRUE; + } + } + + buf = end; + *buf=0; + buf = start; + + usb_dev->product = g_strdup(buf); + } else if (!strncmp(buffer, "D: Ve", 6)) { + gchar *buf = buffer; + gpointer start; + gfloat version; + gint class_id; + + usb_dev = g_new0(USBDevice, 1); + usb_dev->next = usb; + usb = usb_dev; + + buf+=4; + + sscanf(buf, "Ver =%f Cls=%d", &version, &class_id); + + usb_dev->version = version; + usb_dev->class_id= class_id; + + walk_until('('); + start = buf+1; + buf+=6; + *buf = 0; + buf = start; + + usb_dev->class = g_strdup(buf); + n++; + } else if (!strncmp(buffer, "P: Ve", 6)) { + gchar *buf = buffer; + gint vendor_id, prod_id; + gfloat rev; + + buf+=4; + + sscanf(buf, "Vendor=%x ProdID=%x Rev= %f", + &vendor_id, &prod_id, &rev); + + usb_dev->vendor_id = vendor_id; + usb_dev->prod_id = prod_id; + usb_dev->revision = rev; + } + } + fclose(proc_usb); + + return usb; +} + +void hi_show_usb_info(MainWindow *mainwindow, USBDevice *device) +{ + GtkWidget *hbox, *vbox, *label; + gchar *buf; +#ifdef GTK2 + GtkWidget *pixmap; + + pixmap = gtk_image_new_from_file(IMG_PREFIX "usb.png"); + gtk_widget_show(pixmap); +#endif + + if(!device) return; + + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), _("USB Device")); + +#ifdef GTK2 + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); +#endif + + vbox = gtk_vbox_new(FALSE, 2); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("%s", device->product); + label = gtk_label_new(buf); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + + g_free(buf); +#else + label = gtk_label_new(device->product); +#endif + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + if (device->vendor) { + buf = g_strdup_printf(_("Manufacturer: %s"), device->vendor); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + } + + buf = g_strdup_printf(_("Class: %s (%d)"), device->class, device->class_id); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf(_("Version: %.2f, Revision: %.2f"), device->version, device->revision); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + if(!device->prod_id) return; + + buf = g_strdup_printf(_("Vendor ID: 0x%X, Product ID: 0x%X"), + device->vendor_id, device->prod_id); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + +} + diff --git a/usb.h b/usb.h new file mode 100644 index 000000000..f761b5c4f --- /dev/null +++ b/usb.h @@ -0,0 +1,28 @@ +#ifndef __USB_H__ +#define __USB_H__ + +#include "hardinfo.h" + +typedef struct _USBDevice USBDevice; + +struct _USBDevice { + gchar *product; + gchar *vendor; + gchar *class; + + gfloat version, revision; + + gint bus, port, vendor_id, prod_id, class_id; + + gchar *driver; + + USBDevice *next; +}; + + +USBDevice *hi_scan_usb(void); +void hi_show_usb_info(MainWindow *mainwindow, USBDevice *device); + +gboolean usb_update(gpointer data); + +#endif diff --git a/v4l.c b/v4l.c new file mode 100644 index 000000000..6ce5aa028 --- /dev/null +++ b/v4l.c @@ -0,0 +1,137 @@ +/* + * Hardware Information, version 0.3 + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + */ + +#include "hardinfo.h" +#include "v4l.h" + +#include +#include + +#define get_str_val(var) { \ + walk_until_inclusive(':'); buf++; \ + var = g_strdup(buf); \ + continue; \ + } + +V4LDevice *hi_scan_v4l(void) +{ + FILE *proc_video; + DIR *proc_dir; + struct dirent *sd; + V4LDevice *v4l_dev, *v4l; + struct stat st; + + v4l = NULL; + + if (stat("/proc/video/dev", &st)) + return NULL; + + proc_dir = opendir("/proc/video/dev"); + if(!proc_dir) + return NULL; + + while (sd = readdir(proc_dir)) { + gchar *dev, buffer[128]; + + dev = g_strdup_printf("/proc/video/dev/%s", sd->d_name); + proc_video = fopen(dev, "r"); + g_free(dev); + + if(!proc_video) + continue; + + v4l_dev = g_new0(V4LDevice, 1); + v4l_dev->next = v4l; + v4l = v4l_dev; + + while (fgets(buffer, 128, proc_video)) { + char *buf = g_strstrip(buffer); + + if(!strncmp(buf, "name", 4)) + get_str_val(v4l_dev->name) + else if(!strncmp(buf, "type", 4)) + get_str_val(v4l_dev->type) + } + + fclose(proc_video); + } + + return v4l; +} + +void hi_show_v4l_info(MainWindow *mainwindow, V4LDevice *device) +{ + GtkWidget *hbox, *vbox, *label; + gchar *buf; +#ifdef GTK2 + GtkWidget *pixmap; +#endif + + if(!device) return; + + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + +#ifdef GTK2 + buf = g_strdup_printf("%sv4l.png", IMG_PREFIX); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_show(pixmap); + + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); + + g_free(buf); +#endif + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), _("Device Information")); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("%s", device->name); + + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + g_free(buf); +#else + label = gtk_label_new(device->name); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); +#endif + + if (device->type) { + gchar *b = g_strdup(device->type); + gpointer b_start = b; + + do { + if (*b == '|') *b = '\n'; + b++; + } while(*b); + b = b_start; + + buf = g_strdup_printf("Type:\n%s", b); + + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + g_free(buf); + g_free(b); + } +} diff --git a/v4l.h b/v4l.h new file mode 100644 index 000000000..499dfca30 --- /dev/null +++ b/v4l.h @@ -0,0 +1,16 @@ +#ifndef __V4L_H__ +#define __V4L_H__ + +typedef struct _V4LDevice V4LDevice; + +struct _V4LDevice { + gchar *name; + gchar *type; + + V4LDevice *next; +}; + +void hi_show_v4l_info(MainWindow *mainwindow, V4LDevice *device); +V4LDevice *hi_scan_v4l(void); + +#endif diff --git a/x11.c b/x11.c new file mode 100644 index 000000000..dcd7df4a6 --- /dev/null +++ b/x11.c @@ -0,0 +1,244 @@ +/* + * Hardware Information, version 0.3 + * Copyright (C) 2003 Leandro Pereira + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + * This module contains code from xdpyinfo.c, by Jim Fulton, MIT X Consortium + * Copyright 1988, 1998 The Open Group + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of The Open Group shall not be + * used in advertising or otherwise to promote the sale, use or other dealings + * in this Software without prior written authorization from The Open Group. + */ + +#include "hardinfo.h" +#include "x11.h" + +#include + +X11Info * +x11_get_info(void) +{ + X11Info *info; + Display *dpy; + gint default_screen = 0, color_depth = 0; + gchar *buf; + + dpy = XOpenDisplay(NULL); + if(!dpy) return NULL; + + info = g_new0(X11Info, 1); + + buf = DisplayString(dpy); + if (*buf == ':') + info->display = g_strdup_printf(_("Local display (%s)"), buf); + else + info->display = g_strdup_printf(_("Remote display (%s)"), buf); + + info->vendor = g_strdup(ServerVendor(dpy)); + + if (strstr(ServerVendor(dpy), "XFree86")) { + int vendrel = VendorRelease(dpy); + + if (vendrel < 336) { + /* + * vendrel was set incorrectly for 3.3.4 and 3.3.5, so handle + * those cases here. + */ + buf = g_strdup_printf + ("%d.%d.%d", vendrel / 100, (vendrel / 10) % 10, + vendrel % 10); + } else if (vendrel < 3900) { + /* 3.3.x versions, other than the exceptions handled above */ + buf = g_strdup_printf("%d.%d", vendrel / 1000, (vendrel / 100) % 10); + if (((vendrel / 10) % 10) || (vendrel % 10)) { + gchar *buf2; + + buf2 = g_strdup_printf(".%d", (vendrel / 10) % 10); + buf = g_strconcat(buf, buf2, NULL); + g_free(buf2); + + if (vendrel % 10) { + buf2 = g_strdup_printf(".%d", vendrel % 10); + buf = g_strconcat(buf, buf2, NULL); + g_free(buf2); + } + } + } else if (vendrel < 40000000) { + gchar *buf2; + /* 4.0.x versions */ + buf = g_strdup_printf("%d.%d", vendrel / 1000, (vendrel / 10) % 10); + + if (vendrel % 10) { + buf2 = g_strdup_printf(".%d", vendrel % 10); + buf = g_strconcat(buf, buf2, NULL); + g_free(buf2); + } + } else { + /* post-4.0.x */ + /* post-4.0.x */ + buf = g_strdup_printf("%d.%d.%d", vendrel / 10000000, + (vendrel / 100000) % 100, + (vendrel / 1000) % 100); + if (vendrel % 1000) { + gchar *buf2; + + buf2 = g_strdup_printf(".%d", vendrel % 1000); + buf = g_strconcat(buf, buf2, NULL); + g_free(buf2); + } + } + } + if (buf) { + info->xf86version = g_strdup(buf); + g_free(buf); + } + + default_screen = DefaultScreen(dpy); + color_depth = XDefaultDepth(dpy, default_screen); + info->screen_size = g_strdup_printf("%dx%d pixels (%d bpp)", + DisplayWidth(dpy, default_screen), + DisplayHeight(dpy, default_screen), + color_depth); + + + if (info->xf86version) { + info->version = g_strdup_printf(_("XFree86 version %s (protocol version %d.%d)"), + info->xf86version, ProtocolVersion(dpy), + ProtocolRevision(dpy)); + } else { + info->version = g_strdup_printf(_("%d (protocol version %d.%d)"), + VendorRelease(dpy), ProtocolVersion(dpy), + ProtocolRevision(dpy)); + } + + XCloseDisplay(dpy); + + return info; +} + +GtkWidget * +x11_get_widget(MainWindow * mainwindow) +{ + GtkWidget *label, *hbox; + GtkWidget *table; +#ifdef GTK2 + GtkWidget *pixmap; + gchar *buf; +#endif + X11Info *info; + + if (!mainwindow) + return NULL; + + info = x11_get_info(); + + if (!info) + return NULL; + + hbox = gtk_hbox_new(FALSE, 0); + gtk_widget_show(hbox); + +#ifdef GTK2 + buf = g_strdup_printf("%s/x11.png", IMG_PREFIX); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_set_usize(GTK_WIDGET(pixmap), 64, 0); + gtk_widget_show(pixmap); + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); + g_free(buf); +#endif + + table = gtk_table_new(4, 2, FALSE); + gtk_widget_show(table); + gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(table), 10); + gtk_table_set_row_spacings(GTK_TABLE(table), 4); + gtk_table_set_col_spacings(GTK_TABLE(table), 4); + + /* + * Table headers + */ +#ifdef GTK2 + label = gtk_label_new(_("Display:")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Display:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + +#ifdef GTK2 + label = gtk_label_new(_("Vendor:")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Vendor:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + +#ifdef GTK2 + label = gtk_label_new(_("Release:")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Release:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + +#ifdef GTK2 + label = gtk_label_new(_("Resolution:")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Resolution:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + /* + * Table content + */ + label = gtk_label_new(info->display); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + label = gtk_label_new(info->vendor); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + label = gtk_label_new(info->version); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 3); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + label = gtk_label_new(info->screen_size); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 3, 4); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + g_free(info); + + return hbox; +} diff --git a/x11.h b/x11.h new file mode 100644 index 000000000..6800ea7d3 --- /dev/null +++ b/x11.h @@ -0,0 +1,20 @@ +#ifndef __X11_H__ +#define __X11_H__ + +#include +#include + +typedef struct _X11Info X11Info; + +struct _X11Info { + gchar *display; + gchar *version; + gchar *vendor; + gchar *xf86version; + gchar *screen_size; +}; + +X11Info *x11_get_info(void); +GtkWidget *x11_get_widget(MainWindow *mainwindow); + +#endif