=== modified file 'ChangeLog'
--- ChangeLog	2006-09-13 09:00:30 +0000
+++ ChangeLog	2006-09-13 09:00:32 +0000
@@ -196,6 +196,13 @@
 
 2006-07-25  Patrick Bernaud  <b-patrick@wanadoo.fr>
 
+	* noweb/i_callbacks.nw, noweb/i_basic.nw: Switched reference on
+	GtkToggleButtons to GtkToogleToolButtons for items of the new
+	toolbar.
+
+	* noweb/x_window.nw: Modified to build the toolbar from a ui
+	definition for GtkUIManager and GtkActions.
+
 	* noweb/gschem.nw, noweb/i_callbacks.nw: Adapted for new main
 	window.
 

=== modified file 'src/i_basic.c'
--- src/i_basic.c	2006-09-13 08:59:35 +0000
+++ src/i_basic.c	2006-09-13 09:00:32 +0000
@@ -346,22 +346,22 @@
     case(SELECT):
     case(STARTSELECT): 
     case(TEXTENTRY): 
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-				   w_current->toolbar_select), TRUE);
+      gtk_toggle_tool_button_set_active (
+        GTK_TOGGLE_TOOL_BUTTON (w_current->toolbar_select), TRUE);
       break;
       
     case(DRAWNET): 
     case(STARTDRAWNET): 
     case(NETCONT): 
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-				   w_current->toolbar_net), TRUE);
+      gtk_toggle_tool_button_set_active (
+        GTK_TOGGLE_TOOL_BUTTON (w_current->toolbar_net), TRUE);
       break;
       
     case(DRAWBUS): 
     case(STARTDRAWBUS): 
     case(BUSCONT): 
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-				   w_current->toolbar_bus), TRUE);
+      gtk_toggle_tool_button_set_active (
+        GTK_TOGGLE_TOOL_BUTTON (w_current->toolbar_bus), TRUE);
       break;
       
     case(DRAWCOMP): /*! \todo */
@@ -405,8 +405,8 @@
     case(STARTMCOPY): /*! \todo */
     case(ENDMCOPY): /*! \todo */
     default:
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-				   w_current->toolbar_select), TRUE);
+      gtk_toggle_tool_button_set_active (
+        GTK_TOGGLE_TOOL_BUTTON (w_current->toolbar_select), TRUE);
       break;
   }
 }
@@ -573,22 +573,22 @@
     case(SELECT):
     case(STARTSELECT): 
     case(TEXTENTRY): 
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-				   w_current->toolbar_select), TRUE);
+      gtk_toggle_tool_button_set_active (
+        GTK_TOGGLE_TOOL_BUTTON (w_current->toolbar_select), TRUE);
       break;
 
     case(DRAWNET): 
     case(STARTDRAWNET): 
     case(NETCONT): 
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-				   w_current->toolbar_net), TRUE);
+      gtk_toggle_tool_button_set_active (
+        GTK_TOGGLE_TOOL_BUTTON (w_current->toolbar_net), TRUE);
       break;
 
     case(DRAWBUS): 
     case(STARTDRAWBUS): 
     case(BUSCONT): 
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-				   w_current->toolbar_bus), TRUE);
+      gtk_toggle_tool_button_set_active (
+        GTK_TOGGLE_TOOL_BUTTON (w_current->toolbar_bus), TRUE);
       break;
 
     case(DRAWCOMP): /*! \todo */

=== modified file 'src/i_callbacks.c'
--- src/i_callbacks.c	2006-09-13 09:00:30 +0000
+++ src/i_callbacks.c	2006-09-13 09:00:32 +0000
@@ -629,12 +629,10 @@
   exit_if_null(w_current);
   if (!w_current->window) return;
 
-  if (GTK_TOGGLE_BUTTON (widget)->active) {
-    if (!o_erase_rubber(w_current)) {
-      i_callback_cancel(w_current, 0, NULL);
-    }
-    i_callback_edit_select((TOPLEVEL*) data, 0, NULL);
+  if (!o_erase_rubber(w_current)) {
+    i_callback_cancel(w_current, 0, NULL);
   }
+  i_callback_edit_select((TOPLEVEL*) data, 0, NULL);
 }
 
 /*! \todo Finish function documentation!!!
@@ -2399,9 +2397,7 @@
   exit_if_null(w_current);
   if (!w_current->window) return;
 
-  if (GTK_TOGGLE_BUTTON (widget)->active) {
-    i_callback_add_net((TOPLEVEL*) data, 0, NULL);
-  }
+  i_callback_add_net((TOPLEVEL*) data, 0, NULL);
 }
 
 /*! \todo Finish function documentation!!!
@@ -2468,9 +2464,7 @@
   exit_if_null(w_current);
   if (!w_current->window) return;
 
-  if (GTK_TOGGLE_BUTTON (widget)->active) {
-     i_callback_add_bus((TOPLEVEL*) data, 0, NULL);
-  }
+  i_callback_add_bus((TOPLEVEL*) data, 0, NULL);
 }
 
 /*! \todo Finish function documentation!!!

=== modified file 'src/x_window.c'
--- src/x_window.c	2006-09-13 09:00:30 +0000
+++ src/x_window.c	2006-09-13 09:00:32 +0000
@@ -721,6 +721,34 @@
 
 }
 
+static void
+window_callback_toolbar_activate_radio_action (GtkAction      *action,
+                                               GtkRadioAction *current,
+                                               gpointer        user_data)
+{
+  void (*callback) (GtkWidget*, gpointer);
+  enum {
+    MODE_COMPONENT,
+    MODE_NET,
+    MODE_BUS,
+    MODE_TEXT,
+    MODE_SELECT,
+  };
+
+  switch (gtk_radio_action_get_current_value (current)) {
+      case MODE_COMPONENT: callback = i_callback_toolbar_add_component; break;
+      case MODE_NET:       callback = i_callback_toolbar_add_net;       break;
+      case MODE_BUS:       callback = i_callback_toolbar_add_bus;       break;
+      case MODE_TEXT:      callback = i_callback_toolbar_add_text;      break;
+      case MODE_SELECT:    callback = i_callback_toolbar_edit_select;   break;
+      default:
+        g_assert_not_reached ();
+        callback = NULL;
+  }
+  (*callback) (NULL, user_data);
+  
+}
+
 static GtkWidget*
 window_create_menubar (Window *window)
 {
@@ -749,233 +777,86 @@
 window_create_toolbar (Window *window)
 {
   TOPLEVEL *toplevel = window->toplevel;
+  GtkUIManager *ui;
+  GtkActionGroup *actions;
+  GError *error = NULL;  
   GtkWidget *toolbar;
-  gchar *filename;
-
-  toolbar = GTK_WIDGET (
-    g_object_new (GTK_TYPE_TOOLBAR,
-                  /* GtkToolbar */
-                  "orientation",   GTK_ORIENTATION_HORIZONTAL,
-                  "toolbar-style", GTK_TOOLBAR_ICONS,
-                  NULL));
-
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-new.xpm",
-                               NULL);
-  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), 
-                           _("New"), 
-                           _("New file"), 
-                           "toolbar/new",
-                           gtk_image_new_from_file (filename),
-                           (GtkSignalFunc) i_callback_toolbar_file_new, 
-                           toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory, 
-                               "gschem-open.xpm",
-                               NULL);
-  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), 
-                           _("Open"), 
-                           _("Open file..."), 
-                           "toolbar/open", 
-                           gtk_image_new_from_file (filename),
-                           (GtkSignalFunc) i_callback_toolbar_file_open, 
-                           toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory, 
-                               "gschem-save.xpm",
-                               NULL);
-  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), 
-                           _("Save"), 
-                           _("Save file"), 
-                           "toolbar/save", 
-                           gtk_image_new_from_file (filename),
-                           (GtkSignalFunc) i_callback_toolbar_file_save, 
-                           toplevel);
-  g_free (filename);
-  gtk_toolbar_append_space (GTK_TOOLBAR(toolbar)); 
-  filename = g_build_filename (toplevel->bitmap_directory, 
-                               "gschem-undo.xpm",
-                               NULL);
-  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), 
-                           _("Undo"), 
-                           _("Undo last operation"), 
-                           "toolbar/undo", 
-                           gtk_image_new_from_file (filename),
-                           (GtkSignalFunc) i_callback_toolbar_edit_undo, 
-                           toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-redo.xpm",
-                               NULL);
-  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), 
-                           _("Redo"), 
-                           _("Redo last undo"), 
-                           "toolbar/redo", 
-                           gtk_image_new_from_file (filename),
-                           (GtkSignalFunc) i_callback_toolbar_edit_redo, 
-                           toplevel);
-  g_free (filename);
-  gtk_toolbar_append_space (GTK_TOOLBAR(toolbar)); 
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-comp.xpm",
-                               NULL);
-  /* not part of any radio button group */
-  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), 
-                           _("Component"), 
-                           _("Add component...\nSelect library and component from list, move the mouse into main window, click to place\nRight mouse button to cancel"), 
-                           "toolbar/component", 
-                           gtk_image_new_from_file (filename),
-                           (GtkSignalFunc) i_callback_toolbar_add_component, 
-                           toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-net.xpm",
-                               NULL);
-  toplevel->toolbar_net =
-  gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-                             GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                             NULL,
-                             _("Nets"),
-                             _("Add nets mode\nRight mouse button to cancel"),
-                             "toolbar/nets",
-                             gtk_image_new_from_file (filename),
-                             (GtkSignalFunc) i_callback_toolbar_add_net,
-                             toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-bus.xpm",
-                               NULL);
-  toplevel->toolbar_bus =
-  gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-                             GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                             toplevel->toolbar_net,
-                             _("Bus"),
-                             _("Add buses mode\nRight mouse button to cancel"),
-                             "toolbar/bus",
-                             gtk_image_new_from_file (filename),
-                             (GtkSignalFunc) i_callback_toolbar_add_bus,
-                             toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-text.xpm",
-                               NULL);
-  /* not part of any radio button group */
-  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), 
-                           _("Text"), 
-                           _("Add Text..."), 
-                           "toolbar/text", 
-                           gtk_image_new_from_file (filename),
-                           (GtkSignalFunc) i_callback_toolbar_add_text, 
-                           toplevel);
-  g_free (filename);
-  gtk_toolbar_append_space (GTK_TOOLBAR(toolbar)); 
-
-        filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-select.xpm",
-                               NULL);
-  toplevel->toolbar_select =
-  gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-                             GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                             toplevel->toolbar_bus,
-                             _("Select"),
-                             _("Select mode"),
-                             "toolbar/select",
-                             gtk_image_new_from_file (filename),
-                             (GtkSignalFunc) i_callback_toolbar_edit_select, 
-                             toplevel);
-  g_free (filename);
-
-#if 0 /* out until they work */
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-edit.xpm",
-                               NULL);
-  toplevel->toolbar_edit =
-  gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-                             GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                             toplevel->toolbar_select,
-                             _("Edit"),
-                             _("Edit mode"),
-                             "toolbar/edit",
-                             gtk_image_new_from_file (filename),
-                             (GtkSignalFunc) NULL, 
-                             toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-move.xpm",
-                               NULL);
-  toplevel->toolbar_edit =
-  gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-                             GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                             toplevel->toolbar_edit,
-                             _("Move"),
-                             _("Move mode"),
-                             "toolbar/move",
-                             gtk_image_new_from_file (filename),
-                             (GtkSignalFunc) NULL, 
-                             toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-copy.xpm",
-                               NULL);
-  toplevel->toolbar_edit =
-  gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-                             GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                             toplevel->toolbar_edit,
-                             _("Copy"),
-                             _("Copy mode"),
-                             "toolbar/copy",
-                             gtk_image_new_from_file (filename),
-                             (GtkSignalFunc) NULL, 
-                             toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-delete.xpm",
-                               NULL);
-  toplevel->toolbar_delete =
-  gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-                             GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                             toplevel->toolbar_edit,
-                             _("Delete"),
-                             _("Delete mode"),
-                             "toolbar/delete",
-                             gtk_image_new_from_file (filename),
-                             (GtkSignalFunc) NULL, 
-                             toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-rotate.xpm",
-                               NULL);
-  toplevel->toolbar_rotate =
-  gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-                             GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                             toplevel->toolbar_delete,
-                             _("Rotate"),
-                             _("Rotate mode"),
-                             "toolbar/rotate",
-                             gtk_image_new_from_file (filename),
-                             (GtkSignalFunc) NULL, 
-                             toplevel);
-  g_free (filename);
-  filename = g_build_filename (toplevel->bitmap_directory,
-                               "gschem-mirror.xpm",
-                               NULL);
-  toplevel->toolbar_mirror =
-  gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-                             GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                             toplevel->toolbar_rotate,
-                             _("Mirror"),
-                             _("Mirror mode"),
-                             "toolbar/mirror",
-                             gtk_image_new_from_file (filename),
-                             (GtkSignalFunc) NULL, 
-                             toplevel);
-  g_free (filename);
-#endif
-  gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
+  static const gchar *ui_def =
+"<ui>"
+"  <toolbar name='Toolbar'>"
+"    <toolitem action='New'/>"
+"    <toolitem action='Open'/>"
+"    <toolitem action='Save'/>"
+"    <separator/>"
+"    <toolitem action='Undo'/>"
+"    <toolitem action='Redo'/>"
+"    <separator/>"
+"    <toolitem action='Component'/>"
+"    <toolitem action='Net'/>"
+"    <toolitem action='Bus'/>"
+"    <toolitem action='Text'/>"
+"    <separator/>"
+"    <toolitem action='Select'/>"
+"  </toolbar>"
+"</ui>";
+#define CALLBACK(name) \
+  G_CALLBACK (i_callback_toolbar_ ## name)
+  static GtkActionEntry entries[] = {
+    { "New",  GTK_STOCK_NEW,  N_("New"),  "", N_("New file"),            CALLBACK (file_new)  },
+    { "Open", GTK_STOCK_OPEN, N_("Open"), "", N_("Open file..."),        CALLBACK (file_open) },
+    { "Save", GTK_STOCK_SAVE, N_("Save"), "", N_("Save file"),           CALLBACK (file_save) },
+    /* */
+    { "Undo", GTK_STOCK_UNDO, N_("Undo"), "", N_("Undo last operation"), CALLBACK (edit_undo) },
+    { "Redo", GTK_STOCK_REDO, N_("Redo"), "", N_("Redo last undo"),      CALLBACK (edit_redo) },
+  };
+#undef CALLBACK
+  static guint n_entries = G_N_ELEMENTS (entries);
+  enum {
+    MODE_COMPONENT,
+    MODE_NET,
+    MODE_BUS,
+    MODE_TEXT,
+    MODE_SELECT,
+  };
+  static GtkRadioActionEntry radio_entries[] = {
+    { "Component", GTK_STOCK_MISSING_IMAGE, N_("Component"), "", N_("Add component..."), MODE_COMPONENT },
+    { "Net",       GTK_STOCK_MISSING_IMAGE, N_("Net"),       "", N_("Add nets mode"),    MODE_NET       },
+    { "Bus",       GTK_STOCK_MISSING_IMAGE, N_("Bus"),       "", N_("Add buses mode"),   MODE_BUS       },
+    { "Text",      GTK_STOCK_MISSING_IMAGE, N_("Text"),      "", N_("Add text..."),      MODE_TEXT      },
+    { "Select",    GTK_STOCK_MISSING_IMAGE, N_("Select"),    "", N_("Select mode"),      MODE_SELECT    },
+  };
+  static guint n_radio_entries = G_N_ELEMENTS (entries);
+
+
+  actions = gtk_action_group_new ("ToolbarActions");
+  gtk_action_group_set_translate_func (actions,
+                                       (GtkTranslateFunc)gettext,
+                                       NULL,
+                                       NULL);
+  gtk_action_group_add_actions (actions,
+                                entries,
+                                n_entries,
+                                (gpointer)toplevel);
+  gtk_action_group_add_radio_actions (actions,
+                                      radio_entries,
+                                      n_radio_entries,
+                                      MODE_SELECT,
+                                      G_CALLBACK (window_callback_toolbar_activate_radio_action),
+                                      (gpointer)toplevel);
+
+  ui = gtk_ui_manager_new ();
+  gtk_ui_manager_insert_action_group (ui, actions, 0);
+  if (!gtk_ui_manager_add_ui_from_string (ui, ui_def, -1, &error))
+	{
+	  g_message ("building toolbar failed: %s", error->message);
+	  g_error_free (error);
+	}
   
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toplevel->toolbar_select),
-                                TRUE);
+  toolbar = gtk_ui_manager_get_widget (ui, "/Toolbar");
 
+  toplevel->toolbar_select = gtk_ui_manager_get_widget (ui, "/Toolbar/Select");
+  toplevel->toolbar_net    = gtk_ui_manager_get_widget (ui, "/Toolbar/Net");
+  toplevel->toolbar_bus    = gtk_ui_manager_get_widget (ui, "/Toolbar/Bus");
   
   if (toplevel->handleboxes) {
     GtkWidget *handlebox =

