diff -u -u -r1.67 rhythmbox.schemas
--- data/rhythmbox.schemas	31 Mar 2006 09:18:43 -0000	1.67
+++ data/rhythmbox.schemas	1 Apr 2006 08:27:46 -0000
@@ -246,6 +246,17 @@
 	</locale>
       </schema>
       <schema>
+        <key>/schemas/apps/rhythmbox/ui/toolbar_style</key>
+	<applyto>/apps/rhythmbox/ui/toolbar_hiddle</applyto>
+	<owner>rhythmbox</owner>
+	<type>int</type>
+	<default>0</default>
+	<locale name="C">
+	<short>Toolbar style</short>
+	<long>0=Gnome default, 1=Icons only, 2=Text only, 3=Text below icons, 4=Text beside icons</long>
+	</locale>
+      </schema>
+      <schema>
         <key>/schemas/apps/rhythmbox/ui/song_position_slider_hidden</key>
 	<applyto>/apps/rhythmbox/ui/song_position_slider_hidden</applyto>
 	<owner>rhythmbox</owner>
diff -u -u -r1.13 general-prefs.glade
--- data/glade/general-prefs.glade	31 Mar 2006 09:18:44 -0000	1.13
+++ data/glade/general-prefs.glade	1 Apr 2006 08:27:46 -0000
@@ -621,6 +621,164 @@
 	  <property name="fill">False</property>
 	</packing>
       </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox16">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="toolbar_style_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Toolbar Button Labels:</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox18">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label25">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox19">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label26">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">8</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkComboBox" id="toolbar_style_menu">
+		      <property name="visible">True</property>
+		      <property name="items" translatable="yes">Default
+-
+Text below icons
+Text beside icons
+Icons only
+Text only</property>
+		      <property name="add_tearoffs">False</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="filler">
+		      <property name="visible">True</property>
+		      <property name="label"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
     </widget>
   </child>
 </widget>
diff -u -u -r1.5 rb-glade-helpers.c
--- lib/rb-glade-helpers.c	24 Mar 2006 09:04:59 -0000	1.5
+++ lib/rb-glade-helpers.c	1 Apr 2006 08:27:47 -0000
@@ -113,9 +113,11 @@
 void
 rb_glade_boldify_label (GladeXML *xml, const char *name)
 {
-	GtkLabel *label = GTK_LABEL (glade_xml_get_widget (xml, name));
+	GtkWidget *widget;
 
-	if (label == NULL) {
+	widget = glade_xml_get_widget (xml, name);
+
+	if (widget == NULL) {
 		g_warning ("widget '%s' not found", name);
 		return;
 	}
@@ -134,12 +136,27 @@
 		attr->end_index = G_MAXINT;
 		pango_attr_list_insert (pattrlist, attr);
 	}
-	gtk_label_set_attributes (label, pattrlist);*/
+	gtk_label_set_attributes (GTK_LABEL (widget), pattrlist);*/
 
 	gchar *str_final;
-	str_final = g_strdup_printf ("<b>%s</b>", gtk_label_get_label (label));
-	gtk_label_set_markup_with_mnemonic (label, str_final);
+	str_final = g_strdup_printf ("<b>%s</b>", gtk_label_get_label (GTK_LABEL (widget)));
+	gtk_label_set_markup_with_mnemonic (GTK_LABEL (widget), str_final);
 	g_free (str_final);
+}
+
+gboolean
+rb_combo_box_hyphen_separator_func (GtkTreeModel *model,
+				    GtkTreeIter *iter,
+				    gpointer data)
+{
+	const char *s;
+
+	gtk_tree_model_get (model, iter, 0, &s, -1);
+
+	if (s == NULL)
+		return FALSE;
+
+	return (strcmp (s, "-") == 0);
 }
 
 
diff -u -u -r1.5 rb-glade-helpers.h
--- lib/rb-glade-helpers.h	30 Nov 2005 07:18:29 -0000	1.5
+++ lib/rb-glade-helpers.h	1 Apr 2006 08:27:47 -0000
@@ -33,6 +33,9 @@
 void rb_glade_boldify_label (GladeXML *xml,
 			     const char *name);
 
+gboolean rb_combo_box_hyphen_separator_func (GtkTreeModel *model,
+					     GtkTreeIter *iter,
+					     gpointer data);
 G_END_DECLS
 
 #endif /* __RB_GLADE_HELPERS_H */
diff -u -u -r1.29 rb-preferences.h
--- lib/rb-preferences.h	31 Mar 2006 09:18:44 -0000	1.29
+++ lib/rb-preferences.h	1 Apr 2006 08:27:47 -0000
@@ -32,6 +32,7 @@
 #define CONF_UI_DIR               CONF_PREFIX "/ui"
 #define CONF_UI_STATUSBAR_HIDDEN  CONF_PREFIX "/ui/statusbar_hidden"
 #define CONF_UI_TOOLBAR_HIDDEN  CONF_PREFIX "/ui/toolbar_hidden"
+#define CONF_UI_TOOLBAR_STYLE	CONF_PREFIX "/ui/toolbar_style"
 #define CONF_UI_SONG_POSITION_SLIDER_HIDDEN  CONF_PREFIX "/ui/song_position_slider_hidden"
 #define CONF_UI_SOURCELIST_HIDDEN CONF_PREFIX "/ui/sourcelist_hidden"
 #define CONF_UI_QUEUE_AS_SIDEBAR  CONF_PREFIX "/ui/queue_as_sidebar" 
diff -u -u -r1.58 rb-shell-preferences.c
--- shell/rb-shell-preferences.c	31 Mar 2006 09:18:48 -0000	1.58
+++ shell/rb-shell-preferences.c	1 Apr 2006 08:27:48 -0000
@@ -58,6 +58,8 @@
 						   RBShellPreferences *shell_preferences);
 void rb_shell_preferences_browser_views_activated_cb (GtkWidget *widget,
 						      RBShellPreferences *shell_preferences);
+static void rb_shell_preferences_toolbar_style_cb (GtkComboBox *box,
+						   RBShellPreferences *preferences);
 
 
 enum
@@ -86,6 +88,8 @@
 
 	GSList *browser_views_group;
 
+	GtkWidget *toolbar_style_menu;
+
 	gboolean loading;
 };
 
@@ -203,12 +207,21 @@
 				  glade_xml_get_widget (xml, "general_vbox"),
 				  gtk_label_new (_("General")));
 
-	g_object_unref (G_OBJECT (xml));
+	/* toolbar button style */
+	rb_glade_boldify_label (xml, "toolbar_style_label");
+	shell_preferences->priv->toolbar_style_menu =
+		glade_xml_get_widget (xml, "toolbar_style_menu");
+	gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (shell_preferences->priv->toolbar_style_menu),
+					      rb_combo_box_hyphen_separator_func,
+					      NULL, NULL);
+	g_signal_connect_object (G_OBJECT (shell_preferences->priv->toolbar_style_menu),
+				 "changed", G_CALLBACK (rb_shell_preferences_toolbar_style_cb),
+				 shell_preferences, 0);
 	
 	eel_gconf_notification_add (CONF_UI_DIR,
 				    (GConfClientNotifyFunc) rb_shell_preferences_ui_pref_changed,
 				    shell_preferences);
-
+	g_object_unref (G_OBJECT (xml));
 	rb_shell_preferences_sync (shell_preferences);
 }
 
@@ -596,9 +609,38 @@
 	for (l = shell_preferences->priv->browser_views_group, i = 0; l != NULL; l = g_slist_next (l), i++)
 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l->data), (i == view));
 
+	/* toolbar style */
+	g_signal_handlers_block_by_func (G_OBJECT (shell_preferences->priv->toolbar_style_menu),
+					 G_CALLBACK (rb_shell_preferences_toolbar_style_cb),
+					 shell_preferences);
+
+	view = eel_gconf_get_integer (CONF_UI_TOOLBAR_STYLE);
+	/* skip the separator row */
+	if (view >= 1)
+		view++;
+	gtk_combo_box_set_active (GTK_COMBO_BOX (shell_preferences->priv->toolbar_style_menu), view);
+
+	g_signal_handlers_unblock_by_func (G_OBJECT (shell_preferences->priv->toolbar_style_menu),
+					   G_CALLBACK (rb_shell_preferences_toolbar_style_cb),
+					   shell_preferences);
+
 	shell_preferences->priv->loading = FALSE;
 }
 
+static void
+rb_shell_preferences_toolbar_style_cb (GtkComboBox *box, RBShellPreferences *preferences)
+{
+	int selection;
+
+	selection = gtk_combo_box_get_active (box);
+
+	/* skip the separator row */
+	if (selection >= 1)
+		selection--;
+
+	eel_gconf_set_integer (CONF_UI_TOOLBAR_STYLE, selection);
+}
+
 void
 rb_shell_preferences_browser_views_activated_cb (GtkWidget *widget,
 						 RBShellPreferences *shell_preferences)
@@ -612,5 +654,4 @@
 
 	eel_gconf_set_integer (CONF_UI_BROWSER_VIEWS, index);
 }
-
 
diff -u -u -r1.421 rb-shell.c
--- shell/rb-shell.c	1 Apr 2006 03:24:04 -0000	1.421
+++ shell/rb-shell.c	1 Apr 2006 08:27:50 -0000
@@ -208,7 +208,7 @@
 						       RBShell *shell);
 static void rb_shell_load_complete_cb (RhythmDB *db, RBShell *shell);
 static void rb_shell_sync_sourcelist_visibility (RBShell *shell);
-static void rb_shell_sync_toolbar_visibility (RBShell *shell);
+static void rb_shell_sync_toolbar_state (RBShell *shell);
 static void rb_shell_sync_smalldisplay (RBShell *shell);
 static void rb_shell_sync_pane_visibility (RBShell *shell);
 static void rb_shell_sync_statusbar_visibility (RBShell *shell);
@@ -219,10 +219,10 @@
 					      guint cnxn_id,
 					      GConfEntry *entry,
 					      RBShell *shell);
-static void toolbar_visibility_changed_cb (GConfClient *client,
-					   guint cnxn_id,
-					   GConfEntry *entry,
-					   RBShell *shell);
+static void toolbar_state_changed_cb (GConfClient *client,
+				      guint cnxn_id,
+				      GConfEntry *entry,
+				      RBShell *shell);
 static void smalldisplay_changed_cb (GConfClient *client,
 				     guint cnxn_id,
 				     GConfEntry *entry,
@@ -409,6 +409,7 @@
 
 	guint sourcelist_visibility_notify_id;
 	guint toolbar_visibility_notify_id;
+	guint toolbar_style_notify_id;
 	guint smalldisplay_notify_id;
 
 	glong last_small_time; /* when we last changed small mode */
@@ -894,6 +895,7 @@
 	eel_gconf_monitor_remove (CONF_PREFIX);
 	eel_gconf_notification_remove (shell->priv->sourcelist_visibility_notify_id);
 	eel_gconf_notification_remove (shell->priv->toolbar_visibility_notify_id);
+	eel_gconf_notification_remove (shell->priv->toolbar_style_notify_id);
 	eel_gconf_notification_remove (shell->priv->smalldisplay_notify_id);
 
 	g_list_free (shell->priv->supported_media_extensions);
@@ -1182,7 +1184,11 @@
 					    shell);
 	shell->priv->toolbar_visibility_notify_id =
 		eel_gconf_notification_add (CONF_UI_TOOLBAR_HIDDEN,
-					    (GConfClientNotifyFunc) toolbar_visibility_changed_cb,
+					    (GConfClientNotifyFunc) toolbar_state_changed_cb,
+					    shell);
+	shell->priv->toolbar_style_notify_id =
+		eel_gconf_notification_add (CONF_UI_TOOLBAR_STYLE,
+					    (GConfClientNotifyFunc) toolbar_state_changed_cb,
 					    shell);
 	shell->priv->smalldisplay_notify_id =
 		eel_gconf_notification_add (CONF_UI_SMALL_DISPLAY,
@@ -1272,7 +1278,6 @@
 
 	toolbar = gtk_ui_manager_get_widget (shell->priv->ui_manager, "/ToolBar");
 	gtk_box_pack_start_defaults (GTK_BOX (hbox), toolbar);
-	rb_shell_sync_toolbar_visibility (shell);
 
 	shell->priv->volume_button = bacon_volume_button_new (GTK_ICON_SIZE_LARGE_TOOLBAR,
 							       0.0, 1.0, 0.02);
@@ -1312,6 +1317,7 @@
 	rb_shell_sync_window_state (shell, FALSE);
 	rb_shell_sync_smalldisplay (shell);
 	rb_shell_sync_party_mode (shell);
+	rb_shell_sync_toolbar_state (shell);
 
 	rb_shell_select_source (shell, RB_SOURCE (shell->priv->library_source));
 
@@ -2432,11 +2438,12 @@
 
 
 static void
-rb_shell_sync_toolbar_visibility (RBShell *shell)
+rb_shell_sync_toolbar_state (RBShell *shell)
 {
 	GtkWidget *toolbar;
 	gboolean visible;
 	GtkAction *action;
+	guint toolbar_style;
 
 	visible = !eel_gconf_get_boolean (CONF_UI_TOOLBAR_HIDDEN);
 
@@ -2450,6 +2457,33 @@
 					      "ViewToolbar");
 	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
 				      visible);
+
+	toolbar_style = eel_gconf_get_integer (CONF_UI_TOOLBAR_STYLE);
+	switch (toolbar_style) {
+	case 0:
+		/* default*/
+		gtk_toolbar_unset_style (GTK_TOOLBAR (toolbar));
+		break;
+	case 1:
+		/* text below icons */
+		gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH);
+		break;
+	case 2:
+		/* text beside icons */
+		gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ);
+		break;
+	case 3:
+		/* icons only */
+		gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
+		break;
+	case 4:
+		/* test only */
+		gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_TEXT);
+		break;
+	default:
+		g_warning ("unknown toolbar style type");
+		gtk_toolbar_unset_style (GTK_TOOLBAR (toolbar));
+	}
 }
 
 static gboolean
@@ -2567,13 +2601,13 @@
 }
 
 static void
-toolbar_visibility_changed_cb (GConfClient *client,
+toolbar_state_changed_cb (GConfClient *client,
 			       guint cnxn_id,
 			       GConfEntry *entry,
 			       RBShell *shell)
 {
-	rb_debug ("toolbar visibility changed"); 
-	rb_shell_sync_toolbar_visibility (shell);
+	rb_debug ("toolbar state changed"); 
+	rb_shell_sync_toolbar_state (shell);
 }
 
 static void
