From 8c1612d32c5682a86216adb8c8d11ce715fe5475 Mon Sep 17 00:00:00 2001 From: Simon Quigley Date: Mon, 19 Jun 2017 14:38:30 -0500 Subject: Import Upstream version 0.3.6 --- ChangeLog | 136 +++++++++ Makefile.in | 47 ++++ README | 8 + about.c | 120 ++++++++ about.h | 16 ++ computer.c | 515 ++++++++++++++++++++++++++++++++++ computer.h | 45 +++ configure | 226 +++++++++++++++ genintl.pl | 80 ++++++ hardinfo.c | 623 +++++++++++++++++++++++++++++++++++++++++ hardinfo.desktop | 12 + hardinfo.h | 86 ++++++ 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 ++++++++ net.c | 220 +++++++++++++++ net.h | 29 ++ 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/distro/yd.png | Bin 0 -> 2173 bytes pixmaps/distro/yellow-dog.gif | Bin 0 -> 342 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 | 123 ++++++++ serial.h | 19 ++ status.c | 68 +++++ status.h | 20 ++ usb.c | 216 ++++++++++++++ usb.h | 28 ++ v4l.c | 137 +++++++++ v4l.h | 16 ++ x11.c | 243 ++++++++++++++++ x11.h | 20 ++ 78 files changed, 5012 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 100755 genintl.pl create mode 100644 hardinfo.c create mode 100644 hardinfo.desktop 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 net.c create mode 100644 net.h create mode 100644 parport.c create mode 100644 parport.h create mode 100644 pci.c create mode 100644 pci.h create mode 100755 pixmaps/cd.png create mode 100755 pixmaps/cpu.png create mode 100755 pixmaps/distro/.xvpics/mdk.png create mode 100755 pixmaps/distro/cnc.png create mode 100755 pixmaps/distro/deb.png create mode 100755 pixmaps/distro/gnt.png create mode 100755 pixmaps/distro/mdk.png create mode 100755 pixmaps/distro/rh.png create mode 100755 pixmaps/distro/slk.png create mode 100755 pixmaps/distro/suse.png create mode 100755 pixmaps/distro/tl.png create mode 100755 pixmaps/distro/unk.png create mode 100755 pixmaps/distro/yd.png create mode 100755 pixmaps/distro/yellow-dog.gif create mode 100755 pixmaps/gen_connector.png create mode 100755 pixmaps/gen_connector.xpm create mode 100755 pixmaps/hdd.png create mode 100755 pixmaps/hdd.xpm create mode 100755 pixmaps/logo.png create mode 100755 pixmaps/lpr.png create mode 100755 pixmaps/media.png create mode 100755 pixmaps/mem.png create mode 100755 pixmaps/pci.png create mode 100755 pixmaps/pci.xpm create mode 100755 pixmaps/scan.png create mode 100755 pixmaps/scsi.png create mode 100755 pixmaps/scsi.xpm create mode 100755 pixmaps/stock-about-16.png create mode 100755 pixmaps/tape.png create mode 100755 pixmaps/usb.png create mode 100755 pixmaps/usb.xpm create mode 100755 pixmaps/v4l.png create mode 100755 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 status.c create mode 100644 status.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 00000000..b46ca90c --- /dev/null +++ b/ChangeLog @@ -0,0 +1,136 @@ +17/12/2003 10:50 BRST 0.3.6-pre4 + + * hardinfo.desktop, Makefile.in + - Added GNOME/KDE menu entry + (Thanks to Gustavo Noronha ) + * net.[ch] + - Preliminary network information support (disabled in + GUI). + +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 00000000..fa0aab7e --- /dev/null +++ b/Makefile.in @@ -0,0 +1,47 @@ +# ---------------------------------------------------------------------------- + +CC = gcc +CFLAGS = -Wall -g $(GTK_CFLAGS) -O6 + +# ---------------------------------------------------------------------------- + +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 status.o net.o + +all: $(OBJECTS) + $(CC) $(CFLAGS) -o hardinfo $(OBJECTS) $(GTK_LIBS) $(GTK_FLAGS) + +clean: + rm -rf *~ .xvpics pixmaps/.xvpics *.o hardinfo + +install: all + mkdir -p ${DESTDIR}/usr/bin/ + 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 ${DESTDIR}/usr/share/hardinfo + chmod -R -x ${DESTDIR}/usr/share/hardinfo + chmod 755 ${DESTDIR}/usr/share/hardinfo + chmod 755 ${DESTDIR}/usr/share/hardinfo/pixmaps + chmod 755 ${DESTDIR}/usr/share/hardinfo/lang + chmod 755 ${DESTDIR}/usr/share/hardinfo/pixmaps/distro + mkdir -p ${DESTDIR}/usr/share/applications + cp hardinfo.desktop ${DESTDIR}/usr/share/applications + +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 00000000..4e2f765e --- /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 00000000..0d7fae0e --- /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 00000000..a131b0d9 --- /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 00000000..dbcf73af --- /dev/null +++ b/computer.c @@ -0,0 +1,515 @@ +/* + * 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[128]; + 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 + +#ifndef PARSE_PROC_CPU +#error ARCH_i386 or ARCH_PPC not defined! Add support! Send me patches! +#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 00000000..60579689 --- /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 00000000..54011f14 --- /dev/null +++ b/configure @@ -0,0 +1,226 @@ +#!/usr/bin/env 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/genintl.pl b/genintl.pl new file mode 100755 index 00000000..0e19846c --- /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 00000000..e78cf7f5 --- /dev/null +++ b/hardinfo.c @@ -0,0 +1,623 @@ +/* + * 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" +#include "status.h" + +GenericDevice *generic_devices = NULL; + +void hi_show_device_info(GtkCTree * tree, GList * node, + gint column, gpointer user_data); +void hi_hide_device_info(GtkCTree * tree, GList * node, + gint column, gpointer user_data); +void hi_scan_all(MainWindow * mainwindow); + +void +main_window_refresh(GtkWidget * widget, gpointer data) +{ + MainWindow *mainwindow = (MainWindow *) data; + + if (!mainwindow) + return; + + hi_hide_device_info(NULL, NULL, 0, mainwindow); + + memory_update(mainwindow); + uptime_update(mainwindow); + net_update(mainwindow); + + hi_scan_all(mainwindow); +} + +static void +about_window_create(void) +{ + GtkAbout *about; + const gchar *authors[] = { + ">Written by:", + "Leandro Pereira (leandro@linuxmag.com.br)", + ">Disclaimer:", + "This is free software; you can modify and/or distribute it", + "under the terms of GNU GPL version 2. See http://www.fsf.org/", + "for more information.", + NULL + }; + + about = gtk_about_new("HardInfo", VERSION, + _("System information tool for Linux.\n"), + authors, IMG_PREFIX "logo.png"); + +} + +MainWindow * +main_window_create(void) +{ + GtkWidget *window, *mbox, *vbox, *frame, *ctree, *scroll; + GtkWidget *notebook, *label, *hbox, *btn, *hbbox; + MainWindow *mainwindow; + + mainwindow = g_new0(MainWindow, 1); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_container_set_border_width(GTK_CONTAINER(window), 4); + gtk_window_set_title(GTK_WINDOW(window), _("System Information")); + +#ifdef GTK2 + g_signal_connect(G_OBJECT(window), "delete-event", gtk_main_quit, NULL); +#else + gtk_signal_connect(GTK_OBJECT(window), "delete-event", + (GtkSignalFunc) gtk_main_quit, NULL); +#endif + + mbox = gtk_vbox_new(FALSE, 5); + gtk_widget_show(mbox); + gtk_container_add(GTK_CONTAINER(window), mbox); + + notebook = gtk_notebook_new(); + gtk_box_pack_start(GTK_BOX(mbox), notebook, TRUE, TRUE, 0); + + /* + * Computer tab + */ + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); + gtk_widget_show(vbox); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, + gtk_label_new(_("Computer"))); + +#ifdef GTK2 + label = gtk_label_new(_("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); + + /* + * 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); + +#if 0 + /* + * Network tab + */ + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); + gtk_widget_show(vbox); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, + gtk_label_new(_("Network"))); + +#ifdef GTK2 + label = gtk_label_new(_("Interfaces")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Interfaces")); +#endif + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), net_get_widget(mainwindow), + TRUE, TRUE, 0); + +#endif + /* + * Buttons + */ + + hbox = gtk_hbox_new(FALSE, 5); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(mbox), hbox, FALSE, FALSE, 0); + + hbbox = gtk_hbutton_box_new(); + gtk_container_set_border_width(GTK_CONTAINER(hbbox), 4); + gtk_widget_show(hbbox); + gtk_box_pack_start(GTK_BOX(hbox), hbbox, FALSE, FALSE, 0); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbbox), 6); + gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_START); + + btn = gtk_button_new_with_mnemonic(_("Abo_ut...")); +#ifdef GTK2 + g_signal_connect(G_OBJECT(btn), "clicked", + (GCallback) about_window_create, NULL); +#else + gtk_signal_connect(GTK_OBJECT(btn), "clicked", + (GtkSignalFunc) about_window_create, NULL); +#endif + gtk_widget_show(btn); + gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0); + + hbbox = gtk_hbutton_box_new(); + gtk_container_set_border_width(GTK_CONTAINER(hbbox), 4); + gtk_widget_show(hbbox); + gtk_box_pack_end(GTK_BOX(hbox), hbbox, FALSE, FALSE, 0); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbbox), 6); + gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_END); + +#if 0 + btn = gtk_button_new_with_label(_("About")); +#ifdef GTK2 + g_signal_connect(G_OBJECT(btn), "clicked", + (GCallback) about_window_create, NULL); +#else + gtk_signal_connect(GTK_OBJECT(btn), "clicked", + (GtkSignalFunc) about_window_create, NULL); +#endif + gtk_widget_show(btn); + gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0); +#endif + +#ifdef GTK2 + btn = gtk_button_new_from_stock(GTK_STOCK_REFRESH); + g_signal_connect(G_OBJECT(btn), "clicked", + (GCallback) main_window_refresh, mainwindow); +#else + btn = gtk_button_new_with_label(_("Refresh")); + gtk_signal_connect(GTK_OBJECT(btn), "clicked", + (GtkSignalFunc) main_window_refresh, mainwindow); +#endif + gtk_widget_show(btn); + gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0); + +#ifdef GTK2 + btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + g_signal_connect(G_OBJECT(btn), "clicked", gtk_main_quit, NULL); +#else + btn = gtk_button_new_with_label(_("Close")); + gtk_signal_connect(GTK_OBJECT(btn), "clicked", + (GtkSignalFunc) gtk_main_quit, NULL); +#endif + gtk_widget_show(btn); + gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0); + + + + gtk_widget_show_all(window); + gtk_widget_hide(frame); + + mainwindow->window = window; + mainwindow->ctree = ctree; + mainwindow->frame = frame; + + return mainwindow; +} + +static GdkColor +gdk_color_from_rgb(gint r, gint g, gint b) +{ + GdkColormap *cmap = NULL; + GdkColor color; + + if (!cmap) { + cmap = gdk_colormap_get_system(); + gdk_colormap_ref(cmap); + } + + color.red = r * 255; + color.green = g * 255; + color.blue = b * 255; + + gdk_color_alloc(cmap, &color); + gdk_colormap_unref(cmap); + + return color; +} + +GtkCTreeNode * +tree_group_new(MainWindow * mainwindow, const gchar * name, DeviceType type) +{ + GtkCTreeNode *node; + const gchar *text[] = { NULL, name, NULL }; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask = NULL; + GdkColor color; + GdkColormap *colormap = NULL; + + if (!name) + return NULL; + if (type == NONE) + return NULL; + if (!mainwindow) + return NULL; + + colormap = gtk_widget_get_colormap(mainwindow->window); + + switch (type) { + case PARPORT: + case SERIAL: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, gen_connector_xpm); + + break; + case V4L: + case PCI: + case ISAPnP: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, pci_xpm); + break; + case SCSI: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, scsi_xpm); + break; + case IDE: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, hdd_xpm); + break; + case USB: + pixmap = gdk_pixmap_colormap_create_from_xpm_d + (NULL, colormap, &mask, NULL, usb_xpm); + break; + default: + mask = pixmap = NULL; + break; + } + + node = gtk_ctree_insert_node(GTK_CTREE(mainwindow->ctree), + NULL, NULL, text, 0, pixmap, mask, pixmap, + mask, FALSE, TRUE); + + color = gdk_color_from_rgb(0xcc, 0xcc, 0xcc); + gtk_ctree_node_set_background(GTK_CTREE(mainwindow->ctree), + node, &color); + + gdk_pixmap_unref(pixmap); + gdk_bitmap_unref(mask); + + return node; +} + +void +tree_insert_item(MainWindow * mainwindow, GtkCTreeNode * group, gchar * name, + gpointer data) +{ + GtkCTreeNode *node; + gchar *text[] = { NULL, name, NULL }; + + if (!mainwindow) + return; + if (!name) + return; + if (!group) + return; + + node = gtk_ctree_insert_node(GTK_CTREE(mainwindow->ctree), + group, NULL, + text, 0, + NULL, NULL, NULL, NULL, FALSE, TRUE); + gtk_ctree_node_set_row_data(GTK_CTREE(mainwindow->ctree), node, data); +} + +void +hi_insert_generic(gpointer device, DeviceType type) +{ + GenericDevice *generic; + + generic = g_new0(GenericDevice, 1); + + generic->next = generic_devices; + generic_devices = generic; + + generic_devices->device = device; + generic_devices->type = type; +} + +void +hi_hide_device_info(GtkCTree * tree, GList * node, + gint column, gpointer user_data) +{ + MainWindow *mainwindow = (MainWindow *) user_data; + + gtk_widget_hide(mainwindow->frame); +} + +void +hi_show_device_info(GtkCTree * tree, GList * node, + gint column, gpointer user_data) +{ + GenericDevice *dev; + MainWindow *mainwindow = (MainWindow *) user_data; + + dev = (GenericDevice *) gtk_ctree_node_get_row_data + (GTK_CTREE(tree), GTK_CLIST(tree)->selection->data); + + if (!dev) + return; + +#define dev_info(type,name,func) \ + { \ + type *name; \ + name = (type *)dev->device; \ + func(mainwindow, name); \ + } \ + break; + + switch (dev->type) { + case PCI: + dev_info(PCIDevice, pci, hi_show_pci_info); + case ISAPnP: + dev_info(ISADevice, isa, hi_show_isa_info); + case USB: + dev_info(USBDevice, usb, hi_show_usb_info); + case SERIAL: + dev_info(SerialDevice, serial, hi_show_serial_info); + case PARPORT: + dev_info(ParportDevice, parport, hi_show_parport_info); + case IDE: + dev_info(IDEDevice, ide, hi_show_ide_info); + case SCSI: + dev_info(SCSIDevice, scsi, hi_show_scsi_info); + case V4L: + dev_info(V4LDevice, v4l, hi_show_v4l_info); + default: + g_print("Showing info of device type %d not implemented yet.\n", + dev->type); + return; + break; + } + + gtk_widget_show(mainwindow->frame); + +} + +void +hi_scan_all(MainWindow * mainwindow) +{ + myStatus *status; + PCIDevice *pci; + ISADevice *isa; + IDEDevice *ide; + SCSIDevice *scsi; + V4LDevice *v4l; + ParportDevice *pp; + SerialDevice *sd; + GtkCTreeNode *node; + GenericDevice *gd = generic_devices; + gchar *buf; + + status = my_status_new(_("Scanning Devices"), _("Scanning devices...")); + +#define DEVICE_SCAN(name,ptr,func) \ + ptr = func(); \ + buf = g_strdup_printf(_("Scanning %s devices..."), name); \ + my_status_set_text(status, buf); \ + g_free(buf); \ + my_status_pulse(status) + + DEVICE_SCAN("PCI", pci, hi_scan_pci); + DEVICE_SCAN("ISA PnP", isa, hi_scan_isapnp); + DEVICE_SCAN("IDE", ide, hi_scan_ide); + DEVICE_SCAN("SCSI", scsi, hi_scan_scsi); + DEVICE_SCAN("V4L", v4l, hi_scan_v4l); + DEVICE_SCAN("Parallel", pp, hi_scan_parport); + DEVICE_SCAN("Serial", sd, hi_scan_serial); + + gtk_clist_freeze(GTK_CLIST(mainwindow->ctree)); + + /* + * Free the generic_devices stuff and remove all device-related + * nodes. + */ + if (gd != NULL) { + for (; gd != NULL; gd = gd->next) { + g_free(gd->device); + gtk_ctree_remove_node(GTK_CTREE(mainwindow->ctree), + gd->node); + g_free(gd); + } + generic_devices = NULL; + } + +#define CHECK_INSERT(a,b,c,d) \ + if (a) { \ + node = tree_group_new(mainwindow, b, c); \ + for (; a != NULL; a = a->next) { \ + if (a->d) { \ + hi_insert_generic(a, c); \ + tree_insert_item(mainwindow, node, a->d, \ + generic_devices); \ + } \ + } \ + } + + CHECK_INSERT(pci, _("PCI Devices"), PCI, name); + CHECK_INSERT(isa, _("ISA PnP Devices"), ISAPnP, card); + + /* + * USB is different since it's Plug'n'Pray, so we have a + * routine just for it :) + */ + usb_update(mainwindow); + + CHECK_INSERT(ide, _("ATA/IDE Block Devices"), IDE, model); + CHECK_INSERT(scsi, _("SCSI Devices"), SCSI, model); + CHECK_INSERT(v4l, _("Video for Linux"), V4L, name); + CHECK_INSERT(sd, _("Communication Ports"), SERIAL, name); + CHECK_INSERT(pp, _("Parallel Ports"), PARPORT, name); + + gtk_clist_thaw(GTK_CLIST(mainwindow->ctree)); + + my_status_destroy(status); +} + +#if 0 +static void +usage(char *argv0) +{ + g_print("%s [--prefix ]\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.desktop b/hardinfo.desktop new file mode 100644 index 00000000..32895d6d --- /dev/null +++ b/hardinfo.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=System Information (hardinfo) +Name[pt_BR]=Informações do Sistema (hardinfo) +Comment=Information on your hardware devices +Comment[pt_BR]=Informações sobre seus dispositivos de hardware +Exec=hardinfo +Icon=/usr/share/hardinfo/pixmaps/logo.png +Terminal=false +MultipleArgs=false +Type=Application +StartupNotify=true +Categories=Application;System diff --git a/hardinfo.h b/hardinfo.h new file mode 100644 index 00000000..8ba587d0 --- /dev/null +++ b/hardinfo.h @@ -0,0 +1,86 @@ +#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; + + GtkWidget *recv_bytes; + GtkWidget *recv_errors; + GtkWidget *recv_packets; + + GtkWidget *trans_bytes; + GtkWidget *trans_errors; + GtkWidget *trans_packets; +}; + +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 "net.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 00000000..c24305ec --- /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<=16; 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 00000000..baf7b091 --- /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 00000000..e0817b51 --- /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 00000000..35684866 --- /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 00000000..39163349 --- /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 00000000..e6e283c9 --- /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 00000000..990137fc --- /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 00000000..990137fc --- /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 00000000..990137fc --- /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 00000000..990137fc --- /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 00000000..79511225 --- /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 00000000..990137fc --- /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 00000000..990137fc --- /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 00000000..990137fc --- /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 00000000..cc4c592c --- /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/net.c b/net.c new file mode 100644 index 00000000..1586d1c2 --- /dev/null +++ b/net.c @@ -0,0 +1,220 @@ +/* + * 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 netdevfs. + */ + +#include +#include "hardinfo.h" +#include "net.h" + +GtkWidget *net_get_widget(MainWindow * mainwindow) +{ + GtkWidget *vbox1; + GtkWidget *scrolledwindow1; + GtkWidget *clist1; + GtkWidget *label2; + GtkWidget *table1; + GtkWidget *label4; + GtkWidget *label5; + GtkWidget *label7; + GtkWidget *label8; + GtkWidget *label3; + GtkWidget *label10; + GtkWidget *label11; + GtkWidget *label12; + GtkWidget *label14; + GtkWidget *label15; + GtkWidget *vseparator1; + + vbox1 = gtk_vbox_new(FALSE, 5); + gtk_widget_show(vbox1); + gtk_container_set_border_width(GTK_CONTAINER(vbox1), 4); + + scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrolledwindow1); + gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow1), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + + clist1 = gtk_clist_new(2); + gtk_widget_show(clist1); + gtk_container_add(GTK_CONTAINER(scrolledwindow1), clist1); + gtk_clist_set_column_width(GTK_CLIST(clist1), 0, 30); + gtk_clist_set_column_width(GTK_CLIST(clist1), 1, 80); + gtk_clist_column_titles_show(GTK_CLIST(clist1)); + + label2 = gtk_label_new(_("Interface name")); + gtk_widget_show(label2); + gtk_clist_set_column_widget(GTK_CLIST(clist1), 1, label2); + gtk_label_set_justify(GTK_LABEL(label2), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label2), 0, 0.5); + + table1 = gtk_table_new(3, 5, FALSE); + gtk_widget_show(table1); + gtk_box_pack_start(GTK_BOX(vbox1), table1, FALSE, FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER(table1), 4); + gtk_table_set_row_spacings(GTK_TABLE(table1), 4); + gtk_table_set_col_spacings(GTK_TABLE(table1), 4); + + label4 = gtk_label_new(_("Bytes:")); + gtk_widget_show(label4); + gtk_table_attach(GTK_TABLE(table1), label4, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify(GTK_LABEL(label4), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label4), 0, 0.5); + + label5 = gtk_label_new(_("Speed:")); + gtk_widget_show(label5); + gtk_table_attach(GTK_TABLE(table1), label5, 0, 1, 2, 3, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify(GTK_LABEL(label5), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label5), 0, 0.5); + + label7 = gtk_label_new(_("Bytes:")); + gtk_widget_show(label7); + gtk_table_attach(GTK_TABLE(table1), label7, 3, 4, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify(GTK_LABEL(label7), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label7), 0, 0.5); + + label8 = gtk_label_new(_("Speed")); + gtk_widget_show(label8); + gtk_table_attach(GTK_TABLE(table1), label8, 3, 4, 2, 3, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify(GTK_LABEL(label8), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label8), 0, 0.5); + + label3 = gtk_label_new(_("Receive")); + gtk_widget_show(label3); + gtk_table_attach(GTK_TABLE(table1), label3, 0, 2, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_use_markup(GTK_LABEL(label3), TRUE); + gtk_label_set_justify(GTK_LABEL(label3), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label3), 0, 0.5); + + label10 = gtk_label_new(_("Transmit")); + gtk_widget_show(label10); + gtk_table_attach(GTK_TABLE(table1), label10, 3, 5, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_use_markup(GTK_LABEL(label10), TRUE); + gtk_label_set_justify(GTK_LABEL(label10), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label10), 0, 0.5); + + label11 = gtk_label_new(_("0B")); + gtk_widget_show(label11); + gtk_table_attach(GTK_TABLE(table1), label11, 1, 2, 1, 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify(GTK_LABEL(label11), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label11), 0, 0.5); + + label12 = gtk_label_new(_("0B/s")); + gtk_widget_show(label12); + gtk_table_attach(GTK_TABLE(table1), label12, 1, 2, 2, 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify(GTK_LABEL(label12), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label12), 0, 0.5); + + label14 = gtk_label_new(_("0B")); + gtk_widget_show(label14); + gtk_table_attach(GTK_TABLE(table1), label14, 4, 5, 1, 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify(GTK_LABEL(label14), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label14), 0, 0.5); + + label15 = gtk_label_new(_("0B/s")); + gtk_widget_show(label15); + gtk_table_attach(GTK_TABLE(table1), label15, 4, 5, 2, 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify(GTK_LABEL(label15), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label15), 0, 0.5); + + vseparator1 = gtk_vseparator_new(); + gtk_widget_show(vseparator1); + gtk_table_attach(GTK_TABLE(table1), vseparator1, 2, 3, 0, 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); + + + return vbox1; +} + +gboolean net_update(gpointer data) +{ + MainWindow *mainwindow = (MainWindow *) data; + NetDevice *net; + + if (!mainwindow) + return FALSE; + + net = hi_scan_net(); + + return TRUE; +} + +NetDevice *hi_scan_net(void) +{ + FILE *proc_net; + gchar buffer[256]; + NetDevice *net_dev, *net; + struct stat st; + + net = NULL; + + if (stat("/proc/net/dev", &st)) + return NULL; + + proc_net = fopen("/proc/net/dev", "r"); + while (fgets(buffer, 256, proc_net)) { + if (strchr(buffer, ':')) { + gint trash; + gchar ifacename[4]; + gchar *buf = buffer; + gint i; + + net_dev = g_new0(NetDevice, 1); + net_dev->next = net; + net = net_dev; + + buf = g_strstrip(buf); + + memset(ifacename, 0, 4); + + for (i = 0; buffer[i] != ':' && i < 4; i++) { + ifacename[i] = buffer[i]; + } + + walk_until_inclusive(':'); + + /* iface: bytes packets errs drop fifo frame compressed multicast */ + sscanf(buf, "%d %d %d %d %d %d %d %d %d %d %d", + &net_dev->recv_bytes, &net_dev->recv_packets, + &net_dev->recv_errors, &trash, &trash, &trash, &trash, + &trash, &net_dev->trans_bytes, &net_dev->trans_packets, + &net_dev->trans_errors); + + g_print("%s -> %d %d %d | %d %d %d\n", + ifacename, net_dev->recv_bytes, net_dev->recv_errors, + net_dev->recv_packets, net_dev->trans_bytes, + net_dev->trans_errors, net_dev->trans_packets); + + } + } + fclose(proc_net); + + return net; +} diff --git a/net.h b/net.h new file mode 100644 index 00000000..eeb0fa49 --- /dev/null +++ b/net.h @@ -0,0 +1,29 @@ +#ifndef __NET_H__ +#define __NET_H__ + +#include "hardinfo.h" + +typedef struct _NetDevice NetDevice; + +struct _NetDevice { + gchar *iface; + + guint recv_bytes; + guint recv_errors; + guint recv_packets; + + guint trans_bytes; + guint trans_errors; + guint trans_packets; + + NetDevice *next; +}; + + +NetDevice *hi_scan_net(void); +GtkWidget *net_get_widget(MainWindow *mainwindow); +void hi_show_net_info(MainWindow *mainwindow, NetDevice *device); + +gboolean net_update(gpointer data); + +#endif diff --git a/parport.c b/parport.c new file mode 100644 index 00000000..d27aca2b --- /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 00000000..1461a909 --- /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 00000000..026b46db --- /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[4] == ':'){ + gint bus, device, function, domain; + gpointer start, end; + + pci_dev = g_new0(PCIDevice, 1); + + pci_dev->next = pci; + pci = pci_dev; + + sscanf(buf, "%x:%x:%x.%d", &domain, &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 00000000..635443ff --- /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 100755 index 00000000..dd5d3341 Binary files /dev/null and b/pixmaps/cd.png differ diff --git a/pixmaps/cpu.png b/pixmaps/cpu.png new file mode 100755 index 00000000..da4f71d2 Binary files /dev/null and b/pixmaps/cpu.png differ diff --git a/pixmaps/distro/.xvpics/mdk.png b/pixmaps/distro/.xvpics/mdk.png new file mode 100755 index 00000000..84b3f79c Binary files /dev/null and b/pixmaps/distro/.xvpics/mdk.png differ diff --git a/pixmaps/distro/cnc.png b/pixmaps/distro/cnc.png new file mode 100755 index 00000000..3967c237 Binary files /dev/null and b/pixmaps/distro/cnc.png differ diff --git a/pixmaps/distro/deb.png b/pixmaps/distro/deb.png new file mode 100755 index 00000000..0ced3130 Binary files /dev/null and b/pixmaps/distro/deb.png differ diff --git a/pixmaps/distro/gnt.png b/pixmaps/distro/gnt.png new file mode 100755 index 00000000..bf4290a9 Binary files /dev/null and b/pixmaps/distro/gnt.png differ diff --git a/pixmaps/distro/mdk.png b/pixmaps/distro/mdk.png new file mode 100755 index 00000000..a997ea10 Binary files /dev/null and b/pixmaps/distro/mdk.png differ diff --git a/pixmaps/distro/rh.png b/pixmaps/distro/rh.png new file mode 100755 index 00000000..f612354b Binary files /dev/null and b/pixmaps/distro/rh.png differ diff --git a/pixmaps/distro/slk.png b/pixmaps/distro/slk.png new file mode 100755 index 00000000..fd6d3365 Binary files /dev/null and b/pixmaps/distro/slk.png differ diff --git a/pixmaps/distro/suse.png b/pixmaps/distro/suse.png new file mode 100755 index 00000000..0c7759a1 Binary files /dev/null and b/pixmaps/distro/suse.png differ diff --git a/pixmaps/distro/tl.png b/pixmaps/distro/tl.png new file mode 100755 index 00000000..353bddd2 Binary files /dev/null and b/pixmaps/distro/tl.png differ diff --git a/pixmaps/distro/unk.png b/pixmaps/distro/unk.png new file mode 100755 index 00000000..ed850e40 Binary files /dev/null and b/pixmaps/distro/unk.png differ diff --git a/pixmaps/distro/yd.png b/pixmaps/distro/yd.png new file mode 100755 index 00000000..ce002956 Binary files /dev/null and b/pixmaps/distro/yd.png differ diff --git a/pixmaps/distro/yellow-dog.gif b/pixmaps/distro/yellow-dog.gif new file mode 100755 index 00000000..cf143ce1 Binary files /dev/null and b/pixmaps/distro/yellow-dog.gif differ diff --git a/pixmaps/gen_connector.png b/pixmaps/gen_connector.png new file mode 100755 index 00000000..477e55ff Binary files /dev/null and b/pixmaps/gen_connector.png differ diff --git a/pixmaps/gen_connector.xpm b/pixmaps/gen_connector.xpm new file mode 100755 index 00000000..28aa0382 --- /dev/null +++ b/pixmaps/gen_connector.xpm @@ -0,0 +1,46 @@ +/* XPM */ +static char * gen_connector_xpm[] = { +"16 16 27 1", +" c None", +". c #000000", +"+ c #F0F0F0", +"@ c #FFFFFF", +"# c #EEEEEE", +"$ c #EBEBEB", +"% c #E4E4E4", +"& c #C5C5C5", +"* c #C9C9C9", +"= c #D2D2D2", +"- c #BABABA", +"; c #A1A1A1", +"> 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 100755 index 00000000..cc308f88 Binary files /dev/null and b/pixmaps/hdd.png differ diff --git a/pixmaps/hdd.xpm b/pixmaps/hdd.xpm new file mode 100755 index 00000000..7f1d54f7 --- /dev/null +++ b/pixmaps/hdd.xpm @@ -0,0 +1,138 @@ +/* XPM */ +static char * hdd_xpm[] = { +"16 16 119 2", +" c None", +". c #5A5A5A", +"+ c #626262", +"@ c #363636", +"# c #434343", +"$ c #686868", +"% c #6E6356", +"& c #A87B4A", +"* c #EBCAA5", +"= c #E3B88A", +"- c #AA9277", +"; c #7C746C", +"> 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 100755 index 00000000..e19c735a Binary files /dev/null and b/pixmaps/logo.png differ diff --git a/pixmaps/lpr.png b/pixmaps/lpr.png new file mode 100755 index 00000000..3ad6dc99 Binary files /dev/null and b/pixmaps/lpr.png differ diff --git a/pixmaps/media.png b/pixmaps/media.png new file mode 100755 index 00000000..cd061e66 Binary files /dev/null and b/pixmaps/media.png differ diff --git a/pixmaps/mem.png b/pixmaps/mem.png new file mode 100755 index 00000000..a852520b Binary files /dev/null and b/pixmaps/mem.png differ diff --git a/pixmaps/pci.png b/pixmaps/pci.png new file mode 100755 index 00000000..21905108 Binary files /dev/null and b/pixmaps/pci.png differ diff --git a/pixmaps/pci.xpm b/pixmaps/pci.xpm new file mode 100755 index 00000000..3e6f936a --- /dev/null +++ b/pixmaps/pci.xpm @@ -0,0 +1,136 @@ +/* XPM */ +static char * pci_xpm[] = { +"16 16 111 2", +" c None", +". c #030303", +"+ c #D6DDD0", +"@ c #A5B393", +"# c #95B882", +"$ c #B8CAB0", +"% c #A9BEA2", +"& c #809A75", +"* c #93AB88", +"= c #ACBEA4", +"- c #3C5234", +"; c #3F5A32", +"> 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 100755 index 00000000..8074cea6 Binary files /dev/null and b/pixmaps/scan.png differ diff --git a/pixmaps/scsi.png b/pixmaps/scsi.png new file mode 100755 index 00000000..23dd73fd Binary files /dev/null and b/pixmaps/scsi.png differ diff --git a/pixmaps/scsi.xpm b/pixmaps/scsi.xpm new file mode 100755 index 00000000..402906f0 --- /dev/null +++ b/pixmaps/scsi.xpm @@ -0,0 +1,79 @@ +/* XPM */ +static char * scsi_xpm[] = { +"16 16 60 1", +" g None", +". g #696969", +"+ g #B4B4B4", +"@ g #B1B1B1", +"# g #6D6D6D", +"$ g #B2B2B2", +"% g #ADADAD", +"& g #A5A5A5", +"* g #5E5E5E", +"= g #B0B0B0", +"- g #A3A3A3", +"; g #595959", +"> 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 100755 index 00000000..d66bfd7b Binary files /dev/null and b/pixmaps/stock-about-16.png differ diff --git a/pixmaps/tape.png b/pixmaps/tape.png new file mode 100755 index 00000000..90b2e297 Binary files /dev/null and b/pixmaps/tape.png differ diff --git a/pixmaps/usb.png b/pixmaps/usb.png new file mode 100755 index 00000000..a662ce55 Binary files /dev/null and b/pixmaps/usb.png differ diff --git a/pixmaps/usb.xpm b/pixmaps/usb.xpm new file mode 100755 index 00000000..476432fd --- /dev/null +++ b/pixmaps/usb.xpm @@ -0,0 +1,49 @@ +/* XPM */ +static char * usb_xpm[] = { +"16 16 30 1", +" c None", +". c #929292", +"+ c #464646", +"@ c #313131", +"# c #353535", +"$ c #424242", +"% c #000000", +"& c #2E2E2E", +"* c #878787", +"= c #272727", +"- c #242424", +"; c #717171", +"> 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 100755 index 00000000..88801a39 Binary files /dev/null and b/pixmaps/v4l.png differ diff --git a/pixmaps/x11.png b/pixmaps/x11.png new file mode 100755 index 00000000..49924ba2 Binary files /dev/null and b/pixmaps/x11.png differ diff --git a/scsi.c b/scsi.c new file mode 100644 index 00000000..c5d19472 --- /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 00000000..430d9e76 --- /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 00000000..0de96982 --- /dev/null +++ b/serial.c @@ -0,0 +1,123 @@ +/* + * 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 "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 00000000..e2d3e5e8 --- /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/status.c b/status.c new file mode 100644 index 00000000..0d3be0f3 --- /dev/null +++ b/status.c @@ -0,0 +1,68 @@ +#include "status.h" + +myStatus *my_status_new(gchar *title, gchar *text) +{ + GtkWidget *window, *label, *hbox, *img, *vbox, *progress; + myStatus *status; + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window), title); + gtk_container_set_border_width(GTK_CONTAINER(window), 15); + gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_widget_show(hbox); + gtk_container_add(GTK_CONTAINER(window), hbox); + + img = gtk_image_new_from_file(IMG_PREFIX "logo.png"); + gtk_widget_show(img); + gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); + gtk_widget_set_usize(GTK_WIDGET(img), 96, 64); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + + label = gtk_label_new(text); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + + progress = gtk_progress_bar_new(); + gtk_widget_show(progress); + gtk_box_pack_start(GTK_BOX(vbox), progress, TRUE, FALSE, 0); + + gtk_widget_show(window); + + status = g_new0(myStatus, 1); + status->window = window; + status->label = label; + status->progress = progress; + + return status; +} + +void my_status_pulse(myStatus *status) +{ + gtk_progress_bar_pulse(GTK_PROGRESS_BAR(status->progress)); + + while (gtk_events_pending()) + gtk_main_iteration(); +} + +void my_status_destroy(myStatus *status) +{ + gtk_widget_destroy(status->window); + g_free(status); + status = NULL; +} + +void my_status_set_text(myStatus *status, gchar *text) +{ + gtk_label_set_markup(GTK_LABEL(status->label), text); + + while (gtk_events_pending()) + gtk_main_iteration(); +} + diff --git a/status.h b/status.h new file mode 100644 index 00000000..f3cfa91e --- /dev/null +++ b/status.h @@ -0,0 +1,20 @@ +#ifndef __STATUS_H__ +#define __STATUS_H__ + +#include +#include "hardinfo.h" + +typedef struct _myStatus myStatus; + +struct _myStatus { + GtkWidget *window; + GtkWidget *label; + GtkWidget *progress; +}; + +myStatus *my_status_new(gchar *title, gchar *text); +void my_status_pulse(myStatus *status); +void my_status_destroy(myStatus *status); +void my_status_set_text(myStatus *status, gchar *text); + +#endif /* __STATUS_H__ */ diff --git a/usb.c b/usb.c new file mode 100644 index 00000000..e69c6d84 --- /dev/null +++ b/usb.c @@ -0,0 +1,216 @@ +/* + * 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 "usb.h" + +gboolean usb_update(gpointer data) +{ + MainWindow *mainwindow = (MainWindow*)data; + GtkCTreeNode *node; + USBDevice *usb; + + if(!mainwindow) return FALSE; + + 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)); + + 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 00000000..f761b5c4 --- /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 00000000..6ce5aa02 --- /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 00000000..499dfca3 --- /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 00000000..c902aeed --- /dev/null +++ b/x11.c @@ -0,0 +1,243 @@ +/* + * 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 */ + 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 00000000..6800ea7d --- /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 -- cgit v1.2.3