aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog149
-rw-r--r--Makefile81
-rw-r--r--Makefile.in71
-rw-r--r--README8
-rw-r--r--about.c90
-rw-r--r--about.h16
-rw-r--r--arch/common/blowfish.h64
-rw-r--r--arch/common/display.h137
-rw-r--r--arch/common/fib.h50
-rw-r--r--arch/common/languages.h102
-rw-r--r--arch/common/md5.h62
-rw-r--r--arch/common/printers.h67
-rw-r--r--arch/common/sha1.h61
-rw-r--r--arch/common/zlib.h85
-rw-r--r--arch/linux/common/alsa.h69
-rw-r--r--arch/linux/common/filesystem.h103
-rw-r--r--arch/linux/common/inputdevices.h117
-rw-r--r--arch/linux/common/loadavg.h47
-rw-r--r--arch/linux/common/memory.h56
-rw-r--r--arch/linux/common/modules.h129
-rw-r--r--arch/linux/common/net.h203
-rw-r--r--arch/linux/common/os.h203
-rw-r--r--arch/linux/common/pci.h190
-rw-r--r--arch/linux/common/samba.h80
-rw-r--r--arch/linux/common/sensors.h237
-rw-r--r--arch/linux/common/storage.h268
-rw-r--r--arch/linux/common/uptime.h75
-rw-r--r--arch/linux/common/usb.h132
l---------arch/linux/m68k/alsa.h1
l---------arch/linux/m68k/filesystem.h1
l---------arch/linux/m68k/inputdevices.h1
l---------arch/linux/m68k/loadavg.h1
l---------arch/linux/m68k/memory.h1
l---------arch/linux/m68k/modules.h1
l---------arch/linux/m68k/net.h1
l---------arch/linux/m68k/os.h1
l---------arch/linux/m68k/pci.h1
-rw-r--r--arch/linux/m68k/processor.h74
l---------arch/linux/m68k/samba.h1
l---------arch/linux/m68k/sensors.h1
l---------arch/linux/m68k/storage.h1
l---------arch/linux/m68k/uptime.h1
l---------arch/linux/m68k/usb.h1
l---------arch/linux/mips/alsa.h1
l---------arch/linux/mips/filesystem.h1
l---------arch/linux/mips/inputdevices.h1
l---------arch/linux/mips/loadavg.h1
l---------arch/linux/mips/memory.h1
l---------arch/linux/mips/modules.h1
l---------arch/linux/mips/net.h1
l---------arch/linux/mips/os.h1
l---------arch/linux/mips/pci.h1
-rw-r--r--arch/linux/mips/processor.h70
l---------arch/linux/mips/samba.h1
l---------arch/linux/mips/sensors.h1
l---------arch/linux/mips/storage.h1
l---------arch/linux/mips/uptime.h1
l---------arch/linux/mips/usb.h1
l---------arch/linux/parisc/alsa.h1
l---------arch/linux/parisc/filesystem.h1
l---------arch/linux/parisc/inputdevices.h1
l---------arch/linux/parisc/loadavg.h1
l---------arch/linux/parisc/memory.h1
l---------arch/linux/parisc/modules.h1
l---------arch/linux/parisc/net.h1
l---------arch/linux/parisc/os.h1
l---------arch/linux/parisc/pci.h1
-rw-r--r--arch/linux/parisc/processor.h82
l---------arch/linux/parisc/samba.h1
l---------arch/linux/parisc/sensors.h1
l---------arch/linux/parisc/storage.h1
l---------arch/linux/parisc/uptime.h1
l---------arch/linux/parisc/usb.h1
l---------arch/linux/ppc/alsa.h1
l---------arch/linux/ppc/filesystem.h1
l---------arch/linux/ppc/inputdevices.h1
l---------arch/linux/ppc/loadavg.h1
l---------arch/linux/ppc/memory.h1
l---------arch/linux/ppc/modules.h1
l---------arch/linux/ppc/net.h1
l---------arch/linux/ppc/os.h1
l---------arch/linux/ppc/pci.h1
-rw-r--r--arch/linux/ppc/processor.h78
l---------arch/linux/ppc/samba.h1
l---------arch/linux/ppc/sensors.h1
l---------arch/linux/ppc/storage.h1
l---------arch/linux/ppc/uptime.h1
l---------arch/linux/ppc/usb.h1
l---------arch/linux/sparc/alsa.h1
l---------arch/linux/sparc/filesystem.h1
l---------arch/linux/sparc/inputdevices.h1
l---------arch/linux/sparc/loadavg.h1
l---------arch/linux/sparc/memory.h1
l---------arch/linux/sparc/modules.h1
l---------arch/linux/sparc/net.h1
l---------arch/linux/sparc/os.h1
l---------arch/linux/sparc/pci.h1
-rw-r--r--arch/linux/sparc/processor.h59
l---------arch/linux/sparc/samba.h1
l---------arch/linux/sparc/sensors.h1
l---------arch/linux/sparc/storage.h1
l---------arch/linux/sparc/uptime.h1
l---------arch/linux/sparc/usb.h1
l---------arch/linux/x86/alsa.h1
l---------arch/linux/x86/filesystem.h1
l---------arch/linux/x86/inputdevices.h1
l---------arch/linux/x86/loadavg.h1
l---------arch/linux/x86/memory.h1
l---------arch/linux/x86/modules.h1
l---------arch/linux/x86/net.h1
l---------arch/linux/x86/os.h1
l---------arch/linux/x86/pci.h1
-rw-r--r--arch/linux/x86/processor.h303
l---------arch/linux/x86/samba.h1
l---------arch/linux/x86/sensors.h1
l---------arch/linux/x86/storage.h1
l---------arch/linux/x86/uptime.h1
l---------arch/linux/x86/usb.h1
l---------arch/linux/x86_641
-rw-r--r--benchmark.c163
-rw-r--r--benchmark.conf38
-rw-r--r--benchmark.databin0 -> 65536 bytes
-rw-r--r--blowfish.c451
-rw-r--r--blowfish.h33
-rw-r--r--build-stamp0
-rw-r--r--callbacks.c81
-rw-r--r--callbacks.h29
-rw-r--r--computer.c874
-rw-r--r--computer.h182
-rw-r--r--config.h13
-rwxr-xr-xconfigure93
-rw-r--r--configure-stamp0
-rw-r--r--debian/changelog6
-rwxr-xr-xdebian/rules2
-rw-r--r--default.lang148
-rw-r--r--details.c282
-rw-r--r--details.h40
-rw-r--r--devices.c193
-rw-r--r--expr.c242
-rw-r--r--expr.h48
-rwxr-xr-xgenintl.pl80
-rw-r--r--hardinfo.c595
-rw-r--r--hardinfo.desktop12
-rw-r--r--hardinfo.h109
-rw-r--r--iconcache.c80
-rw-r--r--iconcache.h30
-rw-r--r--ide.c140
-rw-r--r--ide.h20
-rw-r--r--intl.c113
-rw-r--r--intl.h11
-rw-r--r--isapnp.c94
-rw-r--r--isapnp.h20
l---------lang/es_CO.lang1
l---------lang/es_DO.lang1
l---------lang/es_ES.lang1
l---------lang/es_GT.lang1
-rw-r--r--lang/es_MX.ISO-8859-1.lang117
l---------lang/es_MX.lang1
l---------lang/es_PR.lang1
l---------lang/es_US.lang1
-rw-r--r--lang/pt_BR.lang117
-rw-r--r--loadgraph.c266
-rw-r--r--loadgraph.h61
-rw-r--r--md5.c318
-rw-r--r--md5.h26
-rw-r--r--menu.c125
-rw-r--r--menu.h25
-rw-r--r--modules.c137
-rw-r--r--modules.conf7
-rw-r--r--modules.h21
-rw-r--r--net.c105
-rw-r--r--net.h29
-rw-r--r--parport.c170
-rw-r--r--parport.h30
-rw-r--r--pci.c274
-rw-r--r--pci.h32
-rw-r--r--pixmaps/2computer.pngbin0 -> 988 bytes
-rw-r--r--pixmaps/athlon.pngbin0 -> 836 bytes
-rw-r--r--pixmaps/audio.pngbin0 -> 1414 bytes
-rw-r--r--pixmaps/benchmark.pngbin0 -> 946 bytes
-rw-r--r--pixmaps/blowfish.pngbin0 -> 1518 bytes
-rw-r--r--pixmaps/cd.pngbin2904 -> 0 bytes
-rw-r--r--pixmaps/cdrom.pngbin0 -> 1235 bytes
-rw-r--r--pixmaps/compress.pngbin0 -> 689 bytes
-rw-r--r--pixmaps/computer.pngbin0 -> 937 bytes
-rwxr-xr-xpixmaps/cpu.pngbin2753 -> 0 bytes
-rw-r--r--pixmaps/dev_removable.pngbin0 -> 815 bytes
-rw-r--r--pixmaps/devices.pngbin0 -> 1005 bytes
-rwxr-xr-xpixmaps/distro/cnc.pngbin4379 -> 0 bytes
-rwxr-xr-xpixmaps/distro/deb.pngbin1718 -> 0 bytes
-rwxr-xr-xpixmaps/distro/gnt.pngbin3470 -> 0 bytes
-rwxr-xr-xpixmaps/distro/mdk.pngbin4648 -> 0 bytes
-rwxr-xr-xpixmaps/distro/rh.pngbin3199 -> 0 bytes
-rwxr-xr-xpixmaps/distro/slk.pngbin2054 -> 0 bytes
-rwxr-xr-xpixmaps/distro/suse.pngbin988 -> 0 bytes
-rwxr-xr-xpixmaps/distro/tl.pngbin731 -> 0 bytes
-rwxr-xr-xpixmaps/distro/unk.pngbin2945 -> 0 bytes
-rwxr-xr-xpixmaps/distro/yd.pngbin3189 -> 0 bytes
-rwxr-xr-xpixmaps/distro/yellow-dog.gifbin342 -> 0 bytes
-rwxr-xr-xpixmaps/gen_connector.pngbin1820 -> 0 bytes
-rwxr-xr-xpixmaps/gen_connector.xpm46
-rw-r--r--pixmaps/gnome-dev-removable-usb.pngbin0 -> 966 bytes
-rw-r--r--pixmaps/gnome-devel.pngbin0 -> 959 bytes
-rw-r--r--pixmaps/gnome-terminal.pngbin0 -> 1077 bytes
-rw-r--r--pixmaps/gnome-window-manager.pngbin0 -> 550 bytes
-rw-r--r--pixmaps/graphics.pngbin0 -> 1499 bytes
-rw-r--r--pixmaps/hdd.pngbin992 -> 793 bytes
-rwxr-xr-xpixmaps/hdd.xpm138
-rw-r--r--pixmaps/joystick.pngbin0 -> 754 bytes
-rw-r--r--pixmaps/kblayout.pngbin0 -> 899 bytes
-rw-r--r--pixmaps/keyboard.pngbin0 -> 1164 bytes
-rw-r--r--pixmaps/language.pngbin0 -> 1145 bytes
-rw-r--r--[-rwxr-xr-x]pixmaps/logo.pngbin3182 -> 3182 bytes
-rw-r--r--pixmaps/logo.xpm349
-rw-r--r--pixmaps/lpr.pngbin2143 -> 0 bytes
-rwxr-xr-xpixmaps/media.pngbin3113 -> 0 bytes
-rwxr-xr-xpixmaps/mem.pngbin2792 -> 0 bytes
-rw-r--r--pixmaps/memory.pngbin0 -> 1044 bytes
-rw-r--r--pixmaps/modem.pngbin0 -> 1669 bytes
-rw-r--r--pixmaps/module.pngbin2995 -> 1049 bytes
-rw-r--r--pixmaps/monitor.pngbin0 -> 981 bytes
-rw-r--r--pixmaps/mouse.pngbin0 -> 922 bytes
-rw-r--r--pixmaps/network.pngbin0 -> 739 bytes
-rw-r--r--pixmaps/os.pngbin0 -> 1094 bytes
-rwxr-xr-xpixmaps/pci.pngbin3797 -> 0 bytes
-rwxr-xr-xpixmaps/pci.xpm136
-rw-r--r--pixmaps/pcmcia.pngbin0 -> 873 bytes
-rw-r--r--pixmaps/printer.pngbin0 -> 1015 bytes
-rw-r--r--pixmaps/processor.pngbin0 -> 1409 bytes
-rw-r--r--pixmaps/processor.xpm116
-rw-r--r--pixmaps/report.pngbin0 -> 853 bytes
-rw-r--r--pixmaps/scanner.pngbin2426 -> 0 bytes
-rwxr-xr-xpixmaps/scsi.pngbin647 -> 0 bytes
-rwxr-xr-xpixmaps/scsi.xpm79
-rw-r--r--pixmaps/shares.pngbin0 -> 990 bytes
-rwxr-xr-xpixmaps/stock-about-16.pngbin320 -> 0 bytes
-rw-r--r--pixmaps/stock_channel.pngbin0 -> 1156 bytes
-rw-r--r--pixmaps/stock_insert-floating-frame.pngbin0 -> 321 bytes
-rw-r--r--pixmaps/stock_landline-phone.pngbin0 -> 1488 bytes
-rw-r--r--pixmaps/stock_macro-watch-variable.pngbin0 -> 543 bytes
-rw-r--r--pixmaps/summary.png (renamed from pixmaps/stock-details.png)bin966 -> 966 bytes
-rwxr-xr-xpixmaps/tape.pngbin1013 -> 0 bytes
-rw-r--r--pixmaps/therm.pngbin0 -> 954 bytes
-rw-r--r--[-rwxr-xr-x]pixmaps/usb.pngbin2925 -> 936 bytes
-rwxr-xr-xpixmaps/usb.xpm49
-rw-r--r--pixmaps/users.pngbin0 -> 1499 bytes
-rwxr-xr-xpixmaps/v4l.pngbin3133 -> 0 bytes
-rw-r--r--pixmaps/videocap.pngbin0 -> 1724 bytes
-rwxr-xr-xpixmaps/x11.pngbin1061 -> 0 bytes
-rw-r--r--report.c461
-rw-r--r--report.h48
-rw-r--r--scsi.c145
-rw-r--r--scsi.h23
-rw-r--r--serial.c80
-rw-r--r--serial.h19
-rw-r--r--sha1.c340
-rw-r--r--sha1.h21
-rw-r--r--shell.c1078
-rw-r--r--shell.h142
-rw-r--r--status.c69
-rw-r--r--status.h20
-rw-r--r--stock.c124
-rw-r--r--stock.h36
-rw-r--r--uidefs.xml29
-rw-r--r--usb.c259
-rw-r--r--usb.h28
-rw-r--r--util.c64
-rw-r--r--v4l.c96
-rw-r--r--v4l.h16
-rw-r--r--x11.c221
-rw-r--r--x11.h20
271 files changed, 8375 insertions, 5669 deletions
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index bb1d7140..00000000
--- a/ChangeLog
+++ /dev/null
@@ -1,149 +0,0 @@
-06/01/2003 12:05 BRST <leandro@linuxmag.com.br> 0.3.7-pre1
-
- * details.[ch]
- Use a window to show details instead of showing them inside the
- main window
- * computer.c, hardinfo.[ch]
- Show more processor information (currently x86 only)
- * modules.[ch], hardinfo.[ch]
- Loaded kernel modules information
-
-05/01/2003 12:05 BRST <leandro@linuxmag.com.br> 0.3.6
-
- * 0.3.6 released
-
-17/12/2003 10:50 BRST <leandro@linuxmag.com.br> 0.3.6-pre4
-
- * hardinfo.desktop, Makefile.in
- - Added GNOME/KDE menu entry
- (Thanks to Gustavo Noronha <kov@debian.org>)
- * net.[ch]
- - Preliminary network information support (disabled in GUI).
-
-03/07/2003 13:25 BRST <leandro@linuxmag.com.br> 0.3.6-pre3
-
- * v4l.[ch], hardinfo.[ch], pixmaps/v4l.png
- - Added Video 4 Linux support
-
-02/07/2003 20:51 BRST <leandro@linuxmag.com.br> 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 <leandro@linuxmag.com.br> 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 <phrozensmoke@yahoo.com>)
-
- * pixmaps/usb.png
- - Changed USB icon a little bit.
-
-23/06/2003 15:50 BRST <leandro@linuxmag.com.br> 0.3.5
-
- * intl.c
- - Improved error checking.
- - Fixed segfault.
- (Patch from Sameh Attia <sameh.attia@tedata.net>)
-
- * configure
- - Added option to disable i18n (--disable-nls).
-
-22/06/2003 21:52 BRST <leandro@linuxmag.com.br> 0.3.4
-
- * 0.3.4 released!
-
-19/06/2003 21:42 BRST <leandro@linuxmag.com.br> 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 <leandro@linuxmag.com.br> 0.3.4-pre1
-
- * hardinfo.h
- - Fixed segfault on startup.
- (Patch from Thomas Zajic <zlatko@gmx.at>)
-
- * 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 <leandro@linuxmag.com.br> 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 <leandro@linuxmag.com.br> 0.3.2
-
- * configure, Makefile.in, hardinfo.c, pci.c
- - Some cleanups.
-
-16/06/2003 17:41 BRST <leandro@linuxmag.com.br> 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 <leandro@linuxmag.com.br> 0.3.2-pre1
-
- * hardinfo.c
- - SCSI support added.
- (Patch from Pascal F.Martin <pascalmartin@earthlink.net>)
- - 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 <leandro@linuxmag.com.br> 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 b/Makefile
index f82f61a5..b8d8ea19 100644
--- a/Makefile
+++ b/Makefile
@@ -1,45 +1,46 @@
-TARGET = GTK2
-GTK_LIBS = -L/usr/X11R6/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -lXrandr -lXi -lXinerama -lXext -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXcursor -lpango-1.0 -lcairo -lXrender -lX11 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0
-GTK_CFLAGS = -DXTHREADS -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/X11R6/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-PACKAGE = hardinfo-0.3.7pre
-# ----------------------------------------------------------------------------
+GTK_LIBS = -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXfixes -lpango-1.0 -lcairo -lX11 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0
+GTK_CFLAGS = -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
+GLADE_LIBS =
+GLADE_CFLAGS =
+PACKAGE = hardinfo-0.4
+ARCHOPTS =
-CC = gcc
-CFLAGS = -Wall -g $(GTK_CFLAGS) -O6
+CC = gcc -fPIC -pipe -O3 $(ARCHOPTS)
+CCSLOW = gcc -fPIC -pipe -O0
+CFLAGS = -Wall -g $(GTK_CFLAGS) $(GLADE_CFLAGS) -I.
# ----------------------------------------------------------------------------
-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 stock.o \
- details.o modules.o
+OBJECTS = hardinfo.o shell.o util.o iconcache.o loadgraph.o sha1.o md5.o \
+ menu.o stock.o callbacks.o expr.o report.o blowfish.o
+MODULES = computer.so devices.so benchmark.so
-all: $(OBJECTS)
- $(CC) $(CFLAGS) -o hardinfo $(OBJECTS) $(GTK_LIBS) $(GTK_FLAGS)
+all: $(OBJECTS) $(MODULES)
+ $(CC) $(CFLAGS) -o hardinfo -Wl,-export-dynamic $(OBJECTS) $(GTK_LIBS) $(GTK_FLAGS) \
+ $(GLADE_LIBS) $(GLADE_FLAGS)
-clean:
- rm -rf *~ .xvpics pixmaps/.xvpics *.o hardinfo
+md5.o:
+ $(CCSLOW) $(CFLAGS) -c md5.c -o $@
-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
- cp -rv pixmaps/logo.xpm ${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
+blowfish.o:
+ $(CCSLOW) $(CFLAGS) -c blowfish.c -o $@
+
+sha1.o:
+ $(CCSLOW) $(CFLAGS) -c sha1.c -o $@
+
+%.so: %.c
+ @echo "--- Module: $< ($@)"
+ $(CC) $(CFLAGS) -o $@ -shared $< $(GTK_FLAGS) $(GTK_LIBS) \
+ $(GLADE_LIBS) $(GLADE_FLAGS)
+ mv $@ modules
+
+clean:
+ rm -rf .xvpics pixmaps/.xvpics *.o *.so hardinfo modules/*.so report
+ find . -name \*~ -exec rm -v {} \;
+ find . -name x86 -type l -exec rm -v {} \;
dist-clean: clean
- rm -rf Makefile debian/hardinfo/ config.h
+ rm -rf Makefile debian/hardinfo/ config.h arch/this
package: dist-clean
@echo "Creating tar.gz..."
@@ -51,3 +52,17 @@ deb: dist-clean
@echo "Creating deb..."
dpkg-buildpackage -rfakeroot -k${USER}
+install: all
+ mkdir -p ${DESTDIR}/usr/bin
+ cp hardinfo ${DESTDIR}/usr/bin/hardinfo
+ mkdir -p ${DESTDIR}/usr/share/hardinfo/modules
+ cp -rv modules/*.so ${DESTDIR}/usr/share/hardinfo/modules
+ mkdir -p ${DESTDIR}/usr/share/hardinfo/pixmaps
+ cp -rv pixmaps/* ${DESTDIR}/usr/share/hardinfo/pixmaps
+ cp uidefs.xml ${DESTDIR}/usr/share/hardinfo
+ cp modules.conf ${DESTDIR}/usr/share/hardinfo
+ cp benchmark.conf ${DESTDIR}/usr/share/hardinfo
+ cp benchmark.data ${DESTDIR}/usr/share/hardinfo
+ chmod -R 755 ${DESTDIR}/usr/share/hardinfo
+ chmod 755 ${DESTDIR}/usr/bin/hardinfo
+
diff --git a/Makefile.in b/Makefile.in
index 29014b89..c4ac1fa1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,41 +1,40 @@
-# ----------------------------------------------------------------------------
-CC = gcc
-CFLAGS = -Wall -g $(GTK_CFLAGS) -O6
+CC = gcc -fPIC -pipe -O3 $(ARCHOPTS)
+CCSLOW = gcc -fPIC -pipe -O0
+CFLAGS = -Wall -g $(GTK_CFLAGS) $(GLADE_CFLAGS) -I.
# ----------------------------------------------------------------------------
-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 stock.o \
- details.o modules.o
+OBJECTS = hardinfo.o shell.o util.o iconcache.o loadgraph.o sha1.o md5.o \
+ menu.o stock.o callbacks.o expr.o report.o blowfish.o
+MODULES = computer.so devices.so benchmark.so
-all: $(OBJECTS)
- $(CC) $(CFLAGS) -o hardinfo $(OBJECTS) $(GTK_LIBS) $(GTK_FLAGS)
+all: $(OBJECTS) $(MODULES)
+ $(CC) $(CFLAGS) -o hardinfo -Wl,-export-dynamic $(OBJECTS) $(GTK_LIBS) $(GTK_FLAGS) \
+ $(GLADE_LIBS) $(GLADE_FLAGS)
-clean:
- rm -rf *~ .xvpics pixmaps/.xvpics *.o hardinfo
+md5.o:
+ $(CCSLOW) $(CFLAGS) -c md5.c -o $@
-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
- cp -rv pixmaps/logo.xpm ${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
+blowfish.o:
+ $(CCSLOW) $(CFLAGS) -c blowfish.c -o $@
+
+sha1.o:
+ $(CCSLOW) $(CFLAGS) -c sha1.c -o $@
+
+%.so: %.c
+ @echo "--- Module: $< ($@)"
+ $(CC) $(CFLAGS) -o $@ -shared $< $(GTK_FLAGS) $(GTK_LIBS) \
+ $(GLADE_LIBS) $(GLADE_FLAGS)
+ mv $@ modules
+
+clean:
+ rm -rf .xvpics pixmaps/.xvpics *.o *.so hardinfo modules/*.so report
+ find . -name \*~ -exec rm -v {} \;
+ find . -name x86 -type l -exec rm -v {} \;
dist-clean: clean
- rm -rf Makefile debian/hardinfo/ config.h
+ rm -rf Makefile debian/hardinfo/ config.h arch/this
package: dist-clean
@echo "Creating tar.gz..."
@@ -47,3 +46,17 @@ deb: dist-clean
@echo "Creating deb..."
dpkg-buildpackage -rfakeroot -k${USER}
+install: all
+ mkdir -p ${DESTDIR}/usr/bin
+ cp hardinfo ${DESTDIR}/usr/bin/hardinfo
+ mkdir -p ${DESTDIR}/usr/share/hardinfo/modules
+ cp -rv modules/*.so ${DESTDIR}/usr/share/hardinfo/modules
+ mkdir -p ${DESTDIR}/usr/share/hardinfo/pixmaps
+ cp -rv pixmaps/* ${DESTDIR}/usr/share/hardinfo/pixmaps
+ cp uidefs.xml ${DESTDIR}/usr/share/hardinfo
+ cp modules.conf ${DESTDIR}/usr/share/hardinfo
+ cp benchmark.conf ${DESTDIR}/usr/share/hardinfo
+ cp benchmark.data ${DESTDIR}/usr/share/hardinfo
+ chmod -R 755 ${DESTDIR}/usr/share/hardinfo
+ chmod 755 ${DESTDIR}/usr/bin/hardinfo
+
diff --git a/README b/README
deleted file mode 100644
index 4e2f765e..00000000
--- a/README
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-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
deleted file mode 100644
index 982c9753..00000000
--- a/about.c
+++ /dev/null
@@ -1,90 +0,0 @@
-#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)
-{
- GtkWidget *img;
- 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;
-
- gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
-
- vbox = gtk_vbox_new(FALSE, 5);
- gtk_box_set_spacing(GTK_BOX(vbox), 3);
- gtk_container_add(GTK_CONTAINER(window), vbox);
-
- 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);
-
-#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);
-
- buf =
- g_strdup_printf
- ("<span size=\"xx-large\" weight=\"bold\">%s %s</span>", name,
- version);
- ADD_LABEL(buf, vbox);
- g_free(buf);
-
- ADD_LABEL(description, vbox);
-
- for (i = 0; authors[i] != NULL; i++) {
- auth = authors[i];
-
- if (*auth == '>') {
- auth++;
-
- buf = g_strdup_printf("<b>%s</b>", auth);
- ADD_LABEL(buf, vbox);
- g_free(buf);
- } else {
- buf = g_strdup_printf("<span size=\"small\">%s</span>", auth);
- 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);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
-
- btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- g_signal_connect(G_OBJECT(btn), "clicked", (GCallback)about_close, about);
- 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
deleted file mode 100644
index a131b0d9..00000000
--- a/about.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#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/arch/common/blowfish.h b/arch/common/blowfish.h
new file mode 100644
index 00000000..7333d069
--- /dev/null
+++ b/arch/common/blowfish.h
@@ -0,0 +1,64 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <blowfish.h>
+
+gchar *
+benchmark_fish(void)
+{
+ BLOWFISH_CTX ctx;
+ GTimer *timer = g_timer_new();
+ gdouble elapsed = 0;
+ gchar src[65536], *tmpsrc;
+ glong srclen = 65536;
+ unsigned long L, R;
+ int i;
+
+ tmpsrc = src;
+
+ L = 0xBEBACAFE;
+ R = 0xDEADBEEF;
+
+ if (!g_file_get_contents(PREFIX "benchmark.data",
+ &tmpsrc, NULL, NULL)) {
+ return g_strdup("[Error]\n"
+ PREFIX "benchmark.data not found=\n");
+ }
+
+ shell_view_set_enabled(FALSE);
+ shell_status_update("Benchmarking...");
+
+ for (i = 0; i <= 50000; i++) {
+ g_timer_start(timer);
+
+ Blowfish_Init(&ctx, (unsigned char*)tmpsrc, srclen);
+ Blowfish_Encrypt(&ctx, &L, &R);
+ Blowfish_Decrypt(&ctx, &L, &R);
+
+ g_timer_stop(timer);
+ elapsed += g_timer_elapsed(timer, NULL);
+
+ shell_status_set_percentage(i/500);
+ }
+
+ g_timer_destroy(timer);
+
+ gchar *retval = g_strdup_printf("[Results <i>(in seconds; lower is better)</i>]\n"
+ "<b>This Machine</b>=<b>%.2f</b>\n", elapsed);
+ return benchmark_include_results(retval, "Blowfish");
+}
diff --git a/arch/common/display.h b/arch/common/display.h
new file mode 100644
index 00000000..6731e3e3
--- /dev/null
+++ b/arch/common/display.h
@@ -0,0 +1,137 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static void
+get_glx_info(DisplayInfo *di)
+{
+ gchar *output;
+ if (g_spawn_command_line_sync("glxinfo", &output, NULL, NULL, NULL)) {
+ gchar **output_lines, **old;
+
+ output_lines = g_strsplit(output, "\n", 0);
+ g_free(output);
+
+ old = output_lines;
+ while (*(++output_lines)) {
+ if (strstr(*output_lines, "OpenGL")) {
+ gchar **tmp = g_strsplit(*output_lines, ":", 0);
+
+ tmp[1] = g_strchug(tmp[1]);
+
+ get_str("OpenGL vendor str", di->ogl_vendor);
+ get_str("OpenGL renderer str", di->ogl_renderer);
+ get_str("OpenGL version str", di->ogl_version);
+
+ g_strfreev(tmp);
+ }
+ }
+
+ g_strfreev(old);
+
+ if (!di->ogl_vendor)
+ di->ogl_vendor = "Unknown";
+ if (!di->ogl_renderer)
+ di->ogl_renderer = "Unknown";
+ if (!di->ogl_version)
+ di->ogl_version = "Unknown";
+ } else {
+ di->ogl_vendor = di->ogl_renderer = di->ogl_version = "Unknown";
+ }
+
+}
+
+static void
+get_x11_info(DisplayInfo *di)
+{
+ gchar *output;
+
+ if (g_spawn_command_line_sync("xdpyinfo", &output, NULL, NULL, NULL)) {
+ gchar **output_lines, **old;
+
+ output_lines = g_strsplit(output, "\n", 0);
+ g_free(output);
+
+ old = output_lines;
+ while (*(output_lines++)) {
+ gchar **tmp = g_strsplit(*output_lines, ":", 0);
+
+ if (tmp[1] && tmp[0]) {
+ tmp[1] = g_strchug(tmp[1]);
+
+ get_str("vendor string", di->vendor);
+ get_str("X.Org version", di->version);
+ get_str("XFree86 version", di->version);
+
+ if (g_str_has_prefix(tmp[0], "number of extensions")) {
+ int n;
+
+ di->extensions = "";
+
+ for (n = atoi(tmp[1]); n; n--) {
+ di->extensions = g_strconcat(di->extensions,
+ g_strstrip(*(++output_lines)),
+ "=\n",
+ NULL);
+ }
+ g_strfreev(tmp);
+
+ break;
+ }
+ }
+
+ g_strfreev(tmp);
+ }
+
+ g_strfreev(old);
+ }
+
+ GdkScreen *screen = gdk_screen_get_default();
+
+ if (screen && GDK_IS_SCREEN(screen)) {
+ gint n_monitors = gdk_screen_get_n_monitors(screen);
+ gint i;
+
+ di->monitors = "";
+ for (i = 0; i < n_monitors; i++) {
+ GdkRectangle rect;
+
+ gdk_screen_get_monitor_geometry(screen, i, &rect);
+
+ di->monitors = g_strdup_printf("%sMonitor %d=%dx%d pixels\n",
+ di->monitors, i, rect.width, rect.height);
+ }
+ } else {
+ di->monitors = "";
+ }
+}
+
+static DisplayInfo *
+computer_get_display(void)
+{
+ DisplayInfo *di = g_new0(DisplayInfo, 1);
+
+ GdkScreen *screen = gdk_screen_get_default();
+
+ di->width = gdk_screen_get_width(screen);
+ di->height = gdk_screen_get_height(screen);
+
+ get_glx_info(di);
+ get_x11_info(di);
+
+ return di;
+}
diff --git a/arch/common/fib.h b/arch/common/fib.h
new file mode 100644
index 00000000..493cfd0f
--- /dev/null
+++ b/arch/common/fib.h
@@ -0,0 +1,50 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static unsigned long long
+fib(unsigned long long n)
+{
+ if (n == 0)
+ return 0;
+ else if (n == 1 || n == 2)
+ return 1;
+ return fib(n - 1) + fib(n - 2);
+}
+
+static gchar *
+benchmark_fib(void)
+{
+ GTimer *timer = g_timer_new();
+ gdouble elapsed = 0;
+
+ shell_view_set_enabled(FALSE);
+ shell_status_update("Calculating the 42<sup>th</sup> Fibonacci number...");
+
+ g_timer_start(timer);
+ fib(42); /* the answer? :) */
+ g_timer_stop(timer);
+
+ elapsed = g_timer_elapsed(timer, NULL);
+
+ g_timer_destroy(timer);
+
+ gchar *retval = g_strdup_printf("[Results <i>(in seconds; lower is better)</i>]\n"
+ "<b>This Machine</b>=<b>%.2f</b>\n", elapsed);
+ return benchmark_include_results(retval, "Fibonacci");
+}
+
diff --git a/arch/common/languages.h b/arch/common/languages.h
new file mode 100644
index 00000000..3a31ef7f
--- /dev/null
+++ b/arch/common/languages.h
@@ -0,0 +1,102 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+void
+scan_languages(OperatingSystem * os)
+{
+ FILE *locale;
+ gchar buf[128], *retval = "";
+
+ locale = popen("locale -va", "r");
+ if (!locale)
+ return;
+
+ gchar name[32];
+ gchar *title = NULL,
+ *source = NULL,
+ *address = NULL,
+ *email = NULL,
+ *language = NULL,
+ *territory = NULL,
+ *revision = NULL,
+ *date = NULL,
+ *codeset = NULL;
+
+ while (fgets(buf, 128, locale)) {
+ if (!strncmp(buf, "locale:", 7)) {
+ sscanf(buf, "locale: %s", name);
+ fgets(buf, 128, locale);
+ } else if (strchr(buf, '|')) {
+ gchar **tmp = g_strsplit(buf, "|", 2);
+
+ tmp[0] = g_strstrip(tmp[0]);
+
+ if (tmp[1]) {
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_str("title", title);
+ get_str("source", source);
+ get_str("address", address);
+ get_str("email", email);
+ get_str("language", language);
+ get_str("territory", territory);
+ get_str("revision", revision);
+ get_str("date", date);
+ get_str("codeset", codeset);
+ }
+
+ g_strfreev(tmp);
+ } else {
+ gchar *currlocale;
+
+ retval = g_strdup_printf("%s$%s$%s=%s\n", retval, name, name, title);
+
+ currlocale = g_strdup_printf("[Locale Information]\n"
+ "Name=%s (%s)\n"
+ "Source=%s\n"
+ "Address=%s\n"
+ "Email=%s\n"
+ "Language=%s\n"
+ "Territory=%s\n"
+ "Revision=%s\n"
+ "Date=%s\n"
+ "Codeset=%s\n", name, title,
+ source, address, email, language,
+ territory, revision, date,
+ codeset);
+
+ g_hash_table_insert(moreinfo, g_strdup(name), currlocale);
+
+ g_free(title);
+ g_free(source);
+ g_free(address);
+ g_free(email);
+ g_free(language);
+ g_free(territory);
+ g_free(revision);
+ g_free(date);
+ g_free(codeset);
+
+ title = source = address = email = language = territory = \
+ revision = date = codeset = NULL;
+ }
+ }
+
+ fclose(locale);
+
+ os->languages = retval;
+}
diff --git a/arch/common/md5.h b/arch/common/md5.h
new file mode 100644
index 00000000..f61aef0f
--- /dev/null
+++ b/arch/common/md5.h
@@ -0,0 +1,62 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <md5.h>
+
+gchar *
+benchmark_md5(void)
+{
+ struct MD5Context ctx;
+ guchar checksum[16];
+ int i;
+ GTimer *timer = g_timer_new();
+ gdouble elapsed = 0;
+ gchar src[65536], *tmpsrc;
+ glong srclen = 65536;
+
+ tmpsrc = src;
+
+ if (!g_file_get_contents(PREFIX "benchmark.data",
+ &tmpsrc, NULL, NULL)) {
+ return g_strdup("[Error]\n"
+ PREFIX "benchmark.data not found=\n");
+ }
+
+ shell_view_set_enabled(FALSE);
+ shell_status_update("Generating MD5 sum for 312MiB of data...");
+
+ for (i = 0; i <= 5000; i++) {
+ g_timer_start(timer);
+
+ MD5Init(&ctx);
+ MD5Update(&ctx, (guchar*)tmpsrc, srclen);
+ MD5Final(checksum, &ctx);
+
+ g_timer_stop(timer);
+ elapsed += g_timer_elapsed(timer, NULL);
+
+ shell_status_set_percentage(i/50);
+ }
+
+ g_timer_destroy(timer);
+
+ gchar *retval = g_strdup_printf("[Results <i>(in seconds; lower is better)</i>]\n"
+ "<b>This Machine</b>=<b>%.2f</b>\n", elapsed);
+ return benchmark_include_results(retval, "MD5");
+}
+
diff --git a/arch/common/printers.h b/arch/common/printers.h
new file mode 100644
index 00000000..8632ea18
--- /dev/null
+++ b/arch/common/printers.h
@@ -0,0 +1,67 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+void
+scan_printers(void)
+{
+ GModule *cups;
+ static int (*cupsGetPrinters) (char ***printers) = NULL;
+ static char *(*cupsGetDefault) (void) = NULL;
+
+ if (printer_list)
+ g_free(printer_list);
+
+ if (!(cupsGetPrinters && cupsGetDefault)) {
+ cups = g_module_open("libcups", G_MODULE_BIND_LAZY);
+ if (!cups) {
+ printer_list = g_strdup("[Printers]\n"
+ "CUPS libraries cannot be found=");
+ return;
+ }
+
+ if (!g_module_symbol(cups, "cupsGetPrinters", (gpointer) & cupsGetPrinters)
+ || !g_module_symbol(cups, "cupsGetDefault",
+ (gpointer) & cupsGetDefault)) {
+ printer_list =
+ g_strdup("[Printers]\n" "No suitable CUPS library found=");
+ g_module_close(cups);
+ return;
+ }
+ }
+
+ gchar **printers;
+ int noprinters, i;
+ const char *default_printer;
+
+ noprinters = cupsGetPrinters(&printers);
+ default_printer = cupsGetDefault();
+
+ if (noprinters > 0) {
+ printer_list = g_strdup_printf("[Printers (CUPS)]\n");
+ for (i = 0; i < noprinters; i++) {
+ printer_list = g_strconcat(printer_list, printers[i],
+ !strcmp(default_printer,
+ printers[i]) ?
+ "=<i>(Default)</i>\n" : "=\n",
+ NULL);
+ g_free(printers[i]);
+ }
+ } else {
+ printer_list = g_strdup("[Printers]\n" "No printers found");
+ }
+}
diff --git a/arch/common/sha1.h b/arch/common/sha1.h
new file mode 100644
index 00000000..521cbcae
--- /dev/null
+++ b/arch/common/sha1.h
@@ -0,0 +1,61 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <sha1.h>
+
+gchar *
+benchmark_sha1(void)
+{
+ SHA1_CTX ctx;
+ guchar checksum[20];
+ int i;
+ GTimer *timer = g_timer_new();
+ gdouble elapsed = 0;
+ gchar src[65536], *tmpsrc;
+ glong srclen = 65536;
+
+ tmpsrc = src;
+
+ if (!g_file_get_contents(PREFIX "benchmark.data",
+ &tmpsrc, NULL, NULL)) {
+ return g_strdup("[Error]\n"
+ PREFIX "benchmark.data not found=\n");
+ }
+
+ shell_view_set_enabled(FALSE);
+ shell_status_update("Generating SHA1 sum for 312MiB of data...");
+
+ for (i = 0; i <= 5000; i++) {
+ g_timer_start(timer);
+
+ SHA1Init(&ctx);
+ SHA1Update(&ctx, (guchar*)tmpsrc, srclen);
+ SHA1Final(checksum, &ctx);
+
+ g_timer_stop(timer);
+ elapsed += g_timer_elapsed(timer, NULL);
+
+ shell_status_set_percentage(i/50);
+ }
+
+ g_timer_destroy(timer);
+
+ gchar *retval = g_strdup_printf("[Results <i>(in seconds; lower is better)</i>]\n"
+ "<b>This Machine</b>=<b>%.2f</b>\n", elapsed);
+ return benchmark_include_results(retval, "SHA1");
+}
+
diff --git a/arch/common/zlib.h b/arch/common/zlib.h
new file mode 100644
index 00000000..f68d60f4
--- /dev/null
+++ b/arch/common/zlib.h
@@ -0,0 +1,85 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static gchar *
+benchmark_zlib(void)
+{
+ GModule *libz;
+ static gulong (*compressBound) (glong srclen) = NULL;
+ static gint (*compress) (gchar *dst, glong *dstlen,
+ const gchar *src, glong srclen) = NULL;
+
+ if (!(compress && compressBound)) {
+ libz = g_module_open("libz", G_MODULE_BIND_LAZY);
+ if (!libz) {
+ libz = g_module_open("/lib/libz.so", G_MODULE_BIND_LAZY);
+ if (!libz) {
+ g_print("%s\n", g_module_error());
+ return g_strdup("[Error]\n"
+ "ZLib not found=");
+ }
+ }
+
+ if (!g_module_symbol(libz, "compress", (gpointer) & compress)
+ || !g_module_symbol(libz, "compressBound", (gpointer) & compressBound)) {
+
+ g_module_close(libz);
+ return g_strdup("[Error]\n"
+ "Invalid Z-Lib found=");
+ }
+ }
+
+ shell_view_set_enabled(FALSE);
+
+ int i;
+ GTimer *timer = g_timer_new();
+ gdouble elapsed = 0;
+ gchar src[65536], *tmpsrc;
+ glong srclen = 65536;
+
+ if (!g_file_get_contents(PREFIX "benchmark.data",
+ &tmpsrc, NULL, NULL)) {
+ return g_strdup("[Error]\n"
+ PREFIX "benchmark.data not found=\n");
+ }
+
+ shell_status_update("Compressing 64MB with default options...");
+
+ for (i = 0; i <= 1000; i++) {
+ g_timer_start(timer);
+
+ gchar *dst;
+ glong dstlen = compressBound(srclen);
+
+ dst = g_new0(gchar, dstlen);
+ compress(dst, &dstlen, src, srclen);
+
+ g_timer_stop(timer);
+ elapsed += g_timer_elapsed(timer, NULL);
+ g_free(dst);
+
+ shell_status_set_percentage(i/10);
+ }
+
+ g_timer_destroy(timer);
+
+ gchar *retval = g_strdup_printf("[Results <i>(in seconds; lower is better)</i>]\n"
+ "<b>This Machine</b>=<b>%.2f</b>\n", elapsed);
+ return benchmark_include_results(retval, "ZLib");
+}
+
diff --git a/arch/linux/common/alsa.h b/arch/linux/common/alsa.h
new file mode 100644
index 00000000..0c0744ae
--- /dev/null
+++ b/arch/linux/common/alsa.h
@@ -0,0 +1,69 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+gchar *
+computer_get_alsacards(Computer * computer)
+{
+ GSList *p;
+ gchar *tmp = "";
+ gint n = 0;
+
+ if (computer->alsa) {
+ for (p = computer->alsa->cards; p; p = p->next) {
+ AlsaCard *ac = (AlsaCard *) p->data;
+
+ tmp =
+ g_strdup_printf("Audio Adapter#%d=%s\n%s", ++n,
+ ac->friendly_name, tmp);
+ }
+ }
+
+ return tmp;
+}
+
+static AlsaInfo *
+computer_get_alsainfo(void)
+{
+ AlsaInfo *ai;
+ AlsaCard *ac;
+ FILE *cards;
+ gchar buffer[128];
+
+ cards = fopen("/proc/asound/cards", "r");
+ if (!cards)
+ return NULL;
+
+ ai = g_new0(AlsaInfo, 1);
+
+ while (fgets(buffer, 128, cards)) {
+ gchar **tmp;
+
+ ac = g_new0(AlsaCard, 1);
+
+ tmp = g_strsplit(buffer, ":", 0);
+
+ ac->friendly_name = g_strdup(tmp[1]);
+ ai->cards = g_slist_append(ai->cards, ac);
+
+ g_strfreev(tmp);
+ fgets(buffer, 128, cards); /* skip next line */
+ }
+ fclose(cards);
+
+ return ai;
+}
diff --git a/arch/linux/common/filesystem.h b/arch/linux/common/filesystem.h
new file mode 100644
index 00000000..37e5a730
--- /dev/null
+++ b/arch/linux/common/filesystem.h
@@ -0,0 +1,103 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Some code from xfce4-mount-plugin, version 0.4.3
+ * Copyright (C) 2005 Jean-Baptiste jb_dul@yahoo.com
+ * Distributed under the terms of GNU GPL 2.
+ */
+#include <sys/vfs.h>
+#define KB 1024
+#define MB 1048576
+#define GB 1073741824
+
+static gchar *fs_list = NULL;
+
+static gchar *
+fs_human_readable(gfloat size)
+{
+ if (size < KB)
+ return g_strdup_printf("%.1f B", size);
+ if (size < MB)
+ return g_strdup_printf("%.1f KiB", size / KB);
+ if (size < GB)
+ return g_strdup_printf("%.1f MiB", size / MB);
+
+ return g_strdup_printf("%.1f GiB", size / GB);
+}
+
+static void
+scan_filesystems(void)
+{
+ FILE *mtab;
+ gchar buf[128];
+ struct statfs sfs;
+
+ g_free(fs_list);
+ fs_list = g_strdup("");
+
+ mtab = fopen("/etc/mtab", "r");
+ if (!mtab)
+ return;
+
+ while (fgets(buf, 128, mtab)) {
+ gfloat size, used, avail;
+ gchar **tmp;
+
+ tmp = g_strsplit(buf, " ", 0);
+ statfs(tmp[1], &sfs);
+
+ size = (float) sfs.f_bsize * (float) sfs.f_blocks;
+ avail = (float) sfs.f_bsize * (float) sfs.f_bavail;
+ used = size - avail;
+
+ gchar *strsize = fs_human_readable(size),
+ *stravail = fs_human_readable(avail),
+ *strused = fs_human_readable(used);
+
+ gchar *strhash;
+ if ((strhash = g_hash_table_lookup(moreinfo, tmp[0]))) {
+ g_hash_table_remove(moreinfo, tmp[0]);
+ g_free(strhash);
+ }
+
+ strhash = g_strdup_printf("[%s]\n"
+ "Filesystem=%s\n"
+ "Mounted As=%s\n"
+ "Mount Point=%s\n"
+ "Size=%s\n"
+ "Used=%s\n"
+ "Available=%s\n",
+ tmp[0],
+ tmp[2],
+ strstr(tmp[3],
+ "rw") ? "Read-Write" :
+ "Read-Only", tmp[1], strsize, strused,
+ stravail);
+ g_hash_table_insert(moreinfo, g_strdup(tmp[0]), strhash);
+
+ fs_list = g_strdup_printf("%s$%s$%s=%s total, %s free\n",
+ fs_list,
+ tmp[0], tmp[0], strsize, stravail);
+
+ g_free(strsize);
+ g_free(stravail);
+ g_free(strused);
+ g_strfreev(tmp);
+ }
+
+ fclose(mtab);
+}
diff --git a/arch/linux/common/inputdevices.h b/arch/linux/common/inputdevices.h
new file mode 100644
index 00000000..c32015a2
--- /dev/null
+++ b/arch/linux/common/inputdevices.h
@@ -0,0 +1,117 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static gchar *input_icons = NULL;
+
+static gboolean
+remove_input_devices(gpointer key, gpointer value, gpointer data)
+{
+ if (!strncmp((gchar *) key, "INP", 3)) {
+ g_free((gchar *) key);
+ g_free((GtkTreeIter *) value);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static struct {
+ char *name;
+ char *icon;
+} input_devices[] = {
+ { "Keyboard", "keyboard.png" },
+ { "Joystick", "joystick.png" },
+ { "Mouse", "mouse.png" },
+ { "Unknown", "module.png" },
+};
+
+void
+scan_inputdevices(void)
+{
+ FILE *dev;
+ gchar buffer[128];
+ gchar *tmp, *name = NULL, *phys = NULL;
+ gint bus, vendor, product, version;
+ int d = 0, n = 0;
+
+ dev = fopen("/proc/bus/input/devices", "r");
+ if (!dev)
+ return;
+
+ if (input_list) {
+ g_hash_table_foreach_remove(devices, remove_input_devices, NULL);
+ g_free(input_list);
+ g_free(input_icons);
+ }
+ input_list = g_strdup("");
+ input_icons = g_strdup("");
+
+ while (fgets(buffer, 128, dev)) {
+ tmp = buffer;
+
+ switch (*tmp) {
+ case 'N':
+ name = g_strdup(tmp + strlen("N: Name="));
+ remove_quotes(name);
+ break;
+ case 'P':
+ phys = g_strdup(tmp + strlen("P: Phys="));
+ break;
+ case 'I':
+ sscanf(tmp, "I: Bus=%x Vendor=%x Product=%x Version=%x",
+ &bus, &vendor, &product, &version);
+ break;
+ case 'H':
+ if (strstr(tmp, "kbd"))
+ d = 0; //INPUT_KEYBOARD;
+ else if (strstr(tmp, "js"))
+ d = 1; //INPUT_JOYSTICK;
+ else if (strstr(tmp, "mouse"))
+ d = 2; //INPUT_MOUSE;
+ else
+ d = 3; //INPUT_UNKNOWN;
+ break;
+ case '\n':
+ tmp = g_strdup_printf("INP%d", ++n);
+ input_list = g_strdup_printf("%s$%s$%s=\n",
+ input_list,
+ tmp, name);
+ input_icons = g_strdup_printf("%sIcon$%s$%s=%s\n",
+ input_icons,
+ tmp, name,
+ input_devices[d].icon);
+ gchar *strhash = g_strdup_printf("[Device Information]\n"
+ "Name=%s\n"
+ "Type=%s\n"
+ "Bus=0x%x\n"
+ "Vendor=0x%x\n"
+ "Product=0x%x\n"
+ "Version=0x%x\n"
+ "Connected to=%s\n",
+ name, input_devices[d].name,
+ bus, vendor, product,
+ version, phys);
+ g_hash_table_insert(devices, tmp, strhash);
+
+ g_free(phys);
+ g_free(name);
+ }
+ }
+
+ fclose(dev);
+}
diff --git a/arch/linux/common/loadavg.h b/arch/linux/common/loadavg.h
new file mode 100644
index 00000000..28132b5f
--- /dev/null
+++ b/arch/linux/common/loadavg.h
@@ -0,0 +1,47 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static LoadInfo *
+computer_get_loadinfo(void)
+{
+ LoadInfo *li = g_new0(LoadInfo, 1);
+ FILE *procloadavg;
+
+ procloadavg = fopen("/proc/loadavg", "r");
+ fscanf(procloadavg, "%f %f %f", &(li->load1), &(li->load5),
+ &(li->load15));
+ fclose(procloadavg);
+
+ return li;
+}
+
+static gchar *
+computer_get_formatted_loadavg()
+{
+ LoadInfo *li;
+ gchar *tmp;
+
+ li = computer_get_loadinfo();
+
+ tmp =
+ g_strdup_printf("%.2f, %.2f, %.2f", li->load1, li->load5,
+ li->load15);
+
+ g_free(li);
+ return tmp;
+}
diff --git a/arch/linux/common/memory.h b/arch/linux/common/memory.h
new file mode 100644
index 00000000..def4cc1d
--- /dev/null
+++ b/arch/linux/common/memory.h
@@ -0,0 +1,56 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static MemoryInfo *
+computer_get_memory(void)
+{
+ MemoryInfo *mi;
+ FILE *procmem;
+ gchar buffer[128];
+
+ procmem = fopen("/proc/meminfo", "r");
+ if (!procmem)
+ return NULL;
+ mi = g_new0(MemoryInfo, 1);
+
+ while (fgets(buffer, 128, procmem)) {
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+
+ tmp[0] = g_strstrip(tmp[0]);
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_int("MemTotal", mi->total);
+ get_int("MemFree", mi->free);
+ get_int("Cached", mi->cached);
+
+ g_strfreev(tmp);
+ }
+ fclose(procmem);
+
+ mi->used = mi->total - mi->free;
+
+ mi->total /= 1000;
+ mi->cached /= 1000;
+ mi->used /= 1000;
+ mi->free /= 1000;
+
+ mi->used -= mi->cached;
+ mi->ratio = 1 - (gdouble) mi->used / mi->total;
+
+ return mi;
+}
diff --git a/arch/linux/common/modules.h b/arch/linux/common/modules.h
new file mode 100644
index 00000000..69f7ebd6
--- /dev/null
+++ b/arch/linux/common/modules.h
@@ -0,0 +1,129 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+void
+scan_modules(void)
+{
+ FILE *lsmod;
+ gchar buffer[1024];
+
+ lsmod = popen("/sbin/lsmod", "r");
+ if (!lsmod)
+ return;
+
+ fgets(buffer, 1024, lsmod); /* Discards the first line */
+
+ while (fgets(buffer, 1024, lsmod)) {
+ gchar *buf, *strmodule, *hashkey;
+ gchar *author = NULL,
+ *description = NULL,
+ *license = NULL,
+ *deps = NULL, *vermagic = NULL, *filename = NULL, modname[64];
+ FILE *modi;
+ glong memory;
+
+ shell_status_pulse();
+
+ buf = buffer;
+
+ sscanf(buf, "%s %ld", modname, &memory);
+
+ hashkey = g_strdup_printf("MOD%s", modname);
+ buf = g_strdup_printf("/sbin/modinfo %s", modname);
+
+ modi = popen(buf, "r");
+ while (fgets(buffer, 1024, modi)) {
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+
+ GET_STR("author", author);
+ GET_STR("description", description);
+ GET_STR("license", license);
+ GET_STR("depends", deps);
+ GET_STR("vermagic", vermagic);
+ GET_STR("filename", filename);
+
+ g_strfreev(tmp);
+ }
+ pclose(modi);
+ g_free(buf);
+
+ /* old modutils includes quotes in some strings; strip them */
+ /*remove_quotes(modname);
+ remove_quotes(description);
+ remove_quotes(vermagic);
+ remove_quotes(author);
+ remove_quotes(license); */
+
+ /* old modutils displays <none> when there's no value for a
+ given field; this is not desirable in the module name
+ display, so change it to an empty string */
+ if (description && !strcmp(description, "&lt;none&gt;")) {
+ g_free(description);
+ description = g_strdup("");
+ }
+
+ /* append this module to the list of modules */
+ module_list = g_strdup_printf("%s$%s$%s=%s\n",
+ module_list,
+ hashkey,
+ modname,
+ description ? description : "");
+
+#define NONE_IF_NULL(var) (var) ? (var) : "N/A"
+
+ /* create the module information string */
+ strmodule = g_strdup_printf("[Module Information]\n"
+ "Path=%s\n"
+ "Used Memory=%.2fKiB\n"
+ "[Description]\n"
+ "Name=%s\n"
+ "Description=%s\n"
+ "Version Magic=%s\n"
+ "[Copyright]\n"
+ "Author=%s\n"
+ "License=%s\n",
+ NONE_IF_NULL(filename),
+ memory / 1024.0,
+ NONE_IF_NULL(modname),
+ NONE_IF_NULL(description),
+ NONE_IF_NULL(vermagic),
+ NONE_IF_NULL(author),
+ NONE_IF_NULL(license));
+
+ /* if there are dependencies, append them to that string */
+ if (deps && strlen(deps)) {
+ gchar **tmp = g_strsplit(deps, ",", 0);
+
+ strmodule = g_strconcat(strmodule,
+ "\n[Dependencies]\n",
+ g_strjoinv("=\n", tmp),
+ "=\n", NULL);
+ g_strfreev(tmp);
+ g_free(deps);
+ }
+
+ g_hash_table_insert(devices, hashkey, strmodule);
+
+ g_free(license);
+ g_free(description);
+ g_free(author);
+ g_free(vermagic);
+ g_free(filename);
+ }
+ pclose(lsmod);
+}
diff --git a/arch/linux/common/net.h b/arch/linux/common/net.h
new file mode 100644
index 00000000..87e7e59b
--- /dev/null
+++ b/arch/linux/common/net.h
@@ -0,0 +1,203 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static gchar *network_interfaces = NULL;
+
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <linux/sockios.h>
+#include <sys/socket.h>
+
+typedef struct _NetInfo NetInfo;
+struct _NetInfo {
+ char name[16];
+ int mtu;
+ unsigned char mac[8];
+};
+
+
+void get_net_info(char *if_name, NetInfo *netinfo)
+{
+ struct ifreq ifr;
+ int fd;
+
+ fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
+
+ strcpy(ifr.ifr_name, if_name);
+ strcpy(netinfo->name, if_name);
+
+ if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) {
+ netinfo->mtu = 0;
+ } else {
+ netinfo->mtu = ifr.ifr_mtu;
+ }
+
+ strcpy(ifr.ifr_name, if_name);
+ if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
+ memset(netinfo->mac, 0, 8);
+ } else {
+ memcpy(netinfo->mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 8);
+ }
+
+ shutdown(fd, 0);
+}
+
+static struct {
+ char *type;
+ char *label;
+} netdev2type[] = {
+ { "eth", "Ethernet" },
+ { "lo", "Loopback" },
+ { "ppp", "Point-to-Point" },
+ { "ath", "Wireless" },
+ { "wlan", "Wireless" },
+ { "tun", "Virtual Point-to-Point (TUN)" },
+ { "tap", "Ethernet (TAP)" },
+ { "plip", "Parallel Line Internet Protocol" },
+ { "irlan", "Infrared" },
+ { "slip", "Serial Line Internet Protocol" },
+ { "isdn", "Integrated Services Digital Network" },
+ { "sit", "IPv6-over-IPv4 Tunnel" },
+ { "vmnet8", "VMWare Virtual Network Interface (NAT)" },
+ { "vmnet", "VMWare Virtual Network Interface" },
+ { NULL, "Unknown" },
+};
+
+static const gchar *
+net_get_iface_type(gchar *name)
+{
+ int i;
+
+ for (i = 0; netdev2type[i].type; i++) {
+ if (g_str_has_prefix(name, netdev2type[i].type))
+ break;
+ }
+
+ return netdev2type[i].label;
+}
+
+static gboolean
+remove_net_devices(gpointer key, gpointer value, gpointer data)
+{
+ if (!strncmp((gchar *) key, "NET", 4)) {
+ g_free((gchar *) key);
+ g_free((GtkTreeIter *) value);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void
+scan_net_interfaces_24(void)
+{
+ FILE *proc_net;
+ NetInfo ni;
+ gchar buffer[256];
+ gchar *devid, *detailed;
+ gulong recv_bytes;
+ gulong recv_errors;
+ gulong recv_packets;
+
+ gulong trans_bytes;
+ gulong trans_errors;
+ gulong trans_packets;
+
+ if (!g_file_test("/proc/net/dev", G_FILE_TEST_EXISTS)) {
+ if (network_interfaces) {
+ g_free(network_interfaces);
+ network_interfaces = g_strdup("[Network Interfaces]\n"
+ "None found=\n");
+ }
+
+ return;
+ }
+
+ if (network_interfaces) {
+ g_free(network_interfaces);
+ }
+
+ network_interfaces = g_strdup("[Network Interfaces]\n");
+
+ proc_net = fopen("/proc/net/dev", "r");
+ while (fgets(buffer, 256, proc_net)) {
+ if (strchr(buffer, ':')) {
+ gint trash;
+ gchar ifacename[16];
+ gchar *buf = buffer;
+ gint i;
+
+ buf = g_strstrip(buf);
+
+ memset(ifacename, 0, 16);
+
+ for (i = 0; buffer[i] != ':' && i < 16; i++) {
+ ifacename[i] = buffer[i];
+ }
+
+ buf = strchr(buf, ':') + 1;
+
+ /* iface: bytes packets errs drop fifo frame compressed multicast */
+ sscanf(buf, "%ld %ld %ld %d %d %d %d %d %ld %ld %ld",
+ &recv_bytes, &recv_packets,
+ &recv_errors, &trash, &trash, &trash, &trash,
+ &trash, &trans_bytes, &trans_packets,
+ &trans_errors);
+
+ gfloat recv_mb = recv_bytes / 1048576.0;
+ gfloat trans_mb = trans_bytes / 1048576.0;
+
+ devid = g_strdup_printf("NET%s", ifacename);
+ network_interfaces = g_strdup_printf("%s$%s$%s=Sent %.2fMiB, received %.2fMiB\n",
+ network_interfaces,
+ devid,
+ ifacename,
+ trans_mb,
+ recv_mb);
+
+ get_net_info(ifacename, &ni);
+ detailed = g_strdup_printf("[Network Adapter Properties]\n"
+ "Interface Type=%s\n"
+ "Hardware Address=%02x:%02x:%02x:%02x:%02x:%02x\n"
+ "MTU=%d\n"
+ "Bytes Sent=%ld (%.2fMiB)\n"
+ "Bytes Received=%ld (%.2fMiB)\n",
+ net_get_iface_type(ifacename),
+ ni.mac[0], ni.mac[1],
+ ni.mac[2], ni.mac[3],
+ ni.mac[4], ni.mac[5],
+ ni.mtu,
+ recv_bytes, recv_mb,
+ trans_bytes, trans_mb);
+ g_hash_table_insert(moreinfo, devid, detailed);
+ }
+ }
+ fclose(proc_net);
+}
+
+static void
+scan_net_interfaces(void)
+{
+ /* FIXME: See if we're running Linux 2.6 and if /sys is mounted, then use
+ that instead of /proc/net/dev */
+
+ /* remove old devices from global device table */
+ g_hash_table_foreach_remove(moreinfo, remove_net_devices, NULL);
+
+ scan_net_interfaces_24();
+}
diff --git a/arch/linux/common/os.h b/arch/linux/common/os.h
new file mode 100644
index 00000000..0f7b59e3
--- /dev/null
+++ b/arch/linux/common/os.h
@@ -0,0 +1,203 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static gchar *
+get_libc_version(void)
+{
+ FILE *libc;
+ gchar buf[256], *tmp, *p;
+
+ libc = popen("/lib/libc.so.6", "r");
+ if (!libc) goto err;
+
+ fgets(buf, 256, libc);
+ if (pclose(libc)) goto err;
+
+ tmp = strstr(buf, "version ");
+ if (!tmp) goto err;
+
+ p = strchr(tmp, ',');
+ if (p) *p = '\0';
+ else goto err;
+
+ return g_strdup_printf("GNU C Library version %s (%sstable)",
+ strchr(tmp, ' ') + 1,
+ strstr(buf, " stable ") ? "" : "un");
+ err:
+ return g_strdup("Unknown");
+}
+
+static gchar *
+get_os_compiled_date(void)
+{
+ FILE *procversion;
+ gchar buf[512];
+
+ procversion = fopen("/proc/sys/kernel/version", "r");
+ if (!procversion)
+ return g_strdup("Unknown");
+
+ fgets(buf, 512, procversion);
+ fclose(procversion);
+
+ return g_strdup(buf);
+}
+
+
+#include <gdk/gdkx.h>
+
+void
+detect_desktop_environment(OperatingSystem * os)
+{
+ const gchar *tmp = g_getenv("GNOME_DESKTOP_SESSION_ID");
+ FILE *version;
+ int maj, min;
+
+ if (tmp) {
+ /* FIXME: this might not be true, as the gnome-panel in path
+ may not be the one that's running.
+ see where the user's running panel is and run *that* to
+ obtain the version. */
+ version = popen("gnome-panel --version", "r");
+ if (version) {
+ fscanf(version, "Gnome gnome-panel %d.%d", &maj, &min);
+ if (pclose(version))
+ goto unknown;
+ } else {
+ goto unknown;
+ }
+
+ os->desktop =
+ g_strdup_printf("GNOME %d.%d (session name: %s)", maj, min,
+ tmp);
+ } else if (g_getenv("KDE_FULL_SESSION")) {
+ version = popen("kcontrol --version", "r");
+ if (version) {
+ char buf[32];
+
+ fgets(buf, 32, version);
+
+ fscanf(version, "KDE: %d.%d", &maj, &min);
+ if (pclose(version))
+ goto unknown;
+ } else {
+ goto unknown;
+ }
+
+ os->desktop = g_strdup_printf("KDE %d.%d", maj, min);
+ } else {
+ unknown:
+ if (!g_getenv("DISPLAY")) {
+ os->desktop = g_strdup("Terminal");
+ } else {
+ const gchar *windowman;
+ GdkScreen *screen = gdk_screen_get_default();
+
+ windowman = gdk_x11_screen_get_window_manager_name(screen);
+
+ if (g_str_equal(windowman, "Xfwm4")) {
+ /* FIXME: check if xprop -root | grep XFCE_DESKTOP_WINDOW
+ is defined */
+ os->desktop = g_strdup("XFCE 4");
+ } else {
+ os->desktop = g_strdup_printf("Unknown (Window Manager: %s)",
+ windowman);
+ }
+ }
+ }
+}
+
+static OperatingSystem *
+computer_get_os(void)
+{
+ struct utsname utsbuf;
+ OperatingSystem *os;
+ int i;
+
+ os = g_new0(OperatingSystem, 1);
+
+ os->compiled_date = get_os_compiled_date();
+
+ /* Attempt to get the Distribution name; try using /etc/lsb-release first,
+ then doing the legacy method (checking for /etc/$DISTRO-release files) */
+ if (g_file_test("/etc/lsb-release", G_FILE_TEST_EXISTS)) {
+ FILE *release;
+ gchar buffer[128];
+
+ release = popen("lsb_release -d", "r");
+ fgets(buffer, 128, release);
+ pclose(release);
+
+ os->distro = buffer;
+ os->distro = g_strdup(os->distro + strlen("Description:\t"));
+ }
+
+ for (i = 0;; i++) {
+ if (distro_db[i].file == NULL) {
+ os->distrocode = g_strdup("unk");
+ os->distro = g_strdup("Unknown distribution");
+ break;
+ }
+
+ if (g_file_test(distro_db[i].file, G_FILE_TEST_EXISTS)) {
+
+
+ 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;
+
+ if (!os->distro) {
+ /*
+ * HACK: Some Debian systems doesn't include
+ * the distribuition name in /etc/debian_release,
+ * so add them here.
+ */
+ if (!strncmp(distro_db[i].codename, "deb", 3) &&
+ ((buf[0] >= '0' && buf[0] <= '9') || buf[0] != 'D')) {
+ os->distro = g_strdup_printf
+ ("Debian GNU/Linux %s", buf);
+ } else {
+ os->distro = g_strdup(buf);
+ }
+ }
+ os->distrocode = g_strdup(distro_db[i].codename);
+
+ break;
+ }
+ }
+
+ /* Kernel and hostname info */
+ uname(&utsbuf);
+ os->kernel = g_strdup_printf("%s %s (%s)", utsbuf.sysname,
+ utsbuf.release, utsbuf.machine);
+ os->hostname = g_strdup(utsbuf.nodename);
+ os->language = g_strdup(g_getenv("LC_MESSAGES"));
+ os->homedir = g_strdup(g_get_home_dir());
+ os->username = g_strdup_printf("%s (%s)",
+ g_get_user_name(), g_get_real_name());
+ os->libc = get_libc_version();
+ scan_languages(os);
+ detect_desktop_environment(os);
+
+ return os;
+}
diff --git a/arch/linux/common/pci.h b/arch/linux/common/pci.h
new file mode 100644
index 00000000..f8c9d319
--- /dev/null
+++ b/arch/linux/common/pci.h
@@ -0,0 +1,190 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+void
+scan_pci(void)
+{
+ FILE *lspci;
+ gchar buffer[256], *buf, *strhash = NULL, *strdevice = NULL;
+ gchar *category = NULL, *name = NULL;
+ gint n = 0;
+
+ //if (g_file_test("/usr/bin/gksudo", G_FILE_TEST_EXISTS)) {
+ // lspci = popen("gksudo '/bin/lspci -v'", "r");
+ //} else {
+ lspci = popen(LSPCI, "r");
+ //}
+
+ if (!lspci) {
+ return;
+ }
+
+ gchar *icon;
+
+ int x = 0; /* unique Memory, Capability and I/O port */
+ while (fgets(buffer, 256, lspci)) {
+ buf = g_strstrip(buffer);
+
+ if (!strncmp(buf, "Flags", 5)) {
+ gint irq = 0, freq = 0, latency = 0, i;
+ gchar **list;
+ gboolean bus_master;
+
+ buf += 7;
+
+ 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))
+ bus_master = TRUE;
+ else if (!strncmp(list[i], "latency", 7))
+ sscanf(list[i], "latency %d", &latency);
+ }
+ g_strfreev(list);
+
+ if (irq)
+ strdevice = g_strdup_printf("%sIRQ=%d\n", strdevice, irq);
+ if (freq)
+ strdevice =
+ g_strdup_printf("%sFrequency=%dMHz\n", strdevice,
+ freq);
+ if (latency)
+ strdevice =
+ g_strdup_printf("%sLatency=%d\n", strdevice, latency);
+
+ strdevice =
+ g_strdup_printf("%sBus Master=%s\n", strdevice,
+ bus_master ? "Yes" : "No");
+ } else if (!strncmp(buf, "Subsystem", 9)) {
+ WALK_UNTIL(' ');
+ buf++;
+ strdevice =
+ g_strdup_printf("%sOEM Vendor=%s\n", strdevice, buf);
+ } else if (!strncmp(buf, "Capabilities", 12)
+ && !strstr(buf, "only to root") &&
+ !strstr(buf, "access denied")) {
+ WALK_UNTIL(' ');
+ WALK_UNTIL(']');
+ buf++;
+ strdevice =
+ g_strdup_printf("%sCapability#%d=%s\n", strdevice, ++x,
+ buf);
+ } else if (!strncmp(buf, "Memory at", 9) && strstr(buf, "[size=")) {
+ gint mem;
+ gchar unit;
+ gboolean prefetch;
+ gboolean _32bit;
+
+ prefetch = strstr(buf, "non-prefetchable") ? FALSE : TRUE;
+ _32bit = strstr(buf, "32-bit") ? TRUE : FALSE;
+
+ WALK_UNTIL('[');
+ sscanf(buf, "[size=%d%c", &mem, &unit);
+
+ strdevice = g_strdup_printf("%sMemory#%d=%d%cB (%s%s)\n",
+ strdevice, ++x,
+ mem,
+ (unit == ']') ? ' ' : unit,
+ _32bit ? "32-bit, " : "",
+ prefetch ? "prefetchable" :
+ "non-prefetchable");
+
+ } 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);
+
+ strdevice =
+ g_strdup_printf("%sI/O ports at#%d=0x%x - 0x%x\n",
+ strdevice, ++x, io_addr,
+ io_addr + io_size);
+ } else if ((buf[0] >= '0' && buf[0] <= '9') && (buf[4] == ':' || buf[2] == ':')) {
+ gint bus, device, function, domain;
+ gpointer start, end;
+
+ if (strdevice != NULL && strhash != NULL) {
+ g_hash_table_insert(devices, strhash, strdevice);
+ g_free(category);
+ g_free(name);
+ }
+
+ if (buf[4] == ':') {
+ sscanf(buf, "%x:%x:%x.%d", &domain, &bus, &device, &function);
+ } else {
+ /* lspci without domain field */
+ sscanf(buf, "%x:%x.%x", &bus, &device, &function);
+ domain = 0;
+ }
+
+ WALK_UNTIL(' ');
+
+ start = buf;
+
+ WALK_UNTIL(':');
+ end = buf + 1;
+ *buf = 0;
+
+ buf = start + 1;
+ category = g_strdup(buf);
+
+ buf = end;
+ start = buf;
+ WALK_UNTIL('(');
+ *buf = 0;
+ buf = start + 1;
+
+ if (strstr(category, "RAM memory")) icon = "mem";
+ else if (strstr(category, "Multimedia")) icon = "media";
+ else if (strstr(category, "USB")) icon = "usb";
+ else icon = "pci";
+
+ name = g_strdup(buf);
+
+ strhash = g_strdup_printf("PCI%d", n);
+ strdevice = g_strdup_printf("[Device Information]\n"
+ "Name=%s\n"
+ "Class=%s\n"
+ "Domain=%d\n"
+ "Bus, device, function=%d, %d, %d\n",
+ name, category, domain, bus,
+ device, function);
+ pci_list = g_strdup_printf("%s$PCI%d$%s=%s\n", pci_list, n, category,
+ name);
+
+ n++;
+ }
+ }
+
+ if (pclose(lspci)) {
+ /* error (no pci, perhaps?) */
+ pci_list = g_strconcat(pci_list, "No PCI devices found=\n", NULL);
+ } else if (strhash) {
+ /* insert the last device */
+ g_hash_table_insert(devices, strhash, strdevice);
+ g_free(category);
+ g_free(name);
+ }
+}
diff --git a/arch/linux/common/samba.h b/arch/linux/common/samba.h
new file mode 100644
index 00000000..538659a6
--- /dev/null
+++ b/arch/linux/common/samba.h
@@ -0,0 +1,80 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static gchar *shares_list = NULL;
+void
+scan_shared_directories(void)
+{
+ GKeyFile *keyfile;
+ GError *error = NULL;
+ gchar **groups;
+ gchar *smbconf;
+ gsize length;
+
+ if (shares_list) {
+ g_free(shares_list);
+ }
+
+ keyfile = g_key_file_new();
+
+ if (!g_file_get_contents("/etc/samba/smb.conf", &smbconf, &length, &error)) {
+ shares_list = g_strdup("Cannot open /etc/samba/smb.conf=\n");
+ g_error_free(error);
+ goto cleanup;
+ }
+
+ gchar *_smbconf = smbconf;
+ for (; *_smbconf; _smbconf++)
+ if (*_smbconf == ';') *_smbconf = '\0';
+
+ if (!g_key_file_load_from_data(keyfile, smbconf, length, 0, &error)) {
+ shares_list = g_strdup("Cannot parse smb.conf=\n");
+ g_error_free(error);
+ goto cleanup;
+ }
+
+ shares_list = g_strdup("");
+
+ groups = g_key_file_get_groups(keyfile, NULL);
+ gchar **_groups = groups;
+ while (*groups) {
+ if (g_key_file_has_key(keyfile, *groups, "path", NULL) &&
+ g_key_file_has_key(keyfile, *groups, "available", NULL)) {
+
+ gchar *available = g_key_file_get_string(keyfile, *groups, "available", NULL);
+
+ if (g_str_equal(available, "yes")) {
+ gchar *path = g_key_file_get_string(keyfile, *groups, "path", NULL);
+ shares_list = g_strconcat(shares_list, *groups, "=",
+ path, "\n", NULL);
+ g_free(path);
+ }
+
+ g_free(available);
+ }
+
+ *groups++;
+ }
+
+ g_strfreev(_groups);
+
+ cleanup:
+ g_key_file_free(keyfile);
+ g_free(smbconf);
+}
+
diff --git a/arch/linux/common/sensors.h b/arch/linux/common/sensors.h
new file mode 100644
index 00000000..ef834de2
--- /dev/null
+++ b/arch/linux/common/sensors.h
@@ -0,0 +1,237 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static gchar *sensors = NULL;
+static GHashTable *sensor_labels = NULL;
+static GHashTable *sensor_compute = NULL;
+
+static void
+read_sensor_labels(gchar *driver)
+{
+ FILE *conf;
+ gchar buf[256], *line, *p;
+ gboolean lock = FALSE;
+ gint i;
+
+ sensor_labels = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, g_free);
+ sensor_compute = g_hash_table_new(g_str_hash, g_str_equal);
+
+ conf = fopen("/etc/sensors.conf", "r");
+ if (!conf)
+ return;
+
+ while (fgets(buf, 256, conf)) {
+ line = buf;
+
+ remove_linefeed(line);
+ strend(line, '#');
+
+ if (*line == '\0') {
+ continue;
+ } else if (lock && strstr(line, "label")) { /* label lines */
+ gchar **names = g_strsplit(strstr(line, "label") + 5, " ", 0);
+ gchar *name = NULL, *value = NULL;
+
+ for (i = 0; names[i]; i++) {
+ if (names[i][0] == '\0')
+ continue;
+
+ if (!name) name = g_strdup(names[i]);
+ else if (!value) value = g_strdup(names[i]);
+ else value = g_strconcat(value, " ", names[i], NULL);
+ }
+
+ remove_quotes(value);
+ g_hash_table_insert(sensor_labels, name, value);
+
+ g_strfreev(names);
+ } else if (lock && strstr(line, "ignore")) { /* ignore lines */
+ p = strstr(line, "ignore") + 6;
+ if (!strchr(p, ' '))
+ continue;
+
+ while (*p == ' ') p++;
+ g_hash_table_insert(sensor_labels, g_strdup(p), "ignore");
+ } else if (lock && strstr(line, "compute")) { /* compute lines */
+ gchar **formulas = g_strsplit(strstr(line, "compute") + 7, " ", 0);
+ gchar *name = NULL, *formula = NULL;
+
+ for (i = 0; formulas[i]; i++) {
+ if (formulas[i][0] == '\0')
+ continue;
+ if (formulas[i][0] == ',')
+ break;
+
+ if (!name) name = g_strdup(formulas[i]);
+ else if (!formula) formula = g_strdup(formulas[i]);
+ else formula = g_strconcat(formula, formulas[i], NULL);
+ }
+
+ g_strfreev(formulas);
+ g_hash_table_insert(sensor_compute, name, math_string_to_postfix(formula));
+ } else if (g_str_has_prefix(line, "chip")) { /* chip lines (delimiter) */
+ if (lock == FALSE) {
+ gchar **chips = g_strsplit(line, " ", 0);
+
+ for (i = 1; chips[i]; i++) {
+ strend(chips[i], '*');
+
+ if (g_str_has_prefix(driver, chips[i] + 1)) {
+ lock = TRUE;
+ break;
+ }
+ }
+
+ g_strfreev(chips);
+ } else {
+ break;
+ }
+ }
+ }
+
+ fclose(conf);
+}
+
+static gchar *
+get_sensor_label(gchar *sensor)
+{
+ gchar *ret;
+
+ ret = g_hash_table_lookup(sensor_labels, sensor);
+ if (!ret) ret = g_strdup(sensor);
+ else ret = g_strdup(ret);
+
+ return ret;
+}
+
+static float
+adjust_sensor(gchar *name, float value)
+{
+ GSList *postfix;
+
+ postfix = g_hash_table_lookup(sensor_compute, name);
+ if (!postfix) return value;
+
+ return math_postfix_eval(postfix, value);
+}
+
+static void
+read_sensors(void)
+{
+ gchar *path_hwmon, *path_sensor, *tmp, *driver, *name, *mon;
+ int hwmon, count;
+
+ if (sensors)
+ g_free(sensors);
+
+ hwmon = 0;
+ sensors = g_strdup("");
+
+ path_hwmon = g_strdup_printf("/sys/class/hwmon/hwmon%d/device/", hwmon);
+ while (g_file_test(path_hwmon, G_FILE_TEST_EXISTS)) {
+ tmp = g_strdup_printf("%sdriver", path_hwmon);
+ driver = g_file_read_link(tmp, NULL);
+ g_free(tmp);
+
+ tmp = g_path_get_basename(driver);
+ g_free(driver);
+ driver = tmp;
+
+ if (!sensor_labels) {
+ read_sensor_labels(driver);
+ }
+
+ sensors = g_strdup_printf("%s[Driver Info]\n"
+ "Name=%s\n", sensors, driver);
+
+ sensors = g_strconcat(sensors, "[Cooling Fans]\n", NULL);
+ for (count = 1; ; count++) {
+ path_sensor = g_strdup_printf("%sfan%d_input", path_hwmon, count);
+ if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) {
+ g_free(path_sensor);
+ break;
+ }
+
+ mon = g_strdup_printf("fan%d", count);
+ name = get_sensor_label(mon);
+ if (!g_str_equal(name, "ignore")) {
+ sensors = g_strdup_printf("%s%s=%.0fRPM\n",
+ sensors, name,
+ adjust_sensor(mon, atof(tmp)));
+ }
+
+ g_free(name);
+ g_free(mon);
+ g_free(tmp);
+ g_free(path_sensor);
+ }
+
+ sensors = g_strconcat(sensors, "[Temperatures]\n", NULL);
+ for (count = 1; ; count++) {
+ path_sensor = g_strdup_printf("%stemp%d_input", path_hwmon, count);
+ if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) {
+ g_free(path_sensor);
+ break;
+ }
+
+ mon = g_strdup_printf("temp%d", count);
+ name = get_sensor_label(mon);
+ if (!g_str_equal(name, "ignore")) {
+ sensors = g_strdup_printf("%s%s=%.2f\302\260C\n",
+ sensors, name,
+ adjust_sensor(mon, atof(tmp) / 1000.0));
+ }
+
+ g_free(tmp);
+ g_free(name);
+ g_free(path_sensor);
+ g_free(mon);
+ }
+
+ sensors = g_strconcat(sensors, "[Voltage Values]\n", NULL);
+ for (count = 0; ; count++) {
+ path_sensor = g_strdup_printf("%sin%d_input", path_hwmon, count);
+ if (!g_file_get_contents(path_sensor, &tmp, NULL, NULL)) {
+ g_free(path_sensor);
+ break;
+ }
+
+
+ mon = g_strdup_printf("in%d", count);
+ name = get_sensor_label(mon);
+ if (!g_str_equal(name, "ignore")) {
+ sensors = g_strdup_printf("%s%s=%.3fV\n",
+ sensors, name,
+ adjust_sensor(mon, atof(tmp) / 1000.0));
+ }
+
+ g_free(tmp);
+ g_free(mon);
+ g_free(name);
+ g_free(path_sensor);
+ }
+
+ g_free(path_hwmon);
+ g_free(driver);
+ path_hwmon = g_strdup_printf("/sys/class/hwmon/hwmon%d/device/", ++hwmon);
+ }
+
+ g_free(path_hwmon);
+}
+
diff --git a/arch/linux/common/storage.h b/arch/linux/common/storage.h
new file mode 100644
index 00000000..4fb682a9
--- /dev/null
+++ b/arch/linux/common/storage.h
@@ -0,0 +1,268 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static gchar *storage_icons = "";
+
+static gboolean
+remove_scsi_devices(gpointer key, gpointer value, gpointer data)
+{
+ if (!strncmp((gchar *) key, "SCSI", 4)) {
+ g_free((gchar *) key);
+ g_free((GtkTreeIter *) value);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* SCSI support by Pascal F.Martin <pascalmartin@earthlink.net> */
+void
+scan_scsi(void)
+{
+ FILE *proc_scsi;
+ gchar buffer[256], *buf;
+ gint n = 0;
+ gint scsi_controller;
+ gint scsi_channel;
+ gint scsi_id;
+ gint scsi_lun;
+ gchar *vendor = NULL, *revision = NULL, *model = NULL;
+
+ /* remove old devices from global device table */
+ g_hash_table_foreach_remove(devices, remove_scsi_devices, NULL);
+
+ if (!g_file_test("/proc/scsi/scsi", G_FILE_TEST_EXISTS))
+ return;
+
+ storage_list = g_strconcat(storage_list, "\n[SCSI Disks]\n", NULL);
+
+ proc_scsi = fopen("/proc/scsi/scsi", "r");
+ while (fgets(buffer, 256, proc_scsi)) {
+ buf = g_strstrip(buffer);
+ if (!strncmp(buf, "Host: scsi", 10)) {
+ sscanf(buf,
+ "Host: scsi%d Channel: %d Id: %d Lun: %d",
+ &scsi_controller, &scsi_channel, &scsi_id, &scsi_lun);
+
+ n++;
+ } else if (!strncmp(buf, "Vendor: ", 8)) {
+ char *p;
+ char *rev = strstr(buf, "Rev: ");
+
+ model = strstr(buf, "Model: ");
+
+ if (model == NULL) {
+ model = buf + strlen(buf);
+ }
+ p = model;
+ while (*(--p) == ' ');
+ *(++p) = 0;
+ vendor = g_strdup(buf + 8);
+
+ if (rev != NULL) {
+ revision = g_strdup(rev + 5);
+ } else {
+ rev = model + strlen(model);
+ }
+ p = rev;
+ while (*(--p) == ' ');
+ *(++p) = 0;
+ model = g_strdup_printf("%s %s", vendor, model + 7);
+
+ } else if (!strncmp(buf, "Type: ", 8)) {
+ char *p = strstr(buf, "ANSI SCSI revi");
+ gchar *type = NULL, *icon = NULL;
+
+ if (p != NULL) {
+ while (*(--p) == ' ');
+ *(++p) = 0;
+
+ static struct {
+ char *type;
+ char *label;
+ char *icon;
+ } type2icon[] = {
+ { "Direct-Access", "Disk", "hdd"},
+ { "Sequential-Access", "Tape", "tape"},
+ { "Printer", "Printer", "lpr"},
+ { "WORM", "CD-ROM", "cd"},
+ { "CD-ROM", "CD-ROM", "cd"},
+ { "Scanner", "Scanner", "scanner"},
+ { NULL, "Generic", "scsi"}
+ };
+ int i;
+
+ for (i = 0; type2icon[i].type != NULL; i++)
+ if (!strcmp(buf + 8, type2icon[i].type))
+ break;
+
+ type = type2icon[i].label;
+ icon = type2icon[i].icon;
+ }
+
+ gchar *devid = g_strdup_printf("SCSI%d", n);
+ storage_list = g_strdup_printf("%s$%s$%s=\n", storage_list, devid, model);
+ storage_icons = g_strdup_printf("%sIcon$%s$%s=%s.png\n", storage_icons, devid, model, icon);
+
+ gchar *strhash = g_strdup_printf("[Device Information]\n"
+ "Model=%s\n"
+ "Type=%s\n"
+ "Revision=%s\n"
+ "[SCSI Controller]\n"
+ "Controller=scsi%d\n"
+ "Channel=%d\n"
+ "ID=%d\n" "LUN=%d\n",
+ model,
+ type,
+ revision,
+ scsi_controller,
+ scsi_channel,
+ scsi_id,
+ scsi_lun);
+ g_hash_table_insert(devices, devid, strhash);
+
+ g_free(model);
+ g_free(revision);
+ g_free(vendor);
+ }
+ }
+ fclose(proc_scsi);
+}
+
+static gboolean
+remove_ide_devices(gpointer key, gpointer value, gpointer data)
+{
+ if (!strncmp((gchar *) key, "IDE", 3)) {
+ g_free((gchar *) key);
+ g_free((gchar *) value);
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+void
+scan_ide(void)
+{
+ FILE *proc_ide;
+ gchar *device, iface, *model, *media, *pgeometry = NULL, *lgeometry =
+ NULL;
+ gint n = 0, i = 0, cache;
+
+ /* remove old devices from global device table */
+ g_hash_table_foreach_remove(devices, remove_ide_devices, NULL);
+
+ storage_list = g_strdup_printf("%s\n[IDE Disks]\n", storage_list);
+
+ iface = 'a';
+ for (i = 0; i <= 16; i++) {
+ device = g_strdup_printf("/proc/ide/hd%c/model", iface);
+ if (g_file_test(device, G_FILE_TEST_EXISTS)) {
+ gchar buf[64];
+
+ cache = 0;
+
+ proc_ide = fopen(device, "r");
+ fgets(buf, 64, proc_ide);
+ fclose(proc_ide);
+
+ buf[strlen(buf) - 1] = 0;
+
+ 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;
+
+ media = g_strdup(buf);
+
+ g_free(device);
+
+ device = g_strdup_printf("/proc/ide/hd%c/cache", iface);
+ if (g_file_test(device, G_FILE_TEST_EXISTS)) {
+ proc_ide = fopen(device, "r");
+ fscanf(proc_ide, "%d", &cache);
+ fclose(proc_ide);
+ }
+ g_free(device);
+
+ device = g_strdup_printf("/proc/ide/hd%c/geometry", iface);
+ if (g_file_test(device, G_FILE_TEST_EXISTS)) {
+ gchar *tmp;
+
+ proc_ide = fopen(device, "r");
+
+ fgets(buf, 64, proc_ide);
+ for (tmp = buf; *tmp; tmp++) {
+ if (*tmp >= '0' && *tmp <= '9')
+ break;
+ }
+
+ pgeometry = g_strdup(g_strstrip(tmp));
+
+ fgets(buf, 64, proc_ide);
+ for (tmp = buf; *tmp; tmp++) {
+ if (*tmp >= '0' && *tmp <= '9')
+ break;
+ }
+ lgeometry = g_strdup(g_strstrip(tmp));
+
+ fclose(proc_ide);
+ }
+ g_free(device);
+
+ n++;
+
+ gchar *devid = g_strdup_printf("IDE%d", n);
+
+ storage_list = g_strdup_printf("%s$%s$%s=\n", storage_list,
+ devid, model);
+ storage_icons = g_strdup_printf("%sIcon$%s$%s=%s.png\n", storage_icons, devid,
+ model, g_str_equal(media, "cdrom") ? \
+ "cdrom" : "hdd");
+
+ gchar *strhash = g_strdup_printf("[Device Information]\n"
+ "Model=%s\n"
+ "Device Name=hd%c\n"
+ "Media=%s\n" "Cache=%dkb\n",
+ model, iface, media, cache);
+ if (pgeometry && lgeometry)
+ strhash = g_strdup_printf("%s[Geometry]\n"
+ "Physical=%s\n"
+ "Logical=%s\n",
+ strhash, pgeometry, lgeometry);
+
+ g_hash_table_insert(devices, devid, strhash);
+
+ g_free(model);
+ model = "";
+
+ g_free(pgeometry);
+ pgeometry = NULL;
+ g_free(lgeometry);
+ lgeometry = NULL;
+ } else
+ g_free(device);
+
+ iface++;
+ }
+}
diff --git a/arch/linux/common/uptime.h b/arch/linux/common/uptime.h
new file mode 100644
index 00000000..cf339bf3
--- /dev/null
+++ b/arch/linux/common/uptime.h
@@ -0,0 +1,75 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static UptimeInfo *
+computer_get_uptime(void)
+{
+ UptimeInfo *ui = g_new0(UptimeInfo, 1);
+ FILE *procuptime;
+ gulong minutes;
+
+ if ((procuptime = fopen("/proc/uptime", "r")) != NULL) {
+ fscanf(procuptime, "%lu", &minutes);
+ ui->minutes = minutes / 60;
+ fclose(procuptime);
+ } else {
+ return NULL;
+ }
+
+ ui->hours = ui->minutes / 60;
+ ui->minutes %= 60;
+ ui->days = ui->hours / 24;
+ ui->hours %= 24;
+
+ return ui;
+}
+
+static gchar *
+computer_get_formatted_uptime()
+{
+ UptimeInfo *ui;
+ gchar *tmp;
+
+ ui = computer_get_uptime();
+
+ /* FIXME: Use ngettext */
+#define plural(x) ((x > 1) ? "s" : "")
+
+
+ if (ui->days < 1) {
+ if (ui->hours < 1) {
+ tmp =
+ g_strdup_printf("%d minute%s", ui->minutes,
+ plural(ui->minutes));
+ } else {
+ tmp =
+ g_strdup_printf("%d hour%s, %d minute%s", ui->hours,
+ plural(ui->hours), ui->minutes,
+ plural(ui->minutes));
+ }
+ } else {
+ tmp =
+ g_strdup_printf("%d day%s, %d hour%s and %d minute%s",
+ ui->days, plural(ui->days), ui->hours,
+ plural(ui->hours), ui->minutes,
+ plural(ui->minutes));
+ }
+
+ g_free(ui);
+ return tmp;
+}
diff --git a/arch/linux/common/usb.h b/arch/linux/common/usb.h
new file mode 100644
index 00000000..a52be2cb
--- /dev/null
+++ b/arch/linux/common/usb.h
@@ -0,0 +1,132 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static gboolean
+remove_usb_devices(gpointer key, gpointer value, gpointer data)
+{
+ if (!strncmp((gchar *) key, "USB", 3)) {
+ GtkTreeIter *iter = (GtkTreeIter *) data;
+
+ g_free((gchar *) value);
+ g_free(iter);
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gchar *usb_list = NULL;
+void
+scan_usb(void)
+{
+ FILE *dev;
+ gchar buffer[128];
+ gchar *tmp, *manuf = NULL, *product = NULL, *mxpwr;
+ gint bus, level, port, classid, trash;
+ gint vendor, prodid;
+ gfloat ver, rev, speed;
+ int n = 0;
+
+ dev = fopen("/proc/bus/usb/devices", "r");
+ if (!dev)
+ return;
+
+ if (usb_list) {
+ g_hash_table_foreach_remove(devices, remove_usb_devices, NULL);
+ g_free(usb_list);
+ }
+ usb_list = g_strdup("");
+
+ while (fgets(buffer, 128, dev)) {
+ tmp = buffer;
+
+ switch (*tmp) {
+ case 'T':
+ sscanf(tmp,
+ "T: Bus=%d Lev=%d Prnt=%d Port=%d Cnt=%d Dev#=%d Spd=%f",
+ &bus, &level, &trash, &port, &trash, &trash, &speed);
+ break;
+ case 'D':
+ sscanf(tmp, "D: Ver=%f Cls=%x", &ver, &classid);
+ break;
+ case 'P':
+ sscanf(tmp, "P: Vendor=%x ProdID=%x Rev=%f",
+ &vendor, &prodid, &rev);
+ break;
+ case 'S':
+ if (strstr(tmp, "Manufacturer=")) {
+ manuf = g_strdup(strchr(tmp, '=') + 1);
+ remove_linefeed(manuf);
+ } else if (strstr(tmp, "Product=")) {
+ product = g_strdup(strchr(tmp, '=') + 1);
+ remove_linefeed(product);
+ }
+ break;
+ case 'C':
+ mxpwr = strstr(buffer, "MxPwr=") + 6;
+
+ tmp = g_strdup_printf("USB%d", ++n);
+
+ if (*product == '\0') {
+ g_free(product);
+ if (classid == 9) {
+ product = g_strdup_printf("USB %.2f Hub", ver);
+ } else {
+ product = g_strdup_printf("Unknown USB %.2f Device (class %d)",
+ ver, classid);
+ }
+ }
+
+
+ if (classid == 9) { /* hub */
+ usb_list = g_strdup_printf("%s[%s#%d]\n",
+ usb_list, product, n);
+ } else { /* everything else */
+ usb_list = g_strdup_printf("%s$%s$%s=\n",
+ usb_list, tmp, product);
+
+ gchar *strhash = g_strdup_printf("[Device Information]\n"
+ "Product=%s\n"
+ "Manufacturer=%s\n"
+ "[Port #%d]\n"
+ "Speed=%.2fMbit/s\n"
+ "Max Current=%s\n"
+ "[Misc]\n"
+ "USB Version=%.2f\n"
+ "Revision=%.2f\n"
+ "Class=0x%x\n"
+ "Vendor=0x%x\n"
+ "Product ID=0x%x\n"
+ "Bus=%d\n" "Level=%d\n",
+ product, manuf,
+ port, speed, mxpwr,
+ ver, rev, classid,
+ vendor, prodid, bus, level);
+
+ g_hash_table_insert(devices, tmp, strhash);
+ }
+
+ g_free(manuf);
+ g_free(product);
+ manuf = g_strdup("");
+ product = g_strdup("");
+ }
+ }
+
+ fclose(dev);
+}
diff --git a/arch/linux/m68k/alsa.h b/arch/linux/m68k/alsa.h
new file mode 120000
index 00000000..0216845a
--- /dev/null
+++ b/arch/linux/m68k/alsa.h
@@ -0,0 +1 @@
+../../linux/common/alsa.h \ No newline at end of file
diff --git a/arch/linux/m68k/filesystem.h b/arch/linux/m68k/filesystem.h
new file mode 120000
index 00000000..6b325b40
--- /dev/null
+++ b/arch/linux/m68k/filesystem.h
@@ -0,0 +1 @@
+../../linux/common/filesystem.h \ No newline at end of file
diff --git a/arch/linux/m68k/inputdevices.h b/arch/linux/m68k/inputdevices.h
new file mode 120000
index 00000000..b9226a29
--- /dev/null
+++ b/arch/linux/m68k/inputdevices.h
@@ -0,0 +1 @@
+../../linux/common/inputdevices.h \ No newline at end of file
diff --git a/arch/linux/m68k/loadavg.h b/arch/linux/m68k/loadavg.h
new file mode 120000
index 00000000..daaed6d5
--- /dev/null
+++ b/arch/linux/m68k/loadavg.h
@@ -0,0 +1 @@
+../../linux/common/loadavg.h \ No newline at end of file
diff --git a/arch/linux/m68k/memory.h b/arch/linux/m68k/memory.h
new file mode 120000
index 00000000..5ffc013e
--- /dev/null
+++ b/arch/linux/m68k/memory.h
@@ -0,0 +1 @@
+../../linux/common/memory.h \ No newline at end of file
diff --git a/arch/linux/m68k/modules.h b/arch/linux/m68k/modules.h
new file mode 120000
index 00000000..8ce5a808
--- /dev/null
+++ b/arch/linux/m68k/modules.h
@@ -0,0 +1 @@
+../../linux/common/modules.h \ No newline at end of file
diff --git a/arch/linux/m68k/net.h b/arch/linux/m68k/net.h
new file mode 120000
index 00000000..72d77b26
--- /dev/null
+++ b/arch/linux/m68k/net.h
@@ -0,0 +1 @@
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/m68k/os.h b/arch/linux/m68k/os.h
new file mode 120000
index 00000000..ef547be5
--- /dev/null
+++ b/arch/linux/m68k/os.h
@@ -0,0 +1 @@
+../../linux/common/os.h \ No newline at end of file
diff --git a/arch/linux/m68k/pci.h b/arch/linux/m68k/pci.h
new file mode 120000
index 00000000..63760048
--- /dev/null
+++ b/arch/linux/m68k/pci.h
@@ -0,0 +1 @@
+../../linux/common/pci.h \ No newline at end of file
diff --git a/arch/linux/m68k/processor.h b/arch/linux/m68k/processor.h
new file mode 100644
index 00000000..0a1bab62
--- /dev/null
+++ b/arch/linux/m68k/processor.h
@@ -0,0 +1,74 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static Processor *
+computer_get_processor(void)
+{
+ Processor *processor;
+ FILE *cpuinfo;
+ gchar buffer[128];
+
+ cpuinfo = fopen("/proc/cpuinfo", "r");
+ if (!cpuinfo)
+ return NULL;
+
+ processor = g_new0(Processor, 1);
+ while (fgets(buffer, 128, cpuinfo)) {
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+
+ if (tmp[0] && tmp[1]) {
+ tmp[0] = g_strstrip(tmp[0]);
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_str("CPU", processor->model_name);
+ get_float("Clocking", processor->cpu_mhz);
+ get_float("bogomips", processor->bogomips);
+
+ get_str("FPU", processor->has_fpu);
+ }
+ g_strfreev(tmp);
+ }
+
+ gchar *tmp;
+ tmp = g_strconcat("Motorola ", processor->model_name, NULL);
+ g_free(processor->model_name);
+ processor->model_name = tmp;
+
+ fclose(cpuinfo);
+
+ return processor;
+}
+
+static gchar *
+processor_get_info(Processor *processor)
+{
+ return g_strdup_printf("[Processor]\n"
+ "Name=%s\n"
+ "Frequency=%.2fMHz\n"
+ "BogoMips=%.2f\n"
+ "Byte Order=%s\n",
+ processor->model_name,
+ processor->cpu_mhz,
+ processor->bogomips,
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ "Little Endian"
+#else
+ "Big Endian"
+#endif
+ );
+}
diff --git a/arch/linux/m68k/samba.h b/arch/linux/m68k/samba.h
new file mode 120000
index 00000000..9227f722
--- /dev/null
+++ b/arch/linux/m68k/samba.h
@@ -0,0 +1 @@
+../../linux/common/samba.h \ No newline at end of file
diff --git a/arch/linux/m68k/sensors.h b/arch/linux/m68k/sensors.h
new file mode 120000
index 00000000..35e5f37a
--- /dev/null
+++ b/arch/linux/m68k/sensors.h
@@ -0,0 +1 @@
+../../linux/common/sensors.h \ No newline at end of file
diff --git a/arch/linux/m68k/storage.h b/arch/linux/m68k/storage.h
new file mode 120000
index 00000000..55b68de3
--- /dev/null
+++ b/arch/linux/m68k/storage.h
@@ -0,0 +1 @@
+../../linux/common/storage.h \ No newline at end of file
diff --git a/arch/linux/m68k/uptime.h b/arch/linux/m68k/uptime.h
new file mode 120000
index 00000000..78c026ff
--- /dev/null
+++ b/arch/linux/m68k/uptime.h
@@ -0,0 +1 @@
+../../linux/common/uptime.h \ No newline at end of file
diff --git a/arch/linux/m68k/usb.h b/arch/linux/m68k/usb.h
new file mode 120000
index 00000000..8b8fbb5d
--- /dev/null
+++ b/arch/linux/m68k/usb.h
@@ -0,0 +1 @@
+../../linux/common/usb.h \ No newline at end of file
diff --git a/arch/linux/mips/alsa.h b/arch/linux/mips/alsa.h
new file mode 120000
index 00000000..0216845a
--- /dev/null
+++ b/arch/linux/mips/alsa.h
@@ -0,0 +1 @@
+../../linux/common/alsa.h \ No newline at end of file
diff --git a/arch/linux/mips/filesystem.h b/arch/linux/mips/filesystem.h
new file mode 120000
index 00000000..6b325b40
--- /dev/null
+++ b/arch/linux/mips/filesystem.h
@@ -0,0 +1 @@
+../../linux/common/filesystem.h \ No newline at end of file
diff --git a/arch/linux/mips/inputdevices.h b/arch/linux/mips/inputdevices.h
new file mode 120000
index 00000000..b9226a29
--- /dev/null
+++ b/arch/linux/mips/inputdevices.h
@@ -0,0 +1 @@
+../../linux/common/inputdevices.h \ No newline at end of file
diff --git a/arch/linux/mips/loadavg.h b/arch/linux/mips/loadavg.h
new file mode 120000
index 00000000..daaed6d5
--- /dev/null
+++ b/arch/linux/mips/loadavg.h
@@ -0,0 +1 @@
+../../linux/common/loadavg.h \ No newline at end of file
diff --git a/arch/linux/mips/memory.h b/arch/linux/mips/memory.h
new file mode 120000
index 00000000..5ffc013e
--- /dev/null
+++ b/arch/linux/mips/memory.h
@@ -0,0 +1 @@
+../../linux/common/memory.h \ No newline at end of file
diff --git a/arch/linux/mips/modules.h b/arch/linux/mips/modules.h
new file mode 120000
index 00000000..8ce5a808
--- /dev/null
+++ b/arch/linux/mips/modules.h
@@ -0,0 +1 @@
+../../linux/common/modules.h \ No newline at end of file
diff --git a/arch/linux/mips/net.h b/arch/linux/mips/net.h
new file mode 120000
index 00000000..72d77b26
--- /dev/null
+++ b/arch/linux/mips/net.h
@@ -0,0 +1 @@
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/mips/os.h b/arch/linux/mips/os.h
new file mode 120000
index 00000000..ef547be5
--- /dev/null
+++ b/arch/linux/mips/os.h
@@ -0,0 +1 @@
+../../linux/common/os.h \ No newline at end of file
diff --git a/arch/linux/mips/pci.h b/arch/linux/mips/pci.h
new file mode 120000
index 00000000..63760048
--- /dev/null
+++ b/arch/linux/mips/pci.h
@@ -0,0 +1 @@
+../../linux/common/pci.h \ No newline at end of file
diff --git a/arch/linux/mips/processor.h b/arch/linux/mips/processor.h
new file mode 100644
index 00000000..8be922f9
--- /dev/null
+++ b/arch/linux/mips/processor.h
@@ -0,0 +1,70 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static Processor *
+computer_get_processor(void)
+{
+ Processor *processor;
+ FILE *cpuinfo;
+ gchar buffer[128];
+
+ cpuinfo = fopen("/proc/cpuinfo", "r");
+ if (!cpuinfo)
+ return NULL;
+
+ processor = g_new0(Processor, 1);
+ while (fgets(buffer, 128, cpuinfo)) {
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+
+ if (tmp[0] && tmp[1]) {
+ tmp[0] = g_strstrip(tmp[0]);
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_str("system type", processor->model_name);
+ get_str("cpu model", processor->vendor_id);
+ get_float("cpu MHz", processor->cpu_mhz);
+ get_float("BogoMIPS", processor->bogomips);
+ }
+ g_strfreev(tmp);
+ }
+
+ fclose(cpuinfo);
+
+ return processor;
+}
+
+static gchar *
+processor_get_info(Processor *processor)
+{
+ return g_strdup_printf("[Processor]\n"
+ "System Type=%s\n"
+ "CPU Model=%s\n"
+ "Frequency=%.2fMHz\n"
+ "BogoMIPS=%.2f\n"
+ "Byte Order=%s\n",
+ processor->model_name,
+ processor->vendor_id,
+ processor->cpu_mhz,
+ processor->bogomips,
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ "Little Endian"
+#else
+ "Big Endian"
+#endif
+ );
+}
diff --git a/arch/linux/mips/samba.h b/arch/linux/mips/samba.h
new file mode 120000
index 00000000..9227f722
--- /dev/null
+++ b/arch/linux/mips/samba.h
@@ -0,0 +1 @@
+../../linux/common/samba.h \ No newline at end of file
diff --git a/arch/linux/mips/sensors.h b/arch/linux/mips/sensors.h
new file mode 120000
index 00000000..35e5f37a
--- /dev/null
+++ b/arch/linux/mips/sensors.h
@@ -0,0 +1 @@
+../../linux/common/sensors.h \ No newline at end of file
diff --git a/arch/linux/mips/storage.h b/arch/linux/mips/storage.h
new file mode 120000
index 00000000..55b68de3
--- /dev/null
+++ b/arch/linux/mips/storage.h
@@ -0,0 +1 @@
+../../linux/common/storage.h \ No newline at end of file
diff --git a/arch/linux/mips/uptime.h b/arch/linux/mips/uptime.h
new file mode 120000
index 00000000..78c026ff
--- /dev/null
+++ b/arch/linux/mips/uptime.h
@@ -0,0 +1 @@
+../../linux/common/uptime.h \ No newline at end of file
diff --git a/arch/linux/mips/usb.h b/arch/linux/mips/usb.h
new file mode 120000
index 00000000..8b8fbb5d
--- /dev/null
+++ b/arch/linux/mips/usb.h
@@ -0,0 +1 @@
+../../linux/common/usb.h \ No newline at end of file
diff --git a/arch/linux/parisc/alsa.h b/arch/linux/parisc/alsa.h
new file mode 120000
index 00000000..0216845a
--- /dev/null
+++ b/arch/linux/parisc/alsa.h
@@ -0,0 +1 @@
+../../linux/common/alsa.h \ No newline at end of file
diff --git a/arch/linux/parisc/filesystem.h b/arch/linux/parisc/filesystem.h
new file mode 120000
index 00000000..6b325b40
--- /dev/null
+++ b/arch/linux/parisc/filesystem.h
@@ -0,0 +1 @@
+../../linux/common/filesystem.h \ No newline at end of file
diff --git a/arch/linux/parisc/inputdevices.h b/arch/linux/parisc/inputdevices.h
new file mode 120000
index 00000000..b9226a29
--- /dev/null
+++ b/arch/linux/parisc/inputdevices.h
@@ -0,0 +1 @@
+../../linux/common/inputdevices.h \ No newline at end of file
diff --git a/arch/linux/parisc/loadavg.h b/arch/linux/parisc/loadavg.h
new file mode 120000
index 00000000..daaed6d5
--- /dev/null
+++ b/arch/linux/parisc/loadavg.h
@@ -0,0 +1 @@
+../../linux/common/loadavg.h \ No newline at end of file
diff --git a/arch/linux/parisc/memory.h b/arch/linux/parisc/memory.h
new file mode 120000
index 00000000..5ffc013e
--- /dev/null
+++ b/arch/linux/parisc/memory.h
@@ -0,0 +1 @@
+../../linux/common/memory.h \ No newline at end of file
diff --git a/arch/linux/parisc/modules.h b/arch/linux/parisc/modules.h
new file mode 120000
index 00000000..8ce5a808
--- /dev/null
+++ b/arch/linux/parisc/modules.h
@@ -0,0 +1 @@
+../../linux/common/modules.h \ No newline at end of file
diff --git a/arch/linux/parisc/net.h b/arch/linux/parisc/net.h
new file mode 120000
index 00000000..72d77b26
--- /dev/null
+++ b/arch/linux/parisc/net.h
@@ -0,0 +1 @@
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/parisc/os.h b/arch/linux/parisc/os.h
new file mode 120000
index 00000000..ef547be5
--- /dev/null
+++ b/arch/linux/parisc/os.h
@@ -0,0 +1 @@
+../../linux/common/os.h \ No newline at end of file
diff --git a/arch/linux/parisc/pci.h b/arch/linux/parisc/pci.h
new file mode 120000
index 00000000..63760048
--- /dev/null
+++ b/arch/linux/parisc/pci.h
@@ -0,0 +1 @@
+../../linux/common/pci.h \ No newline at end of file
diff --git a/arch/linux/parisc/processor.h b/arch/linux/parisc/processor.h
new file mode 100644
index 00000000..41b628f4
--- /dev/null
+++ b/arch/linux/parisc/processor.h
@@ -0,0 +1,82 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static Processor *
+computer_get_processor(void)
+{
+ Processor *processor;
+ FILE *cpuinfo;
+ gchar buffer[128];
+
+ cpuinfo = fopen("/proc/cpuinfo", "r");
+ if (!cpuinfo)
+ return NULL;
+
+ processor = g_new0(Processor, 1);
+ while (fgets(buffer, 128, cpuinfo)) {
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+
+ if (tmp[0] && tmp[1]) {
+ tmp[0] = g_strstrip(tmp[0]);
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_str("cpu family", processor->model_name);
+ get_str("cpu", processor->vendor_id);
+ get_float("cpu MHz", processor->cpu_mhz);
+ get_float("bogomips", processor->bogomips);
+
+ get_str("model name", processor->strmodel);
+
+ get_int("I-cache", processor->has_fpu);
+ get_int("D-cache", processor->flags);
+
+ }
+ g_strfreev(tmp);
+ }
+
+ fclose(cpuinfo);
+
+ return processor;
+}
+
+static gchar *
+processor_get_info(Processor *processor)
+{
+ return g_strdup_printf("[Processor]\n"
+ "CPU Family=%s\n"
+ "CPU=%s\n"
+ "Frequency=%.2fMHz\n"
+ "Bogomips=%.2f\n"
+ "Model Name=%s\n"
+ "Byte Order=%s\n"
+ "[Cache]\n"
+ "I-Cache=%s\n"
+ "D-Cache=%s\n",
+ processor->model_name,
+ processor->vendor_id,
+ processor->cpu_mhz,
+ processor->bogomips,
+ processor->strmodel,
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ "Little Endian",
+#else
+ "Big Endian",
+#endif
+ processor->has_fpu,
+ processor->flags);
+}
diff --git a/arch/linux/parisc/samba.h b/arch/linux/parisc/samba.h
new file mode 120000
index 00000000..9227f722
--- /dev/null
+++ b/arch/linux/parisc/samba.h
@@ -0,0 +1 @@
+../../linux/common/samba.h \ No newline at end of file
diff --git a/arch/linux/parisc/sensors.h b/arch/linux/parisc/sensors.h
new file mode 120000
index 00000000..35e5f37a
--- /dev/null
+++ b/arch/linux/parisc/sensors.h
@@ -0,0 +1 @@
+../../linux/common/sensors.h \ No newline at end of file
diff --git a/arch/linux/parisc/storage.h b/arch/linux/parisc/storage.h
new file mode 120000
index 00000000..55b68de3
--- /dev/null
+++ b/arch/linux/parisc/storage.h
@@ -0,0 +1 @@
+../../linux/common/storage.h \ No newline at end of file
diff --git a/arch/linux/parisc/uptime.h b/arch/linux/parisc/uptime.h
new file mode 120000
index 00000000..78c026ff
--- /dev/null
+++ b/arch/linux/parisc/uptime.h
@@ -0,0 +1 @@
+../../linux/common/uptime.h \ No newline at end of file
diff --git a/arch/linux/parisc/usb.h b/arch/linux/parisc/usb.h
new file mode 120000
index 00000000..8b8fbb5d
--- /dev/null
+++ b/arch/linux/parisc/usb.h
@@ -0,0 +1 @@
+../../linux/common/usb.h \ No newline at end of file
diff --git a/arch/linux/ppc/alsa.h b/arch/linux/ppc/alsa.h
new file mode 120000
index 00000000..0216845a
--- /dev/null
+++ b/arch/linux/ppc/alsa.h
@@ -0,0 +1 @@
+../../linux/common/alsa.h \ No newline at end of file
diff --git a/arch/linux/ppc/filesystem.h b/arch/linux/ppc/filesystem.h
new file mode 120000
index 00000000..6b325b40
--- /dev/null
+++ b/arch/linux/ppc/filesystem.h
@@ -0,0 +1 @@
+../../linux/common/filesystem.h \ No newline at end of file
diff --git a/arch/linux/ppc/inputdevices.h b/arch/linux/ppc/inputdevices.h
new file mode 120000
index 00000000..b9226a29
--- /dev/null
+++ b/arch/linux/ppc/inputdevices.h
@@ -0,0 +1 @@
+../../linux/common/inputdevices.h \ No newline at end of file
diff --git a/arch/linux/ppc/loadavg.h b/arch/linux/ppc/loadavg.h
new file mode 120000
index 00000000..daaed6d5
--- /dev/null
+++ b/arch/linux/ppc/loadavg.h
@@ -0,0 +1 @@
+../../linux/common/loadavg.h \ No newline at end of file
diff --git a/arch/linux/ppc/memory.h b/arch/linux/ppc/memory.h
new file mode 120000
index 00000000..5ffc013e
--- /dev/null
+++ b/arch/linux/ppc/memory.h
@@ -0,0 +1 @@
+../../linux/common/memory.h \ No newline at end of file
diff --git a/arch/linux/ppc/modules.h b/arch/linux/ppc/modules.h
new file mode 120000
index 00000000..8ce5a808
--- /dev/null
+++ b/arch/linux/ppc/modules.h
@@ -0,0 +1 @@
+../../linux/common/modules.h \ No newline at end of file
diff --git a/arch/linux/ppc/net.h b/arch/linux/ppc/net.h
new file mode 120000
index 00000000..72d77b26
--- /dev/null
+++ b/arch/linux/ppc/net.h
@@ -0,0 +1 @@
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/ppc/os.h b/arch/linux/ppc/os.h
new file mode 120000
index 00000000..ef547be5
--- /dev/null
+++ b/arch/linux/ppc/os.h
@@ -0,0 +1 @@
+../../linux/common/os.h \ No newline at end of file
diff --git a/arch/linux/ppc/pci.h b/arch/linux/ppc/pci.h
new file mode 120000
index 00000000..63760048
--- /dev/null
+++ b/arch/linux/ppc/pci.h
@@ -0,0 +1 @@
+../../linux/common/pci.h \ No newline at end of file
diff --git a/arch/linux/ppc/processor.h b/arch/linux/ppc/processor.h
new file mode 100644
index 00000000..f4ff5b0e
--- /dev/null
+++ b/arch/linux/ppc/processor.h
@@ -0,0 +1,78 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static Processor *
+computer_get_processor(void)
+{
+ Processor *processor;
+ FILE *cpuinfo;
+ gchar buffer[128];
+
+ cpuinfo = fopen("/proc/cpuinfo", "r");
+ if (!cpuinfo)
+ return NULL;
+
+ processor = g_new0(Processor, 1);
+ while (fgets(buffer, 128, cpuinfo)) {
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+
+ if (tmp[0] && tmp[1]) {
+ tmp[0] = g_strstrip(tmp[0]);
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_str("cpu", processor->model_name);
+ get_str("machine", processor->vendor_id);
+ get_int("L2 cache", processor->cache_size);
+ get_float("clock", processor->cpu_mhz);
+ get_float("bogomips", processor->bogomips);
+
+ }
+ g_strfreev(tmp);
+ }
+
+ gchar *tmp = g_strconcat("PowerPC ", processor->model_name, NULL);
+ g_free(processor->model_name);
+ processor->model_name = tmp;
+
+ fclose(cpuinfo);
+
+ return processor;
+}
+
+static gchar *
+processor_get_info(Processor *processor)
+{
+ return g_strdup_printf("[Processor]\n"
+ "Machine=%s\n"
+ "CPU=%s\n"
+ "L2 Cache=%.2f\n"
+ "Frequency=%.2fMHz\n"
+ "BogoMips=%.2f"
+ "Byte Order=%s\n",
+ processor->vendor_id,
+ processor->model_name,
+ processor->cache_size,
+ processor->cpu_mhz,
+ processor->bogomips,
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ "Little Endian"
+#else
+ "Big Endian"
+#endif
+ );
+}
diff --git a/arch/linux/ppc/samba.h b/arch/linux/ppc/samba.h
new file mode 120000
index 00000000..9227f722
--- /dev/null
+++ b/arch/linux/ppc/samba.h
@@ -0,0 +1 @@
+../../linux/common/samba.h \ No newline at end of file
diff --git a/arch/linux/ppc/sensors.h b/arch/linux/ppc/sensors.h
new file mode 120000
index 00000000..35e5f37a
--- /dev/null
+++ b/arch/linux/ppc/sensors.h
@@ -0,0 +1 @@
+../../linux/common/sensors.h \ No newline at end of file
diff --git a/arch/linux/ppc/storage.h b/arch/linux/ppc/storage.h
new file mode 120000
index 00000000..55b68de3
--- /dev/null
+++ b/arch/linux/ppc/storage.h
@@ -0,0 +1 @@
+../../linux/common/storage.h \ No newline at end of file
diff --git a/arch/linux/ppc/uptime.h b/arch/linux/ppc/uptime.h
new file mode 120000
index 00000000..78c026ff
--- /dev/null
+++ b/arch/linux/ppc/uptime.h
@@ -0,0 +1 @@
+../../linux/common/uptime.h \ No newline at end of file
diff --git a/arch/linux/ppc/usb.h b/arch/linux/ppc/usb.h
new file mode 120000
index 00000000..8b8fbb5d
--- /dev/null
+++ b/arch/linux/ppc/usb.h
@@ -0,0 +1 @@
+../../linux/common/usb.h \ No newline at end of file
diff --git a/arch/linux/sparc/alsa.h b/arch/linux/sparc/alsa.h
new file mode 120000
index 00000000..0216845a
--- /dev/null
+++ b/arch/linux/sparc/alsa.h
@@ -0,0 +1 @@
+../../linux/common/alsa.h \ No newline at end of file
diff --git a/arch/linux/sparc/filesystem.h b/arch/linux/sparc/filesystem.h
new file mode 120000
index 00000000..6b325b40
--- /dev/null
+++ b/arch/linux/sparc/filesystem.h
@@ -0,0 +1 @@
+../../linux/common/filesystem.h \ No newline at end of file
diff --git a/arch/linux/sparc/inputdevices.h b/arch/linux/sparc/inputdevices.h
new file mode 120000
index 00000000..b9226a29
--- /dev/null
+++ b/arch/linux/sparc/inputdevices.h
@@ -0,0 +1 @@
+../../linux/common/inputdevices.h \ No newline at end of file
diff --git a/arch/linux/sparc/loadavg.h b/arch/linux/sparc/loadavg.h
new file mode 120000
index 00000000..daaed6d5
--- /dev/null
+++ b/arch/linux/sparc/loadavg.h
@@ -0,0 +1 @@
+../../linux/common/loadavg.h \ No newline at end of file
diff --git a/arch/linux/sparc/memory.h b/arch/linux/sparc/memory.h
new file mode 120000
index 00000000..5ffc013e
--- /dev/null
+++ b/arch/linux/sparc/memory.h
@@ -0,0 +1 @@
+../../linux/common/memory.h \ No newline at end of file
diff --git a/arch/linux/sparc/modules.h b/arch/linux/sparc/modules.h
new file mode 120000
index 00000000..8ce5a808
--- /dev/null
+++ b/arch/linux/sparc/modules.h
@@ -0,0 +1 @@
+../../linux/common/modules.h \ No newline at end of file
diff --git a/arch/linux/sparc/net.h b/arch/linux/sparc/net.h
new file mode 120000
index 00000000..72d77b26
--- /dev/null
+++ b/arch/linux/sparc/net.h
@@ -0,0 +1 @@
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/sparc/os.h b/arch/linux/sparc/os.h
new file mode 120000
index 00000000..ef547be5
--- /dev/null
+++ b/arch/linux/sparc/os.h
@@ -0,0 +1 @@
+../../linux/common/os.h \ No newline at end of file
diff --git a/arch/linux/sparc/pci.h b/arch/linux/sparc/pci.h
new file mode 120000
index 00000000..63760048
--- /dev/null
+++ b/arch/linux/sparc/pci.h
@@ -0,0 +1 @@
+../../linux/common/pci.h \ No newline at end of file
diff --git a/arch/linux/sparc/processor.h b/arch/linux/sparc/processor.h
new file mode 100644
index 00000000..211ea56b
--- /dev/null
+++ b/arch/linux/sparc/processor.h
@@ -0,0 +1,59 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static Processor *
+computer_get_processor(void)
+{
+ Processor *processor;
+ FILE *cpuinfo;
+ gchar buffer[128];
+
+ cpuinfo = fopen("/proc/cpuinfo", "r");
+ if (!cpuinfo)
+ return NULL;
+
+ processor = g_new0(Processor, 1);
+ while (fgets(buffer, 128, cpuinfo)) {
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+
+ if (tmp[0] && tmp[1]) {
+ tmp[0] = g_strstrip(tmp[0]);
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_str("cpu", processor->model_name);
+ get_str("fpu", processor->has_fpu);
+ }
+ g_strfreev(tmp);
+ }
+
+ get_processor_strfamily(processor);
+
+ fclose(cpuinfo);
+
+ return processor;
+}
+
+static gchar *
+processor_get_info(Processor *processor)
+{
+ return g_strdup_printf("[Processor]\n"
+ "CPU=%s\n"
+ "FPU=%s\n",
+ processor->model_name,
+ processor->has_fpu);
+}
diff --git a/arch/linux/sparc/samba.h b/arch/linux/sparc/samba.h
new file mode 120000
index 00000000..9227f722
--- /dev/null
+++ b/arch/linux/sparc/samba.h
@@ -0,0 +1 @@
+../../linux/common/samba.h \ No newline at end of file
diff --git a/arch/linux/sparc/sensors.h b/arch/linux/sparc/sensors.h
new file mode 120000
index 00000000..35e5f37a
--- /dev/null
+++ b/arch/linux/sparc/sensors.h
@@ -0,0 +1 @@
+../../linux/common/sensors.h \ No newline at end of file
diff --git a/arch/linux/sparc/storage.h b/arch/linux/sparc/storage.h
new file mode 120000
index 00000000..55b68de3
--- /dev/null
+++ b/arch/linux/sparc/storage.h
@@ -0,0 +1 @@
+../../linux/common/storage.h \ No newline at end of file
diff --git a/arch/linux/sparc/uptime.h b/arch/linux/sparc/uptime.h
new file mode 120000
index 00000000..78c026ff
--- /dev/null
+++ b/arch/linux/sparc/uptime.h
@@ -0,0 +1 @@
+../../linux/common/uptime.h \ No newline at end of file
diff --git a/arch/linux/sparc/usb.h b/arch/linux/sparc/usb.h
new file mode 120000
index 00000000..8b8fbb5d
--- /dev/null
+++ b/arch/linux/sparc/usb.h
@@ -0,0 +1 @@
+../../linux/common/usb.h \ No newline at end of file
diff --git a/arch/linux/x86/alsa.h b/arch/linux/x86/alsa.h
new file mode 120000
index 00000000..0216845a
--- /dev/null
+++ b/arch/linux/x86/alsa.h
@@ -0,0 +1 @@
+../../linux/common/alsa.h \ No newline at end of file
diff --git a/arch/linux/x86/filesystem.h b/arch/linux/x86/filesystem.h
new file mode 120000
index 00000000..6b325b40
--- /dev/null
+++ b/arch/linux/x86/filesystem.h
@@ -0,0 +1 @@
+../../linux/common/filesystem.h \ No newline at end of file
diff --git a/arch/linux/x86/inputdevices.h b/arch/linux/x86/inputdevices.h
new file mode 120000
index 00000000..b9226a29
--- /dev/null
+++ b/arch/linux/x86/inputdevices.h
@@ -0,0 +1 @@
+../../linux/common/inputdevices.h \ No newline at end of file
diff --git a/arch/linux/x86/loadavg.h b/arch/linux/x86/loadavg.h
new file mode 120000
index 00000000..daaed6d5
--- /dev/null
+++ b/arch/linux/x86/loadavg.h
@@ -0,0 +1 @@
+../../linux/common/loadavg.h \ No newline at end of file
diff --git a/arch/linux/x86/memory.h b/arch/linux/x86/memory.h
new file mode 120000
index 00000000..5ffc013e
--- /dev/null
+++ b/arch/linux/x86/memory.h
@@ -0,0 +1 @@
+../../linux/common/memory.h \ No newline at end of file
diff --git a/arch/linux/x86/modules.h b/arch/linux/x86/modules.h
new file mode 120000
index 00000000..8ce5a808
--- /dev/null
+++ b/arch/linux/x86/modules.h
@@ -0,0 +1 @@
+../../linux/common/modules.h \ No newline at end of file
diff --git a/arch/linux/x86/net.h b/arch/linux/x86/net.h
new file mode 120000
index 00000000..72d77b26
--- /dev/null
+++ b/arch/linux/x86/net.h
@@ -0,0 +1 @@
+../../linux/common/net.h \ No newline at end of file
diff --git a/arch/linux/x86/os.h b/arch/linux/x86/os.h
new file mode 120000
index 00000000..ef547be5
--- /dev/null
+++ b/arch/linux/x86/os.h
@@ -0,0 +1 @@
+../../linux/common/os.h \ No newline at end of file
diff --git a/arch/linux/x86/pci.h b/arch/linux/x86/pci.h
new file mode 120000
index 00000000..63760048
--- /dev/null
+++ b/arch/linux/x86/pci.h
@@ -0,0 +1 @@
+../../linux/common/pci.h \ No newline at end of file
diff --git a/arch/linux/x86/processor.h b/arch/linux/x86/processor.h
new file mode 100644
index 00000000..571943f6
--- /dev/null
+++ b/arch/linux/x86/processor.h
@@ -0,0 +1,303 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/*
+ * This function is partly based on x86cpucaps
+ * by Osamu Kayasono <jacobi@jcom.home.ne.jp>
+ */
+static void
+get_processor_strfamily(Processor *processor)
+{
+ gint family = processor->family;
+ gint model = processor->model;
+
+ if (g_str_equal(processor->vendor_id, "GenuineIntel")) {
+ if (family == 4) {
+ processor->strmodel = g_strdup("i486 series");
+ } else if (family == 5) {
+ if (model < 4) {
+ processor->strmodel = g_strdup("Pentium Classic");
+ } else {
+ processor->strmodel = g_strdup("Pentium MMX");
+ }
+ } else if (family == 6) {
+ if (model <= 1) {
+ processor->strmodel = g_strdup("Pentium Pro");
+ } else if (model < 7) {
+ processor->strmodel = g_strdup("Pentium II/Pentium II Xeon/Celeron");
+ } else if (model == 9) {
+ processor->strmodel = g_strdup("Pentium M");
+ } else {
+ processor->strmodel = g_strdup("Pentium III/Pentium III Xeon/Celeron");
+ }
+ } else if (family > 6) {
+ processor->strmodel = g_strdup("Pentium 4");
+ } else {
+ processor->strmodel = g_strdup("i386 class");
+ }
+ } else if (g_str_equal(processor->vendor_id, "AuthenticAMD")) {
+ if (family == 4) {
+ if (model <= 9) {
+ processor->strmodel = g_strdup("AMD i80486 series");
+ } else {
+ processor->strmodel = g_strdup("AMD 5x86");
+ }
+ } else if (family == 5) {
+ if (model <= 3) {
+ processor->strmodel = g_strdup("AMD K5");
+ } else if (model <= 7) {
+ processor->strmodel = g_strdup("AMD K6");
+ } else if (model == 8) {
+ processor->strmodel = g_strdup("AMD K6-2");
+ } else if (model == 9) {
+ processor->strmodel = g_strdup("AMD K6-III");
+ } else {
+ processor->strmodel = g_strdup("AMD K6-2+/III+");
+ }
+ } else if (family == 6) {
+ if (model == 1) {
+ processor->strmodel = g_strdup("AMD Athlon (K7");
+ } else if (model == 2) {
+ processor->strmodel = g_strdup("AMD Athlon (K75)");
+ } else if (model == 3) {
+ processor->strmodel = g_strdup("AMD Duron (Spitfire)");
+ } else if (model == 4) {
+ processor->strmodel = g_strdup("AMD Athlon (Thunderbird)");
+ } else if (model == 6) {
+ processor->strmodel = g_strdup("AMD Athlon XP/MP/4 (Palomino)");
+ } else if (model == 7) {
+ processor->strmodel = g_strdup("AMD Duron (Morgan)");
+ } else if (model == 8) {
+ processor->strmodel = g_strdup("AMD Athlon XP/MP (Thoroughbred)");
+ } else if (model == 10) {
+ processor->strmodel = g_strdup("AMD Athlon XP/MP (Barton)");
+ } else {
+ processor->strmodel = g_strdup("AMD Athlon (unknown)");
+ }
+ } else if (family > 6) {
+ processor->strmodel = g_strdup("AMD Opteron/Athlon64/FX");
+ } else {
+ processor->strmodel = g_strdup("AMD i386 class");
+ }
+ } else if (g_str_equal(processor->vendor_id, "CyrixInstead")) {
+ if (family == 4) {
+ processor->strmodel = g_strdup("Cyrix 5x86");
+ } else if (family == 5) {
+ processor->strmodel = g_strdup("Cyrix M1 (6x86)");
+ } else if (family == 6) {
+ if (model == 0) {
+ processor->strmodel = g_strdup("Cyrix M2 (6x86MX)");
+ } else if (model <= 5) {
+ processor->strmodel = g_strdup("VIA Cyrix III (M2 core)");
+ } else if (model == 6) {
+ processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5A)");
+ } else if (model == 7) {
+ processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5B/C)");
+ } else {
+ processor->strmodel = g_strdup("VIA Cyrix III (WinChip C5C-T)");
+ }
+ } else {
+ processor->strmodel = g_strdup("Cyrix i386 class");
+ }
+ } else if (g_str_equal(processor->vendor_id, "CentaurHauls")) {
+ if (family == 5) {
+ if (model <= 4) {
+ processor->strmodel = g_strdup("Centaur WinChip C6");
+ } else if (model <= 8) {
+ processor->strmodel = g_strdup("Centaur WinChip 2");
+ } else {
+ processor->strmodel = g_strdup("Centaur WinChip 2A");
+ }
+ } else {
+ processor->strmodel = g_strdup("Centaur i386 class");
+ }
+ } else if (g_str_equal(processor->vendor_id, "GenuineTMx86")) {
+ processor->strmodel = g_strdup("Transmeta Crusoe TM3x00/5x00");
+ } else {
+ processor->strmodel = g_strdup("Unknown");
+ }
+}
+
+static Processor *
+computer_get_processor(void)
+{
+ Processor *processor;
+ FILE *cpuinfo;
+ gchar buffer[128];
+
+ cpuinfo = fopen("/proc/cpuinfo", "r");
+ if (!cpuinfo)
+ return NULL;
+
+ processor = g_new0(Processor, 1);
+ while (fgets(buffer, 128, cpuinfo)) {
+ gchar **tmp = g_strsplit(buffer, ":", 2);
+
+ if (tmp[0] && tmp[1]) {
+ tmp[0] = g_strstrip(tmp[0]);
+ tmp[1] = g_strstrip(tmp[1]);
+
+ get_str("model name", processor->model_name);
+ get_str("vendor_id", processor->vendor_id);
+ get_str("flags", processor->flags);
+ get_int("cache size", processor->cache_size);
+ get_float("cpu MHz", processor->cpu_mhz);
+ get_float("bogomips", processor->bogomips);
+
+ get_str("fpu", processor->has_fpu);
+
+ get_str("fdiv_bug", processor->bug_fdiv);
+ get_str("hlt_bug", processor->bug_hlt);
+ get_str("f00f_bug", processor->bug_f00f);
+ get_str("coma_bug", processor->bug_coma);
+
+ get_int("model", processor->model);
+ get_int("cpu family", processor->family);
+ get_int("stepping", processor->stepping);
+ }
+ g_strfreev(tmp);
+ }
+
+ get_processor_strfamily(processor);
+
+ fclose(cpuinfo);
+
+ return processor;
+}
+
+static struct {
+ char *name, *meaning;
+} flag_meaning[] = {
+ { "3dnow", "3DNow! Technology" },
+ { "3dnowext", "Extended 3DNow! Technology" },
+ { "fpu", "Floating Point Unit" },
+ { "vme", "Virtual 86 Mode Extension" },
+ { "de", "Debug Extensions - I/O breakpoints" },
+ { "pse", "Page Size Extensions (4MB pages)" },
+ { "tsc", "Time Stamp Counter and RDTSC instruction" },
+ { "msr", "Model Specific Registers" },
+ { "pae", "Physical Address Extensions (36-bit address, 2MB pages)" },
+ { "mce", "Machine Check Architeture" },
+ { "cx8", "CMPXCHG8 instruction" },
+ { "apic", "Advanced Programmable Interrupt Controller" },
+ { "sep", "Fast System Call (SYSENTER/SYSEXIT instructions)" },
+ { "mtrr", "Memory Type Range Registers" },
+ { "pge", "Page Global Enable" },
+ { "mca", "Machine Check Architecture" },
+ { "cmov", "Conditional Move instruction" },
+ { "pat", "Page Attribute Table" },
+ { "pse36", "36bit Page Size Extensions" },
+ { "psn", "96 bit Processor Serial Number" },
+ { "mmx", "MMX technology" },
+ { "mmxext", "Extended MMX Technology" },
+ { "cflush", "Cache Flush" },
+ { "dtes", "Debug Trace Store" },
+ { "fxsr", "FXSAVE and FXRSTOR instructions" },
+ { "kni", "Streaming SIMD instructions" },
+ { "xmm", "Streaming SIMD instructions" },
+ { "ht", "HyperThreading" },
+ { "mp", "Multiprocessing Capable" },
+ { "sse", "SSE instructions" },
+ { "sse2", "SSE2 (WNI) instructions" },
+ { "acc", "Automatic Clock Control" },
+ { "ia64", "IA64 Instructions" },
+ { "syscall", "SYSCALL and SYSEXIT instructions" },
+ { "nx", "No-execute Page Protection" },
+ { "xd", "Execute Disable" },
+ { "clflush", "Cache Line Flush instruction" },
+ { "acpi", "Thermal Monitor and Software Controlled Clock Facilities" },
+ { "dts", "Debug Store" },
+ { "ss", "Self Snoop" },
+ { "tm", "Thermal Monitor" },
+ { "pbe", "Pending Break Enable" },
+ { "pb", "Pending Break Enable" },
+ { NULL, NULL}
+};
+
+gchar *
+processor_get_capabilities_from_flags(gchar * strflags)
+{
+ /* FIXME: * Separate between processor capabilities, additional instructions and whatnot. */
+ gchar **flags, **old;
+ gchar *tmp = "";
+ gint i;
+
+ flags = g_strsplit(strflags, " ", 0);
+ old = flags;
+
+ while (*flags) {
+ gchar *meaning = "";
+ for (i = 0; flag_meaning[i].name != NULL; i++) {
+ if (!strcmp(*flags, flag_meaning[i].name)) {
+ meaning = flag_meaning[i].meaning;
+ break;
+ }
+ }
+
+ tmp = g_strdup_printf("%s%s=%s\n", tmp, *flags, meaning);
+ *flags++;
+ }
+
+ g_strfreev(old);
+ return tmp;
+}
+
+static gchar *
+processor_get_info(Processor *processor)
+{
+ gchar *tmp = processor_get_capabilities_from_flags(processor->
+ flags);
+ gchar *ret = g_strdup_printf("[Processor]\n"
+ "Name=%s\n"
+ "Specification=%s\n"
+ "Family, model, stepping=%d, %d, %d\n"
+ "Vendor=%s\n"
+ "Cache Size=%dkb\n"
+ "Frequency=%.2fMHz\n"
+ "BogoMips=%.2f\n"
+ "Byte Order=%s\n"
+ "[Features]\n"
+ "FDIV Bug=%s\n"
+ "HLT Bug=%s\n"
+ "F00F Bug=%s\n"
+ "Coma Bug=%s\n"
+ "Has FPU=%s\n"
+ "[Capabilities]\n" "%s",
+ processor->strmodel,
+ processor->model_name,
+ processor->family,
+ processor->model,
+ processor->stepping,
+ processor->vendor_id,
+ processor->cache_size,
+ processor->cpu_mhz,
+ processor->bogomips,
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ "Little Endian",
+#else
+ "Big Endian",
+#endif
+ processor->bug_fdiv,
+ processor->bug_hlt,
+ processor->bug_f00f,
+ processor->bug_coma,
+ processor->has_fpu,
+ tmp);
+ g_free(tmp);
+ return ret;
+}
diff --git a/arch/linux/x86/samba.h b/arch/linux/x86/samba.h
new file mode 120000
index 00000000..9227f722
--- /dev/null
+++ b/arch/linux/x86/samba.h
@@ -0,0 +1 @@
+../../linux/common/samba.h \ No newline at end of file
diff --git a/arch/linux/x86/sensors.h b/arch/linux/x86/sensors.h
new file mode 120000
index 00000000..35e5f37a
--- /dev/null
+++ b/arch/linux/x86/sensors.h
@@ -0,0 +1 @@
+../../linux/common/sensors.h \ No newline at end of file
diff --git a/arch/linux/x86/storage.h b/arch/linux/x86/storage.h
new file mode 120000
index 00000000..55b68de3
--- /dev/null
+++ b/arch/linux/x86/storage.h
@@ -0,0 +1 @@
+../../linux/common/storage.h \ No newline at end of file
diff --git a/arch/linux/x86/uptime.h b/arch/linux/x86/uptime.h
new file mode 120000
index 00000000..78c026ff
--- /dev/null
+++ b/arch/linux/x86/uptime.h
@@ -0,0 +1 @@
+../../linux/common/uptime.h \ No newline at end of file
diff --git a/arch/linux/x86/usb.h b/arch/linux/x86/usb.h
new file mode 120000
index 00000000..8b8fbb5d
--- /dev/null
+++ b/arch/linux/x86/usb.h
@@ -0,0 +1 @@
+../../linux/common/usb.h \ No newline at end of file
diff --git a/arch/linux/x86_64 b/arch/linux/x86_64
new file mode 120000
index 00000000..f4bad791
--- /dev/null
+++ b/arch/linux/x86_64
@@ -0,0 +1 @@
+x86 \ No newline at end of file
diff --git a/benchmark.c b/benchmark.c
new file mode 100644
index 00000000..f4cb904c
--- /dev/null
+++ b/benchmark.c
@@ -0,0 +1,163 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <hardinfo.h>
+#include <iconcache.h>
+#include <shell.h>
+#include <config.h>
+
+enum {
+ BENCHMARK_ZLIB,
+ BENCHMARK_FIB,
+ BENCHMARK_MD5,
+ BENCHMARK_SHA1,
+ BENCHMARK_BLOWFISH
+} Entries;
+
+static ModuleEntry hi_entries[] = {
+ {"CPU ZLib", "compress.png"},
+ {"CPU Fibonacci", "module.png"},
+ {"CPU MD5", "module.png"},
+ {"CPU SHA1", "module.png"},
+ {"CPU Blowfish", "blowfish.png"}
+};
+
+static gchar *
+benchmark_include_results(gchar *results, const gchar *benchmark)
+{
+ GKeyFile *conf;
+ gchar **machines;
+ int i;
+
+ conf = g_key_file_new();
+ g_key_file_load_from_file(conf, PREFIX "benchmark.conf", 0, NULL);
+
+ machines = g_key_file_get_keys(conf, benchmark, NULL, NULL);
+ for (i = 0; machines && machines[i]; i++) {
+ gchar *value = g_key_file_get_value(conf, benchmark, machines[i], NULL);
+ results = g_strconcat(results, machines[i], "=", value, "\n", NULL);
+ g_free(value);
+ }
+
+ g_strfreev(machines);
+ g_key_file_free(conf);
+
+ return g_strconcat(results, "[$ShellParam$]\n"
+ "Zebra=1\n", NULL);
+}
+
+#include <arch/common/fib.h>
+#include <arch/common/zlib.h>
+#include <arch/common/md5.h>
+#include <arch/common/sha1.h>
+#include <arch/common/blowfish.h>
+
+static gchar *bench_zlib = NULL,
+ *bench_fib = NULL,
+ *bench_md5 = NULL,
+ *bench_sha1 = NULL,
+ *bench_fish = NULL;
+
+gchar *
+hi_info(gint entry)
+{
+ switch (entry) {
+ case BENCHMARK_ZLIB:
+ if (bench_zlib)
+ return g_strdup(bench_zlib);
+
+ bench_zlib = benchmark_zlib();
+ return g_strdup(bench_zlib);
+
+ case BENCHMARK_BLOWFISH:
+ if (bench_fish)
+ return g_strdup(bench_fish);
+
+ bench_fish = benchmark_fish();
+ return g_strdup(bench_fish);
+
+ case BENCHMARK_MD5:
+ if (bench_md5)
+ return g_strdup(bench_md5);
+
+ bench_md5 = benchmark_md5();
+ return g_strdup(bench_md5);
+
+ case BENCHMARK_FIB:
+ if (bench_fib)
+ return g_strdup(bench_fib);
+
+ bench_fib = benchmark_fib();
+ return g_strdup(bench_fib);
+
+ case BENCHMARK_SHA1:
+ if (bench_sha1)
+ return g_strdup(bench_sha1);
+
+ bench_sha1 = benchmark_sha1();
+ return g_strdup(bench_sha1);
+
+ default:
+ return g_strdup("[Empty]\n");
+ }
+}
+
+void
+hi_reload(gint entry)
+{
+ switch (entry) {
+ case BENCHMARK_ZLIB:
+ if (bench_zlib) g_free(bench_zlib);
+ bench_zlib = benchmark_zlib();
+ break;
+ case BENCHMARK_BLOWFISH:
+ if (bench_fish) g_free(bench_fish);
+ bench_fish = benchmark_fish();
+ break;
+ case BENCHMARK_MD5:
+ if (bench_md5) g_free(bench_md5);
+ bench_md5 = benchmark_md5();
+ break;
+ case BENCHMARK_FIB:
+ if (bench_fib) g_free(bench_fib);
+ bench_fib = benchmark_fib();
+ break;
+ case BENCHMARK_SHA1:
+ if (bench_sha1) g_free(bench_sha1);
+ bench_sha1 = benchmark_sha1();
+ break;
+ }
+}
+
+gint
+hi_n_entries(void)
+{
+ return G_N_ELEMENTS(hi_entries) - 1;
+}
+
+GdkPixbuf *
+hi_icon(gint entry)
+{
+ return icon_cache_get_pixbuf(hi_entries[entry].icon);
+}
+
+gchar *
+hi_name(gint entry)
+{
+ return hi_entries[entry].name;
+}
diff --git a/benchmark.conf b/benchmark.conf
new file mode 100644
index 00000000..2db3f3b8
--- /dev/null
+++ b/benchmark.conf
@@ -0,0 +1,38 @@
+[ZLib]
+# RAM:1024,Board:GA-7NNXP,OS:Linux 2.6.15
+AMD Athlon XP 3200+=4.33
+# RAM:512,Board:Toshiba M45-S165,OS:Linux 2.6.15,Compiler:GCC 3.3.5
+Intel Celeron M 1.5GHz=5.63
+AMD Athlon XP 2200+=7.38
+# RAM:128,Board:XingLing,OS:Linux 2.4.20
+Intel Pentium 200MHz=117.79
+# RAM:1024,Board:GA-7NNXP,OS:Linux 2.6.15
+Valgrind/AMD Athlon XP 3200+=155.91
+# RAM:32,Board:Toshiba Libretto 50CT,OS:Linux 2.4.20
+Intel Pentium 75MHz=173.06
+
+[Fibonacci]
+# RAM:1024,Board:GA-7NNXP,OS:Linux 2.6.15
+AMD Athlon XP 3200+=6.64
+#AMD Athlon XP 2200+=3.54
+# RAM:512,Board:Toshiba M45-S165,OS:Linux 2.6.15,Compiler:GCC 3.3.5
+Intel Celeron M 1.5GHz=11.10
+# RAM:128,Board:XingLing,OS:Linux 2.4.20
+#Intel Pentium 200MHz=35.02
+# RAM:32,Board:Toshiba Libretto 50CT,OS:Linux 2.4.20
+#Intel Pentium 75MHz=110.20
+# RAM:1024,Board:GA-7NNXP,OS:Linux 2.6.15
+#Valgrind/AMD Athlon XP 3200+=164.92
+
+
+[MD5]
+# RAM:512,Board:Toshiba M45-S165,OS:Linux 2.6.15,Compiler:GCC 3.3.5
+Intel Celeron M 1.5GHz=3.42
+# RAM:1024,Board:GA-7NNXP,OS:Linux 2.6.15
+AMD Athlon XP 3200+=5.04
+
+[SHA1]
+# RAM:1024,Board:GA-7NNXP,OS:Linux 2.6.15
+AMD Athlon XP 3200+=4.88
+# RAM:512,Board:Toshiba M45-S165,OS:Linux 2.6.15,Compiler:GCC 3.3.5
+Intel Celeron M 1.5GHz=5.50
diff --git a/benchmark.data b/benchmark.data
new file mode 100644
index 00000000..efb964db
--- /dev/null
+++ b/benchmark.data
Binary files differ
diff --git a/blowfish.c b/blowfish.c
new file mode 100644
index 00000000..929bfb14
--- /dev/null
+++ b/blowfish.c
@@ -0,0 +1,451 @@
+/*
+blowfish.c: C implementation of the Blowfish algorithm.
+
+Copyright (C) 1997 by Paul Kocher
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+
+
+COMMENTS ON USING THIS CODE:
+
+Normal usage is as follows:
+ [1] Allocate a BLOWFISH_CTX. (It may be too big for the stack.)
+ [2] Call Blowfish_Init with a pointer to your BLOWFISH_CTX, a pointer to
+ the key, and the number of bytes in the key.
+ [3] To encrypt a 64-bit block, call Blowfish_Encrypt with a pointer to
+ BLOWFISH_CTX, a pointer to the 32-bit left half of the plaintext
+ and a pointer to the 32-bit right half. The plaintext will be
+ overwritten with the ciphertext.
+ [4] Decryption is the same as encryption except that the plaintext and
+ ciphertext are reversed.
+
+Warning #1: The code does not check key lengths. (Caveat encryptor.)
+Warning #2: Beware that Blowfish keys repeat such that "ab" = "abab".
+Warning #3: It is normally a good idea to zeroize the BLOWFISH_CTX before
+ freeing it.
+Warning #4: Endianness conversions are the responsibility of the caller.
+ (To encrypt bytes on a little-endian platforms, you'll probably want
+ to swap bytes around instead of just casting.)
+Warning #5: Make sure to use a reasonable mode of operation for your
+ application. (If you don't know what CBC mode is, see Warning #7.)
+Warning #6: This code is susceptible to timing attacks.
+Warning #7: Security engineering is risky and non-intuitive. Have someone
+ check your work. If you don't know what you are doing, get help.
+
+
+This is code is fast enough for most applications, but is not optimized for
+speed.
+
+If you require this code under a license other than LGPL, please ask. (I
+can be located using your favorite search engine.) Unfortunately, I do not
+have time to provide unpaid support for everyone who uses this code.
+
+ -- Paul Kocher
+*/
+
+
+#include "blowfish.h"
+
+#define N 16
+
+static const unsigned long ORIG_P[16 + 2] = {
+ 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
+ 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
+ 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
+ 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
+ 0x9216D5D9L, 0x8979FB1BL
+};
+
+static const unsigned long ORIG_S[4][256] = {
+ { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
+ 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
+ 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
+ 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
+ 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
+ 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
+ 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
+ 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
+ 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
+ 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
+ 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
+ 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
+ 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
+ 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
+ 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
+ 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
+ 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
+ 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
+ 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
+ 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
+ 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
+ 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
+ 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
+ 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
+ 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
+ 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
+ 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
+ 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
+ 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
+ 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
+ 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
+ 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
+ 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
+ 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
+ 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
+ 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
+ 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
+ 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
+ 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
+ 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
+ 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
+ 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
+ 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
+ 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
+ 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
+ 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
+ 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
+ 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
+ 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
+ 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
+ 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
+ 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
+ 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
+ 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
+ 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
+ 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
+ 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
+ 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
+ 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
+ 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
+ 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
+ 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
+ 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
+ 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL },
+ { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
+ 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
+ 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
+ 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
+ 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
+ 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
+ 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
+ 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
+ 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
+ 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
+ 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
+ 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
+ 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
+ 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
+ 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
+ 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
+ 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
+ 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
+ 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
+ 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
+ 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
+ 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
+ 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
+ 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
+ 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
+ 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
+ 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
+ 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
+ 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
+ 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
+ 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
+ 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
+ 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
+ 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
+ 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
+ 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
+ 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
+ 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
+ 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
+ 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
+ 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
+ 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
+ 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
+ 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
+ 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
+ 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
+ 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
+ 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
+ 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
+ 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
+ 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
+ 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
+ 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
+ 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
+ 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
+ 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
+ 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
+ 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
+ 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
+ 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
+ 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
+ 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
+ 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
+ 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L },
+ { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
+ 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
+ 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
+ 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
+ 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
+ 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
+ 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
+ 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
+ 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
+ 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
+ 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
+ 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
+ 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
+ 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
+ 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
+ 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
+ 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
+ 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
+ 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
+ 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
+ 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
+ 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
+ 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
+ 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
+ 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
+ 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
+ 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
+ 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
+ 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
+ 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
+ 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
+ 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
+ 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
+ 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
+ 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
+ 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
+ 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
+ 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
+ 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
+ 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
+ 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
+ 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
+ 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
+ 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
+ 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
+ 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
+ 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
+ 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
+ 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
+ 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
+ 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
+ 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
+ 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
+ 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
+ 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
+ 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
+ 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
+ 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
+ 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
+ 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
+ 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
+ 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
+ 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
+ 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L },
+ { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
+ 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
+ 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
+ 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
+ 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
+ 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
+ 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
+ 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
+ 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
+ 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
+ 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
+ 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
+ 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
+ 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
+ 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
+ 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
+ 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
+ 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
+ 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
+ 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
+ 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
+ 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
+ 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
+ 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
+ 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
+ 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
+ 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
+ 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
+ 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
+ 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
+ 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
+ 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
+ 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
+ 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
+ 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
+ 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
+ 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
+ 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
+ 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
+ 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
+ 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
+ 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
+ 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
+ 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
+ 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
+ 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
+ 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
+ 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
+ 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
+ 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
+ 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
+ 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
+ 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
+ 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
+ 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
+ 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
+ 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
+ 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
+ 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
+ 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
+ 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
+ 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
+ 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
+ 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L }
+};
+
+
+static unsigned long F(BLOWFISH_CTX *ctx, unsigned long x) {
+ unsigned short a, b, c, d;
+ unsigned long y;
+
+ d = (unsigned short)(x & 0xFF);
+ x >>= 8;
+ c = (unsigned short)(x & 0xFF);
+ x >>= 8;
+ b = (unsigned short)(x & 0xFF);
+ x >>= 8;
+ a = (unsigned short)(x & 0xFF);
+ y = ctx->S[0][a] + ctx->S[1][b];
+ y = y ^ ctx->S[2][c];
+ y = y + ctx->S[3][d];
+
+ return y;
+}
+
+
+void Blowfish_Encrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr){
+ unsigned long Xl;
+ unsigned long Xr;
+ unsigned long temp;
+ short i;
+
+ Xl = *xl;
+ Xr = *xr;
+
+ for (i = 0; i < N; ++i) {
+ Xl = Xl ^ ctx->P[i];
+ Xr = F(ctx, Xl) ^ Xr;
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+ }
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+
+ Xr = Xr ^ ctx->P[N];
+ Xl = Xl ^ ctx->P[N + 1];
+
+ *xl = Xl;
+ *xr = Xr;
+}
+
+
+void Blowfish_Decrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr){
+ unsigned long Xl;
+ unsigned long Xr;
+ unsigned long temp;
+ short i;
+
+ Xl = *xl;
+ Xr = *xr;
+
+ for (i = N + 1; i > 1; --i) {
+ Xl = Xl ^ ctx->P[i];
+ Xr = F(ctx, Xl) ^ Xr;
+
+ /* Exchange Xl and Xr */
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+ }
+
+ /* Exchange Xl and Xr */
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+
+ Xr = Xr ^ ctx->P[1];
+ Xl = Xl ^ ctx->P[0];
+
+ *xl = Xl;
+ *xr = Xr;
+}
+
+
+void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen) {
+ int i, j, k;
+ unsigned long data, datal, datar;
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 256; j++)
+ ctx->S[i][j] = ORIG_S[i][j];
+ }
+
+ j = 0;
+ for (i = 0; i < N + 2; ++i) {
+ data = 0x00000000;
+ for (k = 0; k < 4; ++k) {
+ data = (data << 8) | key[j];
+ j = j + 1;
+ if (j >= keyLen)
+ j = 0;
+ }
+ ctx->P[i] = ORIG_P[i] ^ data;
+ }
+
+ datal = 0x00000000;
+ datar = 0x00000000;
+
+ for (i = 0; i < N + 2; i += 2) {
+ Blowfish_Encrypt(ctx, &datal, &datar);
+ ctx->P[i] = datal;
+ ctx->P[i + 1] = datar;
+ }
+
+ for (i = 0; i < 4; ++i) {
+ for (j = 0; j < 256; j += 2) {
+ Blowfish_Encrypt(ctx, &datal, &datar);
+ ctx->S[i][j] = datal;
+ ctx->S[i][j + 1] = datar;
+ }
+ }
+}
+
+
diff --git a/blowfish.h b/blowfish.h
new file mode 100644
index 00000000..3f33e945
--- /dev/null
+++ b/blowfish.h
@@ -0,0 +1,33 @@
+/*
+blowfish.h: Header file for blowfish.c
+
+Copyright (C) 1997 by Paul Kocher
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+See blowfish.c for more information about this file.
+*/
+
+
+typedef struct {
+ unsigned long P[16 + 2];
+ unsigned long S[4][256];
+} BLOWFISH_CTX;
+
+void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen);
+void Blowfish_Encrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr);
+void Blowfish_Decrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr);
+
+
+
diff --git a/build-stamp b/build-stamp
deleted file mode 100644
index e69de29b..00000000
--- a/build-stamp
+++ /dev/null
diff --git a/callbacks.c b/callbacks.c
new file mode 100644
index 00000000..cfab4b2c
--- /dev/null
+++ b/callbacks.c
@@ -0,0 +1,81 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdlib.h>
+#include <gtk/gtk.h>
+
+#include <callbacks.h>
+#include <iconcache.h>
+
+#include <shell.h>
+#include <report.h>
+
+#include <config.h>
+
+void cb_refresh()
+{
+ shell_do_reload();
+}
+
+void cb_left_pane()
+{
+ gboolean visible;
+
+ visible = shell_action_get_active("LeftPaneAction");
+ shell_set_left_pane_visible(visible);
+}
+
+void cb_toolbar()
+{
+ gboolean visible;
+
+ visible = shell_action_get_active("ToolbarAction");
+ shell_ui_manager_set_visible("/MainMenuBarAction", visible);
+}
+
+void cb_about()
+{
+ GtkWidget *about;
+
+ about = gtk_about_dialog_new();
+ gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), "HardInfo");
+ gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), VERSION);
+ gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about),
+ "Copyright \302\251 2003-2006 "
+ "Leandro A. F. Pereira");
+ gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about),
+ "System information and benchmark tool");
+ gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about),
+ icon_cache_get_pixbuf("logo.png"));
+
+ gtk_dialog_run(GTK_DIALOG(about));
+ gtk_widget_destroy(about);
+}
+
+void cb_generate_report()
+{
+ Shell *shell = shell_get_main_shell();
+
+ report_dialog_show(shell->tree->model, shell->window);
+}
+
+void cb_quit(void)
+{
+ gtk_main_quit();
+ exit(0);
+}
diff --git a/callbacks.h b/callbacks.h
new file mode 100644
index 00000000..f0f28322
--- /dev/null
+++ b/callbacks.h
@@ -0,0 +1,29 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __CALLBACKS_H__
+#define __CALLBACKS_H__
+
+void cb_about();
+void cb_generate_report();
+void cb_quit();
+void cb_refresh();
+void cb_left_pane();
+void cb_toolbar();
+
+#endif /* __CALLBACKS_H__ */
diff --git a/computer.c b/computer.c
index 46c25b38..7ae9ee8d 100644
--- a/computer.c
+++ b/computer.c
@@ -1,654 +1,322 @@
/*
- * Distribuition detection routines
- * Copyright (c) 2003 Leandro Pereira <leandro@linuxmag.com.br>
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
*
- * May be distributed under the terms of GNU General Public License version 2.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "hardinfo.h"
-#include "computer.h"
-
+#include <stdlib.h>
+#include <string.h>
#include <gtk/gtk.h>
+#include <config.h>
+#include <time.h>
+#include <string.h>
#include <sys/utsname.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-
-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; \
- }
-
-#ifdef ARCH_i386
-static struct {
- char *small, *large;
-} small2large[] = {
- { "fpu", "Floating Point Unit" },
- { "vme", "Virtual Mode Extension" },
- { "de", "Debugging Extensions" },
- { "pse", "Page Size Extensions" },
- { "tsc", "Time Stamp Counter" },
- { "msr", "Model Specific Registers" },
- { "pae", "Physical Address Extensions" },
- { "mce", "Machine Check Architeture" },
- { "cx8", "CMPXCHG8 instruction" },
- { "apic", "Advanced Programmable Interrupt Controller" },
- { "sep", "Fast System Call" },
- { "mtrr", "Memory Type Range Registers" },
- { "pge", "Page Global Enable" },
- { "cmov", "Conditional Move instruction" },
- { "pat", "Page Attribute Table" },
- { "pse36", "36bit Page Size Extensions" },
- { "psn", "96 bit Processor Serial Number" },
- { "mmx", "MMX technology" },
- { "fxsr", "fxsr" },
- { "kni", "Streaming SIMD instructions" },
- { "xmm", "Streaming SIMD instructions" },
- { "ht", "HyperThreading" },
- { NULL, NULL }
+#include <sys/stat.h>
+
+#include <hardinfo.h>
+#include <iconcache.h>
+#include <shell.h>
+
+#include <expr.h>
+
+enum {
+ COMPUTER_SUMMARY,
+ COMPUTER_PROCESSORS,
+ COMPUTER_OPERATING_SYSTEM,
+ COMPUTER_LANGUAGE,
+ COMPUTER_SENSORS,
+ COMPUTER_FILESYSTEMS,
+ COMPUTER_SHARES,
+ COMPUTER_DISPLAY,
+ COMPUTER_NETWORK,
+} Entries;
+
+static ModuleEntry hi_entries[] = {
+ {"Summary", "summary.png"},
+ {"Processor", "processor.png"},
+ {"Operating System", "os.png"},
+ {"Languages", "language.png"},
+ {"Sensors", "therm.png"},
+ {"Filesystems", "dev_removable.png"},
+ {"Shared Directories", "shares.png"},
+ {"Display", "monitor.png"},
+ {"Network Interfaces", "network.png"},
};
-static GtkWidget *get_features_widget(CPUDevice * device)
-{
- GtkWidget *widget, *scroll;
- GtkTextBuffer *buffer;
- GtkTextIter iter;
- gchar **flags;
- gint i, j;
-
- if (!device->flags)
- return NULL;
-
- buffer = gtk_text_buffer_new(FALSE);
- gtk_text_buffer_set_text(buffer, "", -1);
- gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
-
- flags = g_strsplit(device->flags, " ", G_N_ELEMENTS(small2large));
- for (i = 0; *(flags + i); i++) {
- for (j = 0; j < G_N_ELEMENTS(small2large); j++) {
- if (small2large[j].small &&
- !strncmp(small2large[j].small, *(flags + i),
- strlen(small2large[j].small))) {
-// gtk_text_buffer_insert(buffer, &iter, small2large[j].small,
-// -1);
- gtk_text_buffer_insert(buffer, &iter, "â— ", -1);
- gtk_text_buffer_insert(buffer, &iter, small2large[j].large,
- -1);
- gtk_text_buffer_insert(buffer, &iter, "\n", -1);
- break;
- }
- }
- }
- g_strfreev(flags);
-
- scroll = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_container_set_border_width(GTK_CONTAINER(scroll), 4);
- gtk_widget_show(scroll);
-
- widget = gtk_text_view_new();
- gtk_text_view_set_buffer(GTK_TEXT_VIEW(widget), buffer);
- gtk_text_view_set_editable(GTK_TEXT_VIEW(widget), FALSE);
- gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(widget), FALSE);
- gtk_text_view_set_indent(GTK_TEXT_VIEW(widget), 5);
- gtk_widget_show(widget);
-
- gtk_container_add(GTK_CONTAINER(scroll), widget);
-
- return scroll;
-}
-#endif
+#include "computer.h"
-void hi_show_cpu_info(MainWindow * mainwindow, CPUDevice * device)
+static GHashTable *moreinfo = NULL;
+
+#include <arch/common/languages.h>
+#include <arch/this/alsa.h>
+#include <arch/common/display.h>
+#include <arch/this/loadavg.h>
+#include <arch/this/memory.h>
+#include <arch/this/uptime.h>
+#include <arch/this/processor.h>
+#include <arch/this/os.h>
+#include <arch/this/filesystem.h>
+#include <arch/this/samba.h>
+#include <arch/this/sensors.h>
+#include <arch/this/net.h>
+
+static Computer *
+computer_get_info(void)
{
- gchar *buf;
-
- if (!device)
- return;
-
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window),
- device->processor);
- detail_window_set_icon(mainwindow->det_window, IMG_PREFIX "cpu.png");
- detail_window_set_dev_name(mainwindow->det_window, device->processor);
- detail_window_set_dev_type(mainwindow->det_window, device->machine);
-
- detail_window_append_info_int(mainwindow->det_window, _("Number"),
- device->procno, FALSE);
- buf = g_strdup_printf("%dMHz", device->frequency);
- detail_window_append_info(mainwindow->det_window, _("Frequency"), buf);
- g_free(buf);
-
- detail_window_append_separator(mainwindow->det_window);
-#ifdef ARCH_i386
- detail_window_append_info_int(mainwindow->det_window, _("Family"),
- device->family, FALSE);
- detail_window_append_info_int(mainwindow->det_window, _("Model"),
- device->model, FALSE);
- detail_window_append_info_int(mainwindow->det_window, _("Stepping"),
- device->stepping, FALSE);
- detail_window_append_separator(mainwindow->det_window);
+ Computer *computer;
+
+ computer = g_new0(Computer, 1);
+
+ if (moreinfo) {
+#ifdef g_hash_table_unref
+ g_hash_table_unref(moreinfo);
+#else
+ g_free(moreinfo);
#endif
-
- if (device->cachel2) {
- buf = g_strdup_printf("%dkB", device->cachel2);
- detail_window_append_info(mainwindow->det_window, _("Cache L2"),
- buf);
- g_free(buf);
}
- buf = g_strdup_printf("%d bogomips", device->bogomips);
- detail_window_append_info(mainwindow->det_window, _("Bogomips"), buf);
- g_free(buf);
+ moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-#ifdef ARCH_i386
- {
- GtkWidget *features, *label;
+ shell_status_update("Getting processor information...");
+ computer->processor = computer_get_processor();
- label = gtk_label_new(_("Features"));
- gtk_widget_show(label);
+ shell_status_update("Getting memory information...");
+ computer->memory = computer_get_memory();
- features = get_features_widget(device);
- gtk_notebook_append_page(GTK_NOTEBOOK
- (mainwindow->det_window->notebook),
- features, label);
- }
-#endif
+ shell_status_update("Getting operating system information...");
+ computer->os = computer_get_os();
-}
+ shell_status_update("Getting display information...");
+ computer->display = computer_get_display();
-MemoryInfo *memory_get_info(void)
-{
- MemoryInfo *mi;
- FILE *procmem;
- gchar buffer[128];
- gint memfree = 0, memused;
-
- mi = g_new0(MemoryInfo, 1);
+ shell_status_update("Getting sound card information...");
+ computer->alsa = computer_get_alsainfo();
- procmem = fopen("/proc/meminfo", "r");
- while (fgets(buffer, 128, procmem)) {
- gchar *buf = buffer;
+ shell_status_update("Getting mounted file system information...");
+ scan_filesystems();
- 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);
+ shell_status_update("Getting shared directories...");
+ scan_shared_directories();
+
+ shell_status_update("Reading sensors...");
+ read_sensors();
- mi->used = mi->total - memfree;
+ shell_status_update("Obtaining network information...");
+ scan_net_interfaces();
- mi->total /= 1000;
- mi->cached /= 1000;
- mi->used /= 1000;
- memfree /= 1000;
-
- memused = mi->total - mi->used + mi->cached;
-
- mi->ratio = 1 - (gdouble) memused / mi->total;
-
- return mi;
+ computer->date_time = "...";
+ return computer;
}
-#if defined(ARCH_i386) || defined(ARCH_x86_64) || defined(ARCH_PARISC)
-#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, "flags", 5)) \
- get_str_val(ci->flags) \
- else if(!strncmp(buf, "vendor_id", 8)) \
- get_str_val(ci->machine) \
- 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, "machine", 7)) \
- get_str_val(ci->machine) \
- else if(!strncmp(buf, "clock", 5)) \
- get_int_val(ci->frequency) \
- else if(!strncmp(buf, "L2 cache", 8)) \
- get_int_val(ci->cachel2)
-#endif
-#ifdef ARCH_m68k
-#define PARSE_PROC_CPU() \
- if (!strncmp(buf, "CPU", 3)) \
- get_str_val(ci->processor) \
- else if (!strncmp(buf, "BogoMips", 8)) \
- get_int_val(ci->bogomips) \
- else if (!strncmp(buf, "Clocking", 8)) \
- get_int_val(ci->frequency)
-#endif
-#ifdef ARCH_MIPS
-#define PARSE_PROC_CPU() \
- if (!strncmp(buf, "cpu model", 9)) \
- get_str_val(ci->processor) \
- else if (!strncmp(buf, "BogoMIPS", 8)) \
- get_int_val(ci->bogomips) \
- else if (!strncmp(buf, "system type", 11)) \
- get_str_val(ci->machine)
-#endif
-#ifdef ARCH_IA64
-#define PARSE_PROC_CPU() \
- if(!strncmp(buf, "BogoMIPS", 8)) \
- get_int_val(ci->bogomips) \
- else if(!strncmp(buf, "vendor", 6)) \
- get_str_val(ci->machine) \
- else if(!strncmp(buf, "family", 6)) \
- get_str_val(ci->processor) \
- else if(!strncmp(buf, "cpu MHz", 7)) \
- get_int_val(ci->frequency)
-#endif
-
-
-#ifndef PARSE_PROC_CPU
-#error PARSE_PROC_CPU not defined! Maybe your arch is not supported yet;
-#error please send me your /proc/cpuinfo and/or 'uname -a' output to
-#error leandro@linuxmag.com.br; thanks.
-#endif
-
-static void computer_processor_info(ComputerInfo * ci)
+void
+hi_reload(gint entry)
{
- 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();
+ switch (entry) {
+ case COMPUTER_FILESYSTEMS:
+ scan_filesystems();
+ break;
+ case COMPUTER_NETWORK:
+ scan_net_interfaces();
+ break;
+ case COMPUTER_SENSORS:
+ read_sensors();
+ break;
}
- fclose(proccpu);
-
-#ifdef ARCH_PPC
- {
- gchar *proctemp;
-
- proctemp = g_strdup_printf("PowerPC %s", ci->processor);
- g_free(ci->processor);
- ci->processor = proctemp;
- }
-#endif
-#ifdef ARCH_m68k
- {
- gchar *proctemp;
-
- proctemp = g_strdup_printf("Motorola %s", ci->processor);
- g_free(ci->processor);
- ci->processor = proctemp;
- }
-#endif
-
}
-ComputerInfo *computer_get_info(void)
+gchar *
+hi_more_info(gchar * entry)
{
- 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;
-
- /*
- * HACK: Some Debian systems doesn't include
- * the distribuition name in /etc/debian_release,
- * so add them here.
- */
- if (!strncmp(distro_db[i].codename, "deb", 3) &&
- ((buf[0] >= '0' && buf[0] <= '9') || buf[0] != 'D')) {
- 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);
+ gchar *info = (gchar *) g_hash_table_lookup(moreinfo, entry);
- ci->hostname = g_strdup(utsbuf.nodename);
+ if (info)
+ return g_strdup(info);
- computer_processor_info(ci);
-
- return ci;
+ return g_strdup_printf("[Empty %s]", entry);
}
-/*
- * Code stolen from GKrellM <http://www.gkrellm.net>
- * Copyright (c) 1999-2002 Bill Wilson <bill@gkrellm.net>
- */
-gboolean uptime_update(gpointer data)
+gchar *
+hi_get_field(gchar * field)
{
- 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));
+ gchar *tmp;
+
+ if (!strcmp(field, "Memory")) {
+ MemoryInfo *mi;
+
+ mi = computer_get_memory();
+ tmp = g_strdup_printf("%dMB (%dMB used)", mi->total, mi->used);
+
+ g_free(mi);
+ } else if (!strcmp(field, "Random")) {
+ return g_strdup_printf("%d", rand() % 200);
+ } else if (!strcmp(field, "Uptime")) {
+ tmp = computer_get_formatted_uptime();
+ } else if (!strcmp(field, "Date/Time")) {
+ time_t t = time(NULL);
+
+ tmp = g_new0(gchar, 32);
+ strftime(tmp, 32, "%D / %R", localtime(&t));
+ } else if (!strcmp(field, "Load Average")) {
+ tmp = computer_get_formatted_loadavg();
} else {
- buf =
- g_strdup_printf(_("%d day%s, %d hour%s and %ld minute%s"),
- days, plural(days), hours, plural(hours),
- minutes, plural(minutes));
+ tmp = g_strdup("");
}
- gtk_label_set_text(GTK_LABEL(mainwindow->uptime), buf);
- g_free(buf);
-
- return TRUE;
+ return tmp;
}
-GtkWidget *os_get_widget(MainWindow * mainwindow)
+gchar *
+hi_info(gint entry)
{
- GtkWidget *label, *hbox;
- GtkWidget *table;
- GtkWidget *pixmap;
- gchar *buf;
- ComputerInfo *info;
-
- if (!mainwindow)
- return NULL;
-
- info = computer_get_info();
-
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_widget_show(hbox);
-
- 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);
-
- 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
- */
- label = gtk_label_new(_("<b>Computer name:</b>"));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- 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);
-
- label = gtk_label_new(_("<b>Distribution:</b>"));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- 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);
-
- label = gtk_label_new(_("<b>Kernel:</b>"));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- 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);
-
- label = gtk_label_new(_("<b>Uptime:</b>"));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- 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();
+ static Computer *computer = NULL;
+ static gchar *tmp = NULL;
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwindow->membar),
- mi->ratio);
+ /*if (tmp != NULL) {
+ g_free(tmp);
+ tmp = NULL;
+ } */
- g_free(mi);
+ if (!computer) {
+ computer = computer_get_info();
+ }
- return TRUE;
+ switch (entry) {
+ case COMPUTER_NETWORK:
+ return g_strdup_printf("[$ShellParam$]\n"
+ "ReloadInterval=3000\n"
+ "ViewType=1\n"
+ "%s", network_interfaces);
+ case COMPUTER_SENSORS:
+ return g_strdup_printf("[$ShellParam$]\n"
+ "ReloadInterval=3000\n"
+ "%s", sensors);
+ case COMPUTER_SHARES:
+ return g_strdup_printf("[SAMBA]\n"
+ "%s", shares_list);
+ case COMPUTER_FILESYSTEMS:
+ return g_strdup_printf("[$ShellParam$]\n"
+ "ViewType=1\n"
+ "ReloadInterval=5000\n"
+ "[Mounted File Systems]\n%s\n", fs_list);
+ case COMPUTER_SUMMARY:
+ tmp = computer_get_alsacards(computer);
+ return g_strdup_printf("[$ShellParam$]\n"
+ "UpdateInterval$Memory=1000\n"
+ "UpdateInterval$Date/Time=1000\n"
+ "[Computer]\n"
+ "Processor=%s\n"
+ "Memory=...\n"
+ "Operating System=%s\n"
+ "User Name=%s\n"
+ "Date/Time=%s\n"
+ "[Display]\n"
+ "Resolution=%dx%d pixels\n"
+ "OpenGL Renderer=%s\n"
+ "X11 Vendor=%s\n"
+ "[Multimedia]\n"
+ "%s\n"
+ "#[Storage]\n"
+ "#IDE Controller=\n"
+ "#SCSI Controller=\n"
+ "#Floppy Drive=\n"
+ "#Disk Drive=\n",
+ computer->processor->model_name,
+ computer->os->distro,
+ computer->os->username,
+ computer->date_time,
+ computer->display->width,
+ computer->display->height,
+ computer->display->ogl_renderer,
+ computer->display->vendor,
+ tmp);
+ case COMPUTER_DISPLAY:
+ return g_strdup_printf("[Display]\n"
+ "Resolution=%dx%d pixels\n"
+ "Vendor=%s\n"
+ "Version=%s\n"
+ "[Monitors]\n"
+ "%s"
+ "[Extensions]\n"
+ "%s"
+ "[OpenGL]\n"
+ "Vendor=%s\n"
+ "Renderer=%s\n"
+ "Version=%s\n",
+ computer->display->width,
+ computer->display->height,
+ computer->display->vendor,
+ computer->display->version,
+ computer->display->monitors,
+ computer->display->extensions,
+ computer->display->ogl_vendor,
+ computer->display->ogl_renderer,
+ computer->display->ogl_version);
+ case COMPUTER_OPERATING_SYSTEM:
+ tmp = computer_get_formatted_uptime();
+ return g_strdup_printf("[$ShellParam$]\n"
+ "UpdateInterval$Uptime=10000\n"
+ "UpdateInterval$Load Average=1000\n"
+ "[Version]\n"
+ "Kernel=%s\n"
+ "Compiled=%s\n"
+ "C Library=%s\n"
+ "Distribution=%s\n"
+ "[Current Session]\n"
+ "Computer Name=%s\n"
+ "User Name=%s\n"
+ "#Language=%s\n"
+ "Home Directory=%s\n"
+ "Desktop Environment=%s\n"
+ "[Misc]\n"
+ "Uptime=%s\n"
+ "Load Average=...",
+ computer->os->kernel,
+ computer->os->compiled_date,
+ computer->os->libc,
+ computer->os->distro,
+ computer->os->hostname,
+ computer->os->username,
+ computer->os->language,
+ computer->os->homedir,
+ computer->os->desktop, tmp);
+ case COMPUTER_LANGUAGE:
+ return g_strdup_printf("[$ShellParam$]\n"
+ "ViewType=1\n"
+ "[Available Languages]\n"
+ "%s", computer->os->languages);
+ case COMPUTER_PROCESSORS:
+ return processor_get_info(computer->processor);
+ default:
+ return g_strdup("[Empty]\nNo info available=");
+ }
}
-GtkWidget *memory_get_widget(MainWindow * mainwindow)
+gint
+hi_n_entries(void)
{
- GtkWidget *label, *vbox, *hbox, *hbox2, *progress;
- GtkWidget *pixmap;
- MemoryInfo *mi;
- gchar *buf;
-
- mi = memory_get_info();
-
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_widget_show(hbox);
-
- 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);
-
- 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;
+ return G_N_ELEMENTS(hi_entries) - 1;
}
-GtkWidget *processor_get_widget(void)
+GdkPixbuf *
+hi_icon(gint entry)
{
- GtkWidget *label, *vbox, *hbox;
- GtkWidget *pixmap;
- ComputerInfo *info;
- gchar *buf;
-
- info = computer_get_info();
-
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_widget_show(hbox);
-
- 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);
-
- 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);
-
- buf = g_strdup_printf(_("<b>%s</b> at %d MHz"),
- info->processor, info->frequency);
-
- 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);
- 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
-
- if (info->cachel2) {
- 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);
- }
+ return icon_cache_get_pixbuf(hi_entries[entry].icon);
+}
- g_free(info);
- return hbox;
+gchar *
+hi_name(gint entry)
+{
+ return hi_entries[entry].name;
}
diff --git a/computer.h b/computer.h
index 354a748f..d6244305 100644
--- a/computer.h
+++ b/computer.h
@@ -1,50 +1,162 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#ifndef __COMPUTER_H__
#define __COMPUTER_H__
-#include <glib.h>
+#define DB_PREFIX "/etc/"
-#define DB_PREFIX "/etc/"
+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" },
+ { DB_PREFIX "sun-release", "sun" },
+ /*
+ * 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 }
+};
-typedef struct _ComputerInfo ComputerInfo;
-typedef struct _MemoryInfo MemoryInfo;
-typedef struct _ComputerInfo CPUDevice;
+typedef struct _Computer Computer;
+typedef struct _Processor Processor;
+typedef struct _OperatingSystem OperatingSystem;
+typedef struct _MemoryInfo MemoryInfo;
+typedef struct _UptimeInfo UptimeInfo;
+typedef struct _LoadInfo LoadInfo;
+typedef struct _DisplayInfo DisplayInfo;
-struct _MemoryInfo {
- gint total;
- gint used;
- gint cached;
+typedef struct _AlsaInfo AlsaInfo;
+typedef struct _AlsaCard AlsaCard;
+
+typedef struct _FileSystem FileSystem;
+typedef struct _FileSystemEntry FileSystemEntry;
+
+struct _AlsaCard {
+ gchar *alsa_name;
+ gchar *friendly_name;
+/*
+ gchar *board;
+ gchar revision, compat_class;
+ gint subsys_vendorid, subsys_id;
+
+ gint cap_dac_res, cap_adc_res;
+ gboolean cap_3d_enh;
+
+ gint curr_mic_gain;
+ gboolean curr_3d_enh,
+ curr_loudness,
+ curr_simstereo;
+ gchar *curr_mic_select;
+*/
+};
- gdouble ratio;
+struct _AlsaInfo {
+ GSList *cards;
};
-struct _ComputerInfo {
- gchar *distrocode;
- gchar *distroinfo;
-
- gchar *kernel;
-
- gchar *hostname;
-
- gint procno;
- gchar *processor;
- gchar *flags;
- gchar *machine;
- gint frequency;
- gint family, model, stepping;
- gint cachel2;
- gint bogomips;
+struct _DisplayInfo {
+ gchar *ogl_vendor, *ogl_renderer, *ogl_version;
+ gchar *display_name, *vendor, *version;
+ gchar *extensions;
+ gchar *monitors;
+
+ gint width, height;
};
-ComputerInfo *computer_get_info(void);
-MemoryInfo *memory_get_info(void);
+struct _LoadInfo {
+ float load1, load5, load15;
+};
+
+struct _UptimeInfo {
+ int days, hours, minutes;
+};
-GtkWidget *os_get_widget(MainWindow *mainwindow);
-GtkWidget *memory_get_widget(MainWindow *mainwindow);
-GtkWidget *processor_get_widget(void);
+struct _Computer {
+ Processor *processor;
+ MemoryInfo *memory;
+ OperatingSystem *os;
+ DisplayInfo *display;
+ AlsaInfo *alsa;
+
+ gchar *date_time;
+};
-gboolean uptime_update(gpointer data);
-gboolean memory_update(gpointer data);
+struct _Processor {
+ gchar *model_name;
+ gchar *vendor_id;
+ gchar *flags;
+ gint cache_size;
+ gfloat bogomips, cpu_mhz;
+
+ gchar *has_fpu;
+ gchar *bug_fdiv, *bug_hlt, *bug_f00f, *bug_coma;
+
+ gint model, family, stepping;
+ gchar *strmodel;
+};
+
+struct _OperatingSystem {
+ gchar *kernel;
+ gchar *libc;
+ gchar *distrocode, *distro;
+ gchar *hostname;
+ gchar *language;
+ gchar *homedir;
+ gchar *compiled_date;
+
+ gchar *languages;
+
+ gchar *desktop;
+ gchar *username;
+};
+
+struct _MemoryInfo {
+ gint total, used, free, cached;
+ gfloat ratio;
+};
-void hi_show_cpu_info(MainWindow *mainwindow, ComputerInfo *ci);
+#define get_str(field_name,ptr) \
+ if (g_str_has_prefix(tmp[0], field_name)) { \
+ ptr = g_strdup(tmp[1]); \
+ g_strfreev(tmp); \
+ continue; \
+ }
+#define get_int(field_name,ptr) \
+ if (g_str_has_prefix(tmp[0], field_name)) { \
+ ptr = atoi(tmp[1]); \
+ g_strfreev(tmp); \
+ continue; \
+ }
+#define get_float(field_name,ptr) \
+ if (g_str_has_prefix(tmp[0], field_name)) { \
+ ptr = atof(tmp[1]); \
+ g_strfreev(tmp); \
+ continue; \
+ }
-#endif
+#endif /* __COMPUTER_H__ */
diff --git a/config.h b/config.h
index 63651fb2..ecd46b44 100644
--- a/config.h
+++ b/config.h
@@ -1,14 +1,13 @@
#ifndef __CONFIG_H__
#define __CONFIG_H__
-#define VERSION "0.3.7pre"
-#define USE_LSPCI
-#define LSPCI "/usr/bin/lspci -v"
-#define GTK2
-#define ENABLE_NLS
+#define VERSION "0.4"
+#define LSPCI "/bin/lspci -v"
#define ARCH_i386
#define PLATFORM "Linux"
-#define KERNEL "2.6.15-1-k7"
-#define HOSTNAME "comanche.hangar"
+#define KERNEL "2.6.16-1-686"
+#define HOSTNAME "comanche.linuxhome.com.br"
+#define PREFIX "/usr/share/hardinfo/"
+#define DEBUG 1
#endif /* __CONFIG_H__ */
diff --git a/configure b/configure
index ea279465..77f64686 100755
--- a/configure
+++ b/configure
@@ -19,44 +19,13 @@
# (yes, I did a copy&paste from the BSD license, eat me)
#
# ---------------------------------------------------------------------------
-# Some defaults
-
-DISABLE_NLS=0
-IGNORE_LSPCI=0
-
-# ---------------------------------------------------------------------------
PACKAGE=`basename ${PWD} | cut -d"-" -f1`;
VERSION=`basename ${PWD} | cut -d"-" -f2`;
-echo "ToscoConf (version 0.04) for $PACKAGE version $VERSION"
-
-# ---------------------------------------------------------------------------
-# Damn-cool command line argument parsing. Yay.
-
-while [ "$1" != "" ]; do
- case $1 in
- --disable-lspci)
- echo "Disabling lspci"
- IGNORE_LSPCI=1;;
- --disable-nls)
- echo "NLS disabled."
- DISABLE_NLS=1 ;;
- --help)
- echo ""
- echo " --disable-nls Don't use i18n."
- echo " --disable-lspci Disable lspci."
- echo ""
- echo " --help This help screen."
-
- exit 1;;
- *)
- echo "Please use the --help switch."
- exit 1;;
- esac
- shift
-done
+[ "$PACKAGE" == "$VERSION" ] && VERSION="SVN_$(date)"
+echo "ToscoConf (version 0.04) for $PACKAGE version $VERSION"
# ---------------------------------------------------------------------------
@@ -74,21 +43,28 @@ esac
PROC=`uname -m`
case $PROC in
i?86)
+ ln -sf linux/x86 arch/this
ARCH="ARCH_i386" ;;
ppc)
+ ln -sf linux/ppc arch/this
ARCH="ARCH_PPC" ;;
x86_64)
+ ln -sf linux/x86_64 arch/this
ARCH="ARCH_x86_64" ;;
- mips*)
+ mips)
+ ln -sf linux/mips arch/this
ARCH="ARCH_MIPS" ;;
parisc*)
+ ln -sf linux/parisc arch/this
ARCH="ARCH_PARISC" ;;
- ia64)
- ARCH="ARCH_IA64" ;;
+ sparc*)
+ ln -sf linux/sparc arch/this
+ ARCH="ARCH_SPARC" ;;
*)
# uname -m on m68k doesn't return anything useful :/
- cat /proc/cpuinfo | grep "680?0" >/dev/null
+ grep "680?0" /proc/cpuinfo > /dev/null
if [ "$?" == "0" ]; then
+ ln -sf linux/m68k arch/this
ARCH="ARCH_m68k"
else
echo "Architeture \"$ARCH\" not supported."
@@ -103,11 +79,10 @@ echo "$PROC ($ARCH)"
# ---------------------------------------------------------------------------
echo -n "Checking for lspci... "
-LSPCIPATH="`which lspci` /sbin/lspci /usr/sbin/lspci /bin/lspci /usr/bin/lspci"
+LSPCIPATH="/sbin/lspci /usr/sbin/lspci /bin/lspci /usr/bin/lspci `which lspci`"
for i in $LSPCIPATH; do
if [ -x "$i" ]; then
- USE_LSPCI=1
- LSPCI=$i
+ LSPCI=$i
break;
fi
done
@@ -115,26 +90,14 @@ 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
-
-if [ "$IGNORE_LSPCI" -eq 1 ]; then
- echo "Ignoring lspci (as requested)..."
- LSPCI=""
- USE_LSPCI=0
+ echo "lspci cannot be found"
+ exit
fi
# ---------------------------------------------------------------------------
-
GTK2=-1
-MIN_VERSION="2.2.0"
+MIN_VERSION="2.6.0"
echo -n "Checking for GTK ${MIN_VERSION}... "
for i in `which pkg-config`; do
pkg-config --errors-to-stdout gtk+-2.0 \
@@ -150,9 +113,6 @@ for i in `which pkg-config`; do
esac
done
-# If the user doesn't have GTK2, try to compile with GTK1.2 :)
-# GTK 1.2 is no longer supported
-
# --------------------------------------------------------------------------
if [ $GTK2 -eq -1 ]; then
@@ -172,31 +132,29 @@ 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
-echo "#define GTK2" >> config.h
-
-if [ "$DISABLE_NLS" != "1" ]; then
- echo "#define ENABLE_NLS" >> config.h
-fi
-
echo "#define $ARCH" >> config.h
echo "#define PLATFORM \"`uname`\"" >> config.h
echo "#define KERNEL \"`uname -r`\"" >> config.h
echo "#define HOSTNAME \"`hostname`\"" >> config.h
+echo "#define PREFIX \"/usr/share/hardinfo/\"" >> config.h
+echo "#define DEBUG 1" >> config.h
+
echo -e "\n#endif /* __CONFIG_H__ */" >> config.h
echo "Writing Makefile..."
rm -f Makefile
-echo "TARGET = GTK2" > Makefile
-echo "GTK_LIBS = ${GTK_LIBS}" >> Makefile
+echo "GTK_LIBS = ${GTK_LIBS}" > Makefile
echo "GTK_CFLAGS = ${GTK_FLAGS}" >> Makefile
+echo "GLADE_LIBS = ${GLADE_LIBS}" >> Makefile
+echo "GLADE_CFLAGS = ${GLADE_FLAGS}" >> Makefile
echo "PACKAGE = `basename ${PWD}`" >> Makefile
+echo "ARCHOPTS = " >> Makefile
cat Makefile.in >> Makefile
@@ -204,4 +162,3 @@ 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 <leandro@linuxmag.com.br>.\n"
-
diff --git a/configure-stamp b/configure-stamp
deleted file mode 100644
index e69de29b..00000000
--- a/configure-stamp
+++ /dev/null
diff --git a/debian/changelog b/debian/changelog
index b216b675..861c1360 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+hardinfo (0.4-1) unstable; urgency=low
+
+ * new upstream release
+
+ -- Agney Lopes Roth Ferraz <agney@debian.org> Mon, 22 May 2006 19:43:53 -0300
+
hardinfo (0.3.7pre-4) unstable; urgency=low
* added ia64 support. (Closes: #362175)
diff --git a/debian/rules b/debian/rules
index 9d2c0f5b..3bc037af 100755
--- a/debian/rules
+++ b/debian/rules
@@ -64,7 +64,7 @@ binary-indep: build install
binary-arch: build install
dh_testdir
dh_testroot
- dh_installchangelogs ChangeLog
+ #dh_installchangelogs ChangeLog
dh_installdocs
# dh_installexamples
dh_install
diff --git a/default.lang b/default.lang
deleted file mode 100644
index 8c525152..00000000
--- a/default.lang
+++ /dev/null
@@ -1,148 +0,0 @@
-[Translation]
-translated-by=Unknown
-
-[about.c]
-
-[computer.c]
-Number=Number
-Frequency=Frequency
-Family=Family
-Model=Model
-Stepping=Stepping
-Cache L2=Cache L2
-Bogomips=Bogomips
-Features=Features
-Unknown distribution=Unknown distribution
-%d hour%s and %ld minute%s=%d hour%s and %ld minute%s
-%d day%s, %d hour%s and %ld minute%s=%d day%s, %d hour%s and %ld minute%s
-<b>Computer name:</b>=<b>Computer name:</b>
-<b>Distribution:</b>=<b>Distribution:</b>
-<b>Kernel:</b>=<b>Kernel:</b>
-<b>Uptime:</b>=<b>Uptime:</b>
-Updating...=Updating...
-<b>%s</b> at %d MHz=<b>%s</b> at %d MHz
-Family %d, model %d, stepping %d=Family %d, model %d, stepping %d
-%d KB L2 cache=%d KB L2 cache
-
-[details.c]
-Information=Information
-No device selected.=No device selected.
-
-[hardinfo.c]
-System information tool for GNU/Linux.\n=System information tool for GNU/Linux.\n
-System Information=System Information
-Computer=Computer
-<b><big>Operating System</big></b>=<b><big>Operating System</big></b>
-<b><big>Processor</big></b>=<b><big>Processor</big></b>
-<b><big>Memory Usage</big></b>=<b><big>Memory Usage</big></b>
-Details=Details
-Environment=Environment
-<b><big>X-Window System</big></b>=<b><big>X-Window System</big></b>
-Network=Network
-<b><big>Interfaces</big></b>=<b><big>Interfaces</big></b>
-Scanning Devices=Scanning Devices
-Scanning devices...=Scanning devices...
-Scanning %s devices...=Scanning %s devices...
-Processor=Processor
-PCI Devices=PCI Devices
-ISA PnP Devices=ISA PnP Devices
-ATA/IDE Block Devices=ATA/IDE Block Devices
-SCSI Devices=SCSI Devices
-Video for Linux=Video for Linux
-Communication Ports=Communication Ports
-Parallel Ports=Parallel Ports
-Kernel Modules=Kernel Modules
-for more information.\n\n=for more information.\n\n
-
-[ide.c]
-ATA/IDE %s Device=ATA/IDE %s Device
-Cache (kb)=Cache (kb)
-Physical geometry=Physical geometry
-Logical geometry=Logical geometry
-
-[intl.c]
-
-[isapnp.c]
-ISA Plug and Play Device=ISA Plug and Play Device
-Card ID=Card ID
-PnP version=PnP version
-Product version=Product version
-
-[modules.c]
-Author=Author
-License=License
-Depends on=Depends on
-
-[net.c]
-
-[parport.c]
-N/A=N/A
-Parallel Port=Parallel Port
-Description=Description
-Command set=Command set
-Base I/O address=Base I/O address
-Modes=Modes
-Uses DMA=Uses DMA
-Yes=Yes
-No=No
-
-[pci.c]
-0x%x to 0x%x=0x%x to 0x%x
-I/O Address=I/O Address
-%d%s=%d%s
-Memory=Memory
-%dMHz=%dMHz
-Frequency=Frequency
-Latency=Latency
-Bus master=Bus master
-Yes=Yes
-No=No
-Domain=Domain
-Bus=Bus
-Device=Device
-Function=Function
-
-[scsi.c]
-SCSI %s Device=SCSI %s Device
-Revision=Revision
-Type=Type
-Controller=Controller
-Channel=Channel
-ID=ID
-LUN=LUN
-
-[serial.c]
-Serial Port (tty%d)=Serial Port (tty%d)
-Communication Port=Communication Port
-Communication Port=Communication Port
-I/O port=I/O port
-IRQ=IRQ
-
-[status.c]
-
-[stock.c]
-
-[usb.c]
-USB Devices=USB Devices
-Unknown device (%s)=Unknown device (%s)
-USB Device=USB Device
-Class=Class
-Version=Version
-Revision=Revision
-Vendor ID=Vendor ID
-Product ID=Product ID
-
-[v4l.c]
-Device Information=Device Information
-Type=Type
-
-[x11.c]
-Local display (%s)=Local display (%s)
-Remote display (%s)=Remote display (%s)
-XFree86 version %s (protocol version %d.%d)=XFree86 version %s (protocol version %d.%d)
-%d (protocol version %d.%d)=%d (protocol version %d.%d)
-<b>Display:</b>=<b>Display:</b>
-<b>Vendor:</b>=<b>Vendor:</b>
-<b>Release:</b>=<b>Release:</b>
-<b>Resolution:</b>=<b>Resolution:</b>
-
diff --git a/details.c b/details.c
deleted file mode 100644
index 7c624366..00000000
--- a/details.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Hardware Information, version 0.3.2
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * May be modified and/or distributed under the terms of GNU GPL version 2.
- *
- */
-
-#include "details.h"
-#include "hardinfo.h"
-
-gboolean
-detail_window_close(GtkWidget *widget, gpointer data)
-{
- DetailWindow *dw = (DetailWindow *) data;
-
- gtk_widget_destroy(dw->window);
-
- return FALSE;
-}
-
-void
-detail_window_set_title(DetailWindow *dw, const gchar *title)
-{
- if (!dw) return;
-
- gtk_window_set_title(GTK_WINDOW(dw->window), title);
-}
-
-void
-detail_window_update_names(DetailWindow *dw)
-{
- gchar *buf;
-
- if (dw->device_name && strstr(dw->device_name, "&")) {
- gchar *temp, *temp2;
-
- temp = (gchar *) malloc (strlen (dw->device_name) * 2);
-
- temp2 = temp;
-
- while (*(dw->device_name)) {
- if (*(dw->device_name) == '&') {
- *(temp++) = '&';
- *(temp++) = 'a';
- *(temp++) = 'm';
- *(temp++) = 'p';
- *(temp++) = ';';
- } else {
- *(temp++) = *(dw->device_name);
- }
- dw->device_name++;
- }
-
- *(temp++) = 0;
-
- temp = temp2;
-
- g_free(dw->device_name);
- dw->device_name = g_strdup(temp);
-
- g_free(temp);
- }
-
- if (!dw->device_type)
- dw->device_type = "";
-
- buf = g_strdup_printf("<big><b>%s</b></big>\n%s",
- dw->device_name, dw->device_type);
-
- gtk_label_set_markup(GTK_LABEL(dw->name_label), buf);
-
- g_free(buf);
-}
-
-void
-detail_window_append_separator(DetailWindow *dw)
-{
- GtkWidget *sep;
-
- sep = gtk_hseparator_new();
- gtk_widget_show(sep);
-
- gtk_table_attach_defaults(GTK_TABLE(dw->info_table), sep, 0, 2, dw->last_info,
- dw->last_info + 1);
-
- dw->last_info++;
-}
-
-void
-detail_window_set_dev_type(DetailWindow *dw, const gchar *type)
-{
- dw->device_type = g_strdup(type);
-
- detail_window_update_names(dw);
-}
-
-void
-detail_window_set_dev_name(DetailWindow *dw, const gchar *name)
-{
- dw->device_name = g_strdup(name);
-
- detail_window_update_names(dw);
-}
-
-void
-detail_window_append_info_int(DetailWindow *dw, const gchar *name, gint val,
- gboolean hex)
-{
- gchar *buf;
-
- buf = g_strdup_printf(hex ? "0x%X" : "%d", val);
- detail_window_append_info(dw, name, buf);
- g_free(buf);
-}
-
-void
-detail_window_append_info(DetailWindow *dw, const gchar *name, gchar *val)
-{
- GtkWidget *label;
- gchar *buf;
-
- if (dw->last_info == 0)
- dw->last_info = 1;
-
- buf = g_strdup_printf("<b>%s:</b>", name);
- label = gtk_label_new(buf);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- gtk_widget_show(label);
- gtk_table_attach_defaults(GTK_TABLE(dw->info_table), label, 0, 1, dw->last_info,
- dw->last_info + 1);
- g_free(buf);
-
- label = gtk_label_new(val);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_widget_show(label);
- gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
- gtk_label_set_selectable(GTK_LABEL(label), TRUE);
- gtk_table_attach(GTK_TABLE(dw->info_table), label, 1, 2, dw->last_info,
- dw->last_info + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
-
- dw->last_info++;
-
-}
-
-static gboolean
-notebook_hide_tabs(GtkWidget *widget, gpointer data)
-{
- if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(widget)) == 1) {
- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widget), FALSE);
- gtk_notebook_set_show_border(GTK_NOTEBOOK(widget), FALSE);
- } else {
- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widget), TRUE);
- gtk_notebook_set_show_border(GTK_NOTEBOOK(widget), TRUE);
- }
-
- return FALSE;
-}
-
-void
-detail_window_set_icon(DetailWindow *dw, const gchar *path)
-{
- if (!dw || !dw->icon) return;
-
- gtk_image_set_from_file(GTK_IMAGE(dw->icon), path);
-}
-
-DetailWindow *
-detail_window_new(void)
-{
- DetailWindow *dw;
- GtkWidget *window, *vbox, *btn, *hbbox, *notebook, *table,
- *label, *info_table;
- GtkWidget *icon, *vb, *hb;
-
- dw = g_new0(DetailWindow, 1);
-
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_container_set_border_width(GTK_CONTAINER(window), 5);
- gtk_window_set_title(GTK_WINDOW(window), "Hardware Details");
- gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_UTILITY);
- gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
- gtk_widget_realize(window);
-
- dw->window = window;
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_widget_show(vbox);
- gtk_container_add(GTK_CONTAINER(window), vbox);
-
- dw->vbox = vbox;
-
- notebook = gtk_notebook_new();
- gtk_widget_show(notebook);
- gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
- gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
- dw->notebook = notebook;
-
- g_signal_connect(G_OBJECT(notebook), "expose-event",
- G_CALLBACK(notebook_hide_tabs), notebook);
-
- table = gtk_table_new(1, 2, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(table), 8);
- gtk_table_set_row_spacings(GTK_TABLE(table), 4);
- gtk_table_set_col_spacings(GTK_TABLE(table), 16);
- gtk_widget_show(table);
-
- label = gtk_label_new(_("Information"));
- gtk_widget_show(label);
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table,
- label);
-
- hb = gtk_hbox_new(FALSE, 5);
- gtk_widget_show(hb);
- gtk_table_attach_defaults(GTK_TABLE(table), hb, 0, 1, 0, 1);
-
- icon = gtk_image_new();
- gtk_misc_set_alignment(GTK_MISC(icon), 0.5, 0.0);
- gtk_widget_show(icon);
- dw->icon = icon;
-
- gtk_table_attach_defaults(GTK_TABLE(table), icon, 0, 1, 0, 1);
-
- vb = gtk_vbox_new(FALSE, 5);
- gtk_widget_show(vb);
- gtk_box_pack_start(GTK_BOX(hb), vb, TRUE, TRUE, 0);
-
- label = gtk_label_new(_("No device selected."));
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- gtk_widget_show(label);
- gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1,
- GTK_FILL | GTK_EXPAND, 0, 0, 0);
- dw->name_label = label;
-
- info_table = gtk_table_new(0, 0, FALSE);
- gtk_widget_show(info_table);
- gtk_table_attach(GTK_TABLE(table), info_table, 1, 2, 2, 3,
- GTK_EXPAND | GTK_FILL, 0, 0, 0);
- gtk_table_set_col_spacings(GTK_TABLE(info_table), 4);
- gtk_table_set_row_spacings(GTK_TABLE(info_table), 2);
- dw->info_table = info_table;
-
- hbbox = gtk_hbutton_box_new();
- gtk_container_set_border_width(GTK_CONTAINER(hbbox), 4);
- gtk_widget_show(hbbox);
- gtk_box_pack_start(GTK_BOX(vbox), 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);
-
- btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(detail_window_close), dw);
- gtk_widget_show(btn);
- gtk_box_pack_end(GTK_BOX(hbbox), btn, FALSE, FALSE, 0);
-
- detail_window_set_icon(dw, IMG_PREFIX "logo.png");
-
- return dw;
-}
-
-void
-detail_window_show(GtkWidget *widget, gpointer data)
-{
- MainWindow *mainwindow = (MainWindow *) data;
- GenericDevice *dev;
-
- mainwindow->det_window = detail_window_new();
-
- dev = (GenericDevice *) gtk_ctree_node_get_row_data
- (GTK_CTREE(mainwindow->ctree), GTK_CLIST(mainwindow->ctree)->
- selection->data);
-
- hi_show_device_info_real(mainwindow, dev);
-
- gtk_window_set_modal(GTK_WINDOW(mainwindow->det_window->window), TRUE);
- gtk_window_set_position(GTK_WINDOW(mainwindow->det_window->window), GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_transient_for(GTK_WINDOW(mainwindow->det_window->window),
- GTK_WINDOW(mainwindow->window));
- gtk_widget_show(mainwindow->det_window->window);
-}
diff --git a/details.h b/details.h
deleted file mode 100644
index e7512173..00000000
--- a/details.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef __DETAILS_H__
-#define __DETAILS_H__
-
-#include <gtk/gtk.h>
-#include "config.h"
-
-typedef struct _DetailWindow DetailWindow;
-
-struct _DetailWindow {
- GtkWidget *window;
- GtkWidget *vbox;
- GtkWidget *notebook;
- GtkWidget *icon;
- GtkWidget *name_label;
-
- gchar *device_name;
- gchar *device_type;
- gchar *manufacturer;
-
- GtkWidget *info_table;
- gint last_info;
-};
-
-gboolean detail_window_close(GtkWidget *widget, gpointer data);
-DetailWindow *detail_window_new(void);
-void detail_window_set_icon(DetailWindow *dw, const gchar *path);
-void detail_window_show(GtkWidget *widget, gpointer data);
-
-void detail_window_set_dev_name(DetailWindow *dw, const gchar *name);
-void detail_window_set_dev_type(DetailWindow *dw, const gchar *type);
-void detail_window_update_names(DetailWindow *dw);
-
-void detail_window_append_info(DetailWindow *dw, const gchar *name,
- gchar *val);
-void detail_window_append_info_int(DetailWindow *dw, const gchar *name,
- gint val, gboolean hex);
-void detail_window_append_separator(DetailWindow *dw);
-
-
-#endif
diff --git a/devices.c b/devices.c
new file mode 100644
index 00000000..07946755
--- /dev/null
+++ b/devices.c
@@ -0,0 +1,193 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <gtk/gtk.h>
+#include <config.h>
+#include <string.h>
+
+#include <hardinfo.h>
+#include <shell.h>
+#include <iconcache.h>
+
+enum {
+ DEVICES_KERNEL_MODULES,
+ DEVICES_PCI,
+ DEVICES_USB,
+ DEVICES_PRINTERS,
+ DEVICES_INPUT,
+ DEVICES_STORAGE,
+} Entries;
+
+static ModuleEntry hi_entries[] = {
+ {"Kernel Modules", "module.png"},
+ {"PCI Devices", "devices.png"},
+ {"USB Devices", "usb.png"},
+ {"Printers", "printer.png"},
+ {"Input Devices", "keyboard.png"},
+ {"Storage", "hdd.png"},
+};
+
+static GHashTable *devices = NULL;
+static gchar *module_list = "";
+static gchar *printer_list = NULL;
+static gchar *pci_list = "";
+static gchar *input_list = NULL;
+static gchar *storage_list = "";
+
+#define WALK_UNTIL(x) while((*buf != '\0') && (*buf != x)) buf++
+
+#define GET_STR(field_name,ptr) \
+ if (strstr(tmp[0], field_name)) { \
+ ptr = g_markup_escape_text(g_strstrip(tmp[1]), strlen(tmp[1])); \
+ g_strfreev(tmp); \
+ continue; \
+ }
+
+#include <arch/this/pci.h>
+#include <arch/this/modules.h>
+#include <arch/common/printers.h>
+#include <arch/this/inputdevices.h>
+#include <arch/this/usb.h>
+#include <arch/this/storage.h>
+
+static void
+detect_devices(void)
+{
+ devices = g_hash_table_new(g_str_hash, g_str_equal);
+
+ shell_status_update("Getting loaded modules information...");
+ scan_modules();
+
+ shell_status_update("Scanning PCI devices...");
+ scan_pci();
+
+ shell_status_update("Searching for printers...");
+ scan_printers();
+
+ shell_status_update("Scanning input devices...");
+ scan_inputdevices();
+
+ shell_status_update("Scanning USB devices...");
+ scan_usb();
+
+ shell_status_update("Scanning IDE devices...");
+ scan_ide();
+
+ shell_status_update("Scanning SCSI devices...");
+ scan_scsi();
+}
+
+gchar *
+hi_more_info(gchar * entry)
+{
+ gchar *info = (gchar *) g_hash_table_lookup(devices, entry);
+
+ if (info)
+ return g_strdup(info);
+ return g_strdup("[Empty]");
+}
+
+void
+hi_reload(gint entry)
+{
+ switch (entry) {
+ case DEVICES_INPUT:
+ scan_inputdevices();
+ break;
+ case DEVICES_PRINTERS:
+ scan_printers();
+ break;
+ case DEVICES_USB:
+ scan_usb();
+ break;
+ case DEVICES_STORAGE:
+ if (storage_list) {
+ g_free(storage_list);
+ g_free(storage_icons);
+ storage_list = g_strdup("");
+ storage_icons = g_strdup("");
+ }
+ scan_ide();
+ scan_scsi();
+ break;
+ }
+}
+
+gchar *
+hi_info(gint entry)
+{
+ if (!devices) {
+ detect_devices();
+ }
+
+ switch (entry) {
+ case DEVICES_KERNEL_MODULES:
+ return g_strdup_printf("[Loaded Modules]\n"
+ "%s"
+ "[$ShellParam$]\n"
+ "ViewType=1",
+ module_list);
+ case DEVICES_PCI:
+ return g_strdup_printf("[PCI Devices]\n"
+ "%s"
+ "[$ShellParam$]\n"
+ "ViewType=1\n",
+ pci_list);
+ case DEVICES_PRINTERS:
+ return g_strdup_printf("%s\n"
+ "[$ShellParam$]\n"
+ "ReloadInterval=5000", printer_list);
+ case DEVICES_STORAGE:
+ return g_strdup_printf("%s\n"
+ "[$ShellParam$]\n"
+ "ReloadInterval=5000\n"
+ "ViewType=1\n%s", storage_list, storage_icons);
+ case DEVICES_INPUT:
+ return g_strdup_printf("[Input Devices]\n"
+ "%s"
+ "[$ShellParam$]\n"
+ "ViewType=1\n"
+ "ReloadInterval=5000\n%s", input_list, input_icons);
+ case DEVICES_USB:
+ return g_strdup_printf("%s"
+ "[$ShellParam$]\n"
+ "ViewType=1\n"
+ "ReloadInterval=5000\n",
+ usb_list);
+ default:
+ return g_strdup("[Empty]\nNo info available=");
+ }
+}
+
+gint
+hi_n_entries(void)
+{
+ return G_N_ELEMENTS(hi_entries) - 1;
+}
+
+GdkPixbuf *
+hi_icon(gint entry)
+{
+ return icon_cache_get_pixbuf(hi_entries[entry].icon);
+}
+
+gchar *
+hi_name(gint entry)
+{
+ return hi_entries[entry].name;
+}
diff --git a/expr.c b/expr.c
new file mode 100644
index 00000000..da7c01ad
--- /dev/null
+++ b/expr.c
@@ -0,0 +1,242 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+/*
+ * This is only used to compute sensor values, hence the only variable supported is '@'.
+ * The '`' operator (ln(x)) is not available, nor multi-line formulas.
+ */
+
+#include <glib.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+#include <expr.h>
+
+static MathToken *new_operator(gchar op)
+{
+ MathToken *t = g_new0(MathToken, 1);
+
+ t->val.op = op;
+ t->type = TOKEN_OPERATOR; /* operator */
+
+ return t;
+}
+
+static MathToken *new_variable(gchar var)
+{
+ MathToken *t = g_new0(MathToken, 1);
+
+ t->val.op = '@';
+ t->type = TOKEN_VARIABLE; /* variable */
+
+ return t;
+}
+
+static MathToken *new_value(gfloat value)
+{
+ MathToken *t = g_new0(MathToken, 1);
+
+ t->val.value = value;
+ t->type = TOKEN_VALUE; /* value */
+
+ return t;
+}
+
+static inline gint priority(char operation)
+{
+ switch (operation) {
+ case '^':
+ return 3;
+ case '*':
+ case '/':
+ return 2;
+ case '+':
+ case '-':
+ return 1;
+ case '(':
+ return 0;
+ }
+
+ return 0;
+}
+
+GSList *math_infix_to_postfix(GSList *infix)
+{
+ MathToken *stack[500];
+ gint t_sp = 0;
+
+ GSList *postfix = NULL, *p;
+ MathToken *top;
+
+ for (p = infix; p; p = p->next) {
+ MathToken *t = (MathToken *) p->data;
+
+ if (t->type == TOKEN_OPERATOR && t->val.op == '(') {
+ stack[++t_sp] = t;
+ } else if (t->type == TOKEN_OPERATOR && t->val.op == ')') {
+ for (top = stack[t_sp]; t_sp != 0 && top->val.op != '('; top = stack[t_sp])
+ postfix = g_slist_append(postfix, stack[t_sp--]);
+ t_sp--;
+ } else if (t->type != TOKEN_OPERATOR) {
+ postfix = g_slist_append(postfix, t);
+ } else if (t_sp == 0) {
+ stack[++t_sp] = t;
+ } else {
+ while (t_sp != 0 && priority(t->val.op) <= priority(stack[t_sp]->val.op))
+ postfix = g_slist_append(postfix, stack[t_sp--]);
+ stack[++t_sp] = t;
+ }
+ }
+
+ while (t_sp)
+ postfix = g_slist_append(postfix, stack[t_sp--]);
+
+ return postfix;
+}
+
+static inline gfloat __result(gfloat op1, gfloat op2, gchar operation)
+{
+ switch (operation) {
+ case '^':
+ return powf(op1, op2);
+ case '+':
+ return op1 + op2;
+ case '-':
+ return op1 - op2;
+ case '/':
+ return op1 / op2;
+ case '*':
+ return op1 * op2;
+ }
+
+ return 0;
+}
+
+gfloat math_postfix_eval(GSList *postfix, gfloat at_value)
+{
+ GSList *p;
+ gfloat stack[500];
+ gint sp = 0;
+
+ memset(stack, 0, sizeof(gfloat) * 500);
+
+ for (p = postfix; p; p = p->next) {
+ MathToken *t = (MathToken *) p->data;
+
+ if (t->type == TOKEN_VARIABLE) {
+ stack[++sp] = at_value;
+ } else if (t->type == TOKEN_VALUE) {
+ stack[++sp] = t->val.value;
+ } else {
+ gfloat op1, op2;
+
+ op2 = stack[sp--];
+ op1 = stack[sp];
+
+ stack[sp] = __result(op1, op2, t->val.op);
+ }
+ }
+
+ return stack[sp];
+}
+
+GSList *math_string_to_infix(gchar *string)
+{
+ GSList *infix = NULL;
+ gchar *expr = string;
+
+ for (; *expr; expr++) {
+ if (strchr("+-/*^()", *expr)) {
+ infix = g_slist_append(infix, new_operator(*expr));
+ } else if (strchr("@", *expr)) {
+ infix = g_slist_append(infix, new_variable(*expr));
+ } else if (strchr("-.1234567890", *expr)) {
+ gfloat value;
+
+ sscanf(expr, "%f", &value);
+
+ while (*expr && strchr(".1234567890", *expr))
+ expr++;
+ expr--;
+
+ infix = g_slist_append(infix, new_value(value));
+ } else if (!isspace(*expr)) {
+ g_print("Invalid token: [%c][%d]\n", *expr, *expr);
+ math_infix_free(infix, TRUE);
+ return NULL;
+ }
+ }
+
+ return infix;
+}
+
+void math_infix_free(GSList *infix, gboolean free_tokens)
+{
+ GSList *p;
+
+ if (!free_tokens)
+ for (p = infix; p; p = g_slist_delete_link(p, p));
+ else
+ for (p = infix; p; p = g_slist_delete_link(p, p)) {
+ MathToken *t = (MathToken *)p->data;
+ g_free(t);
+ }
+}
+
+GSList *math_string_to_postfix(gchar *string)
+{
+ GSList *infix;
+ GSList *postfix;
+
+ infix = math_string_to_infix(string);
+ if (!infix)
+ return NULL;
+
+ postfix = math_infix_to_postfix(infix);
+ math_infix_free(infix, FALSE);
+
+ return postfix;
+}
+
+gfloat math_string_eval(gchar *string, gfloat at_value)
+{
+ GSList *postfix;
+ gfloat val;
+
+ postfix = math_string_to_postfix(string);
+ val = math_postfix_eval(postfix, at_value);
+ math_postfix_free(postfix, TRUE);
+
+ return val;
+}
+
+#ifdef MATH_TEST
+int main(void)
+{
+ GSList *postfix;
+
+ gchar *expr = "0.9*(@+(5.2*0.923+3*(2.0)))";
+
+ postfix = math_string_to_postfix(expr);
+ g_print("%s = %f (must be 18.71964)\n", expr,
+ math_postfix_eval(postfix, 10));
+ math_postfix_free(postfix, TRUE);
+
+ return 0;
+}
+#endif
diff --git a/expr.h b/expr.h
new file mode 100644
index 00000000..2a5b15d4
--- /dev/null
+++ b/expr.h
@@ -0,0 +1,48 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef __EXPR_H__
+#define __EXPR_H__
+
+typedef struct _MathToken MathToken;
+
+typedef enum {
+ TOKEN_OPERATOR,
+ TOKEN_VARIABLE,
+ TOKEN_VALUE
+} MathTokenType;
+
+struct _MathToken {
+ union {
+ gfloat value;
+ gchar op;
+ } val;
+ MathTokenType type;
+};
+
+#define math_postfix_free math_infix_free
+
+GSList *math_infix_to_postfix(GSList *infix);
+void math_infix_free(GSList *infix, gboolean free_tokens);
+
+GSList *math_string_to_infix(gchar *string);
+GSList *math_string_to_postfix(gchar *string);
+
+gfloat math_postfix_eval(GSList *postfix, gfloat at_value);
+gfloat math_string_eval(gchar *string, gfloat at_value);
+
+#endif /* __EXPR_H__ */
diff --git a/genintl.pl b/genintl.pl
deleted file mode 100755
index 0e19846c..00000000
--- a/genintl.pl
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/perl
-#
-# Script para gerar arquivo de internacionalização
-# Versão 1.0
-#
-# Copyright (c) 2002-2003 Leandro Pereira <leandro@linuxmag.com.br>
-# 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(<A>){
- $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
index d1c8d3fd..fd605626 100644
--- a/hardinfo.c
+++ b/hardinfo.c
@@ -1,586 +1,37 @@
/*
- * Hardware Information, version 0.3.2
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
*
- * May be modified and/or distributed under the terms of GNU GPL version 2.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
*
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "hardinfo.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#include "pixmaps/pci.xpm"
-#include "pixmaps/usb.xpm"
-#include "pixmaps/hdd.xpm"
-#include "pixmaps/gen_connector.xpm"
-#include "pixmaps/scsi.xpm"
-#include "pixmaps/processor.xpm"
-
-#include "computer.h"
-#include "status.h"
-#include "stock.h"
-
-GenericDevice *generic_devices = NULL;
-
-void hi_enable_details_button(GtkCTree * tree, GList * node,
- gint column, gpointer user_data);
-void hi_enable_details_button_real(MainWindow *mainwindow, GenericDevice *dev);
-void hi_disable_details_button(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_disable_details_button(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 *sysinfo = HOSTNAME " (" PLATFORM KERNEL ")";
- const gchar *authors[] = {
- ">Written by:",
- "Leandro A. F. 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.",
- ">Compiled on:",
- sysinfo,
- NULL
- };
-
- about = gtk_about_new("HardInfo", VERSION,
- _("System information tool for GNU/Linux.\n"),
- authors, IMG_PREFIX "logo.png");
-
-}
-
-MainWindow *
-main_window_create(void)
-{
- GtkWidget *window, *mbox, *vbox, *ctree, *scroll;
- GtkWidget *notebook, *label, *hbox, *btn, *hbbox;
- MainWindow *mainwindow;
-
- mainwindow = g_new0(MainWindow, 1);
-
- mainwindow->det_window = detail_window_new();
-
- 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"));
-
- g_signal_connect(G_OBJECT(window), "delete-event", gtk_main_quit, NULL);
- gtk_window_set_icon_from_file(GTK_WINDOW(window), IMG_PREFIX "logo.png", NULL);
-
- 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")));
-
- label = gtk_label_new(_("<b><big>Operating System</big></b>"));
- 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, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), os_get_widget(mainwindow),
- FALSE, FALSE, 0);
-
- label = gtk_label_new(_("<b><big>Processor</big></b>"));
- 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, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), processor_get_widget(), FALSE,
- FALSE, 0);
-
- label = gtk_label_new(_("<b><big>Memory Usage</big></b>"));
- 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, 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(_("Details")));
-
- hbbox = gtk_hbutton_box_new();
- gtk_container_set_border_width(GTK_CONTAINER(hbbox), 4);
- gtk_widget_show(hbbox);
- gtk_box_pack_end(GTK_BOX(vbox), 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);
-
- btn = gtk_button_new_from_stock(HI_DETAILS);
- g_signal_connect(G_OBJECT(btn), "clicked",
- (GCallback) detail_window_show, mainwindow);
- gtk_widget_show(btn);
- gtk_box_pack_end(GTK_BOX(hbbox), btn, FALSE, FALSE, 0);
- mainwindow->details_button = btn;
-
- 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);
- g_signal_connect(G_OBJECT(ctree), "tree-select-row",
- (GCallback) hi_enable_details_button, mainwindow);
- g_signal_connect(G_OBJECT(ctree), "tree-unselect-row",
- (GCallback) hi_disable_details_button, mainwindow);
-
- /*
- * 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")));
-
- label = gtk_label_new(_("<b><big>X-Window System</big></b>"));
- 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, FALSE, FALSE, 0);
-// gtk_box_pack_start(GTK_BOX(vbox), x11_get_widget(mainwindow),
-// FALSE, FALSE, 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")));
-
- label = gtk_label_new(_("<b><big>Interfaces</big></b>"));
- 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, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), net_get_widget(mainwindow),
- TRUE, TRUE, 0);
-
- /*
- * 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_from_stock(HI_ABOUT);
- g_signal_connect(G_OBJECT(btn), "clicked",
- (GCallback) about_window_create, NULL);
- 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);
-
- btn = gtk_button_new_from_stock(GTK_STOCK_REFRESH);
- g_signal_connect(G_OBJECT(btn), "clicked",
- (GCallback) main_window_refresh, mainwindow);
- gtk_widget_show(btn);
- gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0);
-
- btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- g_signal_connect(G_OBJECT(btn), "clicked", gtk_main_quit, NULL);
- gtk_widget_show(btn);
- gtk_box_pack_start(GTK_BOX(hbbox), btn, FALSE, FALSE, 0);
-
- gtk_widget_show_all(window);
-
- mainwindow->window = window;
- mainwindow->ctree = ctree;
-
- 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;
- case MODULE:
- case PROCESSOR:
- pixmap = gdk_pixmap_colormap_create_from_xpm_d
- (NULL, colormap, &mask, NULL, processor_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_disable_details_button(GtkCTree * tree, GList * node,
- gint column, gpointer user_data)
-{
- MainWindow *mainwindow = (MainWindow *) user_data;
-
- gtk_widget_set_sensitive(GTK_WIDGET(mainwindow->details_button), FALSE);
-}
-
-void hi_enable_details_button(GtkCTree * tree, GList * node,
- gint column, gpointer user_data)
-{
- MainWindow *mainwindow = (MainWindow *) user_data;
-
- gtk_widget_set_sensitive(GTK_WIDGET(mainwindow->details_button), TRUE);
-}
-
-void hi_show_device_info_real(MainWindow *mainwindow, GenericDevice *dev)
-{
- if (!dev)
- return;
-
-#define dev_info(type,name,func) \
- { \
- type *name; \
- name = (type *)dev->device; \
- func(mainwindow, name); \
- } \
- break;
-
- switch (dev->type) {
- case MODULE:
- dev_info(ModInfo, mod, hi_show_module_info);
- case PROCESSOR:
- dev_info(CPUDevice, cpu, hi_show_cpu_info);
- 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;
- }
-}
-
-void
-hi_scan_all(MainWindow * mainwindow)
-{
- myStatus *status;
- PCIDevice *pci;
- ISADevice *isa;
- IDEDevice *ide;
- CPUDevice *cpu;
- SCSIDevice *scsi;
- V4LDevice *v4l;
- ParportDevice *pp;
- SerialDevice *sd;
- GtkCTreeNode *node;
- ModInfo *mod;
- 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("CPU", cpu, computer_get_info);
- 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);
- DEVICE_SCAN("modules", mod, hi_scan_modules);
-
- 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); \
- } \
- } \
- }
-
-
- /*
- * Processor info
- */
- node = tree_group_new(mainwindow, _("Processor"), PROCESSOR);
- hi_insert_generic(cpu, PROCESSOR);
- tree_insert_item(mainwindow, node, cpu->processor, generic_devices);
+#include <config.h>
+#include <shell.h>
- 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);
-
- CHECK_INSERT(mod, _("Kernel Modules"), MODULE, description);
-
- gtk_clist_thaw(GTK_CLIST(mainwindow->ctree));
-
- my_status_destroy(status);
-}
-
-static void
-usage(char *argv0)
-{
- g_print("%s [--help] [--prefix <prefix>]\n", argv0);
- exit(1);
-}
+#include <iconcache.h>
+#include <stock.h>
int
main(int argc, char **argv)
{
- MainWindow *mainwindow;
- gint i;
-
-#ifdef ENABLE_NLS
- intl_init();
-#endif
-
- g_print("HardInfo " VERSION);
- if (strstr(VERSION, "pre")) {
- g_print(" *** PRE-RELEASE ***");
- }
- g_print
- ("\nCopyright (c) 2003 Leandro Pereira <leandro@linuxmag.com.br>\n\n");
- g_print(_
- ("This is free software; you can modify and/or distribute it\n"));
- g_print(_
- ("under the terms of GNU GPL version 2. See http://www.fsf.org/\n"));
- g_print(_("for more information.\n\n"));
-
- gtk_init(&argc, &argv);
-
- hi_stock_init();
-
- 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]);
- }
- }
+ gtk_init(&argc, &argv);
- mainwindow = main_window_create();
- main_window_refresh(NULL, mainwindow);
+ icon_cache_init();
+ stock_icons_init();
+ shell_init();
- gtk_main();
+ gtk_main();
- return 0;
+ return 0;
}
diff --git a/hardinfo.desktop b/hardinfo.desktop
deleted file mode 100644
index 32895d6d..00000000
--- a/hardinfo.desktop
+++ /dev/null
@@ -1,12 +0,0 @@
-[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
index ec843dbc..d8f62439 100644
--- a/hardinfo.h
+++ b/hardinfo.h
@@ -1,91 +1,36 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
#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 <gtk/gtk.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#include "config.h"
-#include "stock.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, PROCESSOR, MODULE
-};
-
-struct _GenericDevice {
- gpointer device;
- DeviceType type;
-
- GtkCTreeNode *node;
-
- GenericDevice *next;
-};
-#include "details.h"
+typedef struct _ModuleEntry ModuleEntry;
-struct _MainWindow {
- GtkWidget *window;
-
- GtkWidget *ctree;
-
- GtkWidget *membar;
- GtkWidget *uptime;
-
- GtkWidget *recv_bytes;
- GtkWidget *recv_errors;
- GtkWidget *recv_packets;
-
- GtkWidget *trans_bytes;
- GtkWidget *trans_errors;
- GtkWidget *trans_packets;
-
- GtkWidget *details_button;
- DetailWindow *det_window;
+struct _ModuleEntry {
+ gchar *name;
+ gchar *icon;
};
-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 "modules.h"
-#include "x11.h"
-#include "net.h"
-
-#include "about.h"
-#include "details.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);
-void hi_show_device_info_real(MainWindow *mainwindow,
- GenericDevice *dev);
+inline void remove_quotes(gchar *str);
+inline void strend(gchar *str, gchar chr);
+inline void remove_linefeed(gchar *str);
+ void widget_set_cursor(GtkWidget *widget, GdkCursorType cursor_type);
-#endif
+#endif /* __HARDINFO_H__ */
diff --git a/iconcache.c b/iconcache.c
new file mode 100644
index 00000000..5ef2bc3c
--- /dev/null
+++ b/iconcache.c
@@ -0,0 +1,80 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <iconcache.h>
+#include <config.h>
+
+static GHashTable *cache = NULL;
+
+void icon_cache_init(void)
+{
+ if (!cache) {
+ cache = g_hash_table_new(g_str_hash, g_str_equal);
+ }
+}
+
+GdkPixbuf *icon_cache_get_pixbuf(const gchar *file)
+{
+ GdkPixbuf *icon;
+
+ icon = g_hash_table_lookup(cache, file);
+
+ if (!icon) {
+ gchar *tmp = g_strdup_printf(PREFIX "pixmaps/%s", file);
+
+ icon = gdk_pixbuf_new_from_file(tmp, NULL);
+ g_hash_table_insert(cache, g_strdup(file), icon);
+
+ g_free(tmp);
+ }
+
+ return icon;
+}
+
+GtkWidget *icon_cache_get_image(const gchar *file)
+{
+ GdkPixbuf *icon;
+
+ icon = icon_cache_get_pixbuf(file);
+ return gtk_image_new_from_pixbuf(icon);
+}
+
+GdkPixbuf *icon_cache_get_pixbuf_at_size(const gchar *file, gint wid, gint hei)
+{
+ GdkPixbuf *icon;
+
+ icon = g_hash_table_lookup(cache, file);
+
+ if (!icon) {
+ gchar *tmp = g_strdup_printf(PREFIX "pixmaps/%s", file);
+
+ icon = gdk_pixbuf_new_from_file_at_size(tmp, wid, hei, NULL);
+ g_hash_table_insert(cache, g_strdup(file), icon);
+
+ g_free(tmp);
+ }
+
+ return icon;
+}
+
+GtkWidget *icon_cache_get_image_at_size(const gchar *file, gint wid, gint hei)
+{
+ GdkPixbuf *icon;
+
+ icon = icon_cache_get_pixbuf_at_size(file, wid, hei);
+ return gtk_image_new_from_pixbuf(icon);
+}
diff --git a/iconcache.h b/iconcache.h
new file mode 100644
index 00000000..e528b090
--- /dev/null
+++ b/iconcache.h
@@ -0,0 +1,30 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __ICONCACHE_H__
+#define __ICONCACHE_H__
+
+#include <gtk/gtk.h>
+
+void icon_cache_init(void);
+GdkPixbuf *icon_cache_get_pixbuf(const gchar *file);
+GtkWidget *icon_cache_get_image(const gchar *file);
+GdkPixbuf *icon_cache_get_pixbuf_at_size(const gchar *file, gint wid, gint hei);
+GtkWidget *icon_cache_get_image_at_size(const gchar *file, gint wid, gint hei);
+
+#endif /* __ICONCACHE_H__ */
diff --git a/ide.c b/ide.c
deleted file mode 100644
index bb790121..00000000
--- a/ide.c
+++ /dev/null
@@ -1,140 +0,0 @@
-
-/*
- * Hardware Information, version 0.3
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * May be modified and/or distributed under the terms of GNU GPL version 2.
- *
- */
-
-#include "hardinfo.h"
-#include "ide.h"
-
-#include <stdlib.h>
-
-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);
- }
- g_free(device);
-
- device = g_strdup_printf("/proc/ide/hd%c/geometry", iface);
- if (!stat(device, &st)) {
- gchar *tmp;
-
- proc_ide = fopen(device, "r");
-
- fgets(buf, 64, proc_ide);
- for (tmp = buf; *tmp; tmp++) {
- if (*tmp >= '0' && *tmp <= '9') break;
- }
-
- ide_dev->phy_geometry = g_strdup(g_strstrip(tmp));
-
- fgets(buf, 64, proc_ide);
- for (tmp = buf; *tmp; tmp++) {
- if (*tmp >= '0' && *tmp <= '9') break;
- }
- ide_dev->log_geometry = g_strdup(g_strstrip(tmp));
-
- fclose(proc_ide);
- }
- g_free(device);
-
- n++;
- } else
- g_free(device);
- }
-
- return ide;
-}
-
-void hi_show_ide_info(MainWindow *mainwindow, IDEDevice *device)
-{
- static struct {
- char *type;
- char *label;
- char *icon;
- } type2icon[] = {
- {"cdrom", "CD-ROM", "cd.png"},
- {"disk", "Hard Disk", "hdd.png"}
- };
- int i;
- gchar *buf;
-
- if(!device) return;
-
- for (i = 0; type2icon[i].type != NULL; ++i) {
- if (!strcmp(device->media, type2icon[i].type)) break;
- }
-
- buf = g_strdup_printf("%s%s", IMG_PREFIX, type2icon[i].icon);
- detail_window_set_icon(mainwindow->det_window, buf);
- g_free(buf);
-
- buf = g_strdup_printf(_("ATA/IDE %s Device"), type2icon[i].label);
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window), buf);
- detail_window_set_dev_type(mainwindow->det_window, buf);
- g_free(buf);
-
- detail_window_set_dev_name(mainwindow->det_window, device->model);
-
- if (device->cache) {
- detail_window_append_info_int(mainwindow->det_window, _("Cache (kb)"),
- device->cache, FALSE);
- }
-
- if (device->phy_geometry) {
- detail_window_append_info(mainwindow->det_window, _("Physical geometry"),
- device->phy_geometry);
- }
- if (device->log_geometry) {
- detail_window_append_info(mainwindow->det_window, _("Logical geometry"),
- device->log_geometry);
- }
-
-}
diff --git a/ide.h b/ide.h
deleted file mode 100644
index 5b2ee8c1..00000000
--- a/ide.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __IDE_H__
-#define __IDE_H__
-
-typedef struct _IDEDevice IDEDevice;
-
-struct _IDEDevice {
- gchar *model;
-
- gchar *media;
- gchar *phy_geometry;
- gchar *log_geometry;
- 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
deleted file mode 100644
index 986b3a48..00000000
--- a/intl.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * ToscoIntl version 0.1
- * Copyright (c) 2002-2003 Leandro Pereira <leandro@linuxmag.com.br>
- * 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 <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-
-#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,
- * but slower :P
- */
-const gchar *
-intl_translate(const gchar * string, const gchar * source)
-{
- FILE *file;
- gchar buffer[256], *keyname, *lang = NULL, *langenv = NULL;
- const gchar *retval, *langvars[] =
- {"LANG", "LC_MESSAGES", "LC_ALL", NULL};
- gboolean found = FALSE;
- 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)) {
- g_free(lang);
- 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
deleted file mode 100644
index 71e6b43b..00000000
--- a/intl.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef __INTL_H__
-#define __INTL_H__
-
-#include "config.h"
-
-void intl_init(void);
-const gchar *intl_translate(const gchar *string, const gchar *source);
-
-#define _(x) (intl_translate(x, __FILE__))
-
-#endif /* __INTL_H__ */
diff --git a/isapnp.c b/isapnp.c
deleted file mode 100644
index 6fc7c8b3..00000000
--- a/isapnp.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Hardware Information, version 0.3.1b
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * May be modified and/or distributed under the terms of GNU GPL version 2.
- *
- */
-
-#include "hardinfo.h"
-#include "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 = NULL, end = NULL;
-
- 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)
-{
- gchar *buf;
-
- if(!device) return;
-
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window), _("ISA Plug and Play Device"));
-
- detail_window_set_dev_name(mainwindow->det_window, device->card);
- detail_window_set_icon(mainwindow->det_window, IMG_PREFIX "pci.png");
-
- detail_window_append_info_int(mainwindow->det_window, _("Card ID"),
- device->card_id, FALSE);
- buf = g_strdup_printf("%.2f", device->pnpversion);
- detail_window_append_info(mainwindow->det_window, _("PnP version"),
- buf);
- g_free(buf);
-
- buf = g_strdup_printf("%.2f", device->prodversion);
- detail_window_append_info(mainwindow->det_window, _("Product version"),
- buf);
- g_free(buf);
-}
-
diff --git a/isapnp.h b/isapnp.h
deleted file mode 100644
index e6e283c9..00000000
--- a/isapnp.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#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
deleted file mode 120000
index 990137fc..00000000
--- a/lang/es_CO.lang
+++ /dev/null
@@ -1 +0,0 @@
-es_MX.ISO-8859-1.lang \ No newline at end of file
diff --git a/lang/es_DO.lang b/lang/es_DO.lang
deleted file mode 120000
index 990137fc..00000000
--- a/lang/es_DO.lang
+++ /dev/null
@@ -1 +0,0 @@
-es_MX.ISO-8859-1.lang \ No newline at end of file
diff --git a/lang/es_ES.lang b/lang/es_ES.lang
deleted file mode 120000
index 990137fc..00000000
--- a/lang/es_ES.lang
+++ /dev/null
@@ -1 +0,0 @@
-es_MX.ISO-8859-1.lang \ No newline at end of file
diff --git a/lang/es_GT.lang b/lang/es_GT.lang
deleted file mode 120000
index 990137fc..00000000
--- a/lang/es_GT.lang
+++ /dev/null
@@ -1 +0,0 @@
-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
deleted file mode 100644
index 79511225..00000000
--- a/lang/es_MX.ISO-8859-1.lang
+++ /dev/null
@@ -1,117 +0,0 @@
-[Translation]
-translated-by=Erica Andrews <PhrozenSmoke@yahoo.com>
-
-[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
-<b>Computer name:</b>=<b>Nombre de computadora:</b>
-Computer name:=Nombre de computadora:
-<b>Distribution:</b>=<b>Distribución:</b>
-Distribution:=Distribución:
-<b>Kernel:</b>=<b>Kernel:</b>
-Kernel:=Kernel:
-<b>Uptime:</b>=<b>Uptime:</b>
-Uptime:=Uptime:
-Updating...=Atualizando...
-<b>%s</b> at %d MHz (%d bogomips)=<b>%s</b> 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
-<b><big>Operating System</big></b>=<b><big>Sistema Operativo</big></b>
-Operating System=Sistema Operativo
-<b><big>Processor</big></b>=<b><big>Procesador</big></b>
-Processor=Procesador
-<b><big>Memory Usage</big></b>=<b><big>Uso de Memoria</big></b>
-Memory Usage=Uso de Memoria
-Devices=Dispositivos
-Device information=Información de Dispositivo
-Refresh=Refrescar
-Close=Cerrar
-Environment=Ambiente
-<b><big>X-Window System</big></b>=<b><big>X-Window System</big></b>
-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]
-<b>Display:</b>=<b>Display:</b>
-Display:=Display:
-<b>Vendor:</b>=<b>Distribuidor:</b>
-Vendor:=Distribuidor:
-<b>Release:</b>=<b>Versión:</b>
-Release:=Versión:
-<b>Resolution:</b>=<b>Resolución:</b>
-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
deleted file mode 120000
index 990137fc..00000000
--- a/lang/es_MX.lang
+++ /dev/null
@@ -1 +0,0 @@
-es_MX.ISO-8859-1.lang \ No newline at end of file
diff --git a/lang/es_PR.lang b/lang/es_PR.lang
deleted file mode 120000
index 990137fc..00000000
--- a/lang/es_PR.lang
+++ /dev/null
@@ -1 +0,0 @@
-es_MX.ISO-8859-1.lang \ No newline at end of file
diff --git a/lang/es_US.lang b/lang/es_US.lang
deleted file mode 120000
index 990137fc..00000000
--- a/lang/es_US.lang
+++ /dev/null
@@ -1 +0,0 @@
-es_MX.ISO-8859-1.lang \ No newline at end of file
diff --git a/lang/pt_BR.lang b/lang/pt_BR.lang
deleted file mode 100644
index 8d45505e..00000000
--- a/lang/pt_BR.lang
+++ /dev/null
@@ -1,117 +0,0 @@
-[Translation]
-translated-by=Leandro Pereira <leandro@linuxmag.com.br>
-
-[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
-<b>Computer name:</b>=<b>Nome do computador:</b>
-Computer name:=Nome do computador:
-<b>Distribution:</b>=<b>Distribuição:</b>
-Distribution:=Distribuição:
-<b>Kernel:</b>=<b>Kernel:</b>
-Kernel:=Kernel:
-<b>Uptime:</b>=<b>Uptime:</b>
-Uptime:=Uptime:
-Updating...=Atualizando...
-<b>%s</b> at %d MHz (%d bogomips)=<b>%s</b> 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
-<b><big>Operating System</big></b>=<b><big>Sistema Operacional</big></b>
-Operating System=Sistema Operacional
-<b><big>Processor</big></b>=<b><big>Processador</big></b>
-Processor=Processador
-<b><big>Memory Usage</big></b>=<b><big>Uso da Memória</big></b>
-Memory Usage=Uso da Memória
-Devices=Dipositivos
-Device information=Informação do Dispositivo
-Refresh=Atualizar
-Close=Fechar
-Environment=Ambiente
-<b><big>X-Window System</big></b>=<b><big>X-Window System</big></b>
-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 base: 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]
-<b>Display:</b>=<b>Display:</b>
-Display:=Display:
-<b>Vendor:</b>=<b>Distribuidor:</b>
-Vendor:=Distribuidor:
-<b>Release:</b>=<b>Versão:</b>
-Release:=Versão:
-<b>Resolution:</b>=<b>Resolução:</b>
-Resolution:=Resolução:
-Local display (%s)=Display local (%s)
-Remote display (%s)=Display remoto (%s)
diff --git a/loadgraph.c b/loadgraph.c
new file mode 100644
index 00000000..a15af347
--- /dev/null
+++ b/loadgraph.c
@@ -0,0 +1,266 @@
+/*
+ * Simple Load Graph
+ * Version 0.1 - Wed, Jan 11 2006
+ * - initial release
+ * Version 0.1.1 - Fri, Jan 13 2006
+ * - fixes autoscaling
+ * - add color
+ *
+ * Copyright (C) 2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * The Simple Load Graph is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License, version 2.1, as published by the Free Software Foundation.
+ *
+ * The Simple Load Graph is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the Simple Load Graph; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307 USA.
+ */
+
+#include "loadgraph.h"
+
+static void _draw(LoadGraph *lg);
+
+LoadGraph *load_graph_new(gint size)
+{
+ LoadGraph *lg;
+
+ lg = g_new0(LoadGraph, 1);
+
+ lg->area = gtk_drawing_area_new();
+ lg->size = size;
+ lg->data = g_new0(gint, size);
+
+ lg->scale = 1.0;
+
+ lg->width = size * 4;
+ lg->height = size * 2;
+
+ gtk_widget_set_size_request(lg->area, lg->width, lg->height);
+ gtk_widget_show(lg->area);
+
+ return lg;
+}
+
+GtkWidget *load_graph_get_framed(LoadGraph *lg)
+{
+ GtkWidget *align, *frame;
+
+ align = gtk_alignment_new(0.5, 0.5, 0, 0);
+ gtk_widget_show(align);
+
+ frame = gtk_frame_new(NULL);
+ gtk_widget_show(frame);
+ gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+
+ gtk_container_add(GTK_CONTAINER(align), frame);
+ gtk_container_add(GTK_CONTAINER(frame), lg->area);
+
+ return align;
+}
+
+void load_graph_clear(LoadGraph *lg)
+{
+ gint i;
+
+ for (i = 0; i < lg->size; i++)
+ lg->data[i] = 0;
+
+ lg->scale = 1.0;
+ _draw(lg);
+}
+
+void load_graph_set_color(LoadGraph *lg, LoadGraphColor color)
+{
+ lg->color = color;
+ gdk_rgb_gc_set_foreground(lg->trace, lg->color);
+}
+
+void load_graph_destroy(LoadGraph *lg)
+{
+ g_free(lg->data);
+ gtk_widget_destroy(lg->area);
+ gdk_pixmap_unref(lg->buf);
+ g_object_unref(lg->trace);
+ g_object_unref(lg->grid);
+ g_free(lg);
+}
+
+static gboolean _expose(GtkWidget *widget, GdkEventExpose *event,
+ gpointer user_data)
+{
+ LoadGraph *lg = (LoadGraph *)user_data;
+ GdkDrawable *draw = GDK_DRAWABLE(lg->buf);
+
+ gdk_draw_drawable(lg->area->window,
+ lg->area->style->white_gc,
+ draw,
+ 0, 0,
+ 0, 0,
+ lg->width, lg->height);
+ return FALSE;
+}
+
+void load_graph_configure_expose(LoadGraph *lg)
+{
+ /* creates the backing store pixmap */
+ gtk_widget_realize(lg->area);
+ lg->buf = gdk_pixmap_new(lg->area->window, lg->width, lg->height, -1);
+
+ /* create the graphic contexts */
+ lg->grid = gdk_gc_new(GDK_DRAWABLE(lg->buf));
+ lg->trace = gdk_gc_new(GDK_DRAWABLE(lg->buf));
+
+ /* the default color is green */
+ load_graph_set_color(lg, LG_COLOR_GREEN);
+
+ /* init graphic contexts */
+ gdk_gc_set_line_attributes(lg->grid,
+ 1, GDK_LINE_ON_OFF_DASH,
+ GDK_CAP_NOT_LAST,
+ GDK_JOIN_ROUND);
+ gdk_rgb_gc_set_foreground(lg->grid, 0x707070);
+
+ gdk_gc_set_line_attributes(lg->trace,
+ 2, GDK_LINE_SOLID,
+ GDK_CAP_NOT_LAST,
+ GDK_JOIN_ROUND);
+
+ /* configures the expose event */
+ g_signal_connect(G_OBJECT(lg->area), "expose-event",
+ (GCallback) _expose, lg);
+}
+
+static void
+_draw(LoadGraph *lg)
+{
+ GdkDrawable *draw = GDK_DRAWABLE(lg->buf);
+ gint i, d;
+
+ /* clears the drawing area */
+ gdk_draw_rectangle(draw, lg->area->style->black_gc,
+ TRUE, 0, 0, lg->width, lg->height);
+
+ /* horizontal bars; 25%, 50% and 75% */
+ d = lg->height / 4;
+ gdk_draw_line(draw, lg->grid, 0, d, lg->width, d);
+ d = lg->height / 2;
+ gdk_draw_line(draw, lg->grid, 0, d, lg->width, d);
+ d = 3 * (lg->height / 4);
+ gdk_draw_line(draw, lg->grid, 0, d, lg->width, d);
+
+ /* vertical bars */
+ for (i = lg->width, d = 0; i > 1; i--, d++)
+ if ((d % 45) == 0 && d)
+ gdk_draw_line(draw, lg->grid, i, 0, i, lg->height);
+
+ /* the graph */
+ for (i = 0; i < lg->size; i++) {
+ gint this = lg->height - lg->data[i];
+ gint next = lg->height - lg->data[i+1];
+
+ gdk_draw_line(draw, lg->trace, i * 4, this, i * 4 + 2,
+ (this + next) / 2);
+ gdk_draw_line(draw, lg->trace, i * 4 + 2, (this + next) / 2,
+ i * 4 + 4, next);
+ }
+
+ gtk_widget_queue_draw(lg->area);
+}
+
+static inline int
+_max(LoadGraph *lg)
+{
+ gint i;
+ gint max = 0;
+
+ for (i = 0; i < lg->size; i++) {
+ if (lg->data[i] > max)
+ max = lg->data[i];
+ }
+
+ return max;
+}
+
+void
+load_graph_update(LoadGraph *lg, gint value)
+{
+ gint i;
+
+ if (value < 0)
+ return;
+ else if (value > _max(lg) && value > lg->height) {
+ /* FIXME: make scale work correctly :P */
+ gfloat nscale = (gfloat)lg->height / ceilf((float)value * lg->scale);
+
+ while (value * nscale > lg->height) {
+ nscale *= .90;
+ }
+
+ if (nscale < lg->scale) {
+ lg->scale = nscale;
+
+ for (i = 0; i < lg->size; i++) {
+ lg->data[i] = (int)((float)lg->data[i] * lg->scale);
+ }
+ }
+ }
+
+ value = (int)ceilf((float)value * lg->scale);
+
+ /* shift-right our data */
+ for (i = 0; i < lg->size; i++) {
+ lg->data[i] = lg->data[i+1];
+ }
+
+ /* insert the updated value */
+ lg->data[i] = value;
+
+ /* redraw */
+ _draw(lg);
+}
+
+#ifdef LOADGRAPH_UNIT_TEST
+gboolean lg_update(gpointer d)
+{
+ LoadGraph *lg = (LoadGraph *)d;
+
+ int i = 0;
+ if ((rand() % 10) == 0) {
+ i = rand() % 1000 + 500;
+ }
+
+ load_graph_update(lg, rand() % 200 + i);
+
+ return TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ LoadGraph *lg;
+ GtkWidget *window;
+
+ gtk_init(&argc, &argv);
+
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_widget_show(window);
+
+ lg = load_graph_new(100);
+ gtk_container_add(GTK_CONTAINER(window), lg->area);
+ load_graph_configure_expose(lg);
+
+ lg_update(lg);
+
+ g_timeout_add(100, lg_update, lg);
+
+ gtk_main();
+
+ return 0;
+}
+#endif
diff --git a/loadgraph.h b/loadgraph.h
new file mode 100644
index 00000000..81bdcde4
--- /dev/null
+++ b/loadgraph.h
@@ -0,0 +1,61 @@
+/*
+ * Simple Load Graph
+ * Copyright (C) 2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * The Simple Load Graph is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License, version 2.1, as published by the Free Software Foundation.
+ *
+ * The Simple Load Graph is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the Simple Load Graph; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307 USA.
+ */
+
+
+#ifndef __LOADGRAPH_H__
+#define __LOADGRAPH_H__
+
+#include <stdlib.h>
+#include <gtk/gtk.h>
+#include <math.h>
+
+typedef struct _LoadGraph LoadGraph;
+
+typedef enum {
+ LG_COLOR_GREEN = 0x4FB05A,
+ LG_COLOR_BLUE = 0x4F58B0,
+ LG_COLOR_RED = 0xB04F4F
+} LoadGraphColor;
+
+struct _LoadGraph {
+ GdkPixmap *buf;
+ GtkWidget *area;
+
+ GdkGC *grid;
+ GdkGC *trace;
+
+ gint *data;
+ gfloat scale;
+
+ gint size;
+ gint width, height;
+ LoadGraphColor color;
+
+};
+
+LoadGraph *load_graph_new(gint size);
+void load_graph_destroy(LoadGraph *lg);
+void load_graph_configure_expose(LoadGraph *lg);
+GtkWidget *load_graph_get_framed(LoadGraph *lg);
+
+void load_graph_update(LoadGraph *lg, gint value);
+void load_graph_set_color(LoadGraph *lg, LoadGraphColor color);
+void load_graph_clear(LoadGraph *lg);
+
+#endif /* __LOADGRAPH_H__ */
diff --git a/md5.c b/md5.c
new file mode 100644
index 00000000..1047bf89
--- /dev/null
+++ b/md5.c
@@ -0,0 +1,318 @@
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+/* This code was modified in 1997 by Jim Kingdon of Cyclic Software to
+ not require an integer type which is exactly 32 bits. This work
+ draws on the changes for the same purpose by Tatu Ylonen
+ <ylo@cs.hut.fi> as part of SSH, but since I didn't actually use
+ that code, there is no copyright issue. I hereby disclaim
+ copyright in any changes I have made; this code remains in the
+ public domain. */
+
+#include <string.h> /* for memcpy() and memset() */
+
+/* Add prototype support. */
+#ifndef PROTO
+#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
+#define PROTO(ARGS) ARGS
+#else
+#define PROTO(ARGS) ()
+#endif
+#endif
+
+#include "md5.h"
+
+#if defined(__OPTIMIZE__)
+#error You must compile this program without "-O". (Or else the benchmark results may be different!)
+#endif
+
+/* Little-endian byte-swapping routines. Note that these do not
+ depend on the size of datatypes such as uint32, nor do they require
+ us to detect the endianness of the machine we are running on. It
+ is possible they should be macros for speed, but I would be
+ surprised if they were a performance bottleneck for MD5. */
+
+static uint32 getu32(addr)
+const unsigned char *addr;
+{
+ return (((((unsigned long) addr[3] << 8) | addr[2]) << 8)
+ | addr[1]) << 8 | addr[0];
+}
+
+static void putu32(data, addr)
+uint32 data;
+unsigned char *addr;
+{
+ addr[0] = (unsigned char) data;
+ addr[1] = (unsigned char) (data >> 8);
+ addr[2] = (unsigned char) (data >> 16);
+ addr[3] = (unsigned char) (data >> 24);
+}
+
+/*
+ * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
+ * initialization constants.
+ */
+void MD5Init(ctx)
+struct MD5Context *ctx;
+{
+ ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+ ctx->buf[2] = 0x98badcfe;
+ ctx->buf[3] = 0x10325476;
+
+ ctx->bits[0] = 0;
+ ctx->bits[1] = 0;
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void MD5Update(ctx, buf, len)
+struct MD5Context *ctx;
+unsigned char const *buf;
+unsigned len;
+{
+ uint32 t;
+
+ /* Update bitcount */
+
+ t = ctx->bits[0];
+ if ((ctx->bits[0] = (t + ((uint32) len << 3)) & 0xffffffff) < t)
+ ctx->bits[1]++; /* Carry from low to high */
+ ctx->bits[1] += len >> 29;
+
+ t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
+
+ /* Handle any leading odd-sized chunks */
+
+ if (t) {
+ unsigned char *p = ctx->in + t;
+
+ t = 64 - t;
+ if (len < t) {
+ memcpy(p, buf, len);
+ return;
+ }
+ memcpy(p, buf, t);
+ MD5Transform(ctx->buf, ctx->in);
+ buf += t;
+ len -= t;
+ }
+
+ /* Process data in 64-byte chunks */
+
+ while (len >= 64) {
+ memcpy(ctx->in, buf, 64);
+ MD5Transform(ctx->buf, ctx->in);
+ buf += 64;
+ len -= 64;
+ }
+
+ /* Handle any remaining bytes of data. */
+
+ memcpy(ctx->in, buf, len);
+}
+
+/*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+void MD5Final(digest, ctx)
+unsigned char digest[16];
+struct MD5Context *ctx;
+{
+ unsigned count;
+ unsigned char *p;
+
+ /* Compute number of bytes mod 64 */
+ count = (ctx->bits[0] >> 3) & 0x3F;
+
+ /* Set the first char of padding to 0x80. This is safe since there is
+ always at least one byte free */
+ p = ctx->in + count;
+ *p++ = 0x80;
+
+ /* Bytes of padding needed to make 64 bytes */
+ count = 64 - 1 - count;
+
+ /* Pad out to 56 mod 64 */
+ if (count < 8) {
+ /* Two lots of padding: Pad the first block to 64 bytes */
+ memset(p, 0, count);
+ MD5Transform(ctx->buf, ctx->in);
+
+ /* Now fill the next block with 56 bytes */
+ memset(ctx->in, 0, 56);
+ } else {
+ /* Pad block to 56 bytes */
+ memset(p, 0, count - 8);
+ }
+
+ /* Append length in bits and transform */
+ putu32(ctx->bits[0], ctx->in + 56);
+ putu32(ctx->bits[1], ctx->in + 60);
+
+ MD5Transform(ctx->buf, ctx->in);
+ putu32(ctx->buf[0], digest);
+ putu32(ctx->buf[1], digest + 4);
+ putu32(ctx->buf[2], digest + 8);
+ putu32(ctx->buf[3], digest + 12);
+ memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
+}
+
+#ifndef ASM_MD5
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f, w, x, y, z, data, s) \
+ ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<<s | w>>(32-s), w += x )
+
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data. MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+void MD5Transform(buf, inraw)
+uint32 buf[4];
+const unsigned char inraw[64];
+{
+ register uint32 a, b, c, d;
+ uint32 in[16];
+ int i;
+
+ for (i = 0; i < 16; ++i)
+ in[i] = getu32(inraw + 4 * i);
+
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+ MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+ MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
+ MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+ MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+ MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+ MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
+ MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
+ MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
+ MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+ MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+ MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+ MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
+ MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
+ MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
+ MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
+
+ MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+ MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
+ MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+ MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+ MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+ MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
+ MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+ MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+ MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+ MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+ MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+ MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+ MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+ MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+ MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+ MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+
+ MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+ MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
+ MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+ MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+ MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+ MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+ MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+ MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+ MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+ MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+ MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+ MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
+ MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+ MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+ MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+ MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+
+ MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
+ MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
+ MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+ MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+ MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+ MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+ MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+ MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+ MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+ MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+ MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
+ MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+ MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+ MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+ MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+ MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
+}
+#endif
+
+#ifdef TEST
+/* Simple test program. Can use it to manually run the tests from
+ RFC1321 for example. */
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+ struct MD5Context context;
+ unsigned char checksum[16];
+ int i;
+ int j;
+
+ if (argc < 2) {
+ fprintf(stderr, "usage: %s string-to-hash\n", argv[0]);
+ exit(1);
+ }
+ for (j = 1; j < argc; ++j) {
+ printf("MD5 (\"%s\") = ", argv[j]);
+ MD5Init(&context);
+ MD5Update(&context, argv[j], strlen(argv[j]));
+ MD5Final(checksum, &context);
+ for (i = 0; i < 16; i++) {
+ printf("%02x", (unsigned int) checksum[i]);
+ }
+ printf("\n");
+ }
+ return 0;
+}
+#endif /* TEST */
+ \ No newline at end of file
diff --git a/md5.h b/md5.h
new file mode 100644
index 00000000..1522170c
--- /dev/null
+++ b/md5.h
@@ -0,0 +1,26 @@
+/* See md5.c for explanation and copyright information. */
+
+#ifndef MD5_H
+#define MD5_H
+
+/* Unlike previous versions of this code, uint32 need not be exactly
+ 32 bits, merely 32 bits or more. Choosing a data type which is 32
+ bits instead of 64 is not important; speed is considerably more
+ important. ANSI guarantees that "unsigned long" will be big enough,
+ and always using it seems to have few disadvantages. */
+typedef unsigned long uint32;
+
+struct MD5Context {
+ uint32 buf[4];
+ uint32 bits[2];
+ unsigned char in[64];
+};
+
+void MD5Init (struct MD5Context *context);
+void MD5Update (struct MD5Context *context,
+ unsigned char const *buf, unsigned len);
+void MD5Final (unsigned char digest[16],
+ struct MD5Context *context);
+void MD5Transform (uint32 buf[4], const unsigned char in[64]);
+
+#endif /* !MD5_H */
diff --git a/menu.c b/menu.c
new file mode 100644
index 00000000..bc66189b
--- /dev/null
+++ b/menu.c
@@ -0,0 +1,125 @@
+/*
+ * HardInfo
+ * Copyright(C) 2003-2006 Leandro A. F. Pereira.
+ *
+ * menu.c is based on UI Manager tutorial by Ryan McDougall
+ * Copyright(C) 2005 Ryan McDougall.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <menu.h>
+#include <config.h>
+
+#include <stock.h>
+
+#include <callbacks.h>
+
+static GtkActionEntry entries[] =
+{
+ { "FileMenuAction", NULL, "_File" }, /* name, stock id, label */
+ { "ViewMenuAction", NULL, "_View" },
+ { "HelpMenuAction", NULL, "_Help" },
+ { "MainMenuBarAction", NULL, "" },
+
+ { "ReportAction", HI_STOCK_REPORT, /* name, stock id */
+ "Generate _Report", "<control>R", /* label, accelerator */
+ "Creates a report in HTML", /* tooltip */
+ G_CALLBACK(cb_generate_report) },
+
+ { "RefreshAction", GTK_STOCK_REFRESH,
+ "_Refresh", "F5",
+ NULL,
+ G_CALLBACK(cb_refresh) },
+
+ { "AboutAction", GTK_STOCK_ABOUT,
+ "_About\342\200\246", NULL,
+ "Displays program version information",
+ G_CALLBACK(cb_about) },
+
+ { "QuitAction", GTK_STOCK_QUIT,
+ "_Quit", "<control>Q",
+ NULL,
+ G_CALLBACK(cb_quit) }
+};
+
+static GtkToggleActionEntry toggle_entries[] =
+{
+ { "LeftPaneAction", NULL,
+ "_Left Pane", NULL,
+ "Toggles left pane visibility",
+ G_CALLBACK(cb_left_pane) },
+ { "ToolbarAction", NULL,
+ "_Toolbar", NULL,
+ NULL,
+ G_CALLBACK(cb_toolbar) },
+};
+
+/* Implement a handler for GtkUIManager's "add_widget" signal. The UI manager
+ * will emit this signal whenever it needs you to place a new widget it has. */
+static void
+menu_add_widget(GtkUIManager *ui, GtkWidget *widget, GtkContainer *container)
+{
+ gtk_box_pack_start(GTK_BOX(container), widget, FALSE, FALSE, 0);
+ gtk_widget_show(widget);
+}
+
+void menu_init(Shell *shell)
+{
+ GtkWidget *menu_box; /* Packing box for the menu and toolbars */
+ GtkActionGroup *action_group; /* Packing group for our Actions */
+ GtkUIManager *menu_manager; /* The magic widget! */
+ GError *error; /* For reporting exceptions or errors */
+
+ /* Create our objects */
+ menu_box = shell->vbox;
+ action_group = gtk_action_group_new("HardInfo");
+ menu_manager = gtk_ui_manager_new();
+
+ shell->action_group = action_group;
+ shell->ui_manager = menu_manager;
+
+ /* Pack up our objects:
+ * menu_box -> window
+ * actions -> action_group
+ * action_group -> menu_manager */
+ gtk_action_group_add_actions(action_group, entries, G_N_ELEMENTS(entries),
+ NULL);
+ gtk_action_group_add_toggle_actions(action_group, toggle_entries,
+ G_N_ELEMENTS(toggle_entries), NULL);
+ gtk_ui_manager_insert_action_group(menu_manager, action_group, 0);
+
+ /* Read in the UI from our XML file */
+ error = NULL;
+ gtk_ui_manager_add_ui_from_file(menu_manager, PREFIX "uidefs.xml", &error);
+
+ if (error) {
+ g_error("building menus failed: %s", error->message);
+ g_error_free(error);
+ }
+
+ /* Connect up important signals */
+ /* This signal is necessary in order to place widgets from the UI manager
+ * into the menu_box */
+ g_signal_connect(menu_manager, "add_widget",
+ G_CALLBACK(menu_add_widget),
+ menu_box);
+
+ /* Show the window and run the main loop, we're done! */
+ gtk_widget_show(menu_box);
+
+ gtk_toolbar_set_style(GTK_TOOLBAR(gtk_ui_manager_get_widget(shell->ui_manager, "/MainMenuBarAction")),
+ GTK_TOOLBAR_BOTH_HORIZ);
+}
diff --git a/menu.h b/menu.h
new file mode 100644
index 00000000..83cf086b
--- /dev/null
+++ b/menu.h
@@ -0,0 +1,25 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef __MENU_H__
+#define __MENU_H__
+
+#include <shell.h>
+
+void menu_init(Shell *shell);
+
+#endif /* __MENU_H__ */
diff --git a/modules.c b/modules.c
deleted file mode 100644
index ddee1def..00000000
--- a/modules.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Hardware Information, version 0.3
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * May be modified and/or distributed under the terms of GNU GPL version 2.
- *
- */
-
-#include <gtk/gtk.h>
-
-#include "hardinfo.h"
-#include "modules.h"
-
-void hi_show_module_info(MainWindow *mainwindow, ModInfo *device)
-{
- if(!device) return;
-
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window), device->description);
- detail_window_set_icon(mainwindow->det_window, IMG_PREFIX "module.png");
- detail_window_set_dev_name(mainwindow->det_window, device->name);
- detail_window_set_dev_type(mainwindow->det_window, device->description);
-
- if (device->author && strlen(device->author)) {
- detail_window_append_info(mainwindow->det_window, _("Author"),
- device->author);
- detail_window_append_separator(mainwindow->det_window);
- }
-
- if (device->license && strlen(device->license))
- detail_window_append_info(mainwindow->det_window, _("License"),
- device->license);
-
- if (device->depends &&strlen(device->depends))
- detail_window_append_info(mainwindow->det_window, _("Depends on"),
- device->depends);
-
-}
-
-GtkWidget *module_get_widget(void)
-{
-#if 0
- GtkWidget *vbox, *hbbox, *scroll, *clist, *btn;
-
- vbox = gtk_vbox_new(FALSE, 5);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
- gtk_widget_show(vbox);
-
- hbbox = gtk_hbutton_box_new();
- gtk_container_set_border_width(GTK_CONTAINER(hbbox), 4);
- gtk_widget_show(hbbox);
- gtk_box_pack_end(GTK_BOX(vbox), 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);
-
- btn = gtk_button_new_from_stock(HI_DETAILS);
- g_signal_connect(G_OBJECT(btn), "clicked",
- (GCallback) detail_window_show, mainwindow);
- gtk_widget_show(btn);
- gtk_box_pack_end(GTK_BOX(hbbox), btn, FALSE, FALSE, 0);
- mainwindow->details_button = btn;
-
- 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);
- g_signal_connect(G_OBJECT(ctree), "tree-select-row",
- (GCallback) hi_enable_details_button, mainwindow);
- g_signal_connect(G_OBJECT(ctree), "tree-unselect-row",
- (GCallback) hi_disable_details_button, mainwindow);
-
-
- return vbox;
-#endif
-
- return NULL;
-}
-
-#define SET_VAR(vname,var) \
- if (!strncmp(buffer, vname, strlen(vname))) { \
- gchar *_b = buffer; \
- while (*_b && *_b != ':') _b++; _b++; \
- while (*_b && (*_b == ' ' || *_b == '\t')) _b++; \
- modinfo->var = g_strdup(g_strstrip(_b)); \
- }
-
-ModInfo *hi_scan_modules(void)
-{
- FILE *lsmod;
- gchar buffer[256];
- ModInfo *modinfo = NULL, *mod = NULL;
-
- lsmod = popen("/sbin/lsmod", "r");
- if(!lsmod) return NULL;
-
- fgets(buffer, 256, lsmod); /* Discards the first line */
-
- while(fgets(buffer, 256, lsmod)){
- gchar *start, *buf;
- FILE *modi;
-
- start = buf = buffer;
-
- walk_until_inclusive(' ');
- *buf = 0;
-
- modinfo = g_new0(ModInfo, 1);
-
- modinfo->name = g_strdup(start);
-
- buf = g_strdup_printf("/sbin/modinfo %s", start);
- modi = popen(buf, "r");
- while (fgets(buffer, 256, modi)) {
- SET_VAR("author", author);
- SET_VAR("description", description);
- SET_VAR("license", license);
- SET_VAR("depends", depends);
- }
- pclose(modi);
-
- modinfo->next = mod;
- mod = modinfo;
- }
- pclose(lsmod);
-
- return mod;
-}
diff --git a/modules.conf b/modules.conf
new file mode 100644
index 00000000..1dbaf07f
--- /dev/null
+++ b/modules.conf
@@ -0,0 +1,7 @@
+[general]
+version=2
+
+[categories]
+Computer=computer
+Devices=devices
+Benchmarks=benchmark
diff --git a/modules.h b/modules.h
deleted file mode 100644
index 046d4b94..00000000
--- a/modules.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef __MODULES_H__
-#define __MODULES_H__
-
-#include <gtk/gtk.h>
-
-typedef struct _ModInfo ModInfo;
-
-struct _ModInfo {
- gchar *name;
- gchar *author;
- gchar *description;
- gchar *license;
- gchar *depends;
-
- ModInfo *next;
-};
-
-void hi_show_module_info(MainWindow *mainwindow, ModInfo *modinfo);
-ModInfo *hi_scan_modules(void);
-
-#endif
diff --git a/net.c b/net.c
deleted file mode 100644
index 6529c420..00000000
--- a/net.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Hardware Information, version 0.3
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * May be modified and/or distributed under the terms of GNU GPL version 2.
- */
-
-#include <stdio.h>
-#include "config.h"
-#include "hardinfo.h"
-#include "net.h"
-
-gboolean net_update(gpointer data);
-
-GtkWidget *net_get_widget(MainWindow * mainwindow)
-{
- return gtk_label_new("Not implemented yet.");
-}
-
-gboolean net_update(gpointer data)
-{
- MainWindow *mainwindow = (MainWindow *) data;
- NetDevice *net;
- static NetDevice *netold = NULL;
-
- if (!mainwindow)
- return FALSE;
-
- net = hi_scan_net();
-
- if (!net)
- return FALSE;
-
- if (!netold) {
- netold = net;
- } else {
- NetDevice *nd1, *nd2;
-
- for (nd1 = netold, nd2 = net; nd1 && nd2;
- nd1 = nd1->next, nd2 = nd2->next) {
-
- g_print ("iface %s: %ld bytes/s up, %ld bytes/s down\n",
- nd1->iface,
- nd2->trans_bytes - nd1->trans_bytes,
- nd2->recv_bytes - nd1->recv_bytes);
- }
-
- netold = net;
- }
-
- g_print("\n\n");
-
- 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[16];
- 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, 16);
-
- for (i = 0; buffer[i] != ':' && i < 16; i++) {
- ifacename[i] = buffer[i];
- }
-
- walk_until_inclusive(':');
-
- /* iface: bytes packets errs drop fifo frame compressed multicast */
- sscanf(buf, "%ld %ld %ld %d %d %d %d %d %ld %ld %ld",
- &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("%ld\n", net_dev->recv_bytes);
-
- net_dev->iface = g_strdup(ifacename);
- }
- }
- fclose(proc_net);
-
- return net;
-}
diff --git a/net.h b/net.h
deleted file mode 100644
index eb9cec00..00000000
--- a/net.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __NET_H__
-#define __NET_H__
-
-#include "hardinfo.h"
-
-typedef struct _NetDevice NetDevice;
-
-struct _NetDevice {
- gchar *iface;
-
- gulong recv_bytes;
- gulong recv_errors;
- gulong recv_packets;
-
- gulong trans_bytes;
- gulong trans_errors;
- gulong 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
deleted file mode 100644
index 3c64b87c..00000000
--- a/parport.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Hardware Information, version 0.3.1b
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * 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)
-{
- 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;
-
- 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;
-
-
- buf = g_strdup_printf("%s%s", IMG_PREFIX, type2icon[i].icon);
- detail_window_set_icon(mainwindow->det_window, buf);
- g_free(buf);
-
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window), _("Parallel Port"));
-
- detail_window_set_dev_name(mainwindow->det_window, device->name);
- detail_window_set_dev_type(mainwindow->det_window, type2icon[i].label);
-
- if (device->description)
- detail_window_append_info(mainwindow->det_window, _("Description"),
- device->description);
-
- if (device->cmdset)
- detail_window_append_info(mainwindow->det_window, _("Command set"),
- device->cmdset);
-
- detail_window_append_info_int(mainwindow->det_window, _("Base I/O address"),
- device->port, TRUE);
- detail_window_append_info(mainwindow->det_window, _("Modes"),
- device->modes);
- detail_window_append_info(mainwindow->det_window, _("Uses DMA"),
- device->dma ? _("Yes") : _("No"));
-}
diff --git a/parport.h b/parport.h
deleted file mode 100644
index 1461a909..00000000
--- a/parport.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#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
deleted file mode 100644
index 12b32397..00000000
--- a/pci.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Hardware Information, version 0.3
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * May be modified and/or distributed under the terms of GNU GPL version 2.
- *
- */
-
-#include "hardinfo.h"
-#include "pci.h"
-
-void hi_show_pci_info(MainWindow *mainwindow, PCIDevice *device)
-{
- gchar *buf;
-
- if(!device) return;
-
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window), device->category);
- detail_window_set_icon(mainwindow->det_window, IMG_PREFIX "pci.png");
- detail_window_set_dev_name(mainwindow->det_window, device->name);
- detail_window_set_dev_type(mainwindow->det_window, device->category);
-
- if (device->irq)
- detail_window_append_info_int(mainwindow->det_window, "IRQ",
- device->irq, FALSE);
-
- if(device->io_addr) {
- buf = g_strdup_printf(_("0x%x to 0x%x"), device->io_addr,
- device->io_addr_end);
-
- detail_window_append_info(mainwindow->det_window,
- _("I/O Address"), buf);
- g_free(buf);
- }
-
- if(device->memory) {
- buf = g_strdup_printf(_("%d%s"),
- (device->memory <= 1024) ? device->memory :
- device->memory / 1000,
- (device->memory <= 1024) ? "bytes" : "KB");
-
- detail_window_append_info(mainwindow->det_window,
- _("Memory"), buf);
-
- g_free(buf);
- }
-
- if(device->freq) {
- buf = g_strdup_printf(_("%dMHz"), device->freq);
-
- detail_window_append_info(mainwindow->det_window,
- _("Frequency"), buf);
-
- g_free(buf);
- }
-
- if (device->latency)
- detail_window_append_info_int(mainwindow->det_window,
- _("Latency"), device->latency,
- FALSE);
-
- detail_window_append_info(mainwindow->det_window, _("Bus master"),
- (gchar*)((device->bus_master) ? _("Yes") : _("No")));
-
- detail_window_append_separator(mainwindow->det_window);
-
- detail_window_append_info_int(mainwindow->det_window, _("Domain"),
- device->domain, FALSE);
- detail_window_append_info_int(mainwindow->det_window, _("Bus"),
- device->bus, FALSE);
- detail_window_append_info_int(mainwindow->det_window, _("Device"),
- device->device, FALSE);
- detail_window_append_info_int(mainwindow->det_window, _("Function"),
- device->function, FALSE);
-}
-
-#ifdef USE_LSPCI
-PCIDevice *hi_scan_pci(void)
-{
- FILE *lspci;
- gchar buffer[256], *buf;
- gint n=0;
- PCIDevice *pci_dev = NULL, *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->domain = domain;
- 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
deleted file mode 100644
index 77abc626..00000000
--- a/pci.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#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 domain;
- 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/2computer.png b/pixmaps/2computer.png
new file mode 100644
index 00000000..46f29204
--- /dev/null
+++ b/pixmaps/2computer.png
Binary files differ
diff --git a/pixmaps/athlon.png b/pixmaps/athlon.png
new file mode 100644
index 00000000..81a1b314
--- /dev/null
+++ b/pixmaps/athlon.png
Binary files differ
diff --git a/pixmaps/audio.png b/pixmaps/audio.png
new file mode 100644
index 00000000..45096651
--- /dev/null
+++ b/pixmaps/audio.png
Binary files differ
diff --git a/pixmaps/benchmark.png b/pixmaps/benchmark.png
new file mode 100644
index 00000000..1be159b7
--- /dev/null
+++ b/pixmaps/benchmark.png
Binary files differ
diff --git a/pixmaps/blowfish.png b/pixmaps/blowfish.png
new file mode 100644
index 00000000..22c68614
--- /dev/null
+++ b/pixmaps/blowfish.png
Binary files differ
diff --git a/pixmaps/cd.png b/pixmaps/cd.png
deleted file mode 100644
index c4c7806d..00000000
--- a/pixmaps/cd.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/cdrom.png b/pixmaps/cdrom.png
new file mode 100644
index 00000000..eb65bcbb
--- /dev/null
+++ b/pixmaps/cdrom.png
Binary files differ
diff --git a/pixmaps/compress.png b/pixmaps/compress.png
new file mode 100644
index 00000000..e5dee194
--- /dev/null
+++ b/pixmaps/compress.png
Binary files differ
diff --git a/pixmaps/computer.png b/pixmaps/computer.png
new file mode 100644
index 00000000..f0de0386
--- /dev/null
+++ b/pixmaps/computer.png
Binary files differ
diff --git a/pixmaps/cpu.png b/pixmaps/cpu.png
deleted file mode 100755
index da4f71d2..00000000
--- a/pixmaps/cpu.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/dev_removable.png b/pixmaps/dev_removable.png
new file mode 100644
index 00000000..2453d8dc
--- /dev/null
+++ b/pixmaps/dev_removable.png
Binary files differ
diff --git a/pixmaps/devices.png b/pixmaps/devices.png
new file mode 100644
index 00000000..0ad1400b
--- /dev/null
+++ b/pixmaps/devices.png
Binary files differ
diff --git a/pixmaps/distro/cnc.png b/pixmaps/distro/cnc.png
deleted file mode 100755
index 3967c237..00000000
--- a/pixmaps/distro/cnc.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/deb.png b/pixmaps/distro/deb.png
deleted file mode 100755
index 0ced3130..00000000
--- a/pixmaps/distro/deb.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/gnt.png b/pixmaps/distro/gnt.png
deleted file mode 100755
index bf4290a9..00000000
--- a/pixmaps/distro/gnt.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/mdk.png b/pixmaps/distro/mdk.png
deleted file mode 100755
index a997ea10..00000000
--- a/pixmaps/distro/mdk.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/rh.png b/pixmaps/distro/rh.png
deleted file mode 100755
index f612354b..00000000
--- a/pixmaps/distro/rh.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/slk.png b/pixmaps/distro/slk.png
deleted file mode 100755
index fd6d3365..00000000
--- a/pixmaps/distro/slk.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/suse.png b/pixmaps/distro/suse.png
deleted file mode 100755
index 0c7759a1..00000000
--- a/pixmaps/distro/suse.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/tl.png b/pixmaps/distro/tl.png
deleted file mode 100755
index 353bddd2..00000000
--- a/pixmaps/distro/tl.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/unk.png b/pixmaps/distro/unk.png
deleted file mode 100755
index ed850e40..00000000
--- a/pixmaps/distro/unk.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/yd.png b/pixmaps/distro/yd.png
deleted file mode 100755
index bde8c6ba..00000000
--- a/pixmaps/distro/yd.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/distro/yellow-dog.gif b/pixmaps/distro/yellow-dog.gif
deleted file mode 100755
index cf143ce1..00000000
--- a/pixmaps/distro/yellow-dog.gif
+++ /dev/null
Binary files differ
diff --git a/pixmaps/gen_connector.png b/pixmaps/gen_connector.png
deleted file mode 100755
index 477e55ff..00000000
--- a/pixmaps/gen_connector.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/gen_connector.xpm b/pixmaps/gen_connector.xpm
deleted file mode 100755
index 28aa0382..00000000
--- a/pixmaps/gen_connector.xpm
+++ /dev/null
@@ -1,46 +0,0 @@
-/* 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/gnome-dev-removable-usb.png b/pixmaps/gnome-dev-removable-usb.png
new file mode 100644
index 00000000..fb83bab2
--- /dev/null
+++ b/pixmaps/gnome-dev-removable-usb.png
Binary files differ
diff --git a/pixmaps/gnome-devel.png b/pixmaps/gnome-devel.png
new file mode 100644
index 00000000..4c63e7dd
--- /dev/null
+++ b/pixmaps/gnome-devel.png
Binary files differ
diff --git a/pixmaps/gnome-terminal.png b/pixmaps/gnome-terminal.png
new file mode 100644
index 00000000..2fe2d14d
--- /dev/null
+++ b/pixmaps/gnome-terminal.png
Binary files differ
diff --git a/pixmaps/gnome-window-manager.png b/pixmaps/gnome-window-manager.png
new file mode 100644
index 00000000..d5f0d3d9
--- /dev/null
+++ b/pixmaps/gnome-window-manager.png
Binary files differ
diff --git a/pixmaps/graphics.png b/pixmaps/graphics.png
new file mode 100644
index 00000000..a70492c1
--- /dev/null
+++ b/pixmaps/graphics.png
Binary files differ
diff --git a/pixmaps/hdd.png b/pixmaps/hdd.png
index e02487eb..bbcdc825 100644
--- a/pixmaps/hdd.png
+++ b/pixmaps/hdd.png
Binary files differ
diff --git a/pixmaps/hdd.xpm b/pixmaps/hdd.xpm
deleted file mode 100755
index 7f1d54f7..00000000
--- a/pixmaps/hdd.xpm
+++ /dev/null
@@ -1,138 +0,0 @@
-/* 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/joystick.png b/pixmaps/joystick.png
new file mode 100644
index 00000000..954cca4b
--- /dev/null
+++ b/pixmaps/joystick.png
Binary files differ
diff --git a/pixmaps/kblayout.png b/pixmaps/kblayout.png
new file mode 100644
index 00000000..b99e27d1
--- /dev/null
+++ b/pixmaps/kblayout.png
Binary files differ
diff --git a/pixmaps/keyboard.png b/pixmaps/keyboard.png
new file mode 100644
index 00000000..a716f07e
--- /dev/null
+++ b/pixmaps/keyboard.png
Binary files differ
diff --git a/pixmaps/language.png b/pixmaps/language.png
new file mode 100644
index 00000000..ab82b50f
--- /dev/null
+++ b/pixmaps/language.png
Binary files differ
diff --git a/pixmaps/logo.png b/pixmaps/logo.png
index d2dee31e..d2dee31e 100755..100644
--- a/pixmaps/logo.png
+++ b/pixmaps/logo.png
Binary files differ
diff --git a/pixmaps/logo.xpm b/pixmaps/logo.xpm
deleted file mode 100644
index 18701670..00000000
--- a/pixmaps/logo.xpm
+++ /dev/null
@@ -1,349 +0,0 @@
-/* XPM */
-static char * logo_xpm[] = {
-"32 32 314 2",
-" c None",
-". c #F3F3F3",
-"+ c #F2F2F2",
-"@ c #F1F1F1",
-"# c #F0F0F0",
-"$ c #EFEFEF",
-"% c #EEEEEE",
-"& c #ECECEC",
-"* c #EAEAEA",
-"= c #E8E8E8",
-"- c #E7E7E7",
-"; c #E3E3E3",
-"> c #AEAEAE",
-", c #F4F4F4",
-"' c #DCDCDC",
-") c #D8D8D8",
-"! c #D6D6D6",
-"~ c #D5D5D5",
-"{ c #D3D3D3",
-"] c #D1D1D1",
-"^ c #D0D0D0",
-"/ c #CFCFCF",
-"( c #CECECE",
-"_ c #CCCCCC",
-": c #CBCBCB",
-"< c #CDCDCD",
-"[ c #626262",
-"} c #898989",
-"| c #383838",
-"1 c #373737",
-"2 c #363636",
-"3 c #353535",
-"4 c #343434",
-"5 c #424242",
-"6 c #E2E2E2",
-"7 c #D9D9D9",
-"8 c #3F3F3F",
-"9 c #6E6E6E",
-"0 c #888682",
-"a c #E2E2DF",
-"b c #EDEAE6",
-"c c #DFDED9",
-"d c #C9CAC7",
-"e c #BFC0BD",
-"f c #C4C1BA",
-"g c #C1BCB2",
-"h c #B8B4AA",
-"i c #ABA69C",
-"j c #919089",
-"k c #7D7C76",
-"l c #282724",
-"m c #E5E5E5",
-"n c #D7D7D7",
-"o c #9A9793",
-"p c #EEF0F1",
-"q c #FFFFFF",
-"r c #EDEDEC",
-"s c #D8DADA",
-"t c #D0D2D2",
-"u c #CAC7C1",
-"v c #C1BDB3",
-"w c #AAA49B",
-"x c #797E7F",
-"y c #89846E",
-"z c #2C2B27",
-"A c #E4E4E4",
-"B c #6D6D6D",
-"C c #96948F",
-"D c #F7F6F5",
-"E c #FAF9F8",
-"F c #EEECEA",
-"G c #EBE9E6",
-"H c #E7E5E1",
-"I c #D0CDC5",
-"J c #C0BCB2",
-"K c #B8B3A9",
-"L c #A8A399",
-"M c #9D9685",
-"N c #8C7D76",
-"O c #2B2926",
-"P c #EBEBEB",
-"Q c #6C6C6C",
-"R c #908E89",
-"S c #F3F2F0",
-"T c #F4F2F1",
-"U c #ECEAE7",
-"V c #E9E7E4",
-"W c #E6E3DF",
-"X c #CECBC4",
-"Y c #BEBAB0",
-"Z c #B7B2A8",
-"` c #A6A197",
-" . c #937162",
-".. c #8B6863",
-"+. c #2A2826",
-"@. c #D2D2D2",
-"#. c #464C52",
-"$. c #49525D",
-"%. c #3F4954",
-"&. c #3E4852",
-"*. c #4D545B",
-"=. c #8E8F90",
-"-. c #C8C8C6",
-";. c #E5E3DF",
-">. c #E5E2DF",
-",. c #E2DFDB",
-"'. c #CAC7BE",
-"). c #BAB5AC",
-"!. c #B3ADA4",
-"~. c #A39E94",
-"{. c #928E84",
-"]. c #928E86",
-"^. c #2A2825",
-"/. c #E1E1E1",
-"(. c #6F7A86",
-"_. c #8397AB",
-":. c #7D96B2",
-"<. c #7B95B1",
-"[. c #758CA7",
-"}. c #637282",
-"|. c #5B5F63",
-"1. c #BAB9B6",
-"2. c #D8D6D3",
-"3. c #DAD8D3",
-"4. c #C3BFB7",
-"5. c #B3AEA4",
-"6. c #ACA79D",
-"7. c #9D988E",
-"8. c #8F8A80",
-"9. c #908B84",
-"0. c #292724",
-"a. c #E0E0E0",
-"b. c #41464D",
-"c. c #7D8A98",
-"d. c #8199B4",
-"e. c #7590AE",
-"f. c #849CB7",
-"g. c #A3B5C9",
-"h. c #94A9C0",
-"i. c #7892AF",
-"j. c #778BA1",
-"k. c #585D60",
-"l. c #A6A4A1",
-"m. c #C7C4C0",
-"n. c #B3AFA7",
-"o. c #A5A097",
-"p. c #9E998F",
-"q. c #928D83",
-"r. c #858077",
-"s. c #8A867F",
-"t. c #272623",
-"u. c #DFDFDF",
-"v. c #606A75",
-"w. c #8097B1",
-"x. c #D1DAE4",
-"y. c #627182",
-"z. c #676868",
-"A. c #B4B2AF",
-"B. c #AFABA5",
-"C. c #A6A29A",
-"D. c #A09C94",
-"E. c #97938B",
-"F. c #908C85",
-"G. c #8D8A83",
-"H. c #272522",
-"I. c #DEDEDE",
-"J. c #C9C9C9",
-"K. c #222528",
-"L. c #7C8EA2",
-"M. c #7892B0",
-"N. c #B2C1D2",
-"O. c #6B84A0",
-"P. c #394048",
-"Q. c #54514C",
-"R. c #5D5A55",
-"S. c #5C5A54",
-"T. c #5A5852",
-"U. c #54514B",
-"V. c #4F4C47",
-"W. c #474540",
-"X. c #151413",
-"Y. c #C6C6C6",
-"Z. c #33373C",
-"`. c #889FB8",
-" + c #708AA7",
-".+ c #3D4752",
-"++ c #838383",
-"@+ c #989898",
-"#+ c #9C9C9C",
-"$+ c #9B9B9B",
-"%+ c #C4C4C4",
-"&+ c #393F44",
-"*+ c #89A0BA",
-"=+ c #E0E6ED",
-"-+ c #718BA8",
-";+ c #35404B",
-">+ c #B0B0B0",
-",+ c #D4D4D4",
-"'+ c #D7D4C3",
-")+ c #E2DAA9",
-"!+ c #B5B5B5",
-"~+ c #BCBCBC",
-"{+ c #3E3E3E",
-"]+ c #5F5F5F",
-"^+ c #3B3F45",
-"/+ c #6F89A6",
-"(+ c #999999",
-"_+ c #CACACA",
-":+ c #C0BDAC",
-"<+ c #A09766",
-"[+ c #A5A5A5",
-"}+ c #7D7D7D",
-"|+ c #323232",
-"1+ c #9E9E9E",
-"2+ c #8394A6",
-"3+ c #7A94B1",
-"4+ c #5B7188",
-"5+ c #262B31",
-"6+ c #3A3A3A",
-"7+ c #404040",
-"8+ c #454545",
-"9+ c #434343",
-"0+ c #2E2E2E",
-"a+ c #1E1E1E",
-"b+ c #797979",
-"c+ c #565F69",
-"d+ c #8198B1",
-"e+ c #738DAB",
-"f+ c #3D4B5A",
-"g+ c #16181A",
-"h+ c #1D1D1D",
-"i+ c #222222",
-"j+ c #212121",
-"k+ c #262626",
-"l+ c #242424",
-"m+ c #252525",
-"n+ c #202020",
-"o+ c #090909",
-"p+ c #6B7580",
-"q+ c #748FAD",
-"r+ c #6A829E",
-"s+ c #465668",
-"t+ c #0B0D10",
-"u+ c #000000",
-"v+ c #535353",
-"w+ c #515A65",
-"x+ c #76889C",
-"y+ c #7D95B0",
-"z+ c #748EAA",
-"A+ c #6E87A4",
-"B+ c #5F758D",
-"C+ c #3E4A58",
-"D+ c #575A5F",
-"E+ c #808080",
-"F+ c #969696",
-"G+ c #A2A2A2",
-"H+ c #A3A3A3",
-"I+ c #F5F5F5",
-"J+ c #5B5B5B",
-"K+ c #7F7F80",
-"L+ c #7E8083",
-"M+ c #494D52",
-"N+ c #464B51",
-"O+ c #484B4F",
-"P+ c #7A7A7A",
-"Q+ c #A1A1A1",
-"R+ c #BBBBBB",
-"S+ c #C5C5C5",
-"T+ c #A9A9A9",
-"U+ c #C0C0C0",
-"V+ c #B6B6B6",
-"W+ c #606060",
-"X+ c #727272",
-"Y+ c #7E7E7E",
-"Z+ c #ABABAB",
-"`+ c #AFAFAF",
-" @ c #B4B4B4",
-".@ c #C3C3C3",
-"+@ c #B8B8B8",
-"@@ c #A0A0A0",
-"#@ c #929292",
-"$@ c #525252",
-"%@ c #515151",
-"&@ c #DADADA",
-"*@ c #BDBDBD",
-"=@ c #555555",
-"-@ c #111111",
-";@ c #B7B7B7",
-">@ c #BFBFBF",
-",@ c #DDDDDD",
-"'@ c #9D9D9D",
-")@ c #2B2B2B",
-"!@ c #9A9A9A",
-"~@ c #979797",
-"{@ c #939393",
-"]@ c #919191",
-"^@ c #959595",
-"/@ c #848484",
-"(@ c #7C7C7C",
-"_@ c #757575",
-":@ c #8E8E8E",
-"<@ c #646464",
-"[@ c #6A6A6A",
-"}@ c #696969",
-"|@ c #686868",
-"1@ c #676767",
-"2@ c #666666",
-"3@ c #656565",
-"4@ c #636363",
-"5@ c #5E5E5E",
-"6@ c #5D5D5D",
-"7@ c #5A5A5A",
-"8@ c #585858",
-"9@ c #575757",
-" ",
-" ",
-" ",
-" . . . + @ @ # $ % % & & * * = - ; > ",
-" , @ ' ) ! ~ { { ] ^ / ( _ : < ! ' : [ ",
-" , @ } | 1 1 2 2 3 3 3 3 3 4 1 5 6 7 8 ",
-" . $ 9 0 a b c d e f g h i j k l m n | ",
-" . $ 9 o p q r s t u v h 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 ` ...+.6 @.| ",
-" #.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^././ | ",
-" (._.:.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.< | ",
-" b.c.d.e.f.g.h.e.i.j.k.l.m.n.o.p.q.r.s.t.u.: | ",
-" v.w.e.e.g.q x.e.e.i.y.z.A.B.C.D.E.F.G.H.I.J.| ",
-" K.L.M.e.e.h.x.N.e.e.e.O.P.Q.R.S.T.U.V.W.X.' Y.| ",
-" Z.`.e.e.e.x.x.N.e.e.e. +.+++@+#+#+$+$+$+@+' %+| ",
-" &+*+e.e.e.=+q x.e.e.e.-+;+>+: ,+@.( _ '+)+!+~+{+]+ ",
-" ^+`.e.e.e.g.q x.e.e.e./+$.(+~+@.^ < _+:+<+[+}+|+3 1+ ",
-" 2+3+e.e.g.q x.e.e.e.4+5+6+7+8+8+5 8+9+9+0+a+ 1+b+ ",
-" c+d+e.e.g.q x.e.e.e+f+g+h+i+j+k+j+l+m+n+o+ 1+b+ ",
-" p+d+3+e.e.e.q+r+s+t+u+u+u+u+u+u+u+u+u+u+ 1+v+ ",
-" w+x+y+z+A+B+C+D+E+F+G+H+H+H+H+H+H+H+H+@.I+#+ 1+J+ ",
-" K+L+M+N+N+O+P+Q+R+! @.~ S+%+! { Y._ T+U+V+W+X+Y+ ",
-" : 7 Z+`+ @Z+.@R+) _ S+%+Y.] ~++@T+`+F+Z+@@#@$@%@ ",
-" @ /.) ~ ) { &@^ { *@n J._ ( ^ S+_+/ !+R+ @#+=@-@ ",
-" I+# _ ^ &@a.= ' - ,+a.! > ~+;@>@S+,@; _+'@T+U+[ )@ ",
-" % R+.@= @.[+H+'@!@~@{@]@`+@. @G+~+^@/@(@_@T+:@Z+<@ ",
-" (@[@[@[@}@}@|@1@1@2@3@<@<@4@[ W+]+5@6@J+7@8@9@=@1 u+ ",
-" u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+ ",
-" ",
-" ",
-" "};
diff --git a/pixmaps/lpr.png b/pixmaps/lpr.png
deleted file mode 100644
index 7bfdefd1..00000000
--- a/pixmaps/lpr.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/media.png b/pixmaps/media.png
deleted file mode 100755
index cd061e66..00000000
--- a/pixmaps/media.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/mem.png b/pixmaps/mem.png
deleted file mode 100755
index a852520b..00000000
--- a/pixmaps/mem.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/memory.png b/pixmaps/memory.png
new file mode 100644
index 00000000..1ea66b8a
--- /dev/null
+++ b/pixmaps/memory.png
Binary files differ
diff --git a/pixmaps/modem.png b/pixmaps/modem.png
new file mode 100644
index 00000000..8d1ea2b0
--- /dev/null
+++ b/pixmaps/modem.png
Binary files differ
diff --git a/pixmaps/module.png b/pixmaps/module.png
index 80dc788d..8f1279d0 100644
--- a/pixmaps/module.png
+++ b/pixmaps/module.png
Binary files differ
diff --git a/pixmaps/monitor.png b/pixmaps/monitor.png
new file mode 100644
index 00000000..669086a4
--- /dev/null
+++ b/pixmaps/monitor.png
Binary files differ
diff --git a/pixmaps/mouse.png b/pixmaps/mouse.png
new file mode 100644
index 00000000..4043722d
--- /dev/null
+++ b/pixmaps/mouse.png
Binary files differ
diff --git a/pixmaps/network.png b/pixmaps/network.png
new file mode 100644
index 00000000..f8c623b6
--- /dev/null
+++ b/pixmaps/network.png
Binary files differ
diff --git a/pixmaps/os.png b/pixmaps/os.png
new file mode 100644
index 00000000..166c2201
--- /dev/null
+++ b/pixmaps/os.png
Binary files differ
diff --git a/pixmaps/pci.png b/pixmaps/pci.png
deleted file mode 100755
index 21905108..00000000
--- a/pixmaps/pci.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/pci.xpm b/pixmaps/pci.xpm
deleted file mode 100755
index 3e6f936a..00000000
--- a/pixmaps/pci.xpm
+++ /dev/null
@@ -1,136 +0,0 @@
-/* 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 <http://www.ximian.com>
- * Unknown author
- */
diff --git a/pixmaps/pcmcia.png b/pixmaps/pcmcia.png
new file mode 100644
index 00000000..2baac660
--- /dev/null
+++ b/pixmaps/pcmcia.png
Binary files differ
diff --git a/pixmaps/printer.png b/pixmaps/printer.png
new file mode 100644
index 00000000..dd814d6c
--- /dev/null
+++ b/pixmaps/printer.png
Binary files differ
diff --git a/pixmaps/processor.png b/pixmaps/processor.png
new file mode 100644
index 00000000..7b2a3fb1
--- /dev/null
+++ b/pixmaps/processor.png
Binary files differ
diff --git a/pixmaps/processor.xpm b/pixmaps/processor.xpm
deleted file mode 100644
index 7a7970d5..00000000
--- a/pixmaps/processor.xpm
+++ /dev/null
@@ -1,116 +0,0 @@
-/* XPM */
-static char * processor_xpm[] = {
-"16 16 97 2",
-" c None",
-". c #000000",
-"+ c #090600",
-"@ c #030000",
-"# c #E8E6E1",
-"$ c #A3A09C",
-"% c #010000",
-"& c #080000",
-"* c #D6D2CD",
-"= c #8F8A84",
-"- c #FFFAF7",
-"; c #98938D",
-"> c #F1EDE9",
-", c #88827E",
-"' c #181510",
-") c #F8EEE4",
-"! c #F8ECE0",
-"~ c #F8ECDE",
-"{ c #0D0600",
-"] c #F8EBDE",
-"^ c #F6E7D7",
-"/ c #C4B5A7",
-"( c #070000",
-"_ c #F6E5D3",
-": c #F7E9D9",
-"< c #D5C5B6",
-"[ c #050200",
-"} c #080300",
-"| c #312722",
-"1 c #EFE7E0",
-"2 c #F6F2EF",
-"3 c #F6F1EE",
-"4 c #EDE4DB",
-"5 c #F1E4D6",
-"6 c #9D9790",
-"7 c #12110D",
-"8 c #B1A79F",
-"9 c #DDCFC2",
-"0 c #F6E8D9",
-"a c #F6F1EC",
-"b c #F5F1EE",
-"c c #E5D7CB",
-"d c #F7E8D8",
-"e c #EEDFD3",
-"f c #CAC0B6",
-"g c #645951",
-"h c #E7D9CA",
-"i c #F6E6D5",
-"j c #F7EBDE",
-"k c #E9DCD2",
-"l c #756F6D",
-"m c #F7EFE7",
-"n c #EDDECF",
-"o c #D6C8BA",
-"p c #CBB9AC",
-"q c #D2C8BC",
-"r c #F8EEE3",
-"s c #F5EEE8",
-"t c #EFE3D7",
-"u c #B8A99D",
-"v c #060000",
-"w c #DBD3CB",
-"x c #F8F1E8",
-"y c #F3E3D4",
-"z c #F1DFCF",
-"A c #E6D7C7",
-"B c #F8F2ED",
-"C c #EDE1D4",
-"D c #9D8E84",
-"E c #090200",
-"F c #DBD3CD",
-"G c #F8F0EA",
-"H c #F1E0D1",
-"I c #F6EEE8",
-"J c #56504A",
-"K c #130D0D",
-"L c #ADA3A2",
-"M c #C8BDBC",
-"N c #BEB3AB",
-"O c #9E9A96",
-"P c #A8A09E",
-"Q c #0E0403",
-"R c #0A0000",
-"S c #0A0200",
-"T c #040000",
-"U c #FCF4F2",
-"V c #F9F1EF",
-"W c #F8F0EE",
-"X c #F2EDEA",
-"Y c #DDD9D6",
-"Z c #E5E4E0",
-"` c #030400",
-" . c #0B0505",
-".. c #050000",
-"+. c #14100F",
-"@. c #090806",
-"#. c #000100",
-" . . ",
-" + @ # $ % % ",
-" & * = - ; > , ' ",
-" & ) ; ! ; ~ ; { ",
-" & ] ; ^ ; ] ; / ( ",
-" & _ ; _ ; : ; < ( ",
-" [ } | 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 v Q R S T } ",
-" T U V W X Y Z ` ",
-" T ...+.@ @.. #. "};
diff --git a/pixmaps/report.png b/pixmaps/report.png
new file mode 100644
index 00000000..48bd5d01
--- /dev/null
+++ b/pixmaps/report.png
Binary files differ
diff --git a/pixmaps/scanner.png b/pixmaps/scanner.png
deleted file mode 100644
index cfede3e5..00000000
--- a/pixmaps/scanner.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/scsi.png b/pixmaps/scsi.png
deleted file mode 100755
index 23dd73fd..00000000
--- a/pixmaps/scsi.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/scsi.xpm b/pixmaps/scsi.xpm
deleted file mode 100755
index 402906f0..00000000
--- a/pixmaps/scsi.xpm
+++ /dev/null
@@ -1,79 +0,0 @@
-/* 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/shares.png b/pixmaps/shares.png
new file mode 100644
index 00000000..ab4e197d
--- /dev/null
+++ b/pixmaps/shares.png
Binary files differ
diff --git a/pixmaps/stock-about-16.png b/pixmaps/stock-about-16.png
deleted file mode 100755
index d66bfd7b..00000000
--- a/pixmaps/stock-about-16.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/stock_channel.png b/pixmaps/stock_channel.png
new file mode 100644
index 00000000..2a74f2e6
--- /dev/null
+++ b/pixmaps/stock_channel.png
Binary files differ
diff --git a/pixmaps/stock_insert-floating-frame.png b/pixmaps/stock_insert-floating-frame.png
new file mode 100644
index 00000000..8f82250f
--- /dev/null
+++ b/pixmaps/stock_insert-floating-frame.png
Binary files differ
diff --git a/pixmaps/stock_landline-phone.png b/pixmaps/stock_landline-phone.png
new file mode 100644
index 00000000..61da5dab
--- /dev/null
+++ b/pixmaps/stock_landline-phone.png
Binary files differ
diff --git a/pixmaps/stock_macro-watch-variable.png b/pixmaps/stock_macro-watch-variable.png
new file mode 100644
index 00000000..2e52ddc9
--- /dev/null
+++ b/pixmaps/stock_macro-watch-variable.png
Binary files differ
diff --git a/pixmaps/stock-details.png b/pixmaps/summary.png
index 5a2cd965..5a2cd965 100644
--- a/pixmaps/stock-details.png
+++ b/pixmaps/summary.png
Binary files differ
diff --git a/pixmaps/tape.png b/pixmaps/tape.png
deleted file mode 100755
index 90b2e297..00000000
--- a/pixmaps/tape.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/therm.png b/pixmaps/therm.png
new file mode 100644
index 00000000..3dac3913
--- /dev/null
+++ b/pixmaps/therm.png
Binary files differ
diff --git a/pixmaps/usb.png b/pixmaps/usb.png
index a662ce55..7c7c6746 100755..100644
--- a/pixmaps/usb.png
+++ b/pixmaps/usb.png
Binary files differ
diff --git a/pixmaps/usb.xpm b/pixmaps/usb.xpm
deleted file mode 100755
index 476432fd..00000000
--- a/pixmaps/usb.xpm
+++ /dev/null
@@ -1,49 +0,0 @@
-/* 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/users.png b/pixmaps/users.png
new file mode 100644
index 00000000..cbc62084
--- /dev/null
+++ b/pixmaps/users.png
Binary files differ
diff --git a/pixmaps/v4l.png b/pixmaps/v4l.png
deleted file mode 100755
index 88801a39..00000000
--- a/pixmaps/v4l.png
+++ /dev/null
Binary files differ
diff --git a/pixmaps/videocap.png b/pixmaps/videocap.png
new file mode 100644
index 00000000..8bbea0ba
--- /dev/null
+++ b/pixmaps/videocap.png
Binary files differ
diff --git a/pixmaps/x11.png b/pixmaps/x11.png
deleted file mode 100755
index 49924ba2..00000000
--- a/pixmaps/x11.png
+++ /dev/null
Binary files differ
diff --git a/report.c b/report.c
new file mode 100644
index 00000000..990abd8b
--- /dev/null
+++ b/report.c
@@ -0,0 +1,461 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <report.h>
+#include <stdio.h>
+#include <string.h>
+#include <shell.h>
+#include <hardinfo.h>
+
+static ReportDialog *report_dialog_new(GtkTreeModel *model, GtkWidget *parent);
+static void set_all_active(ReportDialog *rd, gboolean setting);
+
+static void
+report_html_header(ReportContext *ctx)
+{
+ fprintf(ctx->stream,
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Final//EN\">\n" \
+ "<html><head>\n" \
+ "<title>HardInfo System Report</title>\n" \
+ "<style>\n" \
+ "body { background: #fff }\n" \
+ ".title { font: bold 130%% serif; color: #0066FF; padding: 30px 0 10px 0 }\n" \
+ ".stitle { font: bold 100%% sans-serif; color: #0044DD; padding: 30px 0 10px 0 }\n" \
+ ".sstitle{ font: bold 80%% serif; color: #000000; background: #efefef }\n" \
+ ".field { font: 80%% sans-serif; color: #000000; padding: 2px; padding-left: 50px }\n" \
+ ".value { font: 80%% sans-serif; color: #505050 }\n" \
+ "</style>\n" \
+ "</head><body>\n" \
+ "<table width=\"100%%\"><tbody>");
+}
+
+static void
+report_html_footer(ReportContext *ctx)
+{
+ fprintf(ctx->stream,
+ "</tbody></table></body></html>");
+}
+
+static void
+report_html_title(ReportContext *ctx, gchar *text)
+{
+ fprintf(ctx->stream,
+ "<tr><td colspan=\"2\" class=\"title\">%s</td></tr>\n", text);
+}
+
+static void
+report_html_subtitle(ReportContext *ctx, gchar *text)
+{
+ fprintf(ctx->stream,
+ "<tr><td colspan=\"2\" class=\"stitle\">%s</td></tr>\n", text);
+}
+static void
+report_html_subsubtitle(ReportContext *ctx, gchar *text)
+{
+ fprintf(ctx->stream,
+ "<tr><td colspan=\"2\" class=\"sstitle\">%s</td></tr>\n", text);
+}
+
+static void
+report_html_key_value(ReportContext *ctx, gchar *key, gchar *value)
+{
+ fprintf(ctx->stream,
+ "<tr><td class=\"field\">%s</td>" \
+ "<td class=\"value\">%s</td></tr>\n", key, value);
+}
+
+static void
+report_html_table(ReportContext *ctx, gchar *text)
+{
+ GKeyFile *key_file = g_key_file_new();
+ gchar **groups;
+ gint i;
+
+ g_key_file_load_from_data(key_file, text, strlen(text), 0, NULL);
+ groups = g_key_file_get_groups(key_file, NULL);
+
+ for (i = 0; groups[i]; i++) {
+ gchar *group, *tmpgroup;
+ gchar **keys;
+ gint j;
+
+ if (groups[i][0] == '$')
+ continue;
+
+ group = groups[i];
+ keys = g_key_file_get_keys(key_file, group, NULL, NULL);
+
+ tmpgroup = g_strdup(group);
+ strend(group, '#');
+
+ report_html_subsubtitle(ctx, group);
+
+ for (j = 0; keys[j]; j++) {
+ gchar *key = keys[j];
+ gchar *value;
+
+ value = g_key_file_get_value(key_file, tmpgroup, key, NULL);
+
+ if (g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) {
+ strend(key, '#');
+
+ if (g_str_equal(value, "...")) {
+ g_free(value);
+ value = ctx->entry->fieldfunc(key);
+ }
+
+ if (*key == '$') {
+ gchar **tmp;
+
+ tmp = g_strsplit(++key, "$", 0);
+ report_html_key_value(ctx, tmp[1], value);
+ g_strfreev(tmp);
+ } else {
+ report_html_key_value(ctx, key, value);
+ }
+
+ }
+
+ g_free(value);
+ }
+
+ g_free(tmpgroup);
+ g_strfreev(keys);
+ }
+
+ g_strfreev(groups);
+ g_key_file_free(key_file);
+}
+
+static void
+report_generate_child(ReportContext *ctx, GtkTreeIter *iter)
+{
+ ShellModuleEntry *entry;
+ gboolean selected;
+
+ gtk_tree_model_get(ctx->rd->model, iter, TREE_COL_SEL, &selected, -1);
+ if (!selected)
+ return;
+
+ gtk_tree_model_get(ctx->rd->model, iter, TREE_COL_DATA, &entry, -1);
+
+ ctx->entry = entry;
+
+ report_html_subtitle(ctx, entry->name);
+ report_html_table(ctx, entry->func(entry->number));
+}
+
+static void
+report_generate_children(ReportContext *ctx, GtkTreeIter *iter)
+{
+ GtkTreeModel *model = ctx->rd->model;
+ gchar *name;
+
+ gtk_tree_model_get(model, iter, TREE_COL_NAME, &name, -1);
+ report_html_title(ctx, name);
+
+ if (gtk_tree_model_iter_has_child(model, iter)) {
+ gint children = gtk_tree_model_iter_n_children(model, iter);
+ gint i;
+
+ for (i = 0; i < children; i++) {
+ GtkTreeIter child;
+
+ gtk_tree_model_iter_nth_child(model, &child, iter, i);
+ report_generate_child(ctx, &child);
+ }
+ }
+}
+
+static gchar *
+report_get_filename(void)
+{
+ GtkWidget *dialog;
+ gchar *filename = NULL;
+
+ dialog = gtk_file_chooser_dialog_new("Save File",
+ NULL,
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+ NULL);
+ gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog),
+ TRUE);
+ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),
+ "hardinfo report.html");
+
+ if (gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+ }
+
+ gtk_widget_destroy (dialog);
+ return filename;
+}
+
+static gboolean
+report_generate(ReportDialog *rd)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ ReportContext *ctx;
+ gchar *file;
+ FILE *stream;
+
+ file = report_get_filename();
+ if (!file)
+ return FALSE;
+ stream = fopen(file, "w+");
+ if (!stream)
+ return FALSE;
+
+ model = rd->model;
+ ctx = g_new0(ReportContext, 1);
+ ctx->rd = rd;
+ ctx->stream = stream;
+
+ report_html_header(ctx);
+
+ gtk_tree_model_get_iter_first(model, &iter);
+
+ do {
+ report_generate_children(ctx, &iter);
+ } while (gtk_tree_model_iter_next(model, &iter));
+
+ report_html_footer(ctx);
+
+ fclose(ctx->stream);
+ g_free(ctx);
+
+ return TRUE;
+}
+
+void
+report_dialog_show(GtkTreeModel *model, GtkWidget *parent)
+{
+ gboolean success;
+ ReportDialog *rd = report_dialog_new(model, parent);
+
+ if (gtk_dialog_run(GTK_DIALOG(rd->dialog)) == GTK_RESPONSE_ACCEPT) {
+ shell_status_update("Generating report...");
+ gtk_widget_hide(rd->dialog);
+ shell_view_set_enabled(FALSE);
+ shell_status_set_enabled(TRUE);
+
+ success = report_generate(rd);
+
+ shell_status_set_enabled(FALSE);
+
+ if (success)
+ shell_status_update("Report saved.");
+ else
+ shell_status_update("Error while creating the report.");
+ }
+
+ set_all_active(rd, FALSE);
+ gtk_widget_destroy(rd->dialog);
+ g_free(rd);
+}
+
+static void
+set_children_active(GtkTreeModel *model, GtkTreeIter *iter, gboolean setting)
+{
+ if (gtk_tree_model_iter_has_child(model, iter)) {
+ gint children = gtk_tree_model_iter_n_children(model, iter);
+
+ gtk_tree_store_set(GTK_TREE_STORE(model), iter, TREE_COL_SEL, setting, -1);
+
+ for (children--; children >= 0; children--) {
+ GtkTreeIter child;
+
+ gtk_tree_model_iter_nth_child(model, &child, iter, children);
+ gtk_tree_store_set(GTK_TREE_STORE(model), &child, TREE_COL_SEL, setting, -1);
+ }
+ }
+}
+
+static void
+set_all_active(ReportDialog *rd, gboolean setting)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model = rd->model;
+
+ gtk_tree_model_get_iter_first(model, &iter);
+
+ do {
+ set_children_active(model, &iter, setting);
+ } while (gtk_tree_model_iter_next(model, &iter));
+}
+
+static void
+report_dialog_sel_none(GtkWidget *widget, ReportDialog *rd)
+{
+ set_all_active(rd, FALSE);
+}
+
+static void
+report_dialog_sel_all(GtkWidget *widget, ReportDialog *rd)
+{
+ set_all_active(rd, TRUE);
+}
+
+static void
+report_dialog_sel_toggle(GtkCellRendererToggle *cellrenderertoggle,
+ gchar *path_str,
+ ReportDialog *rd)
+{
+ GtkTreeModel *model = rd->model;
+ GtkTreeIter iter;
+ GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
+ gboolean active;
+
+ gtk_tree_model_get_iter(model, &iter, path);
+ gtk_tree_model_get(model, &iter, TREE_COL_SEL, &active, -1);
+
+ active = !active;
+ gtk_tree_store_set(GTK_TREE_STORE(model), &iter, TREE_COL_SEL, active, -1);
+ set_children_active(model, &iter, active);
+
+ gtk_tree_path_free(path);
+}
+
+static ReportDialog
+*report_dialog_new(GtkTreeModel *model, GtkWidget *parent)
+{
+ ReportDialog *rd;
+ GtkWidget *dialog;
+ GtkWidget *dialog1_vbox;
+ GtkWidget *scrolledwindow2;
+ GtkWidget *treeview2;
+ GtkWidget *hbuttonbox3;
+ GtkWidget *button3;
+ GtkWidget *button6;
+ GtkWidget *dialog1_action_area;
+ GtkWidget *button8;
+ GtkWidget *button7;
+ GtkWidget *label;
+
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *cr_text, *cr_pbuf, *cr_toggle;
+
+ rd = g_new0(ReportDialog, 1);
+
+ dialog = gtk_dialog_new();
+ gtk_window_set_title(GTK_WINDOW(dialog), "Generate Report");
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
+ gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260);
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent));
+ gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+ gtk_window_set_type_hint(GTK_WINDOW(dialog),
+ GDK_WINDOW_TYPE_HINT_DIALOG);
+
+ dialog1_vbox = GTK_DIALOG(dialog)->vbox;
+ gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5);
+ gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4);
+ gtk_widget_show(dialog1_vbox);
+
+ label = gtk_label_new("<big><b>Generate Report</b></big>\n" \
+ "Please choose the information that you wish " \
+ "to view in your report:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+ 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(dialog1_vbox), label, FALSE, FALSE, 0);
+
+ scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL);
+ gtk_widget_show(scrolledwindow2);
+ gtk_box_pack_start(GTK_BOX(dialog1_vbox), scrolledwindow2, TRUE, TRUE, 0);
+ gtk_widget_set_size_request(scrolledwindow2, -1, 200);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW
+ (scrolledwindow2), GTK_SHADOW_IN);
+
+ treeview2 = gtk_tree_view_new_with_model(model);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview2), FALSE);
+ gtk_widget_show(treeview2);
+ gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2);
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_append_column(GTK_TREE_VIEW(treeview2), column);
+
+ cr_toggle = gtk_cell_renderer_toggle_new();
+ gtk_tree_view_column_pack_start(column, cr_toggle, FALSE);
+ g_signal_connect(cr_toggle, "toggled", G_CALLBACK(report_dialog_sel_toggle), rd);
+ gtk_tree_view_column_add_attribute(column, cr_toggle, "active",
+ TREE_COL_SEL);
+
+ cr_pbuf = gtk_cell_renderer_pixbuf_new();
+ gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE);
+ gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf",
+ TREE_COL_PBUF);
+
+ cr_text = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, cr_text, TRUE);
+ gtk_tree_view_column_add_attribute(column, cr_text, "markup",
+ TREE_COL_NAME);
+
+ hbuttonbox3 = gtk_hbutton_box_new();
+ gtk_widget_show(hbuttonbox3);
+ gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbuttonbox3, FALSE, TRUE, 0);
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox3),
+ GTK_BUTTONBOX_SPREAD);
+
+ button3 = gtk_button_new_with_mnemonic("Select _None");
+ gtk_widget_show(button3);
+ gtk_container_add(GTK_CONTAINER(hbuttonbox3), button3);
+ GTK_WIDGET_SET_FLAGS(button3, GTK_CAN_DEFAULT);
+ g_signal_connect(button3, "clicked", G_CALLBACK(report_dialog_sel_none), rd);
+
+ button6 = gtk_button_new_with_mnemonic("Select _All");
+ gtk_widget_show(button6);
+ gtk_container_add(GTK_CONTAINER(hbuttonbox3), button6);
+ GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT);
+ g_signal_connect(button6, "clicked", G_CALLBACK(report_dialog_sel_all), rd);
+
+ dialog1_action_area = GTK_DIALOG(dialog)->action_area;
+ gtk_widget_show(dialog1_action_area);
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area),
+ GTK_BUTTONBOX_END);
+
+ button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+ gtk_widget_show(button8);
+ gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8,
+ GTK_RESPONSE_CANCEL);
+ GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT);
+
+ button7 = gtk_button_new_with_mnemonic("_Generate");
+ gtk_widget_show(button7);
+ gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7,
+ GTK_RESPONSE_ACCEPT);
+ GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT);
+
+ rd->dialog = dialog;
+ rd->btn_cancel = button8;
+ rd->btn_generate = button7;
+ rd->btn_sel_all = button6;
+ rd->btn_sel_none = button3;
+ rd->treeview = treeview2;
+ rd->model = model;
+
+ gtk_tree_view_collapse_all(GTK_TREE_VIEW(treeview2));
+ set_all_active(rd, TRUE);
+
+ return rd;
+}
diff --git a/report.h b/report.h
new file mode 100644
index 00000000..e2bfc912
--- /dev/null
+++ b/report.h
@@ -0,0 +1,48 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __REPORT_H__
+#define __REPORT_H__
+#include <gtk/gtk.h>
+#include <shell.h>
+
+typedef struct _ReportDialog ReportDialog;
+typedef struct _ReportContext ReportContext;
+
+struct _ReportContext {
+ ReportDialog *rd;
+ ShellModuleEntry *entry;
+
+ FILE *stream;
+};
+
+struct _ReportDialog {
+ GtkWidget *dialog;
+ GtkWidget *filechooser;
+ GtkWidget *btn_cancel;
+ GtkWidget *btn_generate;
+ GtkWidget *btn_sel_all;
+ GtkWidget *btn_sel_none;
+ GtkWidget *treeview;
+
+ GtkTreeModel *model;
+};
+
+void report_dialog_show();
+
+#endif /* __REPORT_H__ */
diff --git a/scsi.c b/scsi.c
deleted file mode 100644
index fc1dd40d..00000000
--- a/scsi.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Hardware Information, version 0.3
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- * SCSI support by Pascal F.Martin <pascalmartin@earthlink.net>
- *
- * May be modified and/or distributed under the terms of GNU GPL version 2.
- */
-
-#include "hardinfo.h"
-#include "scsi.h"
-
-SCSIDevice *hi_scan_scsi(void)
-{
- FILE *proc_scsi;
- gchar buffer[256], *buf;
- gint n=0;
- SCSIDevice *scsi_dev = NULL, *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;
- gchar *buf;
-
- if(!device) return;
-
- for (i = 0; type2icon[i].type != NULL; ++i) {
- if (!strcmp(device->type, type2icon[i].type)) break;
- }
-
- buf = g_strdup_printf("%s%s", IMG_PREFIX, type2icon[i].icon);
- detail_window_set_icon(mainwindow->det_window, buf);
- g_free(buf);
-
- buf = g_strdup_printf(_("SCSI %s Device"), type2icon[i].label);
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window), buf);
- detail_window_set_dev_type(mainwindow->det_window, buf);
- g_free(buf);
-
- detail_window_set_dev_name(mainwindow->det_window, device->model);
-
-
- detail_window_append_info(mainwindow->det_window, _("Revision"), device->revision);
- detail_window_append_info(mainwindow->det_window, _("Type"), device->type);
-
- detail_window_append_separator(mainwindow->det_window);
-
- detail_window_append_info_int(mainwindow->det_window, _("Controller"), device->controller, FALSE);
- detail_window_append_info_int(mainwindow->det_window, _("Channel"), device->channel, FALSE);
- detail_window_append_info_int(mainwindow->det_window, _("ID"), device->id, FALSE);
- detail_window_append_info_int(mainwindow->det_window, _("LUN"), device->lun, FALSE);
-}
diff --git a/scsi.h b/scsi.h
deleted file mode 100644
index 430d9e76..00000000
--- a/scsi.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#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
deleted file mode 100644
index 7bb5ebc7..00000000
--- a/serial.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Hardware Information, version 0.3.1b
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * May be modified and/or distributed under the terms of GNU GPL version 2.
- */
-
-#include "hardinfo.h"
-#include "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(buffer, "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)
-{
- if(!device) return;
-
- detail_window_set_icon(mainwindow->det_window, IMG_PREFIX "gen_connector.png");
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window), _("Communication Port"));
-
- detail_window_set_dev_name(mainwindow->det_window, device->name);
- detail_window_set_dev_type(mainwindow->det_window, _("Communication Port"));
-
- detail_window_append_info_int(mainwindow->det_window, _("I/O port"),
- device->port, TRUE);
- detail_window_append_info_int(mainwindow->det_window, _("IRQ"),
- device->irq, TRUE);
- detail_window_append_info(mainwindow->det_window, "UART", device->uart);
-}
diff --git a/serial.h b/serial.h
deleted file mode 100644
index e2d3e5e8..00000000
--- a/serial.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#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/sha1.c b/sha1.c
new file mode 100644
index 00000000..0981a04b
--- /dev/null
+++ b/sha1.c
@@ -0,0 +1,340 @@
+/*
+SHA-1 in C
+By Steve Reid <steve@edmweb.com>
+100% Public Domain
+
+Test Vectors (from FIPS PUB 180-1)
+"abc"
+ A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
+"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+ 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
+A million repetitions of "a"
+ 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
+*/
+
+
+/* #define SHA1HANDSOFF * Copies data before messing with it. */
+
+#include <stdio.h>
+#include <string.h>
+#include <sha1.h>
+
+#include <glib.h>
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define LITTLE_ENDIAN /* This should be #define'd if true. */
+#endif
+
+#if defined(__OPTIMIZE__)
+#error You must compile this program without "-O".
+#endif
+
+
+#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
+
+/* blk0() and blk() perform the initial expand. */
+/* I got the idea of expanding during the round function from SSLeay */
+#ifdef LITTLE_ENDIAN
+#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
+ |(rol(block->l[i],8)&0x00FF00FF))
+#else
+#define blk0(i) block->l[i]
+#endif
+#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
+ ^block->l[(i+2)&15]^block->l[i&15],1))
+
+/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
+#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
+#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
+#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
+#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
+#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
+
+
+/* Hash a single 512-bit block. This is the core of the algorithm. */
+
+void SHA1Transform(unsigned long state[5], unsigned char buffer[64])
+{
+ unsigned long a, b, c, d, e;
+ typedef union {
+ unsigned char c[64];
+ unsigned long l[16];
+ } CHAR64LONG16;
+ CHAR64LONG16 *block;
+#ifdef SHA1HANDSOFF
+ static unsigned char workspace[64];
+ block = (CHAR64LONG16 *) workspace;
+ memcpy(block, buffer, 64);
+#else
+ block = (CHAR64LONG16 *) buffer;
+#endif
+ /* Copy context->state[] to working vars */
+ a = state[0];
+ b = state[1];
+ c = state[2];
+ d = state[3];
+ e = state[4];
+ /* 4 rounds of 20 operations each. Loop unrolled. */
+ R0(a, b, c, d, e, 0);
+ R0(e, a, b, c, d, 1);
+ R0(d, e, a, b, c, 2);
+ R0(c, d, e, a, b, 3);
+ R0(b, c, d, e, a, 4);
+ R0(a, b, c, d, e, 5);
+ R0(e, a, b, c, d, 6);
+ R0(d, e, a, b, c, 7);
+ R0(c, d, e, a, b, 8);
+ R0(b, c, d, e, a, 9);
+ R0(a, b, c, d, e, 10);
+ R0(e, a, b, c, d, 11);
+ R0(d, e, a, b, c, 12);
+ R0(c, d, e, a, b, 13);
+ R0(b, c, d, e, a, 14);
+ R0(a, b, c, d, e, 15);
+ R1(e, a, b, c, d, 16);
+ R1(d, e, a, b, c, 17);
+ R1(c, d, e, a, b, 18);
+ R1(b, c, d, e, a, 19);
+ R2(a, b, c, d, e, 20);
+ R2(e, a, b, c, d, 21);
+ R2(d, e, a, b, c, 22);
+ R2(c, d, e, a, b, 23);
+ R2(b, c, d, e, a, 24);
+ R2(a, b, c, d, e, 25);
+ R2(e, a, b, c, d, 26);
+ R2(d, e, a, b, c, 27);
+ R2(c, d, e, a, b, 28);
+ R2(b, c, d, e, a, 29);
+ R2(a, b, c, d, e, 30);
+ R2(e, a, b, c, d, 31);
+ R2(d, e, a, b, c, 32);
+ R2(c, d, e, a, b, 33);
+ R2(b, c, d, e, a, 34);
+ R2(a, b, c, d, e, 35);
+ R2(e, a, b, c, d, 36);
+ R2(d, e, a, b, c, 37);
+ R2(c, d, e, a, b, 38);
+ R2(b, c, d, e, a, 39);
+ R3(a, b, c, d, e, 40);
+ R3(e, a, b, c, d, 41);
+ R3(d, e, a, b, c, 42);
+ R3(c, d, e, a, b, 43);
+ R3(b, c, d, e, a, 44);
+ R3(a, b, c, d, e, 45);
+ R3(e, a, b, c, d, 46);
+ R3(d, e, a, b, c, 47);
+ R3(c, d, e, a, b, 48);
+ R3(b, c, d, e, a, 49);
+ R3(a, b, c, d, e, 50);
+ R3(e, a, b, c, d, 51);
+ R3(d, e, a, b, c, 52);
+ R3(c, d, e, a, b, 53);
+ R3(b, c, d, e, a, 54);
+ R3(a, b, c, d, e, 55);
+ R3(e, a, b, c, d, 56);
+ R3(d, e, a, b, c, 57);
+ R3(c, d, e, a, b, 58);
+ R3(b, c, d, e, a, 59);
+ R4(a, b, c, d, e, 60);
+ R4(e, a, b, c, d, 61);
+ R4(d, e, a, b, c, 62);
+ R4(c, d, e, a, b, 63);
+ R4(b, c, d, e, a, 64);
+ R4(a, b, c, d, e, 65);
+ R4(e, a, b, c, d, 66);
+ R4(d, e, a, b, c, 67);
+ R4(c, d, e, a, b, 68);
+ R4(b, c, d, e, a, 69);
+ R4(a, b, c, d, e, 70);
+ R4(e, a, b, c, d, 71);
+ R4(d, e, a, b, c, 72);
+ R4(c, d, e, a, b, 73);
+ R4(b, c, d, e, a, 74);
+ R4(a, b, c, d, e, 75);
+ R4(e, a, b, c, d, 76);
+ R4(d, e, a, b, c, 77);
+ R4(c, d, e, a, b, 78);
+ R4(b, c, d, e, a, 79);
+ /* Add the working vars back into context.state[] */
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ state[4] += e;
+ /* Wipe variables */
+ a = b = c = d = e = 0;
+}
+
+
+/* SHA1Init - Initialize new context */
+
+void SHA1Init(SHA1_CTX * context)
+{
+ /* SHA1 initialization constants */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xEFCDAB89;
+ context->state[2] = 0x98BADCFE;
+ context->state[3] = 0x10325476;
+ context->state[4] = 0xC3D2E1F0;
+ context->count[0] = context->count[1] = 0;
+}
+
+
+/* Run your data through this. */
+
+void SHA1Update(SHA1_CTX * context, unsigned char *data, unsigned int len)
+{
+ unsigned int i, j;
+
+ j = (context->count[0] >> 3) & 63;
+ if ((context->count[0] += len << 3) < (len << 3))
+ context->count[1]++;
+ context->count[1] += (len >> 29);
+ if ((j + len) > 63) {
+ memcpy(&context->buffer[j], data, (i = 64 - j));
+ SHA1Transform(context->state, context->buffer);
+ for (; i + 63 < len; i += 64) {
+ SHA1Transform(context->state, &data[i]);
+ }
+ j = 0;
+ } else
+ i = 0;
+ memcpy(&context->buffer[j], &data[i], len - i);
+}
+
+
+/* Add padding and return the message digest. */
+
+void SHA1Final(unsigned char digest[20], SHA1_CTX * context)
+{
+ unsigned long i, j;
+ unsigned char finalcount[8];
+
+ for (i = 0; i < 8; i++) {
+ finalcount[i] = (unsigned char) ((context->count[(i >= 4 ? 0 : 1)]
+ >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */
+ }
+ SHA1Update(context, (unsigned char *) "\200", 1);
+ while ((context->count[0] & 504) != 448) {
+ SHA1Update(context, (unsigned char *) "\0", 1);
+ }
+ SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */
+ for (i = 0; i < 20; i++) {
+ digest[i] = (unsigned char)
+ ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
+ }
+ /* Wipe variables */
+ i = j = 0;
+ memset(context->buffer, 0, 64);
+ memset(context->state, 0, 20);
+ memset(context->count, 0, 8);
+ memset(&finalcount, 0, 8);
+#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */
+ SHA1Transform(context->state, context->buffer);
+#endif
+}
+
+#ifdef SHA1_TEST
+static char *b32_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
+
+void g_assert(int a)
+{
+ /* Bah, who needs testing anyway... ;) */
+}
+
+static void base32_encode_exactly(unsigned char *buf, int len,
+ unsigned char *encbuf, int enclen)
+{
+ int i = 0;
+ unsigned char *ip = buf + len;
+ unsigned char *op = encbuf + enclen;
+
+ switch (len % 5) {
+ case 0:
+ do {
+ g_assert(op - encbuf >= 8);
+ i = *--ip; /* Input #4 */
+ *--op = b32_alphabet[i & 0x1f]; /* Ouput #7 */
+ i >>= 5; /* upper <234>, input #4 */
+ /* FALLTHROUGH */
+ case 4:
+ i |= ((unsigned int) *--ip) << 3; /* had 3 bits in `i' */
+ *--op = b32_alphabet[i & 0x1f]; /* Output #6 */
+ i >>= 5; /* upper <401234>, input #3 */
+ *--op = b32_alphabet[i & 0x1f]; /* Output #5 */
+ i >>= 5; /* upper <4>, input #3 */
+ /* FALLTHROUGH */
+ case 3:
+ i |= ((unsigned int) *--ip) << 1; /* had 1 bits in `i' */
+ *--op = b32_alphabet[i & 0x1f]; /* Output #4 */
+ i >>= 5; /* upper <1234>, input #2 */
+ /* FALLTHROUGH */
+ case 2:
+ i |= ((unsigned int) *--ip) << 4; /* had 4 bits in `i' */
+ *--op = b32_alphabet[i & 0x1f]; /* Output #3 */
+ i >>= 5; /* upper <3401234>, input #1 */
+ *--op = b32_alphabet[i & 0x1f]; /* Output #2 */
+ i >>= 5; /* upper <34>, input #1 */
+ /* FALLTHROUGH */
+ case 1:
+ i |= ((unsigned int) *--ip) << 2; /* had 2 bits in `i' */
+ *--op = b32_alphabet[i & 0x1f]; /* Output #1 */
+ i >>= 5; /* upper <01234>, input #0 */
+ *--op = b32_alphabet[i & 0x1f]; /* Output #0 */
+ i >>= 5; /* Holds nothing, MBZ */
+ g_assert(i == 0);
+ g_assert(op >= encbuf);
+ } while (op > encbuf);
+ }
+}
+
+
+
+/*************************************************************/
+
+int main(int argc, char **argv)
+{
+ int i, j;
+ SHA1_CTX context;
+ unsigned char digest[20], buffer[16384];
+ FILE *file;
+
+ if (argc > 2) {
+ puts("Public domain SHA-1 implementation - by Steve Reid <steve@edmweb.com>");
+ puts("Produces the SHA-1 hash of a file, or stdin if no file is specified.");
+ exit(0);
+ }
+ if (argc < 2) {
+ file = stdin;
+ } else {
+ if (!(file = fopen(argv[1], "rb"))) {
+ fputs("Unable to open file.", stderr);
+ exit(-1);
+ }
+ }
+ SHA1Init(&context);
+ while (!feof(file)) { /* note: what if ferror(file) */
+ i = fread(buffer, 1, 16384, file);
+ SHA1Update(&context, buffer, i);
+ }
+ SHA1Final(digest, &context);
+ fclose(file);
+/*
+ for (i = 0; i < 5; i++) {
+ for (j = 0; j < 4; j++) {
+ printf("%02X", digest[i*4+j]);
+ }
+ putchar(' ');
+ }
+ putchar('\n');
+*/
+
+ {
+ unsigned char tmp[33];
+ tmp[32] = '\0';
+ base32_encode_exactly(digest, 20, tmp, 32);
+ printf("%s\n", tmp);
+ }
+
+ exit(0);
+}
+#endif /* SHA1_TEST */
diff --git a/sha1.h b/sha1.h
new file mode 100644
index 00000000..83f28df7
--- /dev/null
+++ b/sha1.h
@@ -0,0 +1,21 @@
+/*
+ * SHA-1 in C
+ * By Steve Reid <steve@edmweb.com>
+ * 100% Public Domain
+ */
+
+#ifndef __SHA1_H__
+#define __SHA1_H__
+
+typedef struct {
+ unsigned long state[5];
+ unsigned long count[2];
+ unsigned char buffer[64];
+} SHA1_CTX;
+
+void SHA1Transform(unsigned long state[5], unsigned char buffer[64]);
+void SHA1Init(SHA1_CTX* context);
+void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len);
+void SHA1Final(unsigned char digest[20], SHA1_CTX* context);
+
+#endif /* __SHA1_H__ */
diff --git a/shell.c b/shell.c
new file mode 100644
index 00000000..e8ac1f5e
--- /dev/null
+++ b/shell.c
@@ -0,0 +1,1078 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+
+#include <config.h>
+
+#include <hardinfo.h>
+
+#include <shell.h>
+#include <iconcache.h>
+#include <menu.h>
+#include <stock.h>
+
+/*
+ * Internal Prototypes ********************************************************
+ */
+
+static void create_window();
+static ShellTree *tree_new(void);
+static ShellInfoTree *info_tree_new(gboolean extra);
+
+static void module_selected(GtkTreeSelection * ts, gpointer data);
+static void module_selected_show_info(ShellModuleEntry * entry,
+ gboolean reload);
+static void info_selected(GtkTreeSelection * ts, gpointer data);
+static void info_selected_show_extra(gchar * data);
+static gboolean reload_section(gpointer data);
+
+/*
+ * Globals ********************************************************************
+ */
+
+static Shell *shell = NULL;
+static GHashTable *update_tbl = NULL;
+
+/*
+ * Code :) ********************************************************************
+ */
+
+Shell *shell_get_main_shell(void)
+{
+ return shell;
+}
+
+void shell_ui_manager_set_visible(const gchar *path,
+ gboolean setting)
+{
+ GtkWidget *widget;
+
+ widget = gtk_ui_manager_get_widget(shell->ui_manager, path);
+ if (!widget)
+ return;
+
+ if (setting)
+ gtk_widget_show(widget);
+ else
+ gtk_widget_hide(widget);
+}
+
+void shell_action_set_property(const gchar *action_name,
+ const gchar *property,
+ gboolean setting)
+{
+ GtkAction *action;
+
+ action = gtk_action_group_get_action(shell->action_group, action_name);
+ if (action) {
+ GValue value = {0};
+
+ g_value_init(&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean(&value, setting);
+
+ g_object_set_property(G_OBJECT(action), property, &value);
+
+ g_value_unset(&value);
+ }
+}
+
+void shell_action_set_enabled(const gchar *action_name, gboolean setting)
+{
+ GtkAction *action;
+
+ action = gtk_action_group_get_action(shell->action_group, action_name);
+ if (action) {
+ gtk_action_set_sensitive(action, setting);
+ }
+}
+
+void shell_set_left_pane_visible(gboolean setting)
+{
+ if (setting)
+ gtk_widget_show(shell->tree->scroll);
+ else
+ gtk_widget_hide(shell->tree->scroll);
+}
+
+gboolean shell_action_get_active(const gchar *action_name)
+{
+ GtkAction *action;
+ GSList *proxies;
+
+ /* FIXME: Ugh. Are you sure there isn't any simpler way? O_o */
+
+ action = gtk_action_group_get_action(shell->action_group, action_name);
+ if (action) {
+ proxies = gtk_action_get_proxies(action);
+
+ for (; proxies; proxies = proxies->next) {
+ GtkWidget *widget = (GtkWidget *)proxies->data;
+
+ if (GTK_IS_CHECK_MENU_ITEM(widget)) {
+ return gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+void shell_action_set_active(const gchar *action_name, gboolean setting)
+{
+ GtkAction *action;
+ GSList *proxies;
+
+ /* FIXME: Ugh. Are you sure there isn't any simpler way? O_o */
+
+ action = gtk_action_group_get_action(shell->action_group, action_name);
+ if (action) {
+ proxies = gtk_action_get_proxies(action);
+
+ for (; proxies; proxies = proxies->next) {
+ GtkWidget *widget = (GtkWidget *)proxies->data;
+
+ if (GTK_IS_CHECK_MENU_ITEM(widget)) {
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), setting);
+ return;
+ }
+ }
+ }
+}
+
+void
+shell_status_pulse(void)
+{
+ gtk_progress_bar_pulse(GTK_PROGRESS_BAR(shell->progress));
+ while (gtk_events_pending())
+ gtk_main_iteration();
+}
+
+void
+shell_status_set_percentage(gint percentage)
+{
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(shell->progress),
+ (float)percentage/100.0);
+ while (gtk_events_pending())
+ gtk_main_iteration();
+}
+
+void
+shell_view_set_enabled(gboolean setting)
+{
+ if (setting) {
+ widget_set_cursor(shell->window, GDK_LEFT_PTR);
+ } else {
+ widget_set_cursor(shell->window, GDK_WATCH);
+ }
+
+ gtk_widget_set_sensitive(shell->hpaned, setting);
+ shell_action_set_enabled("ViewMenuAction", setting);
+ shell_action_set_enabled("RefreshAction", setting);
+ shell_action_set_enabled("ReportAction", setting);
+}
+
+void
+shell_status_set_enabled(gboolean setting)
+{
+ if (setting)
+ gtk_widget_show(shell->progress);
+ else {
+ gtk_widget_hide(shell->progress);
+ shell_view_set_enabled(TRUE);
+ }
+}
+
+void
+shell_do_reload(void)
+{
+ shell_action_set_enabled("RefreshAction", FALSE);
+ shell_action_set_enabled("ReportAction", FALSE);
+
+ if (shell->selected && shell->selected->reloadfunc) {
+ GtkTreeSelection *ts;
+
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(shell->tree->view));
+ shell_status_set_enabled(TRUE);
+
+ shell->selected->reloadfunc(shell->selected->number);
+ module_selected(ts, NULL);
+ }
+
+ shell_action_set_enabled("RefreshAction", TRUE);
+ shell_action_set_enabled("ReportAction", TRUE);
+}
+
+void
+shell_status_update(const gchar *message)
+{
+ gtk_label_set_markup(GTK_LABEL(shell->status), message);
+ gtk_progress_bar_pulse(GTK_PROGRESS_BAR(shell->progress));
+ while (gtk_events_pending())
+ gtk_main_iteration();
+}
+
+static void
+destroy_me(void)
+{
+ gtk_main_quit();
+ exit(0);
+}
+
+static void
+create_window(void)
+{
+ GtkWidget *vbox, *hbox;
+
+ shell = g_new0(Shell, 1);
+
+ shell->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_icon(GTK_WINDOW(shell->window),
+ icon_cache_get_pixbuf("logo.png"));
+ gtk_window_set_title(GTK_WINDOW(shell->window), "System Information");
+ gtk_widget_set_size_request(shell->window, 600, 400);
+ g_signal_connect(G_OBJECT(shell->window), "destroy", destroy_me, NULL);
+
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_widget_show(vbox);
+ gtk_container_add(GTK_CONTAINER(shell->window), vbox);
+ shell->vbox = vbox;
+
+ menu_init(shell);
+
+ hbox = gtk_hbox_new(FALSE, 5);
+ gtk_widget_show(hbox);
+ gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 3);
+
+ shell->progress = gtk_progress_bar_new();
+ gtk_widget_set_size_request(shell->progress, 70, 10);
+ gtk_widget_hide(shell->progress);
+ gtk_box_pack_end(GTK_BOX(hbox), shell->progress, FALSE, FALSE, 0);
+
+ shell->status = gtk_label_new("");
+ gtk_misc_set_alignment(GTK_MISC(shell->status), 0.0, 0.5);
+ gtk_widget_show(shell->status);
+ gtk_box_pack_start(GTK_BOX(hbox), shell->status, FALSE, FALSE, 0);
+
+ shell->hpaned = gtk_hpaned_new();
+ gtk_widget_show(shell->hpaned);
+ gtk_box_pack_end(GTK_BOX(vbox), shell->hpaned, TRUE, TRUE, 0);
+ gtk_paned_set_position(GTK_PANED(shell->hpaned), 210);
+
+ shell->vpaned = gtk_vpaned_new();
+ gtk_widget_show(shell->vpaned);
+ gtk_paned_add2(GTK_PANED(shell->hpaned), shell->vpaned);
+
+ shell->notebook = gtk_notebook_new();
+ gtk_paned_add2(GTK_PANED(shell->vpaned), shell->notebook);
+
+ gtk_widget_show(shell->window);
+ while (gtk_events_pending())
+ gtk_main_iteration();
+}
+
+static void
+shell_tree_modules_load(ShellTree * shelltree)
+{
+ GKeyFile *keyfile = g_key_file_new();
+ guint categories, i;
+
+ keyfile = g_key_file_new();
+ g_key_file_load_from_file(keyfile, PREFIX "modules.conf", 0, NULL);
+ if (g_key_file_get_integer(keyfile, "general", "version", NULL) != 2) {
+ g_error("Wrong version of modules.conf");
+ }
+
+ gchar **cat = g_key_file_get_keys(keyfile, "categories", &categories, NULL);
+ for (i = 0; i < categories; i++) {
+ ShellModule *module;
+ gchar *tmp, *iname;
+
+ module = g_new0(ShellModule, 1);
+ module->name = g_strdup(cat[i]);
+ iname = g_key_file_get_value(keyfile, "categories", cat[i], NULL);
+
+ tmp = g_strdup_printf("%s.png", iname);
+ module->icon = icon_cache_get_pixbuf(tmp);
+ g_free(tmp);
+
+ tmp = g_strdup_printf(PREFIX "modules/%s.so", iname);
+ module->dll = g_module_open(tmp, G_MODULE_BIND_LAZY);
+ g_free(tmp);
+
+ if (module->dll) {
+ gint(*n_entries) (void);
+ gint i;
+
+ if (!g_module_symbol(module->dll, "hi_n_entries", (gpointer) & n_entries))
+ continue;
+
+ gint j = n_entries();
+ for (i = 0; i <= j; i++) {
+ GdkPixbuf *(*shell_icon) (gint);
+ const gchar *(*shell_name) (gint);
+ ShellModuleEntry *entry = g_new0(ShellModuleEntry, 1);
+
+ if (g_module_symbol(module->dll, "hi_icon", (gpointer)&(shell_icon))) {
+ entry->icon = shell_icon(i);
+ }
+ if (g_module_symbol(module->dll, "hi_name", (gpointer)&(shell_name))) {
+ entry->name = g_strdup(shell_name(i));
+ }
+ g_module_symbol(module->dll, "hi_info",
+ (gpointer) & (entry->func));
+ g_module_symbol(module->dll, "hi_reload",
+ (gpointer) & (entry->reloadfunc));
+ g_module_symbol(module->dll, "hi_more_info",
+ (gpointer) & (entry->morefunc));
+ g_module_symbol(module->dll, "hi_get_field",
+ (gpointer) & (entry->fieldfunc));
+
+ entry->number = i;
+ module->entries = g_slist_append(module->entries, entry);
+ }
+
+ shelltree->modules = g_slist_append(shelltree->modules, module);
+ } else {
+ g_free(module->name);
+ g_free(module->icon);
+ g_free(module);
+ }
+
+ g_free(iname);
+ }
+
+ g_strfreev(cat);
+ g_key_file_free(keyfile);
+}
+
+static void view_menu_select_entry(gpointer data, gpointer data2)
+{
+ GtkTreeSelection *ts;
+ GtkTreePath *path;
+ GtkTreeIter *iter = (GtkTreeIter*) data2;
+
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(shell->tree->view));
+ path = gtk_tree_model_get_path(shell->tree->model, iter);
+
+ gtk_tree_selection_select_path(ts, path);
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(shell->tree->view), path, NULL, FALSE);
+ gtk_tree_path_free(path);
+}
+
+static void
+add_module_to_view_menu(gchar *name, GdkPixbuf *pixbuf)
+{
+ stock_icon_register_pixbuf(pixbuf, name);
+
+ GtkActionEntry entries[] = {
+ { name, /* name */
+ name, /* stockid */
+ name, /* label */
+ NULL, /* accelerator */
+ NULL, /* tooltip */
+ NULL, /* callback */
+ },
+ };
+
+ gtk_action_group_add_actions(shell->action_group, entries, 1, NULL);
+
+ gtk_ui_manager_add_ui(shell->ui_manager,
+ gtk_ui_manager_new_merge_id(shell->ui_manager),
+ "/menubar/ViewMenu/LastSep",
+ name,
+ name,
+ GTK_UI_MANAGER_MENU,
+ TRUE);
+}
+
+static void
+add_module_entry_to_view_menu(gchar *module, gchar *name, GdkPixbuf *pixbuf, GtkTreeIter *iter)
+{
+ stock_icon_register_pixbuf(pixbuf, name);
+
+ GtkActionEntry entries[] = {
+ { name, /* name */
+ name, /* stockid */
+ name, /* label */
+ NULL, /* accelerator */
+ NULL, /* tooltip */
+ (GCallback)view_menu_select_entry,/* callback */
+ },
+ };
+
+ gtk_action_group_add_actions(shell->action_group, entries, 1, iter);
+
+ gtk_ui_manager_add_ui(shell->ui_manager,
+ gtk_ui_manager_new_merge_id(shell->ui_manager),
+ g_strdup_printf("/menubar/ViewMenu/%s", module),
+ name,
+ name,
+ GTK_UI_MANAGER_AUTO,
+ FALSE);
+}
+
+static void
+add_modules_to_gui(gpointer data, gpointer user_data)
+{
+ ShellTree *shelltree = (ShellTree *) user_data;
+ ShellModule *module = (ShellModule *) data;
+ GtkTreeStore *store = GTK_TREE_STORE(shelltree->model);
+ GtkTreeIter parent;
+
+ gtk_tree_store_append(store, &parent, NULL);
+ gtk_tree_store_set(store, &parent, TREE_COL_NAME, module->name,
+ TREE_COL_DATA, NULL,
+ TREE_COL_SEL, FALSE, -1);
+
+ if (module->icon) {
+ gtk_tree_store_set(store, &parent, TREE_COL_PBUF, module->icon, -1);
+ }
+
+ add_module_to_view_menu(module->name, module->icon);
+
+ if (module->entries) {
+ ShellModuleEntry *entry;
+ GSList *p;
+
+ for (p = module->entries; p; p = g_slist_next(p)) {
+ GtkTreeIter child;
+ entry = (ShellModuleEntry *) p->data;
+
+ gtk_tree_store_append(store, &child, &parent);
+ gtk_tree_store_set(store, &child, TREE_COL_NAME, entry->name,
+ TREE_COL_DATA, entry,
+ TREE_COL_SEL, FALSE, -1);
+
+ if (entry->icon) {
+ gtk_tree_store_set(store, &child, TREE_COL_PBUF,
+ entry->icon, -1);
+ }
+
+ add_module_entry_to_view_menu(module->name, entry->name, entry->icon,
+ gtk_tree_iter_copy(&child));
+
+ shell_status_pulse();
+ }
+
+ }
+}
+
+void
+shell_init(void)
+{
+ if (shell) {
+ g_error("Shell already created");
+ return;
+ }
+
+ create_window();
+
+ shell->tree = tree_new();
+ shell->info = info_tree_new(FALSE);
+ shell->moreinfo = info_tree_new(TRUE);
+ shell->loadgraph = load_graph_new(75);
+
+ gtk_paned_pack1(GTK_PANED(shell->hpaned), shell->tree->scroll,
+ SHELL_PACK_RESIZE, SHELL_PACK_SHRINK);
+ gtk_paned_pack1(GTK_PANED(shell->vpaned), shell->info->scroll,
+ SHELL_PACK_RESIZE, SHELL_PACK_SHRINK);
+
+ gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook),
+ shell->moreinfo->scroll, NULL);
+ gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook),
+ load_graph_get_framed(shell->loadgraph), NULL);
+
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(shell->notebook), FALSE);
+ gtk_notebook_set_show_border(GTK_NOTEBOOK(shell->notebook), FALSE);
+
+ shell_status_set_enabled(TRUE);
+ shell_status_update("Loading modules...");
+
+ shell_tree_modules_load(shell->tree);
+ g_slist_foreach(shell->tree->modules, add_modules_to_gui, shell->tree);
+ gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->tree->view));
+
+ shell_status_update("Done.");
+ shell_status_set_enabled(FALSE);
+
+ gtk_widget_show_all(shell->hpaned);
+
+ load_graph_configure_expose(shell->loadgraph);
+
+ gtk_widget_hide(shell->notebook);
+
+ shell_action_set_enabled("RefreshAction", FALSE);
+ shell_action_set_active("LeftPaneAction", TRUE);
+ shell_action_set_active("ToolbarAction", TRUE);
+ shell_action_set_property("RefreshAction", "is-important", TRUE);
+ shell_action_set_property("ReportAction", "is-important", TRUE);
+}
+
+static gboolean
+update_field(gpointer data)
+{
+ ShellFieldUpdate *fu = (ShellFieldUpdate *) data;
+
+ /* if the entry is still selected, update it */
+ if (fu->entry->selected && fu->entry->fieldfunc) {
+ gchar *value = fu->entry->fieldfunc(fu->field_name);
+ GtkTreeIter *iter = g_hash_table_lookup(update_tbl, fu->field_name);
+
+ /* this function is also used to feed the load graph when ViewType =
+ SHELL_VIEW_LOAD_GRAPH */
+ if (fu->loadgraph && shell->view_type == SHELL_VIEW_LOAD_GRAPH) {
+ GtkTreeSelection *ts;
+
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW
+ (shell->info->view));
+
+ if (iter && gtk_tree_selection_iter_is_selected(ts, iter)) {
+ load_graph_update(shell->loadgraph, atoi(value));
+ }
+
+ g_free(value);
+
+ return TRUE;
+ }
+
+ if (iter) {
+ GtkTreeStore *store = GTK_TREE_STORE(shell->info->model);
+
+ gtk_tree_store_set(store, iter, INFO_TREE_COL_VALUE, value, -1);
+ g_free(value);
+
+ return TRUE;
+ }
+ }
+
+ /* otherwise, cleanup and destroy the timeout */
+ g_free(fu->field_name);
+ g_free(fu);
+
+ return FALSE;
+}
+
+static gboolean
+reload_section(gpointer data)
+{
+ ShellModuleEntry *entry = (ShellModuleEntry *) data;
+
+ /* if the entry is still selected, update it */
+ if (entry->selected && entry->reloadfunc) {
+ GtkTreePath *path = NULL;
+ GtkTreeSelection *ts;
+ GtkTreeIter iter;
+
+ /* gets the current selected path */
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW
+ (shell->info->view));
+ if (gtk_tree_selection_get_selected(ts, &shell->info->model, &iter))
+ path = gtk_tree_model_get_path(shell->info->model, &iter);
+
+ /* update the information, clear the treeview and populate it again */
+ entry->reloadfunc(entry->number);
+ info_selected_show_extra(NULL); /* clears the more info store */
+ module_selected_show_info(entry, TRUE);
+
+ /* if there was a selection, reselect it */
+ if (path) {
+ gtk_tree_selection_select_path(ts, path);
+ gtk_tree_path_free(path);
+ }
+ }
+
+ /* destroy the timeout: it'll be set up again */
+ return FALSE;
+}
+
+static void
+set_view_type(ShellViewType viewtype)
+{
+ gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(shell->info->view), FALSE);
+
+ if (viewtype == shell->view_type)
+ return;
+
+ switch (viewtype) {
+ default:
+ case SHELL_VIEW_NORMAL:
+ gtk_widget_hide(shell->notebook);
+
+ shell->view_type = SHELL_VIEW_NORMAL;
+ break;
+ case SHELL_VIEW_DUAL:
+ gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 0);
+ gtk_widget_show(shell->notebook);
+
+ shell->view_type = SHELL_VIEW_DUAL;
+ break;
+ case SHELL_VIEW_LOAD_GRAPH:
+ gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 1);
+ gtk_widget_show(shell->notebook);
+ load_graph_clear(shell->loadgraph);
+
+ gtk_paned_set_position(GTK_PANED(shell->vpaned),
+ shell->hpaned->allocation.height -
+ shell->loadgraph->height - 16);
+
+ shell->view_type = SHELL_VIEW_LOAD_GRAPH;
+ break;
+ }
+}
+
+static void
+group_handle_special(GKeyFile * key_file, ShellModuleEntry * entry,
+ gchar * group, gchar ** keys)
+{
+ if (g_str_equal(group, "$ShellParam$")) {
+ gint i;
+
+ for (i = 0; keys[i]; i++) {
+ gchar *key = keys[i];
+
+ if (g_str_has_prefix(key, "UpdateInterval")) {
+ gint ms;
+ ShellFieldUpdate *fu = g_new0(ShellFieldUpdate, 1);
+
+ ms = g_key_file_get_integer(key_file, group, key, NULL);
+
+ fu->field_name = g_strdup(strchr(key, '$') + 1);
+ fu->entry = entry;
+ fu->loadgraph = FALSE;
+
+ g_timeout_add(ms, update_field, fu);
+ } else if (g_str_has_prefix(key, "LoadGraphInterval")) {
+ gint ms;
+ ShellFieldUpdate *fu = g_new0(ShellFieldUpdate, 1);
+
+ ms = g_key_file_get_integer(key_file, group, key, NULL);
+
+ fu->field_name = g_strdup(strchr(key, '$') + 1);
+ fu->entry = entry;
+ fu->loadgraph = TRUE;
+
+ g_timeout_add(ms, update_field, fu);
+ } else if (g_str_equal(key, "ReloadInterval")) {
+ gint ms;
+
+ ms = g_key_file_get_integer(key_file, group, key, NULL);
+
+ g_timeout_add(ms, reload_section, entry);
+ } else if (g_str_equal(key, "ViewType")) {
+ set_view_type(g_key_file_get_integer(key_file, group,
+ key, NULL));
+ } else if (g_str_has_prefix(key, "Icon")) {
+ GtkTreeIter *iter = g_hash_table_lookup(update_tbl,
+ strchr(key, '$') + 1);
+
+ if (iter) {
+ gchar *file = g_key_file_get_value(key_file, group, key, NULL);
+ gtk_tree_store_set(GTK_TREE_STORE(shell->info->model),
+ iter, INFO_TREE_COL_PBUF,
+ icon_cache_get_pixbuf_at_size(file, 24, 24),
+ -1);
+ g_free(file);
+ }
+ } else if (g_str_equal(key, "Zebra")) {
+ gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(shell->info->view),
+ g_key_file_get_boolean(key_file,
+ group,
+ key, NULL));
+ }
+ }
+ } else {
+ g_warning("Unknown parameter group '%s'", group);
+ }
+}
+
+static void
+group_handle_normal(GKeyFile * key_file, ShellModuleEntry * entry,
+ gchar * group, gchar ** keys)
+{
+ GtkTreeIter parent;
+ GtkTreeStore *store = GTK_TREE_STORE(shell->info->model);
+ gchar *tmp = g_strdup(group);
+ gint i;
+
+ gtk_tree_store_append(store, &parent, NULL);
+
+ strend(tmp, '#');
+ gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, tmp, -1);
+ g_free(tmp);
+
+ for (i = 0; keys[i]; i++) {
+ gchar *key = keys[i];
+ gchar *value;
+ GtkTreeIter child;
+
+ value = g_key_file_get_value(key_file, group, key, NULL);
+
+ if (g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) {
+ gtk_tree_store_append(store, &child, &parent);
+ gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value, -1);
+
+ strend(key, '#');
+
+ if (*key == '$') {
+ gchar **tmp;
+
+ tmp = g_strsplit(++key, "$", 0);
+
+ gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, tmp[1],
+ INFO_TREE_COL_DATA, tmp[0], -1);
+
+ g_strfreev(tmp);
+ } else {
+ gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, key,
+ INFO_TREE_COL_DATA, NULL, -1);
+ }
+
+ g_hash_table_insert(update_tbl, g_strdup(key),
+ gtk_tree_iter_copy(&child));
+
+ }
+
+ g_free(value);
+ }
+}
+
+static void
+moreinfo_handle_normal(GKeyFile * key_file, gchar * group, gchar ** keys)
+{
+ GtkTreeIter parent;
+ GtkTreeStore *store = GTK_TREE_STORE(shell->moreinfo->model);
+ gint i;
+
+ gtk_tree_store_append(store, &parent, NULL);
+ gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, group, -1);
+
+ for (i = 0; keys[i]; i++) {
+ gchar *key = keys[i];
+ GtkTreeIter child;
+ gchar *value;
+
+ value = g_key_file_get_value(key_file, group, key, NULL);
+
+ if (g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) {
+ strend(key, '#');
+
+ gtk_tree_store_append(store, &child, &parent);
+ gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value,
+ INFO_TREE_COL_NAME, key, -1);
+ }
+
+ g_free(value);
+ }
+}
+
+static gboolean
+g_true(gpointer key, gpointer value, gpointer data)
+{
+ return TRUE;
+}
+
+static void
+module_selected_show_info(ShellModuleEntry * entry, gboolean reload)
+{
+ GKeyFile *key_file = g_key_file_new();
+ gchar *key_data;
+ gchar **groups;
+ GtkTreeStore *store;
+ gint i;
+
+ if (entry->func) {
+ key_data = entry->func(entry->number);
+ } else {
+ key_data = g_strdup("[Error]\n"
+ "Invalid module=");
+ }
+
+ /* reset the view type to normal */
+ set_view_type(SHELL_VIEW_NORMAL);
+
+ /* recreate the iter hash table only if we're not reloading the module section */
+ if (!reload) {
+ if (update_tbl != NULL) {
+ g_hash_table_foreach_remove(update_tbl, g_true, NULL);
+ }
+ update_tbl = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+ }
+
+ store = GTK_TREE_STORE(shell->info->model);
+ gtk_tree_store_clear(store);
+
+ g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0, NULL);
+ groups = g_key_file_get_groups(key_file, NULL);
+
+ for (i = 0; groups[i]; i++) {
+ gchar *group = groups[i];
+ gchar **keys = g_key_file_get_keys(key_file, group, NULL, NULL);
+
+ if (*group == '$') {
+ group_handle_special(key_file, entry, group, keys);
+ } else {
+ group_handle_normal(key_file, entry, group, keys);
+ }
+ }
+
+ gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->info->view));
+
+ g_strfreev(groups);
+ g_key_file_free(key_file);
+ g_free(key_data);
+}
+
+static void
+info_selected_show_extra(gchar * data)
+{
+ GtkTreeStore *store;
+
+ store = GTK_TREE_STORE(shell->moreinfo->model);
+ gtk_tree_store_clear(store);
+
+ if (!shell->selected->morefunc)
+ return;
+
+ if (data) {
+ GKeyFile *key_file = g_key_file_new();
+ gchar *key_data = shell->selected->morefunc(data);
+ gchar **groups;
+ gint i;
+
+ g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0,
+ NULL);
+ groups = g_key_file_get_groups(key_file, NULL);
+
+ for (i = 0; groups[i]; i++) {
+ gchar *group = groups[i];
+ gchar **keys = g_key_file_get_keys(key_file, group, NULL, NULL);
+
+ moreinfo_handle_normal(key_file, group, keys);
+ }
+
+ gtk_tree_view_expand_all(GTK_TREE_VIEW
+ (shell->moreinfo->view));
+
+ g_strfreev(groups);
+ g_key_file_free(key_file);
+ g_free(key_data);
+ }
+}
+
+static void
+module_selected(GtkTreeSelection * ts, gpointer data)
+{
+ ShellTree *shelltree = shell->tree;
+ GtkTreeModel *model = GTK_TREE_MODEL(shelltree->model);
+ GtkTreeIter parent;
+ ShellModuleEntry *entry;
+ static ShellModuleEntry *current = NULL;
+ static gboolean updating = FALSE;
+
+ if (updating)
+ return;
+
+ updating = TRUE;
+
+ /* Gets the currently selected item on the left-side TreeView; if there is no
+ selection, silently return */
+ if (!gtk_tree_selection_get_selected(ts, &model, &parent))
+ return;
+
+ /* Mark the currently selected module as "unselected"; this is used to kill the
+ update timeout. */
+ if (current)
+ current->selected = FALSE;
+
+ /* Get the current selection and shows its related info */
+ gtk_tree_model_get(model, &parent, TREE_COL_DATA, &entry, -1);
+ if (entry && entry->func && !entry->selected) {
+ shell_status_set_enabled(TRUE);
+ shell_status_update("Updating...");
+
+ entry->selected = TRUE;
+ shell->selected = entry;
+ module_selected_show_info(entry, FALSE);
+
+ info_selected_show_extra(NULL); /* clears the more info store */
+ gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->info->view));
+
+ /* urgh. why don't GTK do this when the model is cleared? */
+ gtk_range_set_value(GTK_RANGE(GTK_SCROLLED_WINDOW(shell->info->scroll)->vscrollbar), 0.0);
+ gtk_range_set_value(GTK_RANGE(GTK_SCROLLED_WINDOW(shell->info->scroll)->hscrollbar), 0.0);
+ gtk_range_set_value(GTK_RANGE(GTK_SCROLLED_WINDOW(shell->moreinfo->scroll)->vscrollbar), 0.0);
+ gtk_range_set_value(GTK_RANGE(GTK_SCROLLED_WINDOW(shell->moreinfo->scroll)->hscrollbar), 0.0);
+
+ shell_status_update("Done.");
+ shell_status_set_enabled(FALSE);
+
+ gchar *tmp = g_strdup_printf("%s - System Information", entry->name);
+ gtk_window_set_title(GTK_WINDOW(shell->window), tmp);
+ g_free(tmp);
+
+ shell_action_set_enabled("RefreshAction", entry->reloadfunc ? TRUE : FALSE);
+ } else {
+ gtk_window_set_title(GTK_WINDOW(shell->window), "System Information");
+ shell_action_set_enabled("RefreshAction", FALSE);
+
+ gtk_tree_store_clear(GTK_TREE_STORE(shell->info->model));
+ set_view_type(SHELL_VIEW_NORMAL);
+ }
+
+ current = entry;
+ updating = FALSE;
+}
+
+static void
+info_selected(GtkTreeSelection * ts, gpointer data)
+{
+ ShellInfoTree *info = (ShellInfoTree *) data;
+ GtkTreeModel *model = GTK_TREE_MODEL(info->model);
+ GtkTreeIter parent;
+ gchar *datacol;
+
+ if (!gtk_tree_selection_get_selected(ts, &model, &parent))
+ return;
+
+ gtk_tree_model_get(model, &parent, INFO_TREE_COL_DATA, &datacol, -1);
+ info_selected_show_extra(datacol);
+ gtk_tree_view_columns_autosize(GTK_TREE_VIEW
+ (shell->moreinfo->view));
+}
+
+static ShellInfoTree *
+info_tree_new(gboolean extra)
+{
+ ShellInfoTree *info;
+ GtkWidget *treeview, *scroll;
+ GtkTreeModel *model;
+ GtkTreeStore *store;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *cr_text, *cr_pbuf;
+
+ info = g_new0(ShellInfoTree, 1);
+
+ scroll = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW
+ (scroll), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+
+ store = gtk_tree_store_new(INFO_TREE_NCOL, G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_STRING, GDK_TYPE_PIXBUF);
+ model = GTK_TREE_MODEL(store);
+ treeview = gtk_tree_view_new_with_model(model);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
+
+ cr_pbuf = gtk_cell_renderer_pixbuf_new();
+ gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE);
+ gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf",
+ INFO_TREE_COL_PBUF);
+
+ cr_text = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, cr_text, TRUE);
+ gtk_tree_view_column_add_attribute(column, cr_text, "markup",
+ INFO_TREE_COL_NAME);
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
+
+ cr_text = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, cr_text, TRUE);
+ gtk_tree_view_column_add_attribute(column, cr_text, "markup",
+ INFO_TREE_COL_VALUE);
+
+ if (!extra) {
+ GtkTreeSelection *sel;
+
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+ g_signal_connect(G_OBJECT(sel), "changed",
+ (GCallback) info_selected, info);
+ }
+
+ gtk_container_add(GTK_CONTAINER(scroll), treeview);
+
+ info->scroll = scroll;
+ info->view = treeview;
+ info->model = model;
+
+ gtk_widget_show_all(scroll);
+
+ return info;
+}
+
+static ShellTree *
+tree_new()
+{
+ ShellTree *shelltree;
+ GtkWidget *treeview, *scroll;
+ GtkTreeModel *model;
+ GtkTreeStore *store;
+ GtkCellRenderer *cr_text, *cr_pbuf;
+ GtkTreeViewColumn *column;
+ GtkTreeSelection *sel;
+
+ shelltree = g_new0(ShellTree, 1);
+
+ scroll = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW
+ (scroll), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+
+ store = gtk_tree_store_new(TREE_NCOL, GDK_TYPE_PIXBUF, G_TYPE_STRING,
+ G_TYPE_POINTER, G_TYPE_BOOLEAN);
+ model = GTK_TREE_MODEL(store);
+ treeview = gtk_tree_view_new_with_model(model);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
+
+ cr_pbuf = gtk_cell_renderer_pixbuf_new();
+ cr_text = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE);
+ gtk_tree_view_column_pack_start(column, cr_text, TRUE);
+
+ gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf",
+ TREE_COL_PBUF);
+ gtk_tree_view_column_add_attribute(column, cr_text, "markup",
+ TREE_COL_NAME);
+
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+ g_signal_connect(G_OBJECT(sel), "changed", (GCallback) module_selected,
+ NULL);
+
+ gtk_container_add(GTK_CONTAINER(scroll), treeview);
+
+ shelltree->scroll = scroll;
+ shelltree->view = treeview;
+ shelltree->model = model;
+ shelltree->modules = NULL;
+
+ gtk_widget_show_all(scroll);
+
+ return shelltree;
+}
diff --git a/shell.h b/shell.h
new file mode 100644
index 00000000..54745bb6
--- /dev/null
+++ b/shell.h
@@ -0,0 +1,142 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef __SHELL_H__
+#define __SHELL_H__
+
+#include <gtk/gtk.h>
+#include <loadgraph.h>
+
+typedef struct _Shell Shell;
+typedef struct _ShellTree ShellTree;
+typedef struct _ShellInfoTree ShellInfoTree;
+
+typedef struct _ShellModule ShellModule;
+typedef struct _ShellModuleEntry ShellModuleEntry;
+
+typedef struct _ShellFieldUpdate ShellFieldUpdate;
+
+typedef enum {
+ SHELL_PACK_RESIZE = 1 << 0,
+ SHELL_PACK_SHRINK = 1 << 1
+} ShellPackOptions;
+
+typedef enum {
+ SHELL_VIEW_NORMAL,
+ SHELL_VIEW_DUAL,
+ SHELL_VIEW_LOAD_GRAPH,
+} ShellViewType;
+
+typedef enum {
+ TREE_COL_PBUF,
+ TREE_COL_NAME,
+ TREE_COL_DATA,
+ TREE_COL_SEL,
+ TREE_NCOL
+} ShellTreeColumns;
+
+typedef enum {
+ INFO_TREE_COL_NAME,
+ INFO_TREE_COL_VALUE,
+ INFO_TREE_COL_DATA,
+ INFO_TREE_COL_PBUF,
+ INFO_TREE_NCOL
+} ShellInfoTreeColumns;
+
+struct _Shell {
+ GtkWidget *window, *vbox;
+ GtkWidget *status, *progress;
+ GtkWidget *notebook;
+ GtkWidget *hpaned, *vpaned;
+
+ ShellTree *tree;
+ ShellInfoTree *info, *moreinfo;
+ ShellModuleEntry *selected;
+ LoadGraph *loadgraph;
+
+ GtkActionGroup *action_group;
+ GtkUIManager *ui_manager;
+
+ ShellViewType view_type;
+};
+
+struct _ShellTree {
+ GtkWidget *scroll;
+ GtkWidget *view;
+ GtkTreeModel *model;
+
+ GSList *modules;
+};
+
+struct _ShellInfoTree {
+ GtkWidget *scroll;
+ GtkWidget *view;
+ GtkTreeModel *model;
+};
+
+struct _ShellModule {
+ gchar *name;
+ GdkPixbuf *icon;
+ GModule *dll;
+
+ GSList *entries;
+};
+
+struct _ShellModuleEntry {
+ gchar *name;
+ gint number;
+ GdkPixbuf *icon;
+ gboolean selected;
+
+ gchar *(*func) (gint entry);
+ gchar *(*reloadfunc) (gint entry);
+ gchar *(*fieldfunc) (gchar * entry);
+ gchar *(*morefunc) (gchar * entry);
+};
+
+struct _ShellFieldUpdate {
+ ShellModuleEntry *entry;
+ gchar *field_name;
+ gboolean loadgraph;
+};
+
+void shell_init(void);
+void shell_do_reload(void);
+
+Shell *shell_get_main_shell();
+
+void shell_action_set_enabled(const gchar *action_name,
+ gboolean setting);
+gboolean shell_action_get_active(const gchar *action_name);
+void shell_action_set_active(const gchar *action_name,
+ gboolean setting);
+void shell_action_set_property(const gchar *action_name,
+ const gchar *property,
+ gboolean setting);
+
+void shell_set_left_pane_visible(gboolean setting);
+void shell_ui_manager_set_visible(const gchar *path,
+ gboolean setting);
+
+void shell_status_update(const gchar *message);
+void shell_status_pulse(void);
+void shell_status_set_percentage(gint percentage);
+void shell_status_set_enabled(gboolean setting);
+
+void shell_view_set_enabled(gboolean setting);
+
+#endif /* __SHELL_H__ */
diff --git a/status.c b/status.c
deleted file mode 100644
index 626093ff..00000000
--- a/status.c
+++ /dev/null
@@ -1,69 +0,0 @@
-#include "config.h"
-#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
deleted file mode 100644
index a7e6fbe6..00000000
--- a/status.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __STATUS_H__
-#define __STATUS_H__
-
-#include <gtk/gtk.h>
-#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/stock.c b/stock.c
index 11b05073..34aea2e9 100644
--- a/stock.c
+++ b/stock.c
@@ -1,64 +1,80 @@
/*
- * Based on GAIM's stock.c
- * Copyright (C) 2002-2003, Christian Hammond <chipx86@gnupdate.org>
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
*
- * Also distributed under GNU GPL version 2.
- */
-
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
#include <gtk/gtk.h>
-#include "stock.h"
-#include "hardinfo.h"
-#include "config.h"
-
-static struct StockIcon {
- const char *name;
- const char *filename;
-} const stock_icons[] = {
- { HI_ABOUT, "stock-about-16.png" },
- { HI_DETAILS, "stock-details.png" }
-};
+#include <stock.h>
+#include <iconcache.h>
-const GtkStockItem stock_items[] = {
- { HI_ABOUT, "About...", 0, 0, NULL },
- { HI_DETAILS, "_Details...", 0, 0, NULL }
+static struct {
+ gchar *filename;
+ gchar *stock_id;
+} stock_icons[] = {
+ { "report.png", HI_STOCK_REPORT}
};
-static gint stock_icon_count = sizeof stock_icons / sizeof(*stock_icons);
-static gint stock_item_count = sizeof stock_items / sizeof(*stock_items);
-static gboolean stock_inited = FALSE;
+static GtkIconFactory *icon_factory;
-void hi_stock_init(void)
+void stock_icon_register(gchar *filename, gchar *stock_id)
{
- GtkIconFactory *ift;
- int i;
- GtkWidget *win;
-
- if (stock_inited) return;
-
- ift = gtk_icon_factory_new();
- gtk_icon_factory_add_default(ift);
-
- win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_widget_realize(win);
-
- for (i = 0; i < stock_icon_count; i++) {
- GdkPixbuf *pixbuf;
- GtkIconSet *iconset;
- gchar *filename;
-
- filename = g_strdup_printf("%s/%s", IMG_PREFIX, stock_icons[i].filename);
- pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
- g_free(filename);
-
- iconset = gtk_icon_set_new_from_pixbuf(pixbuf);
- gtk_icon_factory_add(ift, stock_icons[i].name, iconset);
- gtk_icon_set_unref(iconset);
- }
-
- gtk_widget_destroy(win);
- g_object_unref(G_OBJECT(ift));
- gtk_stock_add_static(stock_items, stock_item_count);
-
- stock_inited = TRUE;
+ GtkIconSet *icon_set;
+ GtkIconSource *icon_source;
+
+ icon_set = gtk_icon_set_new();
+ icon_source = gtk_icon_source_new();
+
+ gtk_icon_source_set_pixbuf(icon_source, icon_cache_get_pixbuf(filename));
+ gtk_icon_set_add_source(icon_set, icon_source);
+ gtk_icon_source_free(icon_source);
+
+ gtk_icon_factory_add(icon_factory, stock_id, icon_set);
+
+ gtk_icon_set_unref(icon_set);
}
+void stock_icon_register_pixbuf(GdkPixbuf *pixbuf, gchar *stock_id)
+{
+ GtkIconSet *icon_set;
+ GtkIconSource *icon_source;
+
+ icon_set = gtk_icon_set_new();
+ icon_source = gtk_icon_source_new();
+
+ gtk_icon_source_set_pixbuf(icon_source, pixbuf);
+ gtk_icon_set_add_source(icon_set, icon_source);
+ gtk_icon_source_free(icon_source);
+
+ gtk_icon_factory_add(icon_factory, stock_id, icon_set);
+
+ gtk_icon_set_unref(icon_set);
+}
+
+void stock_icons_init(void)
+{
+ gint i;
+ guint n_stock_icons = G_N_ELEMENTS(stock_icons);
+
+ icon_factory = gtk_icon_factory_new();
+
+ for (i = 0; i < n_stock_icons; i++) {
+ stock_icon_register(stock_icons[i].filename, stock_icons[i].stock_id);
+ }
+
+ gtk_icon_factory_add_default(icon_factory);
+
+ g_object_unref(icon_factory);
+}
diff --git a/stock.h b/stock.h
index cf9014fd..b40d48e1 100644
--- a/stock.h
+++ b/stock.h
@@ -1,20 +1,28 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
#ifndef __STOCK_H__
#define __STOCK_H__
-#include "config.h"
-
-#ifdef GTK2
-
-#define HI_ABOUT "hi-about"
-#define HI_DETAILS "hi-details"
-
-#define HI_PCI "hi-pci"
-#define HI_HDD "hi-hdd"
-#define HI_SCSI "hi-scsi"
-#define HI_CONNECTOR "hi-connector"
-#define HI_USB "hi-usb"
+#define HI_STOCK_REPORT "hi-stock-report"
-void hi_stock_init(void);
-#endif
+void stock_icons_init(void);
+void stock_icon_register(gchar *filename, gchar *stock_id);
+void stock_icon_register_pixbuf(GdkPixbuf *pixbuf, gchar *stock_id);
#endif /* __STOCK_H__ */
diff --git a/uidefs.xml b/uidefs.xml
new file mode 100644
index 00000000..f70031c8
--- /dev/null
+++ b/uidefs.xml
@@ -0,0 +1,29 @@
+<ui>
+ <menubar>
+ <menu name="FileMenu" action="FileMenuAction">
+ <menuitem name="Generate Report..." action="ReportAction" />
+ <separator/>
+ <menuitem name="Quit" action="QuitAction" />
+ <placeholder name="FileMenuAdditions" />
+ </menu>
+ <menu name="ViewMenu" action="ViewMenuAction">
+ <menuitem name="LeftPane" action="LeftPaneAction"/>
+ <menuitem name="Toolbar" action="ToolbarAction"/>
+ <separator/>
+ <menuitem name="Refresh" action="RefreshAction"/>
+ <separator/>
+ <separator name="LastSep"/>
+ </menu>
+ <menu name="HelpMenu" action="HelpMenuAction">
+ <menuitem name="About" action="AboutAction"/>
+ </menu>
+ </menubar>
+
+ <toolbar action="MainMenuBar" action="MainMenuBarAction">
+ <placeholder name="ToolItems">
+ <toolitem name="Refresh" action="RefreshAction"/>
+ <separator/>
+ <toolitem name="Report" action="ReportAction"/>
+ </placeholder>
+ </toolbar>
+</ui>
diff --git a/usb.c b/usb.c
deleted file mode 100644
index 712f4356..00000000
--- a/usb.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Hardware Information, version 0.3
- * Copyright (C) 2003-2004 Leandro Pereira <leandro@linuxmag.com.br>
- * USB support rewritten by Christophe Grosjean <christopheg@wanadoo.fr>
- *
- * 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;
- gint n=0;
- USBDevice *usb_dev = NULL, *usb = NULL;
- struct stat st;
- gchar buffer[128];
-
- if (stat("/proc/bus/usb/devices", &st)) return NULL;
-
- proc_usb = fopen("/proc/bus/usb/devices", "r");
- while(fgets(buffer, 128, proc_usb)){
- int lg = strlen(buffer);
- if (lg>0 && buffer[lg-1] == '\n'){
- buffer[lg-1]=0;
- }
- if (strstr(buffer, "Manufacturer=")) {
- gchar *buf = buffer;
-
- for (;*buf; buf++) {
- if (*buf == '=') {
- if (usb){
- usb->vendor = g_strdup(buf+1);
- }
- break;
- }
- }
- } else if (strstr(buffer, "Product=")) {
- gchar *buf = buffer;
- for (; *buf; buf++) {
- if (*buf == '=') {
- if (usb_dev){
- usb_dev->product = g_strdup(buf+1);
- }
- }
- }
- } else if (!strncmp(buffer, "D: Ve", 6)) {
- gchar *buf = buffer;
- 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('(');
- buf[6]=0;
- usb_dev->class = g_strdup(buf+1);
-
- 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);
- if (usb_dev){
- usb_dev->vendor_id = vendor_id;
- usb_dev->prod_id = prod_id;
- usb_dev->revision = rev;
- }
- }
- }
- fclose(proc_usb);
- return usb;
- }
-
-#if 0
-USBDevice *hi_scan_usb(void)
-{
- FILE *proc_usb;
- gchar buffer[64];
- gint n=0;
- USBDevice *usb_dev = NULL, *usb = NULL;
- 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 = NULL, end = NULL;
-
- 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 = NULL, end = NULL;
-
- 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;
-}
-#endif
-
-void hi_show_usb_info(MainWindow *mainwindow, USBDevice *device)
-{
- gchar *buf;
-
- if(!device) return;
-
- detail_window_set_icon(mainwindow->det_window, IMG_PREFIX "usb.png");
-
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window), _("USB Device"));
-
-
- detail_window_set_dev_name(mainwindow->det_window, device->product);
- detail_window_set_dev_type(mainwindow->det_window, device->vendor ?
- device->vendor : "");
-
- buf = g_strdup_printf("%s (%d)", device->class, device->class_id);
- detail_window_append_info(mainwindow->det_window, _("Class"), buf);
- g_free(buf);
-
- detail_window_append_separator(mainwindow->det_window);
-
- buf = g_strdup_printf("%.2f", device->version);
- detail_window_append_info(mainwindow->det_window, _("Version"), buf);
- g_free(buf);
-
- buf = g_strdup_printf("%.2f", device->revision);
- detail_window_append_info(mainwindow->det_window, _("Revision"), buf);
- g_free(buf);
-
- if(!device->prod_id) return;
-
- detail_window_append_separator(mainwindow->det_window);
-
- detail_window_append_info_int(mainwindow->det_window, _("Vendor ID"), device->vendor_id, TRUE);
- detail_window_append_info_int(mainwindow->det_window, _("Product ID"), device->prod_id, TRUE);
-
-}
-
diff --git a/usb.h b/usb.h
deleted file mode 100644
index f761b5c4..00000000
--- a/usb.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#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/util.c b/util.c
new file mode 100644
index 00000000..79084c2c
--- /dev/null
+++ b/util.c
@@ -0,0 +1,64 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <string.h>
+#include <hardinfo.h>
+#include <gtk/gtk.h>
+
+inline void
+remove_quotes(gchar *str)
+{
+ if (!str)
+ return;
+
+ while (*str == '"')
+ *(str++) = ' ';
+
+ gchar *p;
+ if ((p = strchr(str, '"')))
+ *p = 0;
+}
+
+inline void
+strend(gchar *str, gchar chr)
+{
+ if (!str)
+ return;
+
+ char *p;
+ if ((p = strchr(str, chr)))
+ *p = 0;
+}
+
+inline void
+remove_linefeed(gchar * str)
+{
+ strend(str, '\n');
+}
+
+void
+widget_set_cursor(GtkWidget *widget, GdkCursorType cursor_type)
+{
+ GdkCursor *cursor;
+
+ cursor = gdk_cursor_new(cursor_type);
+ gdk_window_set_cursor(GDK_WINDOW(widget->window), cursor);
+ gdk_cursor_unref(cursor);
+
+ while(gtk_events_pending())
+ gtk_main_iteration();
+}
diff --git a/v4l.c b/v4l.c
deleted file mode 100644
index 118d9fde..00000000
--- a/v4l.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Hardware Information, version 0.3
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * May be modified and/or distributed under the terms of GNU GPL version 2.
- *
- */
-
-#include "hardinfo.h"
-#include "v4l.h"
-
-#include <stdlib.h>
-#include <dirent.h>
-
-#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)
-{
- gchar *buf;
-
- if(!device) return;
-
- buf = g_strdup_printf("%sv4l.png", IMG_PREFIX);
- detail_window_set_icon(mainwindow->det_window, buf);
- g_free(buf);
-
- gtk_window_set_title(GTK_WINDOW(mainwindow->det_window->window), _("Device Information"));
-
-
- detail_window_set_dev_name(mainwindow->det_window, device->name);
-
- if (device->type) {
- gchar *b = g_strdup(device->type);
- gpointer b_start = b;
-
- do {
- if (*b == '|') *b = '\n';
- b++;
- } while(*b);
- b = b_start;
-
- detail_window_append_info(mainwindow->det_window, _("Type"),
- b);
- g_free(b);
- }
-}
diff --git a/v4l.h b/v4l.h
deleted file mode 100644
index 499dfca3..00000000
--- a/v4l.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#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
deleted file mode 100644
index 34bfd46c..00000000
--- a/x11.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Hardware Information, version 0.3
- * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
- *
- * 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 <stdlib.h>
-
-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;
- GtkWidget *pixmap;
- gchar *buf;
- X11Info *info;
-
- if (!mainwindow)
- return NULL;
-
- info = x11_get_info();
-
- if (!info)
- return NULL;
-
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_widget_show(hbox);
-
- 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);
-
- 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
- */
- label = gtk_label_new(_("<b>Display:</b>"));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- 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);
-
- label = gtk_label_new(_("<b>Vendor:</b>"));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- 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);
-
- label = gtk_label_new(_("<b>Release:</b>"));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- 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);
-
- label = gtk_label_new(_("<b>Resolution:</b>"));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- 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
deleted file mode 100644
index 6800ea7d..00000000
--- a/x11.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __X11_H__
-#define __X11_H__
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-
-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