diff -Naur usbview-1.0/ChangeLog usbview/ChangeLog
--- usbview-1.0/ChangeLog	2000-12-06 07:34:50.000000000 +0100
+++ usbview/ChangeLog	2005-06-30 17:13:34.000000000 +0200
@@ -1,3 +1,8 @@
+	- added "..." to About and Configure dialogs based on comments by
+	  Emil Brink.
+	- added patch from Emil Brink <emil.brink@interactiveinstitute.se>
+	  that fixed gtk warning when about dialog was displayed.
+
 version 1.0
 	- fixed problem for devices that grabed more than one interface, the
 	  name of the device would show up repeated a bunch.  This was true
diff -Naur usbview-1.0/Makefile.am usbview/Makefile.am
--- usbview-1.0/Makefile.am	2000-12-06 07:47:26.000000000 +0100
+++ usbview/Makefile.am	2005-06-30 17:13:34.000000000 +0200
@@ -1,7 +1,9 @@
 ## Process this file with automake to produce Makefile.in
 
 INCLUDES = \
-	@GTK_CFLAGS@
+	$(GTK_CFLAGS)	\
+	$(GLIB_CFLAGS)	\
+	@CPPFLAGS@
 
 VERSION = 1.0
 
@@ -20,5 +22,7 @@
 	usbview_logo.xcf	\
 	usbview.spec
 
-usbview_LDADD = @GTK_LIBS@ 
+usbview_LDADD = \
+	$(GTK_LIBS)	\
+	$(GLIB_LIBS)
 
diff -Naur usbview-1.0/about-dialog.c usbview/about-dialog.c
--- usbview-1.0/about-dialog.c	2000-12-06 07:20:25.000000000 +0100
+++ usbview/about-dialog.c	2005-06-30 17:13:34.000000000 +0200
@@ -66,7 +66,8 @@
 	dialog_vbox1 = GTK_DIALOG (aboutDialog)->vbox;
 	gtk_object_set_data (GTK_OBJECT (aboutDialog), "dialog_vbox1", dialog_vbox1);
 	gtk_widget_show (dialog_vbox1);
-	
+
+	gtk_widget_realize(aboutDialog);
 	logo = gdk_pixmap_create_from_xpm_d (aboutDialog->window, &logoMask, NULL, usbview_logo_xpm);
 	logoWidget = gtk_pixmap_new (logo, logoMask);
 	gtk_box_pack_start (GTK_BOX (dialog_vbox1), logoWidget, FALSE, FALSE, 0);
diff -Naur usbview-1.0/configure.in usbview/configure.in
--- usbview-1.0/configure.in	2000-12-06 07:48:28.000000000 +0100
+++ usbview/configure.in	2005-06-30 17:14:38.000000000 +0200
@@ -4,13 +4,18 @@
 AM_INIT_AUTOMAKE(usbview, 1.0)
 AM_CONFIG_HEADER(config.h)
 
+# required versions of other packages
+#m4_define([gtk_required_version], [2.2.0])
+
 AC_ISC_POSIX
 AC_PROG_CC
 AM_PROG_CC_STDC
 AC_HEADER_STDC
 
-AM_PATH_GTK(1.2.0, ,
-            AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?))
+GTK_CFLAGS=`pkg-config --cflags gtk+-2.0`
+GTK_LIBS=`pkg-config --libs gtk+-2.0`
+AC_SUBST(GTK_CFLAGS)
+AC_SUBST(GTK_LIBS)
 
 
 dnl Set PACKAGE_LOCALE_DIR in config.h.
diff -Naur usbview-1.0/interface.c usbview/interface.c
--- usbview-1.0/interface.c	2000-10-24 10:32:15.000000000 +0200
+++ usbview/interface.c	2005-06-30 17:13:34.000000000 +0200
@@ -32,7 +32,8 @@
 #include "usbtree.h"
 
 GtkWidget *treeUSB;
-GtkWidget *textDescription;
+GtkTextBuffer *textDescriptionBuffer;
+GtkWidget *textDescriptionView;
 
 int timer;
 
@@ -90,13 +91,17 @@
 	gtk_container_add (GTK_CONTAINER (hpaned1), scrolledwindow1);
 	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
 
-	textDescription = gtk_text_new (NULL, NULL);
-	gtk_widget_set_name (textDescription, "textDescription");
-	gtk_widget_ref (textDescription);
-	gtk_object_set_data_full (GTK_OBJECT (windowMain), "textDescription", textDescription,
-				  (GtkDestroyNotify) gtk_widget_unref);
-	gtk_widget_show (textDescription);
-	gtk_container_add (GTK_CONTAINER (scrolledwindow1), textDescription);
+	textDescriptionBuffer = gtk_text_buffer_new(NULL);
+	//textDescription = gtk_text_new (NULL, NULL);
+	textDescriptionView = gtk_text_view_new_with_buffer(textDescriptionBuffer);
+	gtk_widget_set_name (textDescriptionView, "textDescription");
+	gtk_widget_ref (textDescriptionView);
+	gtk_object_set_data_full (GTK_OBJECT (windowMain), "textDescription", textDescriptionView,
+				  (GtkDestroyNotify) gtk_widget_unref);
+	gtk_text_view_set_editable(GTK_TEXT_VIEW(textDescriptionView), FALSE);
+	gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textDescriptionView), FALSE);
+	gtk_widget_show (textDescriptionView);
+	gtk_container_add (GTK_CONTAINER (scrolledwindow1), textDescriptionView);
 
 	hbuttonbox1 = gtk_hbutton_box_new ();
 	gtk_widget_set_name (hbuttonbox1, "hbuttonbox1");
@@ -119,7 +124,7 @@
 	gtk_container_set_border_width (GTK_CONTAINER (buttonRefresh), 4);
 	GTK_WIDGET_SET_FLAGS (buttonRefresh, GTK_CAN_DEFAULT);
 
-	buttonConfigure = gtk_button_new_with_label ("Configure");
+	buttonConfigure = gtk_button_new_with_label ("Configure...");
 	gtk_widget_set_name (buttonConfigure, "buttonConfigure");
 	gtk_widget_ref (buttonConfigure);
 	gtk_object_set_data_full (GTK_OBJECT (windowMain), "buttonConfigure", buttonConfigure,
@@ -129,7 +134,7 @@
 	gtk_container_set_border_width (GTK_CONTAINER (buttonConfigure), 4);
 	GTK_WIDGET_SET_FLAGS (buttonConfigure, GTK_CAN_DEFAULT);
 
-	buttonAbout = gtk_button_new_with_label ("About");
+	buttonAbout = gtk_button_new_with_label ("About...");
 	gtk_widget_set_name (buttonAbout, "buttonAbout");
 	gtk_widget_ref (buttonAbout);
 	gtk_object_set_data_full (GTK_OBJECT (windowMain), "buttonAbout", buttonAbout,
@@ -166,7 +171,7 @@
 			    NULL);
 
 	/* create our timer */
-	timer = gtk_timeout_add (2000, on_timer_timeout, 0);
+	//timer = gtk_timeout_add (2000, on_timer_timeout, 0);
 	
 	return windowMain;
 }
diff -Naur usbview-1.0/usbparse.c usbview/usbparse.c
--- usbview-1.0/usbparse.c	2000-10-24 09:36:18.000000000 +0200
+++ usbview/usbparse.c	2005-06-30 17:13:34.000000000 +0200
@@ -427,8 +427,8 @@
 	interface->interfaceNumber      = GetInt (data, INTERFACE_NUMBER_STRING, 10);
 	interface->alternateNumber      = GetInt (data, INTERFACE_ALTERNATESETTING_STRING, 10);
 	interface->numEndpoints         = GetInt (data, INTERFACE_NUMENDPOINTS_STRING, 10);
-	interface->subClass             = GetInt (data, INTERFACE_SUBCLASS_STRING, 10);
-	interface->protocol             = GetInt (data, INTERFACE_PROTOCOL_STRING, 10);
+	interface->subClass             = GetInt (data, INTERFACE_SUBCLASS_STRING, 16);
+	interface->protocol             = GetInt (data, INTERFACE_PROTOCOL_STRING, 16);
 
 	GetString (interface->class, data, INTERFACE_CLASS_STRING, INTERFACE_CLASS_SIZE);
 	GetString (interface->name, data, INTERFACE_DRIVERNAME_STRING, INTERFACE_DRIVERNAME_STRING_MAXLENGTH);
diff -Naur usbview-1.0/usbtree.c usbview/usbtree.c
--- usbview-1.0/usbtree.c	2000-10-24 10:15:22.000000000 +0200
+++ usbview/usbtree.c	2005-06-30 17:13:34.000000000 +0200
@@ -41,13 +41,18 @@
 
 static void Init (void)
 {
+	GtkTextIter begin;
+	GtkTextIter end;
+
 	/* blow away the tree if there is one */
 	if (rootDevice != NULL) {
 		gtk_ctree_remove_node (GTK_CTREE(treeUSB), GTK_CTREE_NODE(rootDevice->leaf));
 	}
 
 	/* clean out the text box */
-	gtk_editable_delete_text (GTK_EDITABLE(textDescription), 0, -1);
+	gtk_text_buffer_get_start_iter(textDescriptionBuffer,&begin);
+	gtk_text_buffer_get_end_iter(textDescriptionBuffer,&end);
+	gtk_text_buffer_delete (textDescriptionBuffer, &begin, &end);
 
 	return;
 }
@@ -56,7 +61,7 @@
 static void PopulateListBox (int deviceId)
 {
 	Device  *device;
-	gint    position = 0;
+	//gint    position = 0;
 	char    *string;
 	char    *tempString;
 	int     configNum;
@@ -64,6 +69,9 @@
 	int     endpointNum;
 	int     deviceNumber = (deviceId >> 8);
 	int     busNumber = (deviceId & 0x00ff);
+	GtkTextIter begin;
+	GtkTextIter end;
+	GtkTextIter position;
 
 	device = usb_find_device (deviceNumber, busNumber);
 	if (device == NULL) {
@@ -72,29 +80,31 @@
 	}
 
 	/* clear the textbox */
-	gtk_editable_delete_text (GTK_EDITABLE(textDescription), 0, -1);
+	gtk_text_buffer_get_start_iter(textDescriptionBuffer,&begin);
+	gtk_text_buffer_get_end_iter(textDescriptionBuffer,&end);
+	gtk_text_buffer_delete (textDescriptionBuffer, &begin, &end);
 
 	/* freeze the display */
 	/* this keeps the annoying scroll from happening */
-	gtk_text_freeze (GTK_TEXT (textDescription));
+	gtk_widget_freeze_child_notify(textDescriptionView);
 
 	string = (char *)g_malloc (1000);
 
 	/* add the name to the textbox if we have one*/
 	if (device->name != NULL) {
-		gtk_editable_insert_text (GTK_EDITABLE(textDescription), device->name, strlen(device->name), &position);
+		gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, device->name,strlen(device->name));
 	}
 
 	/* add the manufacturer if we have one */
 	if (device->manufacturer != NULL) {
 		sprintf (string, "\nManufacturer: %s", device->manufacturer);
-		gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+		gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 	}
 
 	/* add the serial number if we have one */
 	if (device->serialNumber != NULL) {
 		sprintf (string, "\nSerial Number: %s", device->serialNumber);
-		gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+		gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 	}
 
 	/* add speed */
@@ -105,24 +115,24 @@
 		default :       tempString = "unknown";         break;
 	}
 	sprintf (string, "\nSpeed: %s", tempString);
-	gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+	gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 
 	/* add ports if available */
 	if (device->maxChildren) {
 		sprintf (string, "\nNumber of Ports: %i", device->maxChildren);
-		gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+		gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 	}
 
 	/* add the bandwidth info if available */
 	if (device->bandwidth != NULL) {
 		sprintf (string, "\nBandwidth allocated: %i / %i (%i%%)", device->bandwidth->allocated, device->bandwidth->total, device->bandwidth->percent);
-		gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+		gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 
 		sprintf (string, "\nTotal number of interrupt requests: %i", device->bandwidth->numInterruptRequests);
-		gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+		gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 
 		sprintf (string, "\nTotal number of isochronous requests: %i", device->bandwidth->numIsocRequests);
-		gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+		gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 	}
 
 	/* add the USB version, device class, subclass, protocol, max packet size, and the number of configurations (if it is there) */
@@ -131,14 +141,14 @@
 			 "Maximum Default Endpoint Size: %i\nNumber of Configurations: %i",
 			 device->version, device->class, device->subClass, device->protocol,
 			 device->maxPacketSize, device->numConfigs);
-		gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+		gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 	}
 
 	/* add the vendor id, product id, and revision number (if it is there) */
 	if (device->vendorId) {
 		sprintf (string, "\nVendor Id: %.4x\nProduct Id: %.4x\nRevision Number: %s",
 			 device->vendorId, device->productId, device->revisionNumber);
-		gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+		gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 	}
 
 	/* display all the info for the configs */
@@ -151,7 +161,7 @@
 				 "Attributes: %.2x\n\tMaxPower Needed: %s",
 				 config->configNumber, config->numInterfaces, 
 				 config->attributes, config->maxPower);
-			gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+			gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 
 			/* show all of the interfaces for this config */
 			for (interfaceNum = 0; interfaceNum < MAX_INTERFACES; ++interfaceNum) {
@@ -159,18 +169,18 @@
 					DeviceInterface *interface = config->interface[interfaceNum];
 
 					sprintf (string, "\n\n\tInterface Number: %i", interface->interfaceNumber);
-					gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+					gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string, strlen(string));
 
 					if (interface->name != NULL) {
 						sprintf (string, "\n\t\tName: %s", interface->name);
-						gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+						gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string, strlen(string));
 					}
 
 					sprintf (string, "\n\t\tAlternate Number: %i\n\t\tClass: %s\n\t\t"
-						 "Sub Class: %i\n\t\tProtocol: %i\n\t\tNumber of Endpoints: %i",
+						 "Sub Class: %.2x\n\t\tProtocol: %.2x\n\t\tNumber of Endpoints: %i",
 						 interface->alternateNumber, interface->class, 
 						 interface->subClass, interface->protocol, interface->numEndpoints);
-					gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+					gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string, strlen(string));
 
 					/* show all of the endpoints for this interface */
 					for (endpointNum = 0; endpointNum < MAX_ENDPOINTS; ++endpointNum) {
@@ -183,7 +193,7 @@
 								 endpoint->address, 
 								 endpoint->in ? "in" : "out", endpoint->attribute,
 								 endpoint->type, endpoint->maxPacketSize, endpoint->interval);
-							gtk_editable_insert_text (GTK_EDITABLE(textDescription), string, strlen(string), &position);
+							gtk_text_buffer_insert_at_cursor(textDescriptionBuffer, string,strlen(string));
 						}
 					}
 				}
@@ -191,11 +201,8 @@
 		}
 	}
 
-	/* throw the cursor back to the top so the user sees the top first */
-	gtk_editable_set_position (GTK_EDITABLE(textDescription), 0);
-
 	/* thaw the display */
-	gtk_text_thaw (GTK_TEXT (textDescription));
+	gtk_widget_thaw_child_notify(textDescriptionView);
 
 	/* clean up our string */
 	g_free (string);
@@ -349,7 +356,7 @@
 	dataLine = (char *)g_malloc (MAX_LINE_SIZE);
 	while (!finished) {
 		/* read the line in from the file */
-		fgets (dataLine, MAX_LINE_SIZE, usbFile);
+		fgets (dataLine, MAX_LINE_SIZE-1, usbFile);
 
 		if (dataLine[strlen(dataLine)-1] == '\n')
 			usb_parse_line (dataLine);
@@ -358,6 +365,7 @@
 			finished = 1;
 	}
 
+	fclose (usbFile);
 	g_free (dataLine);
 
 	usb_name_devices ();
diff -Naur usbview-1.0/usbtree.h usbview/usbtree.h
--- usbview-1.0/usbtree.h	2000-10-24 10:53:38.000000000 +0200
+++ usbview/usbtree.h	2005-06-30 17:13:34.000000000 +0200
@@ -24,7 +24,8 @@
 
 extern gchar		devicesFile[1000];
 extern GtkWidget	*treeUSB;
-extern GtkWidget	*textDescription;
+extern GtkWidget	*textDescriptionView;
+extern GtkTextBuffer	*textDescriptionBuffer;
 
 extern void	LoadUSBTree		(int refresh);
 extern void	initialize_stuff	(void);
diff -Naur usbview-1.0/usbview.8 usbview/usbview.8
--- usbview-1.0/usbview.8	1970-01-01 01:00:00.000000000 +0100
+++ usbview/usbview.8	2005-06-30 17:13:34.000000000 +0200
@@ -0,0 +1,28 @@
+.\"                                      Hey, EMACS: -*- nroff -*-
+.TH USBVIEW 8 "July 2002"
+.SH NAME
+usbview \- display information on USB devices
+.SH SYNOPSIS
+.B usbview
+.SH DESCRIPTION
+.B usbview
+provides a graphical summary of USB devices connected to the system.
+Detailed information may be displayed by selecting individual devices
+in the tree display.  Red items are those that have no driver associated
+with them.
+.SH OPTIONS
+No command line options are accepted by
+.B usbview.
+.SH FILES
+.TP
+.B /proc/bus/usb/devices
+Kernel file providing providing information on USB devices attached to
+the machine.
+.SH SEE ALSO
+.BR lsusb (8),
+.BR lspci (8).
+.SH AUTHOR
+.B usbview
+was written by Greg Kroah-Hartman <greg@kroah.com>.  This manual page
+was written by Mark Brown <broonie@sirena.org.uk>, for the Debian
+GNU/Linux system (but may be used freely by others).
