Index: gtk/options.h
===================================================================
--- gtk/options.h	(revision 6998)
+++ gtk/options.h	(working copy)
@@ -27,6 +27,7 @@
 extern char *option_downloads_directory;
 extern char *option_url_file;
 extern bool option_show_single_tab;
+extern int option_button_type;
 
 #define EXTRA_OPTION_DEFINE \
 bool option_render_resample = false; \
@@ -34,7 +35,8 @@
 bool option_request_overwrite = true; \
 char *option_downloads_directory = 0; \
 char *option_url_file = 0;            \
-bool option_show_single_tab = false;
+bool option_show_single_tab = false; \
+int option_button_type = 0;
 
 #define EXTRA_OPTION_TABLE \
 { "render_resample",	OPTION_BOOL,	&option_render_resample }, \
@@ -42,6 +44,7 @@
 { "request_overwrite",	OPTION_BOOL,	&option_request_overwrite }, \
 { "downloads_directory",OPTION_STRING,	&option_downloads_directory }, \
 { "url_file",		OPTION_STRING,	&option_url_file }, \
-{ "show_single_tab",    OPTION_BOOL,    &option_show_single_tab },
+{ "show_single_tab",    OPTION_BOOL,    &option_show_single_tab }, \
+{ "button_type",		OPTION_INTEGER, &option_button_type}
 
 #endif
Index: gtk/gtk_scaffolding.c
===================================================================
--- gtk/gtk_scaffolding.c	(revision 6998)
+++ gtk/gtk_scaffolding.c	(working copy)
@@ -22,7 +22,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <gtk/gtk.h>
-#include <glade/glade.h>
 #include <libxml/debugXML.h>
 #include "content/content.h"
 #include "desktop/browser.h"
@@ -50,6 +49,7 @@
 #include "gtk/gtk_schedule.h"
 #include "gtk/gtk_tabs.h"
 #include "gtk/gtk_throbber.h"
+#include "gtk/gtk_utils.h"
 #include "gtk/gtk_window.h"
 #include "gtk/options.h"
 #include "render/box.h"
@@ -65,42 +65,6 @@
 
 struct gtk_history_window;
 
-struct gtk_scaffolding {
-	GtkWindow		*window;
-	GtkNotebook		*notebook;
-	GtkEntry		*url_bar;
-	GtkEntryCompletion	*url_bar_completion;
-	GtkStatusbar		*status_bar;
-	GtkMenuItem		*edit_menu;
-	GtkMenuItem		*tabs_menu;
-	GtkToolbar		*tool_bar;
-	GtkToolButton		*back_button;
-	GtkToolButton		*forward_button;
-	GtkToolButton		*stop_button;
-	GtkToolButton		*reload_button;
-	GtkMenuBar		*menu_bar;
-	GtkMenuItem		*back_menu;
-	GtkMenuItem		*forward_menu;
-	GtkMenuItem		*stop_menu;
-	GtkMenuItem		*reload_menu;
-	GtkImage		*throbber;
-	GtkPaned		*status_pane;
-
-	GladeXML		*xml;
-
-	GladeXML		*popup_xml;
-	GtkMenu			*popup_menu;
-
-	struct gtk_history_window *history_window;
-	GtkDialog 		*preferences_dialog;
-
-	int			throb_frame;
-        struct gui_window	*top_level;
-        int			being_destroyed;
-
-	bool			fullscreen;
-};
-
 struct gtk_history_window {
 	struct gtk_scaffolding 	*g;
 	GtkWindow		*window;
@@ -305,7 +269,8 @@
         LOG(("Being Destroyed = %d", g->being_destroyed));
         gtk_widget_destroy(GTK_WIDGET(g->history_window->window));
 	gtk_widget_destroy(GTK_WIDGET(g->window));
-
+	
+	remove_gtk_scaffolding_list_item(g);
 	if (--open_windows == 0)
 		netsurf_quit = true;
 
@@ -1174,6 +1139,8 @@
         LOG(("Constructing a scaffold of %p for gui_window %p", g, toplevel));
 
         g->top_level = toplevel;
+        
+        add_gtk_scaffolding_list_item(g);
 
 	open_windows++;
 
@@ -1216,6 +1183,53 @@
 	} else {
 		gtk_window_set_default_size(g->window, 600, 600);
 	}
+	
+	if (option_button_type == 0) {
+		GtkSettings *settings = gtk_settings_get_default();
+		GtkIconSize tooliconsize;
+		GtkToolbarStyle toolbarstyle;
+		g_object_get(settings, "gtk-toolbar-icon-size",  &tooliconsize,
+				"gtk-toolbar-style", &toolbarstyle, NULL);
+		switch (toolbarstyle) {
+			case GTK_TOOLBAR_ICONS :
+				option_button_type = (tooliconsize ==
+						GTK_ICON_SIZE_SMALL_TOOLBAR) ? 1 : 2;
+				break;
+			case GTK_TOOLBAR_TEXT :
+				option_button_type = 4;
+				break;
+			case GTK_TOOLBAR_BOTH :
+			case GTK_TOOLBAR_BOTH_HORIZ :
+			default :
+				option_button_type = 3;
+				break;
+		}
+	}
+	switch(option_button_type) {
+		case 1:
+			gtk_toolbar_set_style(GTK_TOOLBAR(g->tool_bar),
+					GTK_TOOLBAR_ICONS);
+			gtk_toolbar_set_icon_size(GTK_TOOLBAR(g->tool_bar),
+					GTK_ICON_SIZE_SMALL_TOOLBAR);
+			break;
+		case 2:
+			gtk_toolbar_set_style(GTK_TOOLBAR(g->tool_bar),
+					GTK_TOOLBAR_ICONS);
+			gtk_toolbar_set_icon_size(GTK_TOOLBAR(g->tool_bar),
+					GTK_ICON_SIZE_LARGE_TOOLBAR);
+			break;
+		case 3:
+			gtk_toolbar_set_style(GTK_TOOLBAR(g->tool_bar),
+					GTK_TOOLBAR_BOTH);
+			gtk_toolbar_set_icon_size(GTK_TOOLBAR(g->tool_bar),
+					GTK_ICON_SIZE_LARGE_TOOLBAR);
+			break;
+		case 4:
+			gtk_toolbar_set_style(GTK_TOOLBAR(g->tool_bar),
+					GTK_TOOLBAR_TEXT);
+		default:
+			break;
+	}
 
 	nsgtk_tab_init(GTK_WIDGET(g->notebook));
 
@@ -1579,4 +1593,3 @@
 	widget = glade_xml_get_widget(xml, "separator");
 	gtk_widget_show(widget);
 }
-	
Index: gtk/gtk_scaffolding.h
===================================================================
--- gtk/gtk_scaffolding.h	(revision 6998)
+++ gtk/gtk_scaffolding.h	(working copy)
@@ -20,11 +20,48 @@
 #define NETSURF_GTK_SCAFFOLDING_H 1
 
 #include <gtk/gtk.h>
+#include <glade/glade.h>
 #include "desktop/gui.h"
 #include "desktop/plotters.h"
 
 typedef struct gtk_scaffolding nsgtk_scaffolding;
 
+struct gtk_scaffolding {
+	GtkWindow		*window;
+	GtkNotebook		*notebook;
+	GtkEntry		*url_bar;
+	GtkEntryCompletion	*url_bar_completion;
+	GtkStatusbar		*status_bar;
+	GtkMenuItem		*edit_menu;
+	GtkMenuItem		*tabs_menu;
+	GtkToolbar		*tool_bar;
+	GtkToolButton		*back_button;
+	GtkToolButton		*forward_button;
+	GtkToolButton		*stop_button;
+	GtkToolButton		*reload_button;
+	GtkMenuBar		*menu_bar;
+	GtkMenuItem		*back_menu;
+	GtkMenuItem		*forward_menu;
+	GtkMenuItem		*stop_menu;
+	GtkMenuItem		*reload_menu;
+	GtkImage		*throbber;
+	GtkPaned		*status_pane;
+
+	GladeXML		*xml;
+
+	GladeXML		*popup_xml;
+	GtkMenu			*popup_menu;
+
+	struct gtk_history_window *history_window;
+	GtkDialog 		*preferences_dialog;
+
+	int			throb_frame;
+        struct gui_window	*top_level;
+        int			being_destroyed;
+
+	bool			fullscreen;
+};
+
 GtkWindow *nsgtk_get_window_for_scaffold(struct gtk_scaffolding *g);
 
 nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel);
Index: gtk/dialogs/gtk_options.c
===================================================================
--- gtk/dialogs/gtk_options.c	(revision 6998)
+++ gtk/dialogs/gtk_options.c	(working copy)
@@ -30,6 +30,7 @@
 #include "gtk/gtk_gui.h"
 #include "gtk/gtk_scaffolding.h"
 #include "gtk/dialogs/gtk_options.h"
+#include "gtk/gtk_utils.h"
 #include "gtk/gtk_window.h"
 
 #include "desktop/print.h"
@@ -85,6 +86,8 @@
 DECLARE(spinMinimumSize);
 DECLARE(fontPreview);
 
+DECLARE(comboButtonType);
+
 DECLARE(spinMemoryCacheSize);
 DECLARE(spinDiscCacheAge);
 
@@ -167,6 +170,8 @@
 	CONNECT(spinDefaultSize, "value-changed");
 	CONNECT(spinMinimumSize, "value-changed");
 	CONNECT(fontPreview, "clicked");
+	
+	CONNECT(comboButtonType, "changed");
 
 	CONNECT(spinMemoryCacheSize, "value-changed");
 	CONNECT(spinDiscCacheAge, "value-changed");
@@ -251,7 +256,27 @@
 {
 	char b[20];
 	int proxytype = 0;
-
+	if (option_button_type == 0) {
+		GtkSettings *settings = gtk_settings_get_default();
+		GtkIconSize tooliconsize;
+		GtkToolbarStyle toolbarstyle;
+		g_object_get(settings, "gtk-toolbar-icon-size",  &tooliconsize,
+				"gtk-toolbar-style", &toolbarstyle, NULL);
+		switch (toolbarstyle) {
+			case GTK_TOOLBAR_ICONS :
+				option_button_type = (tooliconsize ==
+						GTK_ICON_SIZE_SMALL_TOOLBAR) ? 1 : 2;
+				break;
+			case GTK_TOOLBAR_TEXT :
+				option_button_type = 4;
+				break;
+			case GTK_TOOLBAR_BOTH :
+			case GTK_TOOLBAR_BOTH_HORIZ :
+			default :
+				option_button_type = 3;
+				break;
+		}
+	}
 	SET_ENTRY(entryHomePageURL,
 			option_homepage_url ? option_homepage_url : "");
 	SET_BUTTON(setCurrentPage);
@@ -297,6 +322,8 @@
 	SET_SPIN(spinDefaultSize, option_font_size / 10);
 	SET_SPIN(spinMinimumSize, option_font_min_size / 10);
 	SET_BUTTON(fontPreview);
+	
+	SET_COMBO(comboButtonType, option_button_type -1);
 
 	SET_SPIN(spinMemoryCacheSize, option_memory_cache_size >> 20);
 	SET_SPIN(spinDiscCacheAge, option_disc_cache_age);
@@ -334,7 +361,11 @@
 {
 	LOG(("Writing options to file"));
 	options_write(options_file_location);
-	if (stay_alive) gtk_widget_hide(GTK_WIDGET(wndPreferences));
+	if ((stay_alive) && GTK_IS_WIDGET(dlg))
+		gtk_widget_hide(GTK_WIDGET(dlg));
+	else {
+		stay_alive = FALSE;
+	}
 	return stay_alive;
 }
 	
@@ -531,6 +562,41 @@
 	nsgtk_reflow_all_windows();
 END_HANDLER
 
+COMBO_CHANGED(comboButtonType, option_button_type)
+	option_button_type++;
+	struct gtk_scaffolding_list_item *current;
+	current = first_window;
+	while (current)
+	{
+		switch(option_button_type) {
+			case 1:
+				gtk_toolbar_set_style(GTK_TOOLBAR(current->g->tool_bar),
+						GTK_TOOLBAR_ICONS);
+				gtk_toolbar_set_icon_size(GTK_TOOLBAR(current->g->tool_bar),
+						GTK_ICON_SIZE_SMALL_TOOLBAR);
+				break;
+			case 2:
+				gtk_toolbar_set_style(GTK_TOOLBAR(current->g->tool_bar),
+						GTK_TOOLBAR_ICONS);
+				gtk_toolbar_set_icon_size(GTK_TOOLBAR(current->g->tool_bar),
+						GTK_ICON_SIZE_LARGE_TOOLBAR);
+				break;
+			case 3:
+				gtk_toolbar_set_style(GTK_TOOLBAR(current->g->tool_bar),
+						GTK_TOOLBAR_BOTH);
+				gtk_toolbar_set_icon_size(GTK_TOOLBAR(current->g->tool_bar),
+						GTK_ICON_SIZE_LARGE_TOOLBAR);
+				break;
+			case 4:
+				gtk_toolbar_set_style(GTK_TOOLBAR(current->g->tool_bar),
+						GTK_TOOLBAR_TEXT);
+			default:
+				break;
+		}
+		current = current->next;
+	}
+END_HANDLER
+
 SPIN_CHANGED(spinMemoryCacheSize, option_memory_cache_size)
 	option_memory_cache_size <<= 20;
 END_HANDLER
Index: Makefile.sources
===================================================================
--- Makefile.sources	(revision 6998)
+++ Makefile.sources	(working copy)
@@ -59,7 +59,7 @@
 	gtk_thumbnail.c gtk_plotters.c gtk_treeview.c gtk_scaffolding.c	\
 	gtk_completion.c gtk_login.c gtk_throbber.c gtk_selection.c	\
 	gtk_history.c gtk_window.c gtk_filetype.c gtk_download.c	\
-	gtk_print.c gtk_tabs.c						\
+	gtk_print.c gtk_tabs.c gtk_utils.c						\
 	$(addprefix dialogs/,gtk_options.c gtk_about.c)
 S_GTK := $(addprefix gtk/,$(S_GTK))
 
Index: desktop/options.c
===================================================================
--- desktop/options.c	(revision 6998)
+++ desktop/options.c	(working copy)
@@ -389,7 +389,7 @@
 				break;
 		}
 		fprintf(fp, "\n");
-        }
+	}
 
 	fclose(fp);
 }
