diff -ru bfm-0.6.1/ChangeLog bfm-0.6.2/ChangeLog
--- bfm-0.6.1/ChangeLog	2003-11-01 16:46:25.000000000 +0000
+++ bfm-0.6.2/ChangeLog	2003-11-04 03:00:43.000000000 +0000
@@ -1,3 +1,24 @@
+2003-11-04 01:48  Bill Wilson <bill@gkrellm.net>
+	* : Adds a spin button and code so there can be a bubblefishymon
+		update interval independent of gkrellm builtin updates.  I
+		arbitrarily set to allow 10 - 50 updates per second.
+	* : Put a callback on the prog_entry so that the apply_config
+		function can be eliminated.  This totally converts the plugin
+		to an instant apply config and it becomes the first plugin I
+		know of that achieves this status!  You'll notice there are no
+		longer the "Apply" and "Close" buttons appearing when the
+		bubblefishymon config page is up.
+
+2003-11-02 16:37  James Rowe  <Jay@jnrowe.uklinux.net>
+	* : Applied patch from Huw Giddens to fix the memory usage routines
+		for 2.6 kernels that still works for 2.4 kernels.  It is now
+		possible to use the same binary with different kernels.
+	* : Import of debian packaging dir, again from Huw Giddens.  Probably
+		requires some fixing by someone with a Debian box, because 
+		some of the Makefile changes have not been applied. [ PREFIX
+		and "all" target].  And the "install" target changes have been
+		taken under some duress.
+
 2003-10-08 11:36  James Rowe  <Jay@jnrowe.uklinux.net>
 
 	* : Applied the gkrellm2 support patch from Debian's package, by
@@ -13,12 +34,3 @@
 	* : Bumped revision to 0.6.0 from the original 0.5.1 release on
 		http://pigeond.net/bfm/.
 
-2003-11-02 16:37  James Rowe  <Jay@jnrowe.uklinux.net>
-	* : Applied patch from Huw Giddens to fix the memory usage routines
-		for 2.6 kernels that still works for 2.4 kernels.  It is now
-		possible to use the same binary with different kernels.
-	* : Import of debian packaging dir, again from Huw Giddens.  Probably
-		requires some fixing by someone with a Debian box, because 
-		some of the Makefile changes have not been applied. [ PREFIX
-		and "all" target].  And the "install" target changes have been
-		taken under some duress.
diff -ru bfm-0.6.1/bubblemon.c bfm-0.6.2/bubblemon.c
--- bfm-0.6.1/bubblemon.c	2003-11-01 16:44:06.000000000 +0000
+++ bfm-0.6.2/bubblemon.c	2003-11-04 03:00:43.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * bubblefishymon 0.6.1
+ * bubblefishymon 0.6.2
  *
  * Well, Hacks from bubblemon by timecop and Johan
  *
@@ -76,7 +76,7 @@
  */
 #define _GNU_SOURCE
 
-#define VERSION "0.6.1"
+#define VERSION "0.6.2"
 
 /* general includes */
 #include <stdio.h>
diff -ru bfm-0.6.1/fishmon.c bfm-0.6.2/fishmon.c
--- bfm-0.6.1/fishmon.c	2003-11-01 16:43:34.000000000 +0000
+++ bfm-0.6.2/fishmon.c	2003-11-04 03:00:43.000000000 +0000
@@ -1,4 +1,4 @@
-/*  BubbleFishyMon dockapp 0.6.1
+/*  BubbleFishyMon dockapp 0.6.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
diff -ru bfm-0.6.1/gkrellm-bfm.c bfm-0.6.2/gkrellm-bfm.c
--- bfm-0.6.1/gkrellm-bfm.c	2003-11-01 16:44:15.000000000 +0000
+++ bfm-0.6.2/gkrellm-bfm.c	2003-11-04 03:00:43.000000000 +0000
@@ -1,4 +1,3 @@
-
 /*
  *
  * gkrellm-bfm.c
@@ -34,7 +33,7 @@
 #include <stdlib.h>
 #include <time.h>
 
-#define PLUGIN_VERSION	"0.6.1"
+#define PLUGIN_VERSION	"0.6.2"
 
 #define PLUGIN_NAME	"gkrellm-bfm"
 #define PLUGIN_DESC	"bubblefishymon gkrellm port"
@@ -68,6 +67,8 @@
 static Chart *chart = NULL;
 static ChartConfig *chart_config = NULL;
 
+static gint	timeout_id,
+			update_interval;
 
 
 /* From the actual bfm */
@@ -92,13 +93,13 @@
 GtkWidget *clock_check = NULL;
 GtkWidget *fish_traffic_check = NULL;
 
-static void
+static gboolean
 update_plugin(void)
 {
 	GdkEventExpose event;
 	gint ret_val;
 	gtk_signal_emit_by_name(GTK_OBJECT(chart->drawing_area), "expose_event", &event, &ret_val);
-
+	return TRUE;	/* restart timer */
 }
 
 
@@ -154,6 +155,15 @@
 	return TRUE;
 }
 
+
+static void
+disable_plugin(void)
+	{
+	if (timeout_id)
+		gtk_timeout_remove(timeout_id);
+	timeout_id = 0;
+	}
+
 static void
 create_plugin(GtkWidget *vbox, gint first_create)
 {
@@ -182,7 +192,10 @@
 				"leave_notify_event", GTK_SIGNAL_FUNC(leave_notify_event),
 				NULL);
 	}
-
+	if (!timeout_id)
+		timeout_id = gtk_timeout_add(1000 / update_interval,
+					(GtkFunction) update_plugin, NULL);
+	gkrellm_disable_plugin_connect(mon, disable_plugin);
 }
 
 
@@ -240,6 +253,44 @@
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fish_traffic_check), fish_traffic);
 }
 
+
+static void
+cb_interval_modified(GtkWidget *widget, GtkSpinButton *spin)
+	{
+	update_interval = gtk_spin_button_get_value_as_int(spin);
+	if (timeout_id)
+		gtk_timeout_remove(timeout_id);
+	timeout_id = gtk_timeout_add(1000 / update_interval,
+					(GtkFunction) update_plugin, NULL);
+	}
+
+static gchar	*pending_prog;
+
+static void
+cb_prog_entry(GtkWidget *widget, gpointer data)
+{
+	gboolean	activate_sig = GPOINTER_TO_INT(data);
+	gchar		*s           = gkrellm_gtk_entry_get_text(&prog_entry);
+
+	if (activate_sig)
+		{
+		gkrellm_dup_string(&prog, s);
+		g_free(pending_prog);
+		pending_prog = NULL;
+		}
+	else	/* "changed" sig, entry is pending on "activate" or config close */
+		gkrellm_dup_string(&pending_prog, s);
+}
+
+static void
+config_destroyed(void)
+	{
+	if (pending_prog)
+		gkrellm_dup_string(&prog, pending_prog);
+	g_free(pending_prog);
+	pending_prog = NULL;
+	}
+
 static void
 create_plugin_tab(GtkWidget *tab_vbox)
 {
@@ -287,10 +338,7 @@
 		"   fish swiming from right to left represents incoming traffic)\n",
 		"- Cute little duck swimming...\n",
 		"- Clock hands representing time (obviously)...\n",
-		"- Click and it will run a command for you (requested by Nick =)\n\n",
-		"<i>Notes\n\n",
-		"- Currently Gkrellm updates at most 10 times a second, and so\n",
-		"  BFM updates is a bit jerky still.\n",
+		"- Click and it will run a command for you (requested by Nick =)\n",
 		"\n\n",
 	};
 
@@ -307,6 +355,8 @@
 	tabs = gtk_notebook_new();
 	gtk_notebook_set_tab_pos(GTK_NOTEBOOK(tabs), GTK_POS_TOP);
 	gtk_box_pack_start(GTK_BOX(tab_vbox), tabs, TRUE, TRUE, 0);
+	g_signal_connect(G_OBJECT(tabs),"destroy",
+			 G_CALLBACK(config_destroyed), NULL);
 
 	/* Options tab */
 	options_tab = gkrellm_create_tab(tabs, _("Options"));
@@ -346,6 +396,10 @@
 							(GtkDestroyNotify) gtk_widget_unref);
 	gtk_widget_show (prog_entry);
 	gtk_box_pack_start (GTK_BOX (prog_box), prog_entry, TRUE, TRUE, 0);
+	g_signal_connect(G_OBJECT(prog_entry), "activate",
+				G_CALLBACK(cb_prog_entry), GINT_TO_POINTER(1));
+	g_signal_connect(G_OBJECT(prog_entry), "changed",
+				G_CALLBACK(cb_prog_entry), GINT_TO_POINTER(0));
 
 	row1 = gtk_hbox_new (FALSE, 0);
 	gtk_widget_set_name (row1, "row1");
@@ -470,6 +524,11 @@
 	gtk_widget_show (fish_traffic_check);
 	gtk_box_pack_start (GTK_BOX (fish_traffic_box), fish_traffic_check, TRUE, TRUE, 0);
 
+	gkrellm_gtk_spin_button(main_box, NULL, update_interval,
+				10.0, 50.0, 1.0, 5.0, 0, 60,
+				cb_interval_modified, NULL, FALSE,
+				_("Updates per second"));
+
 	setup_toggle_buttons();
 
 	gtk_signal_connect(GTK_OBJECT(cpu_check), "toggled", GTK_SIGNAL_FUNC(option_toggled_cb), NULL);
@@ -494,15 +553,6 @@
 
 }
 
-static void
-apply_plugin_config(void)
-{
-	if(prog)
-	{
-		g_free(prog);
-	}
-	prog = g_strdup(gtk_editable_get_chars(GTK_EDITABLE(prog_entry), 0, -1));
-}
 
 static void
 save_plugin_config(FILE *f)
@@ -511,13 +561,15 @@
 	{
 		fprintf(f, "%s prog %s\n", PLUGIN_KEYWORD, prog);
 	}
-	fprintf(f, "%s options %d.%d.%d.%d.%d.%d\n", PLUGIN_KEYWORD,
+	fprintf(f, "%s options %d.%d.%d.%d.%d.%d.%d\n", PLUGIN_KEYWORD,
 			cpu_enabled,
 			duck_enabled,
 			memscreen_enabled,
 			fish_enabled,
 			fish_traffic,
-			time_enabled);
+			time_enabled,
+			update_interval);
+
 }
 
 static void
@@ -539,13 +591,14 @@
 	}
 	else if(!strcmp(config_item, "options"))
 	{
-		sscanf(value, "%d.%d.%d.%d.%d.%d",
+		sscanf(value, "%d.%d.%d.%d.%d.%d.%d",
 				&cpu_enabled,
 				&duck_enabled,
 				&memscreen_enabled,
 				&fish_enabled,
 				&fish_traffic,
-				&time_enabled);
+				&time_enabled,
+				&update_interval);
 	}
 
 }
@@ -556,9 +609,9 @@
 	PLUGIN_NAME,         /* Name, for config tab.                    */
 	0,                   /* Id,  0 if a plugin                       */
 	create_plugin,       /* The create_plugin() function             */
-	update_plugin,       /* The update_plugin() function             */
+	NULL,                /* The update_plugin() function             */
 	create_plugin_tab,   /* The create_plugin_tab() config function  */
-	apply_plugin_config, /* The apply_plugin_config() function       */
+	NULL,                /* The apply_plugin_config() function       */
 	
 	save_plugin_config,  /* The save_plugin_config() function        */
 	load_plugin_config,  /* The load_plugin_config() function        */
@@ -577,6 +630,7 @@
 Monitor *
 init_plugin(void)
 {
+	update_interval = 20;
 	style_id = gkrellm_add_meter_style(&bfm_mon, PLUGIN_STYLE);
 	return (mon = &bfm_mon);
 }
